原来的程序如下,感谢有位大佬给我分享的程序,但是我测试后发现,电压采样没反应,电流采样也没有反应,不知道为什么?
先抛开采样,以上程序是部分程序,如果想要两路载波为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; //死区时间调节600ns
TMR2IE=1; //打开定时器2中断使能
TMR2ON=1; //打开定时器2
TMR2IF=0; //定时器2中断标志位清零
adc_power=0; //PID调节标志初始化
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;}
}
}
|