TMS320F280049: 关于280049C的PWM全局加载、一次加载与高精度HRPWM共用的问题

Part Number: TMS320F280049

Hi Ti Team:

我在使用280049这一款芯片配置PWM的一次加载模式与高精度占空比时,发现高精度占空比不起作用,经过排查发现是因为使用了一次加载导致的,但我没有在相关文档中看到一次加载与高精度占空比的使用存在冲突或有相关限制。

为了方便排查,我在“hrpwm_ex4_duty_updown”的例程中复现了该现象,可以帮我排查一下是配置导致的问题还是的确有该限制?

下面是增加的相关配置代码

    //
    // Disable sync(Freeze clock to PWM as well)
    //
    SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);

    //
    // Initialize the EPWM GPIOs and change XBAR inputs from using GPIO0
    //
    Board_init();

    initHRPWM_ChannelB(EPWM_TIMER_TBPRD);
    EALLOW;
    //使能全局加载
    // 1. 使能 TBPRD, CMPA, CMPB 参与全局加载//GLDCFG
    EPWM_enableGlobalLoad(myEPWM1_BASE);//使能全局加载
    EPWM_setGlobalLoadTrigger(myEPWM1_BASE, EPWM_GL_LOAD_PULSE_CNTR_ZERO);//下降沿加载
    EPWM_enableGlobalLoadOneShotMode(myEPWM1_BASE);// 启用 One-Shot 模式(每次触发只加载一次)
    EPWM_setGlobalLoadOneShotLatch(myEPWM1_BASE);//设置One shot global shadow
    EPWM_setGlobalLoadEventPrescale(myEPWM1_BASE,7U);
    EPWM_enableGlobalLoadRegisters(myEPWM1_BASE,EPWM_GL_REGISTER_CMPA_CMPAHR);//使能此寄存器后便会发生该问题

    //调整时基
    EPWM_setTimeBasePeriod(myEPWM1_BASE, EPWM_TIMER_TBPRD);
    EPWM_setTimeBasePeriod(myEPWM2_BASE, EPWM_TIMER_TBPRD);
    EPWM_setTimeBasePeriod(myEPWM3_BASE, EPWM_TIMER_TBPRD);
    EPWM_setTimeBasePeriod(myEPWM4_BASE, EPWM_TIMER_TBPRD);
    //修改AQ动作寄存器
    HRPWM_setActionQualifierShadowLoadMode(myEPWM1_BASE, EPWM_ACTION_QUALIFIER_A, EPWM_AQ_LOAD_ON_CNTR_ZERO);
    HRPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    HRPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
    HRPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
    HRPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
    HRPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
    HRPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);

    //HRPWM
    HRPWM_setCounterCompareShadowLoadEvent(myEPWM1_BASE, HRPWM_CHANNEL_A, HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);
    HRPWM_setMEPEdgeSelect(myEPWM1_BASE, HRPWM_CHANNEL_A, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE);
    HRPWM_setMEPControlMode(myEPWM1_BASE, HRPWM_CHANNEL_A, HRPWM_MEP_DUTY_PERIOD_CTRL);//HRPWM_MEP_PHASE_CTRL
    HRPWM_enableAutoConversion(myEPWM1_BASE);
    HRPWM_enablePeriodControl(myEPWM1_BASE);
    EDIS;
    //
    // Enable sync and clock to PWM
    //
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);

使能了EPWM_enableGlobalLoadRegisters(myEPWM1_BASE,EPWM_GL_REGISTER_CMPA_CMPAHR);寄存器后,便会发生高精度占空比不生效的情况。

如果有相关信息,感谢告知