Chào các bác!
Em đang viết chương trình tạo xung sin PWM tần số hài cơ bản 50Hz, tần số sóng mang 20kHz
+ nửa chu kỳ đầu tạo xung pwm cho chân 19, chân 18 = 0
+ nửa chu kỳ sau tạo xung pwm cho chân 18, chân 19 = 0
Các thông số cài đặt cho các chân và thanh ghi
chân 19: ngõ ra không đảo - Fast PWM - chế độ 14
chân 18: ngõ ra không đảo - Fast PWM - chế độ 14
thanh ghi ICR1=800
Các bác xem giúp code của em bị gì nha.
Nhân tiện bác nào có tài liệu (công thức tính toán) mạch lọc LC cho em xin nha.
Bất kỳ sự giúp đỡ nào của các bác em xin chân thành cảm ơn!!!
Thân ái.
Em đang viết chương trình tạo xung sin PWM tần số hài cơ bản 50Hz, tần số sóng mang 20kHz
+ nửa chu kỳ đầu tạo xung pwm cho chân 19, chân 18 = 0
+ nửa chu kỳ sau tạo xung pwm cho chân 18, chân 19 = 0
Các thông số cài đặt cho các chân và thanh ghi
chân 19: ngõ ra không đảo - Fast PWM - chế độ 14
chân 18: ngõ ra không đảo - Fast PWM - chế độ 14
thanh ghi ICR1=800
Các bác xem giúp code của em bị gì nha.
Code:
#include <mega16.h> #define suon PORTB.4 //suon=0/1 thi ham sin dang o suon trai/phai #define led_1 PORTB.5 #define led_2 PORTB.6 #define led_3 PORTB.7 unsigned int index=0; unsigned int sin[201]={ 800, 800, 800, 800, 799, 799, 798, 798, 797, 796, 795, 794, 793, 792, 790, 789, 787, 786, 784, 782, 780, 778, 776, 774, 772, 770, 767, 765, 762, 759, 756, 754, 751, 747, 744, 741, 738, 734, 731, 727, 724, 720, 716, 712, 708, 704, 700, 696, 692, 687, 683, 678, 674, 669, 665, 660, 655, 650, 645, 640, 635, 630, 625, 620, 614, 609, 604, 598, 593, 587, 582, 576, 570, 565, 559, 553, 547, 541, 535, 530, 524, 518, 512, 506, 499, 493, 487, 481, 475, 469, 463, 456, 450, 444, 438, 431, 425, 419, 413, 406, 400, 394, 387, 381, 375, 369, 362, 356, 350, 344, 337, 331, 325, 319, 313, 307, 301, 294, 288, 282, 276, 270, 265, 259, 253, 247, 241, 235, 230, 224, 218, 213, 207, 202, 196, 191, 186, 180, 175, 170, 165, 160, 155, 150, 145, 140, 135, 131, 126, 122, 117, 113, 108, 104, 100, 96, 92, 88, 84, 80, 76, 73, 69, 66, 62, 59, 56, 53, 49, 46, 44, 41, 38, 35, 33, 30, 28, 26, 24, 22, 20, 18, 16, 14, 13, 11, 10, 8, 7, 6, 5, 4, 3, 2, 2, 1, 1, 0, 0, 0, 0 }; // bảng sin của một nửa chu kỳ interrupt [TIM1_COMPA] void timer1_compa_isr(void) { if (index==0) { suon=1; }; if (suon==1) { OCR1A=sin[index]; index++; } else { OCR1A=sin[index]; index--; }; } interrupt [TIM1_COMPB] void timer1_compb_isr(void) { if (index==201) { suon=0; }; if (suon==1) { OCR1B=sin[index]; index++; } else { OCR1B=sin[index]; index--; }; } void main(void) { // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0xFF; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x30; index=0; led_1=1; suon=1; TCCR1B=(1<<4)|(1<<3)|(1<<0);// WGM13=1, WGM12=1, CS10=1 OCR1A=sin[index]; OCR1B=sin[index]; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x03; ICR1L=0x20;// nap 800 vao thanh ghi ICR1 #asm ("sei") while (1) { if (index<=100) { led_2=1; led_3=0; TCCR1A=0x32; TIMSK=(0<<4)|(1<<3);//cho phep ngat khi match xay ra khi so sanh OCR1B voi TCNT1 } else { led_2=0; led_3=1; TCCR1A=0x82; TIMSK=(1<<4)|(0<<3);//cho phep ngat khi match xay ra khi so sanh OCR1A voi TCNT1 } }; };
Bất kỳ sự giúp đỡ nào của các bác em xin chân thành cảm ơn!!!
Thân ái.
Comment