Trước đây mình đã trình bày cách tính toán các giá trị cho bảng sin. Bây giờ mình sẽ chỉ cho bạn cách sử dụng bảng sin đó để tạo sóng sin bằng PIC16F684. Tại sao PIC16F684? Đó là một PIC 14 chân nhỏ xinh chứa tất cả những gì cần thiết cho xung SPWM (điều chế độ rộng xung hình sin) – mô-đun ECCP. Vì bộ ADC hoặc bộ so sánh hoặc các thiết bị ngoại vi khác không được sử dụng và có đủ chân, mình đã chọn PIC16F684.
Hãy chạy 16F684 từ bộ dao động tinh thể 16MHz và sử dụng tần số chuyển mạch 16kHz.Vì vậy, giá trị yêu cầu của PR2 là 249.Bảng sin (cho nửa chu kỳ) là:0, 25, 49, 73, 96, 118, 139, 159, 177, 193, 208, 220, 231, 239, 245, 249, 250, 249, 245, 239, 231, 220, 208, 193, 177, 159, 139, 118, 96, 73, 49, 25
Đây là mã:
unsigned char sin_table [32] = {0,25,49,73,96,118,137,159,177,193,208,220,231,239,245,249,250,249,245,239,231,220,208,193,177,159,137,118,96,73,49,25};unsigned int TBL_POINTER_NEW, TBL_POINTER_OLD,
TBL_POINTER_SHIFT, SET_FREQ;không dấu int TBL_temp;char không dấu DUTY_CYCLE;void ngắt () { if (TMR2IF_bit ==
1) {
TBL_POINTER_NEW = TBL_POINTER_OLD + SET_FREQ; nếu
(TBL_POINTER_NEW <TBL_POINTER_OLD) {
CCP1CON.P1M1 = ~ CCP1CON.P1M1; // Đảo ngược hướng của toàn cầu }
TBL_POINTER_SHIFT = TBL_POINTER_NEW >> 11; DUTY_CYCLE =
TBL_POINTER_SHIFT; CCPR1L =
sin_table [DUTY_CYCLE];
TBL_POINTER_OLD = TBL_POINTER_NEW; TMR2IF_bit =
0; }}void main () { SET_FREQ = 410; TBL_POINTER_SHIFT
= 0; TBL_POINTER_NEW =
0; TBL_POINTER_OLD =
0; DUTY_CYCLE = 0; ANSEL = 0;
// Tắt ADC CMCON0 = 7;
// Tắt bộ so sánh
PR2 = 249; TRISC = 0x3F; CCP1CON = 0x4C; TMR2IF_bit = 0; T2CON = 4; // TMR2
on, prescaler và postscaler 1: 1 while (TMR2IF_bit
== 0); TMR2IF_bit = 0; TRISC = 0; TMR2IE_bit = 1; GIE_bit = 1; PEIE_bit = 1; trong khi (1);}
Để làm cho quá trình cập nhật giá trị bảng sin trở nên đơn giản, con trỏ bảng đã được sử dụng. Tần số ở đây được đặt là 50Hz và tần số chuyển mạch là 16kHz. 16F684 tạo ra các tín hiệu xung SPWM trên các chân P1A, P1B, P1C và P1D, các chân này sau đó sẽ được kết nối với một tầng cầu đầy đủ để cấp vào biến áp.Tần số 16kHz được sử dụng vì nó ở phía cuối của phổ âm thanh và do đó tiếng ồn phát ra sẽ không thể dung nạp được. Tần số trên 20kHz không được sử dụng vì 20kHz là tần số tối đa cho mô-đun ECCP của 16F684.Vì mô-đun ECCP và ngắt đảm nhận xung SPWM nên nó đang được thực thi bởi các mô-đun phần cứng. Vì vậy, trong khi những thứ này đang chạy, bạn cũng có thể làm những việc khác bằng cách mã hóa chúng trong vòng lặp while (1), như bạn có thể thấy, hiện đang trống vì không có tác vụ nào khác được thực hiện ngoài xung SPWM.Tạo bảng sin:
xung SPWM báo hiệu:
Sóng hình sin được tạo ra:
❀◕ ‿ ◕❀