e có chương trình băm xung pwm để lm nghịch lưu.h ctrinh thế này oy e muốn điều chỉnh thêm tần số và duty bằng biến trở ở ngoài nữa.

tên minh

Học sinh phổ thông
#1
ac nào có thể chỉnh giúp e dk k ạ. e cảm ơn và hậu tạ ạ
const unsigned int sine_table[200]={75, 80, 86, 91, 97, 102, 108, 113, 119, 124,
130, 135, 141, 146, 151, 157, 162, 167, 173, 178, 183, 188, 194, 199, 204, 209,
214, 219, 224, 229, 234, 239, 244, 248, 253, 258, 263, 267, 272, 276, 281, 285,
290, 294, 298, 302, 306, 311, 315, 319, 322, 326, 330, 334, 338, 341, 345, 348,
352, 355, 358, 361, 364, 368, 371, 373, 376, 379, 382, 384, 387, 389, 392, 394,
396, 398, 400, 402, 404, 406, 408, 410, 411, 413, 414, 415, 417, 418, 419, 420,
421, 422, 422, 423, 423, 424, 424, 425, 425, 425, 425, 425, 425, 425, 424, 424,
423, 423, 422, 422, 421, 420, 419, 418, 417, 415, 414, 413, 411, 410, 408, 406,
404, 402, 400, 398, 396, 394, 392, 389, 387, 384, 382, 379, 376, 373, 371, 368,
364, 361, 358, 355, 352, 348, 345, 341, 338, 334, 330, 326, 322, 319, 315, 311,
306, 302, 298, 294, 290, 285, 281, 276, 272, 267, 263, 258, 253, 248, 244, 239,
234, 229, 224, 219, 214, 209, 204, 199, 194, 188, 183, 178, 173, 167, 162, 157,
151, 146, 141, 135, 130, 124, 119, 113, 108, 102, 97, 91, 86, 80}; //20KHz

unsigned int T1,T2,index=0;
//Thach anh 20MHz, PWM=20KHz, ti le chia 4
//Cau hinh PWM, f=20KHz
void Config_PWM()
{
PTCON0=0x02; //Chon bo chia va che do hoat dong, 1:1 va updow
PTCON1=0x80; //Cho phep thanh ghi dem PWM (PTMR)
PWMCON0=0x30; //Cho phep chan PWMx hoat dong va kieu cap PWM
PWMCON1=0x00; //Bat Cap nhat gia tri cac thanh ghi
PTPERL=125&0xFF; //Gia tri thanh ghi PTPER = Fosc/(4*Fpwm) -1
PTPERH=125>>8; // Gia tri thanh ghi PTPER
PDC0L=0;
PDC0H=0;
PDC1L=0;
PDC1H=0;
PDC2L=0;
PDC2H=0;
PDC3L=0;
PDC3H=0;
DTCON=20;//Tre 3us Dead_Time Value(6bit)=Dead_Time*(Fosc/Prescale)
OVDCOND=0xFF; //Pin PWM kich hoat
}
void set_duty0(unsigned int duty)
{
PDC0H = duty>>8;
PDC0L = duty&0xFF;
}
void set_duty1(unsigned int duty)
{
PDC1H = duty>>8;
PDC1L = duty&0xFF;

}
void Sinware_PWM(unsigned int deg)
{
if(deg < 200)
{
T1 = sine_table[deg];
T2 = 0;
set_duty0(T1);
set_duty1(T2);
T1 = 0;
}
else if(deg >= 200 & deg < 400)
{
T1 = 0;
T2 = sine_table[deg-200];
set_duty0(T1);
set_duty1(T2);
T2 = 0;
}
}
void main(){
Config_PWM();
//Cho phep ngat PWM
PIE3.PTIE = 1; // Cho phep ngat ADC
INTCON.PEIE = 1; // Cho phep ngat ngoai vi
INTCON.GIE = 1; // Cho phep ngat toan cuc

while(1){
}
}
void interrupt()

{
if (PIR3.PTIF == 1)
{
Sinware_PWM(index);
index++;
PIR3.PTIF = 0;
if (index == 400) {
index = 0;
}
}
}
 

Quảng cáo Google