|
void pwmInit()
{
PR2=0XfE; //設(shè)置pwm工作周期,20mHz,PWM周期19.5kHz
CCP1CON=0X8C; //PW模式,1000 1100 P1A P1C高電平有效 P1B,P1D高電平有效
CCPR1L=0X00; //設(shè)置CCP1,0%的脈寬輸出
T2CON=0X1C; //定時器2預(yù)分頻1,后分頻器4分頻
PWM1CON=0X03; //死區(qū)時間調(diào)節(jié)600ns
TMR2IE=1; //打開定時器2中斷使能
TMR2ON=1; //打開定時器2
TMR2IF=0; //定時器2中斷標(biāo)志位清零
adc_power=0; //PID調(diào)節(jié)標(biāo)志初始化
soft_count=0;
sin_num=0;
sin_l=0;
sin_d=0;
sin=0;
m=0;
inc=0; //以上為PWM相關(guān)變量初始化
}
//----------------------中斷服務(wù)程序------------------
void interrupt timer2() //定時器2中斷
{
if(TMR2IF&&TMR2IE)
{
TMR2IF=0;
sin_l = SPWMTABLE[sin_num]*m;//???????
sin_d = sin_l/VSPWM;//????????
if(m>129) {m=129;} //防止溢出
if(0==sin)
{
if(!sin_num)??????
{
ECCPAS=0X80;
PWM2H=0;
PWM2L=1;
ECCPAS=0;
}
CCPR1L=sin_d+1;
}
else
{
if(!sin_num)
{
ECCPAS =0X80;
PWM2L=0;
PWM2H=1;
ECCPAS=0;
}
CCPR1L =~sin_d;
}
sin_num++;
if(sin_num==SPWM){sin_num=0;sin++;if(sin==2){sin=0;}} //查表
if(sin_num==23){adv=1;}
if(sin_num==0){adc_power=1;}
}
}
原來的程序如上,感謝有位大佬給我分享的程序,但是我測試后發(fā)現(xiàn),電壓采樣沒反應(yīng),電流采樣也沒有反應(yīng),不知道為什么?
先拋開采樣,以上程序是部分程序,如果想要兩路載波為16k,兩路基波50hz我應(yīng)該如何改,還有比如我要10k載波,如何計算修改值?
還有就是以上中斷服務(wù)程序是不是太過復(fù)雜,有沒有更為簡單的寫法?,折磨了我一個星期不睡還是不明白:sin_l = SPWMTABLE[sin_num]*m;sin_d = sin_l/VSPWM;這是為什么?
|
|