This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于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