[讨论] 关于Time-Base Clock Synchronization

haichao   2016-5-31 14:28 楼主
系统控制算法包括直流有刷电动机及三相鼠笼机
调试过程中发现直流有刷机启动时,有时会出现过流现象,且有时算法运行异常
查找原因后,发现是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

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复