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.

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);寄存器后,便会发生高精度占空比不生效的情况。

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

  • 关于高精度占空比HRPWM我还有几个问题:

    1、关于HRPWM的触发时刻,是在什么时刻对输出就行修改的,是在AQ之后,还是在死区后面?

    2、关于HRPWM的特性,加载时刻需要选择HRPWM_LOAD_ON_CNTR_ZERO_PERIOD;若仅选择HRPWM_LOAD_ON_CNTR_ZERO;似乎会导致上升、下降沿往一边移动;或者高精度占空比的边沿移动方向相反;我想知道我是否能利用相关特性进行HRPWM的配置?即我就需要上升、下降沿都朝向一边移动。

  • 已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 你好,是否有找到相关资料?

  • 您好

    关于您提出的两个关于HRPWM的问题:

    1. HRPWM在什么情况下修改输出边沿:AQ之后还是死区之后?

    HR(硬件资源)边沿放置应用于从比较/AQ路径生成的PWM边沿。如果启用了死区,则死区模块会作用于该PWM路径/输出选择。死区输入来自AQ生成的PWM路径,因此从概念上讲,HR边沿放置发生在PWM生成侧,而死区位于其下游,除非您专门使用HR死区功能。

    2. 为什么通常需要HRPWM_LOAD_ON_CNTR_ZERO_PERIOD,并且两个边缘是否可以移动到一侧?

    对于由MEP控制两个边缘的上下模式,PWM应集中在PRD上,以便内部HR逻辑能够正确计算上升沿和下降沿的位置。这就是为什么LOAD_ON_CNTR_ZERO_PERIOD通常是正确的选择。如果你反转AQ极性/动作感测,即使硬件工作正常,HR的占空比行为也可能看起来“相反”。

    所以,是的,你可以使用不同的AQ极性/动作组合,但这样HR职责调整的明显方向可能会发生逆转。

    对于两个边缘的真正同向运动,通常需要采用不同的控制方法,如相位/周期控制或不同的脉宽调制(PWM)方案,而不仅仅是依赖于中心水平速率(HR)占空比更新。

    EPWM全局加载寄存器CMPA_CMPAHR是一个有效的全局加载寄存器,一旦启用全局加载功能,影子寄存器到活动寄存器的转换将由全局加载触发路径控制,而非单个寄存器加载路径。在单次触发模式下,加载仅在单次触发锁存就绪且选定的全局加载触发事件发生后才会执行。

    在你的代码中,启用CMPA:CMPAHR的全局加载后,比较更新不再仅受控于

    HRPWM_setCounterCompareShadowLoadEvent()

    它现在还取决于:EPWM_setGlobalLoadTrigger()函数以及通过EPWM_setGlobalLoadOneShotLatch()函数启用的一次性锁存,还有全局加载预分频计数。

    调用EPWM_setGlobalLoadEventPrescale(myEPWM1_BASE, 7U)后,全局加载脉冲仅在选定触发事件达到预设次数后才会发出,因此HR占空比更新看似并未立即生效。

    您的AQ方案仍使用ZERO/PERIOD事件,这在双向模式下调整双边时对HR占空比控制并不理想。您应避免依赖AQ动作在ZERO/PERIOD时对HR控制的输出进行调节;优先采用CMPx上升/下降事件生成边沿。