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.

[参考译文] F28377D-SEP:启用高分辨率死区 (HRDB) 后、CMPAHR 对占空比没有影响

Guru**** 2883190 points

Other Parts Discussed in Thread: C2000WARE, SYSCONFIG

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1642554/f28377d-sep-cmpahr-has-no-effect-on-duty-cycle-when-high-resolution-dead-band-hrdb-is-enabled

器件型号: F28377D-SEP
Thread 中讨论的其他器件: C2000WARESysConfig

尊敬的 TI 专家:

我正在 C2000 MCU 上的 HRPWM 模块采用向上/向下双向计数模式。 我的目标是使用 CMPAHR 在高分辨率下调整占空比、同时使用具有固定高分辨率死区的死区模块(DBFEDHR = 20 步)。

不过、我在调试期间发现了以下问题:
当我通过 CCS 表达式的 cmpahr_ofs 动态更改 CMPAHR 寄存器时、物理输出的占空比根本不会改变(我已经确认寄存器值在存储器中成功更新)。

    fTmr=0.5*EPWM_TIMER_TBPRD;
    fTmr=__fsat(fTmr,EPWM_MAX_CMPA,EPWM_MIN_CMPA);
    Tmr_int =(Uint16)fTmr;
    Tmr_frac=(fTmr-Tmr_int)*MEP_ScaleFactor+0.5;

    EPwmRegs->CMPA.bit.CMPA  =Tmr_int;
    EPwmRegs->CMPA.bit.CMPAHR=(cmpahr_ofs<<8);


1.png

另一方面、如果在“Expressions“视图中手动更改 DBFEDHR 寄存器、就可以看到示波器上的边缘完美移动。

当 HR 死区处于活动状态时、CMPAHR 值被硬件完全忽略或被该边缘覆盖。
我的问题是:

启用高分辨率死区 (HRDB) 是否会完全覆盖或禁用 CMPAHR 对死区模块生成的边沿的影响?

如果这是预期的硬件行为(MEP 多路复用)、建议使用什么软件权变措施来同时独立控制动态高分辨率占空比和固定高分辨率死区?

我们非常感谢您对底层硬件路由的任何见解。 谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Listen、

    是否检查了在未启用死区模块的情况下 HRPWM 的操作、以验证 HRPWM 的配置是否正确? 您还可以参阅 C2000 软件中的 HRPWM 配置示例、该示例位于 C:\ti\c2000\C2000Ware_6_00_01_00\driverlib\f28p65x\examples\c28x\HRPWM。

    另请注意、“死 区上升沿延迟和下降沿延迟的 HRPWM 功能仅在死区半周期时钟运行期间适用。 出于同样的原因、MEP 步进数的大小是占空比和相位高分辨率寄存器的一半[位 15:9 ]、如  TRM 中的第 15.14.1.1 节所述。

    如果仍然无法解决您的问题、您能否共享 HRPWM 配置。

    谢谢您、
    Harisyam

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Harisyam:

    感谢您的答复。 为了帮助您充分了解我当前的应用需求和我面临的确切问题:我的目标是动态调整 高分辨率占空比(通过 CMPAHR) 、同时应用固定的高分辨率死区(通过 DBFEDHR/DBREDHR)

    但是、根据我的交叉测试、这两个功能似乎是互斥的。 通过 SysConfig 更改“死区边沿模式“、我观察到以下经验结果:


    场景 1:将“Deadband Edge Mode“(死区边缘模式)设置为“Disabled“(已禁用)时

    • 调整 cmpahr_ofs 按预期工作(占空比变化)。

    • 调整 dbfedhr_ofs 不起 作用

    场景 2:将“Deadband Edge Mode“(死区边沿模式)设置为“MEP controls falling Edge delay“(MEP 控制下降沿延迟)时

    • 调整 cmpahr_ofs 对波形完全没有影响。

    • 调整 dbfedhr_ofs 工作正常

    以下是我用于测试的运行时更新代码:

        fTmr=0.5*EPWM_TIMER_TBPRD;
    
        fTmr=__fsat(fTmr,EPWM_MAX_CMPA,EPWM_MIN_CMPA);
    
        Tmr_int =(Uint16)fTmr;
    
        Tmr_frac=(fTmr-Tmr_int)*MEP_ScaleFactor+0.5;
    
    
    
        EPwmRegs->CMPA.bit.CMPA  =Tmr_int;
    
        EPwmRegs->CMPA.bit.CMPAHR=(cmpahr_ofs<<8);
    
        EPwmRegs->DBFEDHR.all=(dbfedhr_ofs<<9);


    作为参考、以下是 SysConfig 为“Scenario 2“生成的完整初始化代码、该代码触发 HRPWM_setHiResFallingEdgeDelayOnly

        HRPWM_setEmulationMode(EPwm1_V_pos_Cmd_BASE, EPWM_EMULATION_FREE_RUN);
    
        HRPWM_setClockPrescaler(EPwm1_V_pos_Cmd_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
    
        EPWM_setTimeBasePeriod(EPwm1_V_pos_Cmd_BASE, 625);
    
        HRPWM_setTimeBaseCounter(EPwm1_V_pos_Cmd_BASE, 0);
    
        HRPWM_setTimeBaseCounterMode(EPwm1_V_pos_Cmd_BASE, EPWM_COUNTER_MODE_UP_DOWN);
    
        EPWM_enablePhaseShiftLoad(EPwm1_V_pos_Cmd_BASE);
    
        HRPWM_enablePhaseShiftLoad(EPwm1_V_pos_Cmd_BASE);
    
        HRPWM_setPhaseShift(EPwm1_V_pos_Cmd_BASE, 1);
    
        HRPWM_setSyncOutPulseMode(EPwm1_V_pos_Cmd_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
    
        EPWM_setSyncPulseSource(EPwm1_V_pos_Cmd_BASE, HRPWM_PWMSYNC_SOURCE_ZERO);
    
        EPWM_setCounterCompareValue(EPwm1_V_pos_Cmd_BASE, EPWM_COUNTER_COMPARE_A, 31);
    
        HRPWM_setCounterCompareShadowLoadMode(EPwm1_V_pos_Cmd_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
    
        EPWM_setCounterCompareValue(EPwm1_V_pos_Cmd_BASE, EPWM_COUNTER_COMPARE_B, 593);
    
        HRPWM_setCounterCompareShadowLoadMode(EPwm1_V_pos_Cmd_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
    
        HRPWM_setActionQualifierT2TriggerSource(EPwm1_V_pos_Cmd_BASE, EPWM_AQ_TRIGGER_EVENT_TRIG_DCB_1);
    
        HRPWM_setActionQualifierAction(EPwm1_V_pos_Cmd_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    
        HRPWM_setActionQualifierAction(EPwm1_V_pos_Cmd_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
    
        HRPWM_setActionQualifierAction(EPwm1_V_pos_Cmd_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
    
        HRPWM_setActionQualifierAction(EPwm1_V_pos_Cmd_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
    
        HRPWM_setActionQualifierAction(EPwm1_V_pos_Cmd_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
    
        HRPWM_setActionQualifierAction(EPwm1_V_pos_Cmd_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
    
        HRPWM_setActionQualifierAction(EPwm1_V_pos_Cmd_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    
        HRPWM_setActionQualifierAction(EPwm1_V_pos_Cmd_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
    
        HRPWM_setActionQualifierAction(EPwm1_V_pos_Cmd_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
    
        HRPWM_setActionQualifierAction(EPwm1_V_pos_Cmd_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
    
        HRPWM_setActionQualifierAction(EPwm1_V_pos_Cmd_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
    
        HRPWM_setActionQualifierAction(EPwm1_V_pos_Cmd_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
    
        HRPWM_setDeadBandDelayPolarity(EPwm1_V_pos_Cmd_BASE, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW);
    
        HRPWM_setDeadBandDelayMode(EPwm1_V_pos_Cmd_BASE, EPWM_DB_RED, true);
    
        HRPWM_setRisingEdgeDelayCountShadowLoadMode(EPwm1_V_pos_Cmd_BASE, EPWM_RED_LOAD_ON_CNTR_ZERO);
    
        HRPWM_disableRisingEdgeDelayCountShadowLoadMode(EPwm1_V_pos_Cmd_BASE);
    
        HRPWM_setRisingEdgeDelayCount(EPwm1_V_pos_Cmd_BASE, 34);
    
        HRPWM_setDeadBandDelayMode(EPwm1_V_pos_Cmd_BASE, EPWM_DB_FED, true);
    
        HRPWM_setFallingEdgeDeadBandDelayInput(EPwm1_V_pos_Cmd_BASE, EPWM_FED_LOAD_ON_CNTR_ZERO);
    
        HRPWM_disableFallingEdgeDelayCountShadowLoadMode(EPwm1_V_pos_Cmd_BASE);
    
        HRPWM_setFallingEdgeDelayCount(EPwm1_V_pos_Cmd_BASE, 34);
    
        HRPWM_setDeadBandCounterClock(EPwm1_V_pos_Cmd_BASE, EPWM_DB_COUNTER_CLOCK_HALF_CYCLE);
    
        HRPWM_setTripZoneAction(EPwm1_V_pos_Cmd_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
    
        HRPWM_setTripZoneAction(EPwm1_V_pos_Cmd_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_LOW);
    
        HRPWM_setTripZoneAction(EPwm1_V_pos_Cmd_BASE, EPWM_TZ_ACTION_EVENT_DCAEVT1, EPWM_TZ_ACTION_LOW);
    
        HRPWM_setTripZoneAction(EPwm1_V_pos_Cmd_BASE, EPWM_TZ_ACTION_EVENT_DCAEVT2, EPWM_TZ_ACTION_LOW);
    
        HRPWM_setTripZoneAction(EPwm1_V_pos_Cmd_BASE, EPWM_TZ_ACTION_EVENT_DCBEVT1, EPWM_TZ_ACTION_LOW);
    
        HRPWM_setTripZoneAction(EPwm1_V_pos_Cmd_BASE, EPWM_TZ_ACTION_EVENT_DCBEVT2, EPWM_TZ_ACTION_LOW);
    
        EPWM_enableTripZoneSignals(EPwm1_V_pos_Cmd_BASE, EPWM_TZ_SIGNAL_DCAEVT2 | EPWM_TZ_SIGNAL_DCBEVT2);
    
        HRPWM_selectDigitalCompareTripInput(EPwm1_V_pos_Cmd_BASE, EPWM_DC_TRIP_TRIPIN4, EPWM_DC_TYPE_DCAH);
    
        HRPWM_selectDigitalCompareTripInput(EPwm1_V_pos_Cmd_BASE, EPWM_DC_TRIP_TRIPIN4, EPWM_DC_TYPE_DCAL);
    
        HRPWM_setTripZoneDigitalCompareEventCondition(EPwm1_V_pos_Cmd_BASE, EPWM_TZ_DC_OUTPUT_A1, EPWM_TZ_EVENT_DCXH_HIGH);
    
        HRPWM_setTripZoneDigitalCompareEventCondition(EPwm1_V_pos_Cmd_BASE, EPWM_TZ_DC_OUTPUT_A2, EPWM_TZ_EVENT_DCXH_HIGH);
    
        HRPWM_selectDigitalCompareTripInput(EPwm1_V_pos_Cmd_BASE, EPWM_DC_TRIP_TRIPIN4, EPWM_DC_TYPE_DCBH);
    
        HRPWM_selectDigitalCompareTripInput(EPwm1_V_pos_Cmd_BASE, EPWM_DC_TRIP_TRIPIN4, EPWM_DC_TYPE_DCBL);
    
        HRPWM_setTripZoneDigitalCompareEventCondition(EPwm1_V_pos_Cmd_BASE, EPWM_TZ_DC_OUTPUT_B1, EPWM_TZ_EVENT_DCXH_HIGH);
    
        HRPWM_setTripZoneDigitalCompareEventCondition(EPwm1_V_pos_Cmd_BASE, EPWM_TZ_DC_OUTPUT_B2, EPWM_TZ_EVENT_DCXH_HIGH);
    
        HRPWM_enableInterrupt(EPwm1_V_pos_Cmd_BASE);
    
        HRPWM_setInterruptSource(EPwm1_V_pos_Cmd_BASE, EPWM_INT_TBCTR_U_CMPB);
    
        HRPWM_setInterruptEventCount(EPwm1_V_pos_Cmd_BASE, 1);
    
        HRPWM_enableADCTrigger(EPwm1_V_pos_Cmd_BASE, EPWM_SOC_A);
    
        HRPWM_setADCTriggerSource(EPwm1_V_pos_Cmd_BASE, EPWM_SOC_A, EPWM_SOC_TBCTR_U_CMPB);
    
        HRPWM_setMEPEdgeSelect(EPwm1_V_pos_Cmd_BASE, HRPWM_CHANNEL_A, HRPWM_MEP_CTRL_FALLING_EDGE);
    
        HRPWM_setCounterCompareShadowLoadEvent(EPwm1_V_pos_Cmd_BASE, HRPWM_CHANNEL_A, HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);
    
        HRPWM_setMEPEdgeSelect(EPwm1_V_pos_Cmd_BASE, HRPWM_CHANNEL_B, HRPWM_MEP_CTRL_FALLING_EDGE);
    
        HRPWM_setCounterCompareShadowLoadEvent(EPwm1_V_pos_Cmd_BASE, HRPWM_CHANNEL_B, HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);
    
        HRPWM_setHiResFallingEdgeDelayOnly(EPwm1_V_pos_Cmd_BASE, 20);


    我的问题: 基于这些观察,似乎启用高分辨率 Deadband 固有地忽略或覆盖来自的分数控制 CMPAHR

    这种相互排斥的行为是否预期? 能否 CMPAHR DBFEDHR 在同一信号边沿上一起工作、或者启用 HR 死区是否 CMPAHR 通过设计完全覆盖?

    我期待着您的见解。 谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Listen、

    你是对的。 由于有一个由 CMPAHR 或 DBFEDHR 控制的 MEP、因此当启用死区边沿模式时、无法由 CMPAHR 控制。 该配置通过 HRCNFG 和 HRCNFG2 寄存器来完成。

    这在 TRM 的第 15.14.1.1 节中进行了讨论。

    希望这能回答您的问题。

    谢谢、
    Harisyam