系统控制算法包括直流有刷电动机及三相鼠笼机
调试过程中发现直流有刷机启动时,有时会出现过流现象,且有时算法运行异常
查找原因后,发现是TB同步的问题,写在这里,与大家分享。
main函数初始化将ePWM配置为ACI控制方式
void main(void)
{
...
InitSysCtrl(); //SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0-->Disable TBCLK
InitEPwmGpio();
EALLOW;
SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1; // ePWM1
SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1; // ePWM2
SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1; // ePWM3
EDIS;
InitEPwm_ACI();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; //Start TBCLK
EDIS;
EPwm1Regs.CMPA.half.CMPA = 0;
EPwm2Regs.CMPA.half.CMPA = 0;
EPwm3Regs.CMPA.half.CMPA = 0;
...
while(1)
{
;
}
}
在初始化中,对ePWM的配置过程是正确的,TB手册24页有如下描述:
我的启动函数代码如下:
void motor_start(void)
{
...
if( motor_type == _ACI )
{
InitEPwm_ACI();
}
else if( motor_type == _BDC )
{
InitEPwm_BDC();
}
...
}
调试时的现象是如果上电后运行鼠笼电机,是正常的;
之后更换机组,运行直流有刷电机时,有时启动过流,有时算法运行异常,不断的情况下,在换成鼠笼机也是有时异常。
代码是很久以前写的,查了下手册才发现是配置ePWM的时候没有停止TB,修改启动函数后,解决了上述问题:
void motor_start(void)
{
...
if( motor_type == _ACI )
{
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; //Stop TBCLK
EDIS;
InitEPwm_ACI();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; //Start TBCLK
EDIS;
}
else if( motor_type == _BDC )
{
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; //Stop TBCLK
EDIS;
InitEPwm_BDC();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; //Start TBCLK
EDIS;
}
...
}
由于有时电机运行异常,有时电机运行正常,所以直观上不好想是哪里出现的问题,28335的PWM单元模块化细分以后,各模块的同步要控制好,手册24的那个描述大家调试的时候留意下,要按照操作顺序配置ePWM