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.

[参考译文] TMS320F28069:当通过向 PWM1添加相位差来操作 PWM2时、在相位差中、PWM2的输出定期成为一个跳周期。

Guru**** 2042920 points
Other Parts Discussed in Thread: TMS320F28069, TMDSCNCD28069
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/624205/tms320f28069-when-pwm2-was-operated-by-adding-a-phase-difference-to-pwm1-in-a-phase-difference-the-output-of-pwm2-periodically-becomes-a-skip-cycle

器件型号:TMS320F28069
主题中讨论的其他器件: TMDSCNCD28069

你好。 每个人。

我对 TMS320F28069的 HRPWM 有疑问。

当通过向 PWM1添加相位差来操作 PWM2时、在相位差中、PWM2的输出定期成为跳周期。 *1.

如何摆脱 PWM2输出跳周期?

*发生跳频的1相位值(EPwm2Regs.TBPHS.ALL)
0x00AE9800至0x00AEFF00
0x00AF2000到0x00AFFF00
0x00B02000到0x00B07700

正常波形

黄色:PWM1A、青色:PWM1B、品红色:PWM2A、绿色:PWM2B

非法波形

黄色:PWM1A、青色:PWM1B、品红色:PWM2A、绿色:PWM2B


可以立即发送项目文件。

此致、
Maekawa

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

    您能否为 EPWM1和2发布 ePWM 和 HRPWM 配置代码?

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

    您好、Kris - San。

    感谢您的快速回复。

    PWM 和 HRPWM 的寄存器设置如下。

    // ePWM1
    EALLOW;
    EPwm1Regs.TBPRD = 0x0160;
    EPwm1Regs.TBPRDHR = 0xF000;
    EPwm1Regs.TBPHS.Half.TBPHS = 0U;
    EPwm1Regs.TBPHS.Half.TBPHSHR = 0U;
    EPwm1Regs.TBCTR = 0;
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_updown;
    EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE;
    EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
    
    EPwm1Regs.CMPA.ALL = 0x00B07800;
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO _PRD;
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;
    
    EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;
    EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
    
    EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
    EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
    EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;
    EPwm1Regs.DBCTL.bit.HALFCYCLE = 1;
    EPwm1Regs.DBRED = 24;
    EPwm1Regs.DBFED = 24;
    
    EPwm1Regs.TZSEL.bit.OSHT1 = TZ_ENABLE;
    EPwm1Regs.TZSEL.bit.OSHT2 = TZ_ENABLE;
    EPwm1Regs.TZSEL.bit.OSHT3 = TZ_ENABLE;
    EPwm1Regs.TZSEL.bit.DCAEVT1 = TZ_ENABLE;
    EPwm1Regs.TZSEL.bit.DCBEVT1 = TZ_ENABLE;
    EPwm1Regs.TZSEL.bit.DCAEVT2 = TZ_DISABLE;
    EPwm1Regs.TZSEL.bit.DCBEVT2 = TZ_DISABLE;
    EPwm1Regs.TZSEL.bit.CBC1 = TZ_DISABLE;
    EPwm1Regs.TZSEL.bit.CBC2 = TZ_DISABLE;
    EPwm1Regs.TZSEL.bit.CBC3 = TZ_DISABLE;
    
    EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
    EPwm1Regs.TZCTL.bit.TSB = TZ_FORCE_LO;
    EPwm1Regs.TZCTL.bit.DCAEVT1 = TZ_NO_CHANGE;
    EPwm1Regs.TZCTL.bit.DCBEVT1 = TZ_NO_CHANGE;
    EPwm1Regs.TZCTL.bit.DCAEVT2 = TZ_NO_CHANGE;
    EPwm1Regs.TZCTL.bit.DCBEVT2 = TZ_NO_CHANGE;
    
    EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = DC_COMP2OUT;
    EPwm1Regs.DCTRIPSEL.bit.DCBHCOMPSEL = DC_COMP3OUT;
    EPwm1Regs.DCTRIPSEL.bit.DCALCOMPSEL = DC_TZ2;
    EPwm1Regs.DCTRIPSEL.bit.DCBLCOMPSEL = DC_TZ3;
    
    EPwm1Regs.TZDCSEL.bit.DCAEVT1 = TZ_DCAH_HI;
    EPwm1Regs.TZDCSEL.bit.DCBEVT1 = TZ_DCBH_HI;
    EPwm1Regs.TZDCSEL.bit.DCAEVT2 = TZ_FCAL_LOW;
    EPwm1Regs.TZDCSEL.bit.DCBEVT2 = TZ_DCBL_LOW;
    
    EPwm1Regs.TZCLR.ALL = 0x007F;
    
    EPwm1Regs.DCACTL.bit.EVT1SRCSEL = DC_EVT1;
    EPwm1Regs.DCACTL.bit.EVT1FRCSYNCSEL = DC_EVT_SYNC;
    EPwm1Regs.DCBCTL.bit.EVT1SRCSEL = DC_EVT1;
    EPwm1Regs.DCBCTL.bit.EVT1FRCSYNCSEL = DC_EVT_SYNC;
    EPwm1Regs.DCACTL.bit.EVT2SRCSEL = DC_EVT2;
    EPwm1Regs.DCACTL.bit.EVT2FRCSYNCSEL = DC_EVT_SYNC;
    EPwm1Regs.DCBCTL.bit.EVT2SRCSEL = DC_EVT2;
    EPwm1Regs.DCBCTL.bit.EVT2FRCSYNCSEL = DC_EVT_SYNC;
    
    EPwm1Regs.HRCNFG.bit.EDGMODE = HR_BEP;
    EPwm1Regs.HRCNFG.bit.CTLMODE = HR_CMP;
    EPwm1Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO _PRD;
    EPwm1Regs.HRCNFG.bit.SELOUTB = HR_NORM_B;
    EPwm1Regs.HRCNFG.bit.AUTOCONV = 1;
    EPwm1Regs.HRCNFG.bit.SWAPAB = HR_NORM_B;
    
    EPwm1Regs.HRPCTL.bit.TBPHSHRLOADE = 1;
    EPwm1Regs.HRPCTL.bit.HRPE = 1;
    EDIS;
    
    // ePWM2
    EALLOW;
    EPwm2Regs.TBPRD = 0x0160;
    EPwm2Regs.TBPRDHR = 0xF000;
    uiDebug_TBPHS_ePWM2 = 0x00B07800;
    EPwm2Regs.TBPHS.ALL = uiDebug_TBPHS_ePWM2;
    EPwm2Regs.TBCTR = 0;
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
    EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;
    EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
    EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
    EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
    EPwm2Regs.TBCTL.bit.PHSDIR = TB_DOWN;
    
    EPwm2Regs.CMPA.ALL = 0x00B07800;
    EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD;
    EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    
    EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;
    EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;
    
    EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
    EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
    EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL;
    EPwm2Regs.DBCTL.bit.HALFCYCLE = 1;
    EPwm2Regs.DBRED = 24;
    EPwm2Regs.DBFED = 24;
    
    EPwm2Regs.TZSEL.bit.OSHT1 = TZ_ENABLE;
    EPwm2Regs.TZSEL.bit.OSHT2 = TZ_ENABLE;
    EPwm2Regs.TZSEL.bit.OSHT3 = TZ_ENABLE;
    EPwm2Regs.TZSEL.bit.DCAEVT1 = TZ_ENABLE;
    EPwm2Regs.TZSEL.bit.DCBEVT1 = TZ_ENABLE;
    EPwm2Regs.TZSEL.bit.DCAEVT2 = TZ_DISABLE;
    EPwm2Regs.TZSEL.bit.DCBEVT2 = TZ_DISABLE;
    EPwm2Regs.TZSEL.bit.CBC1 = TZ_DISABLE;
    EPwm2Regs.TZSEL.bit.CBC2 = TZ_DISABLE;
    EPwm2Regs.TZSEL.bit.CBC3 = TZ_DISABLE;
    
    EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
    EPwm2Regs.TZCTL.bit.TSB = TZ_FORCE_LO;
    EPwm2Regs.TZCTL.bit.DCAEVT1 = TZ_NO_CHANGE;
    EPwm2Regs.TZCTL.bit.DCBEVT1 = TZ_NO_CHANGE;
    EPwm2Regs.TZCTL.bit.DCAEVT2 = TZ_NO_CHANGE;
    EPwm2Regs.TZCTL.bit.DCBEVT2 = TZ_NO_CHANGE;
    
    EPwm2Regs.DCTRIPSEL.bit.DCAHCOMPSEL = DC_COMP2OUT;
    EPwm2Regs.DCTRIPSEL.bit.DCBHCOMPSEL = DC_COMP3OUT;
    EPwm2Regs.DCTRIPSEL.bit.DCALCOMPSEL = DC_TZ2;
    EPwm2Regs.DCTRIPSEL.bit.DCBLCOMPSEL = DC_TZ3;
    
    EPwm2Regs.TZDCSEL.bit.DCAEVT1 = TZ_DCAH_HI;
    EPwm2Regs.TZDCSEL.bit.DCBEVT1 = TZ_DCBH_HI;
    EPwm2Regs.TZDCSEL.bit.DCAEVT2 = TZ_FCAL_LOW;
    EPwm2Regs.TZDCSEL.bit.DCBEVT2 = TZ_DCBL_LOW;
    
    EPwm2Regs.TZCLR.ALL = 0x007F;
    
    EPwm2Regs.DCACTL.bit.EVT1SRCSEL = DC_EVT1;
    EPwm2Regs.DCACTL.bit.EVT1FRCSYNCSEL = DC_EVT_SYNC;
    EPwm2Regs.DCBCTL.bit.EVT1SRCSEL = DC_EVT1;
    EPwm2Regs.DCBCTL.bit.EVT1FRCSYNCSEL = DC_EVT_SYNC;
    EPwm2Regs.DCACTL.bit.EVT2SRCSEL = DC_EVT2;
    EPwm2Regs.DCACTL.bit.EVT2FRCSYNCSEL = DC_EVT_SYNC;
    EPwm2Regs.DCBCTL.bit.EVT2SRCSEL = DC_EVT2;
    EPwm2Regs.DCBCTL.bit.EVT2FRCSYNCSEL = DC_EVT_SYNC;
    
    EPwm2Regs.HRCNFG.bit.EDGMODE = HR_BEP;
    EPwm2Regs.HRCNFG.bit.CTLMODE = HR_CMP;
    EPwm2Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO _PRD;
    EPwm2Regs.HRCNFG.bit.SELOUTB = HR_NORM_B;
    EPwm2Regs.HRCNFG.bit.AUTOCONV = 1;
    EPwm2Regs.HRCNFG.bit.SWAPAB = HR_NORM_B;
    
    EPwm2Regs.HRPCTL.bit.TBPHSHRLOADE = 1;
    EPwm2Regs.HRPCTL.bit.HRPE = 1;
    EDIS;
    
    

    此致、

    Maekawa

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

    您好、Maekawa、

    寄存器设置与我所说的内容完全不同。 我将努力让您的代码在本地设备上运行、看看我是否可以复制它。

    此致、

    Kris

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

    您好、Kris - San、

    感谢你的答复。

    我可以提供可与 TMDX28069USB 或 TMDSCNCD28069配合使用的项目文件。

    此致、
    Maekawa

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

    您好、Maekawa、

    这将非常有帮助。 请上传项目、这样会加快调试。

    此致、

    Kris

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

    您好、Kris - San、

    共享项目文件。

    e2e.ti.com/.../F28069_5F00_HRPWM_5F00_skip_5F00_cycle.zip

    此致、
    Maekawa

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

    这是因为您加载的相位值在 CMPA 递增事件的3个周期内。 因此、您的 PWM 不会被清除、并在下一个周期前保持高电平。

    这是由于 HRPWM 附带的3周期限制。 在启用 HR 的向上向下模式下、周期开始后的前3个周期不能有比较事件、因为它将产生与您看到的类似的未定义行为。 这可以通过设置 TBPHSHR = 0来确认、并且可以看到您的波形现在按预期工作、或者加载任何小于 TBPHS - 3的值、并且在 TBPHSHR 中具有非零值的情况下看到正确的波形。

    我注意到、您的示例中还有一些其他注意事项、但我知道这可能只是用于调试:

    -确保校准 HRPWM。 通常您只需在初始化时运行 SFO ()即可完成此操作。 当我运行您的代码时、HRMSTEP 设置为0、这可能会在道路上引起很多问题(超出不精确度)。 SFO 将根据您的特定器件在完成时自动填充此信息。

    -您持续以接近3MHz 的频率对 TBPHSHR 寄存器进行编程。 这也会导致任何 CMP/PRD/PHS 寄存器出现许多问题。 最好在每个 PWM 周期中对此进行一次写入。 例如、我使用了一个基于 EPWM1 TBCTR = 0的中断。

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

    感谢您的回答。

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

    除了不将有问题的值设置为 EPwm2Regs.TBPHS.ALL 之外、还有其他权变措施吗?

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

    您好、Maekawa、

    没有权变措施-它只是外设的设计方式。 HRPWM 在前几个周期内对寄存器执行更新、因此有可能丢失事件。 如果您需要加载这些值、从工作台看、如果 CMP 寄存器的 HR 部分为0、则似乎可以正常工作。 但是、我并不相信情况总是如此。

    此致、

    Kris

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

    您好、Kris - San、

    感谢你的答复。

    我不能说没有解决办法。

    此致、
    Maekawa

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

    客户还有其他问题。
    ※有人请求将 TIJ FAE 发布到 E2E。

    【问题1】
    如果 EPwm2Regs.TBCTL.bit.PHSDIR = TB_UP 被置位、则看起来是(PWM2向 PWM1移动的方向)。

    PWM2A =低电平/ PWM2B =高电平

    →当实际检查时、没有跳周期。

    因此、跳周期似乎只在 EPwm2Regs.TBCTL.bit.PHSDIR = TB_DOWN 时发生。


    【问题2】
    当设置为向上计数模式或向下计数模式时、设置 TBPRD = 0x02C0E100 (设置与向上计数模式相同的频率)。

    ·当 TBPHS = 0x00000000 (无偏差)时、
    PWM2A =低电平/ PWM2B =高电平

    ·当 TBPHS = 0x015FF000 (180度]移位)时、
    PWM2A =高电平/ PWM2B =低电平保持

    或者、在向上计数模式下可能不会发生这种情况、因为跳周期仅在向下计数模式下发生。
    →这是未经确认的。

    是否仅在上行-下行模式和 PHSDIR = TB_DOWN 时才发生跳周期?
    即使在其他运行模式下、也会发生这种现象、具体取决于同步信号和 PWM2的上升/下降时序?


    在示例项目中、TBPHS 寄存器的写入速度大约为3MHz、这是为了进行调试。
    通常、它是在 PWM 更新的具体时间写入的。

    对于(;)

        GpioDataRegs.GPBTOGGLE.bit.GPIO 34=1;
        EALLOW;
        EPwm2Regs.TBPHS.ALL = uiDebug_TBPHS_ePWM2;
        EDIS;


    此致、
    Maekawa
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将附加问题发布回以下主题。
    e2e.ti.com/.../638299