您好,我在使用epwm模块时配置了EPWM1-5五路,他们的周期是相同的,且都与EPWM1同步(CNT=0时)。对EPWM1配置了一个中断,每三个周期触发一次,在中断函数内对EPWM2-5的AQ进行设置。具体的代码如下:
中断函数的配置,其中利用ConfigEpwm()函数对EPWM2-5的AQ进行设置
ConfigEpwm()函数如下:
目前出现的问题是,如果我把EPWM2的AQ和死区先配置,再配置EPWM3的AQ和死区,就会导致EPWM3、4、5发波不正确,具体的波形如下:(红色是中断函数中的GPIO翻转,以表明进入哪一次中断;黄色和蓝色分别是EPWM3A和EPWM3B。此处只看了EPWM3,此时EPWM4和5的波形和EPWM3一样)
而如果我先配置EPWM2的AQ和EPWM3的AQ,再配置EPWM2的死区和EPWM3的死区。此时可以得到正确的波形,波形如图所示。此时EPWM4和EPWM5的AQ和死区配置的代码可以随意放置顺序都不会出错。
在配置任何ePWM寄存器之前,您能确认TBCLKSYNC=0吗?那么,当设置完ePWM初始化后,TBCLKSYNC=1吗?
如果您正在使用Device_init()函数,默认情况下,所有时钟/外围设备都已启用,这可能是您在初始化ePWM时看到此行为的原因。
为ePWM2或ePWM3设置AQ然后DB的顺序不应影响输出。
您好,请问我该怎么确定配置前后的TBCLKSYNC的值呢,有什么操作是可以去确保的吗。目前我又出现了新的问题,我在epwm1的中断里面对epwm4和5的CMPA和CMPB进行赋值(两个EPWM都和EPWM1同步),但是偶尔会出现出中断函数执行完后的第一二个周期EPWM发波不正确的情况(并非每次中断,间歇性出现)。但是我是十个周期进一次中断,后续8个周期的epwm的波形又是正常的,说明CPMA和CMPB的配置是对的,只是赋值前后可能出现了一点问题。
在中断中配置epwm4和5的代码如下:
void PWM_SetSR(int Dir, int Period, int Delay, int Width) { //设置开关时间
switch(Dir) {
case FORWARD: // 正向
if(Delay >= 0) {
EPwm4Regs.TBCTL.bit.PHSDIR = 0; // 同步方向:0->Count-Down[56滞后14]; 1->Count-Up[56超前14]
EPwm4Regs.TBPHS.bit.TBPHS = Delay; //!!!!!!同类型的TBPHS寄存器改过,后面注意查
EPwm5Regs.TBCTL.bit.PHSDIR = 0; // 同步方向:0->Count-Down[56滞后14]; 1->Count-Up[56超前14]
EPwm5Regs.TBPHS.bit.TBPHS = Delay; //!!!!!!同类型的TBPHS寄存器改过,后面注意查
}
else {
EPwm4Regs.TBCTL.bit.PHSDIR = 1;
EPwm4Regs.TBPHS.bit.TBPHS = -Delay;
EPwm5Regs.TBCTL.bit.PHSDIR = 1;
EPwm5Regs.TBPHS.bit.TBPHS = -Delay;
}
EPwm4Regs.CMPA.bit.CMPA = Width;
EPwm4Regs.CMPB.bit.CMPB = Period - Width;
EPwm5Regs.CMPA.bit.CMPA = Width;
EPwm5Regs.CMPB.bit.CMPB = Period - Width;
break;
default:
break;
}
}
问题波形如下图所示:
其中黄色的波形和蓝色的波形分别对应epwm5a和epmw5b,二者驱动半桥的对管,红色波形是黄色波形驱动管的VDS。在错误发生时,蓝色波形的占空比突然增大(从时间上看似乎是配置的CAU关断变成了PRD关断),紧接着黄色驱动丢波,蓝色波形又提前开通。但后续又能正常发波。