|
发表于 2011-4-11 11:32:47
|
显示全部楼层
这是之前用2020写的单极性倍频逆变程序,不过这芯片真不怎么样,热的要死。换33F凉快好多啊。
另外30F2010的电机PWM模块,死区在占空比为0的时候也出死区,这个谁解决过,传授下经验啊!
void pwm_init()
{
PTCON=0x2801;//暂时关闭PWM,允许特殊事件中断,无外部同步源,特殊初始每触发2次就中断一次(用于更新占空比用)
PTPER=Period_Def;//20KHzPWM,周期时间=(PTPER+1)/120MHz;50uS=(PTPER+1)*8.33nS;PTPER=6000;另外由于PTPER最低3位是0.所以左移3位
SEVTCMP=38000;//特殊事件触发时间设置为当次周期结束前6uS时触发
MDC=0x0010;//占空比最小值是16
IPC4bits.PSEMIP=6;//暂时设置PWM特殊事件中断优先级为6(第二级)
IEC1bits.PSEMIE=0;//暂时屏蔽PWM特殊事件中断
IFS1bits.PSEMIF=0;//清除中断标志位
//PWM1
PDC1=0x0010;
//PWMCON1=0xC00;//允许中断触发,允许过流保护中断,主时基提供时间,使用PDC1独立占空比
PWMCON1=0x0000;//禁止故障中断,正死区
DTR1=0x1ea;//死区250nS
ALTDTR1=0x1ea;//双死区时间,上升沿死去时间和下降沿死区时间相等
//IOCON1=0xD000;//PWM模块控制H,L控制脚,互补输出模式,如果发生限流中断则CLDAT1:CLDAT0分别为H:L提供占空比,2位都设置为0,相当于输出低电平
IOCON1=0xc000;//互补,无故障
//FCLCON1=0x10E3;//共享故障1,低电平有效,使能限流故障。禁止故障控制
TRIG1=0x0000;//PWM1触发中断,暂时禁止触发中断,用于触发AD采样用
LEBCON1=0x0000;//不使用前沿消隐功能
IEC1bits.PWM1IE=0;//禁止PWM1触发中断,只使用其启动AD转换
IFS1bits.PWM1IF=0;
//PWM2
PDC2=0x0010;
//PWMCON2=0x800;//禁止中断触发,允许过流保护中断,主时基提供时间,使用PDC2独立占空比
PWMCON2=0x0000;
DTR2=0x1ea;//死区200nS
ALTDTR2=0x1ea;//双死区时间,上升沿死去时间和下降沿死区时间相等
//IOCON2=0xD000;//PWM模块控制H,L控制脚,互补输出模式,如果发生限流中断则CLDAT1:CLDAT0分别为H:L提供占空比,2位都设置为0,相当于输出低电平
IOCON2=0xc000;
//FCLCON2=0x10E3;//共享故障1,低电平有效,使能限流故障。禁止故障控制
TRIG2=0x0000;//PWM2不触发中断,次中断与PWM采样中断无关
LEBCON2=0x0000;//不使用前沿消隐功能
}
void __attribute__((__interrupt__,auto_psv)) _PWMSpEventMatchInterrupt()//PWM特殊中断,用于更新占空比
{
register int result asm("A");//定义一个变量指向DSP累加器A
IFS1bits.PSEMIF=0;
//这里查遍程序,查完后计算
//这里计算占空比,赋给Duty_Gain_A和Duty_Gain_B
Duty_Gain_A<<=3;
Duty_Gain_B<<=3;
if(Duty_Gain_A<0x0010)//如果小于限制值
{
Duty_Gain_A=0x0010;
}
if(Duty_Gain_B<0x0010)
{
Duty_Gain_B=0x0010;
}
PDC1=Duty_Gain_A;
PDC2=Duty_Gain_B;
} |
|