TI中文支持网
TI专业的中文技术问题搜集分享网站

关于Time-Base Clock Synchronization

系统控制算法包括直流有刷电动机及三相鼠笼机

调试过程中发现直流有刷机启动时,有时会出现过流现象,且有时算法运行异常

查找原因后,发现是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

Jason Wu4:

非常用心的经验总结,谢谢分享!

赞(0)
未经允许不得转载:TI中文支持网 » 关于Time-Base Clock Synchronization
分享到: 更多 (0)