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