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.

[参考译文] TMS320F28384D:PWM 影子寄存器争用

Guru**** 2874030 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1621671/tms320f28384d-pwm-shadow-register-contention

器件型号: TMS320F28384D
主题: SysConfig 中讨论的其他器件

您好:

当我将 PWM 输出从完全关闭转换为高电平有效互补时、我认为加载的影子寄存器存在一些争用。  我将更改 DBCTL 和 AQCTLA/B 寄存器、它们通过全局加载寄存器配置为在 SYNCIN 事件发生时加载。

以下是关闭 PWM 输出然后再次打开它们的步骤。

要关闭:

  1. 将 DBCTL.OUT_MODE 设置为 2、以绕过输出 B 上的死区模块
  2. 将所有 AQCTLA 和 AQCTLB 设置为 1、以便在发生所有事件时清除输出

要打开它们:

  1. 将 DBCTL.OUT_MODE 设置为 3、以重新启用输出 B 上的死区
  2. 设置 AQCTLA 可将输出设置为 TBCTR = ZRO
  3. 设置 AQCTLA 可将输出设置为 TBCTR = CAD
  4. 设置 AQCTLA 以在 TBCTR = CAU 时清除输出
  5. 所有其他 AQCTLA 寄存器设置为“无操作“。

结果是、除了从关断转换时输出 B 上的 8ns 至 12ns 小突降(在我的图像中以红色圈出)外、我的 PWM 完全满足我的需求。  从快速方向到相应通道翻转高电平的测量值、正好是我设置的 1 微秒死区的时间。

处理器在何时加载哪些影子寄存器时遵循某种顺序吗?  如果在动作限定器寄存器之前加载死区影子寄存器、就会解释这种行为、因为对于高电平有效极性、如果 A 为低电平、输出 B 会想要导通。  这是预期行为还是可以通过其他方式打开/关闭 PWM 来避免这种异常情况?

image.png

谢谢、

Will

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

    将会、

    可以通过将 AQCLTA 和 AQCTLB 设置为影子化寄存器来解决这个问题。 默认情况下、这些寄存器会立即加载。 您观察到的 8ns 至 12ns 快速波是由于 AQCTLA 和 AQCTLB 寄存器未进行影子化(即立即执行)导致的、这意味着它们在写入时立即更新、而不是与 SYNCIN 事件同步(影子加载就是这种情况)。 此外、TRM 中的 ePWM 模块信号路径会显示动作限定符 (AQ) 子模块输出馈送到死区 (DB) 子模块中。 这会产生时序不匹配、其中动作限定器寄存器在死区控制寄存器之前生效、导致在转换期间输出 A 为低电平时输出 B 短暂激活。

    另一个可以开启和关闭 PWM 的干净解决方案: 不使用操作动作限定符寄存器来打开/关闭输出、而是使用跳闸区 (TZ) 子模块、该子模块位于信号路径中死区模块的下游。 这种方法可使动作限定器和死区配置保持恒定、并使用 TZ 强制输出进入已知状态(高,低或高阻抗)、同时提供同步控制而不会出现时序问题。

    请告诉我这些解决方案是否适合您。

    此致、

    Sumit

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

    您好 Sumit、

    感谢您的答复。  通过配置以下各项、我确实将 AQCTLA 和 AQCTLB 作为由 SYNCIN 事件加载的影子寄存器:

    AQCTL.SHDWAQAMODE 和 AQCTL.SHDWAQBMODE 更改为 1
    AQCTL.LDAQASYNC 和 AQCTL.LDAQBSYNC 更改为 2

    我希望在发生 SYNCIN 事件时更新所有内容、该事件由作为我们计时器的不同 PWM 供电。  根据我所能说的、一切似乎都在 SYNCIN 事件上正确更新、因为我有一个 GPIO 以 SYNCIN 信号的速率切换、并且它与我们的 PWM 变化一致。

    我将探究跳闸区模块、但理想情况下、我希望在 SYNCIN 边界处开启/关闭所有内容、并且 TZ 模块似乎就在即刻运行。  我必须调查这是否对我们有用。   

    但是、现在您知道我已将 AQCTL 配置为影子寄存器、那么您知道还有什么原因会导致出现这种异常情况吗? 这可能是因为死区寄存器依赖于全局加载设置来在 SYNCIN 上加载、而 AQCTL 寄存器有自己的 SYNCIN 设置、不使用全局加载?

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

    将会、

    我认为您的分析是正确的 — 这确实是影子寄存器加载序列问题。 发生干扰的原因是 DBCTL 和 AQCTL 寄存器在 SYNCIN 事件期间不会同时加载、尽管两者都配置为基于 SYNCIN 的顺序加载。  正确的解决方案是使用全局加载功能来确保在发生 SYNCIN 事件时同时加载 DBCTL 和 AQCTL 寄存器。

    您可以按照如下所示的顺序操作、并查看问题是否得到解决:

    //步骤 1:为 DBCTL 寄存器启用全局加载
    EPWM_enableGlobalLoadRegisters (BASE、EPWM_GL_REGISTER_DBCTL);

    //步骤 2:为 AQCTLA 寄存器启用全局加载
    EPWM_enableGlobalLoadRegisters (BASE、EPWM_GL_REGISTER_AQCTLA_AQCTLA2);

    //步骤 3:为 AQCTLB 寄存器启用全局加载
    EPWM_enableGlobalLoadRegisters (BASE、EPWM_GL_REGISTER_AQCTLB_AQCTLB2);

    //步骤 4:将全局加载触发器设置为同步事件
    EPWM_setGlobalLoadTrigger (BASE、EPWM_GL_LOAD_PULSE_SYNC);

    //步骤 5:启用全局加载模式
    EPWM_enableGlobalLoad (base);

    启用全局加载后、所有配置的寄存器将在 SYNCIN 事件发生时同时将其影子值加载到活动寄存器、从而消除导致干扰的时序不匹配。

    此致、

    Sumit

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

    您好 Sumit、

    我按照您的建议启用了动作限定符的全局加载、但在打开 PWM 时仍能看到嘟嘟声。  我通过删除其他动作限定器初始化代码并在逻辑分析仪上验证时序来确保应用了全局加载。  很遗憾、我不确定还要尝试什么。

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

    将会、

    让我在我这边复制一下、看看我能找到什么。 我明天会回来的。  

    此致、

    Sumit

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

    将会、

    您是否使用 SysConfig 创建了此工程? 如果是、您能向我发送您的设置吗? 我想确保配置完全相同、周期、占空比和死区数字也相同。

    此外、如果您可以发送用于关闭和打开的代码、这也会很有帮助。

    此致、

    Sumit

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

    您好 Sumit、

    否、我没有使用 SysConfig 创建工程。  下面是一些显示 init、on 和 off 函数的简化代码。  如果您需要任何未包含的其他详细信息、请告诉我。

    谢谢、

    Will

    #include "f2838x_device.h"
    
    void Init()
    {
       volatile struct EPWM_REGS *EPwmRegsPointer = &EPwm1Regs;
    
        /* Global Load.  Load DBCTL, AQ, and CMP shadow registers on SYNCIN signal */
        EPwmRegsPointer->GLDCTL.bit.GLDMODE = 3;
        EPwmRegsPointer->GLDCTL.bit.GLDPRD = 1;
        EPwmRegsPointer->GLDCFG.bit.DBCTL = 1;
        EPwmRegsPointer->GLDCFG.bit.AQCTLA_AQCTLA2 = 1;
        EPwmRegsPointer->GLDCFG.bit.AQCTLB_AQCTLB2 = 1;
        EPwmRegsPointer->GLDCFG.bit.CMPA_CMPAHR = 1;
        EPwmRegsPointer->GLDCFG.bit.CMPB_CMPBHR = 1;
        EPwmRegsPointer->GLDCTL.bit.GLD = 1;
    
    
        /******************************************************************
            * -- Setup Time-Base (TB) Submodule --
            *****************************************************************/
        /* Setup period */
        EPwmRegsPointer->TBPRD = 5000;
        /* counter mode: Up-down count mode */
        EPwmRegsPointer->TBCTL.bit.CTRMODE = 2;
        /* High Speed tb clock Prescale:  /1 */
        EPwmRegsPointer->TBCTL.bit.HSPCLKDIV = 0;
        /* Clock Pre-Scale: /1 */
        EPwmRegsPointer->TBCTL.bit.CLKDIV = 0;
        /* counter: Free run FOR DEBUG PURPOSES ONLY */
        EPwmRegsPointer->TBCTL.bit.FREE_SOFT = 2;
        /* Enable Phase Shift */
        EPwmRegsPointer->TBCTL.bit.PHSEN = 1;
        /* Set Counter to 0 */
        EPwmRegsPointer->TBCTR = 0;
        /* Set Phase Shift to 0 */
        EPwmRegsPointer->TBPHS.all = 0;
        /* Sync on TBCTR = 0 */
        EPwmRegsPointer->TBCTL2.bit.PRDLDSYNC = 0;
        /* PWM_10 is what other PWMs are synced to.  It has same clock settings, up/down count mode, and TBPRD=5000*/
        EPwmRegsPointer->EPWMSYNCINSEL.bit.SEL = 10;
    
        /******************************************************************
            * -- Setup Deadband (DB) Submodule --
            ******************************************************************/
        EPwmRegsPointer->DBCTL2.bit.SHDWDBCTLMODE = 1;
        EPwmRegsPointer->DBCTL2.bit.LOADDBCTLMODE = 0;
        /* Active High Complementary(AHC) */
        EPwmRegsPointer->DBCTL.bit.POLSEL = 2;
        /* Disable deadband on B to force it low to start */
        EPwmRegsPointer->DBCTL.bit.OUT_MODE = 2;
        /* Shadow Mode for DBRED and DBFED registers */
        EPwmRegsPointer->DBCTL.bit.SHDWDBFEDMODE = 1;
        EPwmRegsPointer->DBCTL.bit.SHDWDBREDMODE = 1;
        /* Load on TBCTL = zero for both FED/RED */
        EPwmRegsPointer->DBCTL.bit.LOADFEDMODE = 0;
        EPwmRegsPointer->DBCTL.bit.LOADREDMODE = 0;
        /* Delay for FED/RED */
        EPwmRegsPointer->DBFED.bit.DBFED = 200;
        EPwmRegsPointer->DBRED.bit.DBRED = 200
    
        /******************************************************************
            * -- Setup Action-Qualifier (AQ) Submodule CMPA --
            *****************************************************************/
        /* Load AQCTL shadow registers on SYNC to keep PWMs aligned. */
        EPwmRegsPointer->AQCTL.bit.SHDWAQAMODE = 1;
        EPwmRegsPointer->AQCTL.bit.SHDWAQBMODE = 1;
    
        /* Clear PWM signal for both channels at all events to
            * ensure no output will be on as we are initializing.
            */
        EPwmRegsPointer->AQCTLA.all = PWM_AQ_CLEAR;
        EPwmRegsPointer->AQCTLB.all = PWM_AQ_CLEAR;
    }
    
    void On()
    {
        volatile struct EPWM_REGS *EPwmRegsPointer = &EPwm1Regs;
    
        /* Enable deadband on both A and B outputs */
        EPwmRegsPointer->DBCTL.bit.OUT_MODE = 3;
    
        /* Common settings for AHC and ALC. Explicitly set CMB and PRD to
         * have no action */
        EPwmRegsPointer->AQCTLA.bit.CBU = 0;
        EPwmRegsPointer->AQCTLA.bit.CBD = 0;
        EPwmRegsPointer->AQCTLA.bit.PRD = 0;
    
        if (polarity == PWM_DBCTL_POLSEL_AHC)
        {
           EPwmRegsPointer->AQCTLA.bit.ZRO = 2;
           EPwmRegsPointer->AQCTLA.bit.CAU = 1;
           EPwmRegsPointer->AQCTLA.bit.CAD = 2;
        }
        else
        {
           EPwmRegsPointer->AQCTLA.bit.ZRO = 1;
           EPwmRegsPointer->AQCTLA.bit.CAU = 2;
           EPwmRegsPointer->AQCTLA.bit.CAD = 1;
        }
    }
    
    void Off()
    {
        volatile struct EPWM_REGS *EPwmRegsPointer = &EPwm1Regs;
    
        /* 
        * Disable PWM by bypassing deadband on B, setting all action qualifiers
        * to clear.
        */
        EPwmRegsPointer->DBCTL.bit.OUT_MODE = 2;
    
        /* Be safe and turn everything off at all events */
        EPwmRegsPointer->AQCTLA.all = 1;
        EPwmRegsPointer->AQCTLB.all = 1;
    }

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

    感谢您分享代码。 在 我结束时、我将在星期一上尝试此操作、然后会回复您。  

    此致

    Sumit

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

    您好 Sumit、

    是否有运气重现此问题?

    谢谢、

    Will

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

    我已经配置了 PWM、但尚未完成关断和导通的逻辑、我正在使用 TI 驱动程序库执行此操作、因此在重现问题时会出现一些问题。 我明天会更新你。 感谢您的耐心!

    此致、

    Sumit  

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

    将会、  

    您能尝试按以下顺序查看它是否适合您吗?

    1. 关闭时、请按照以下顺序操作:

      1. AQ FIRST—将正确的开关模式加载到影子寄存器中
      2. DBCTL second—重新启用 B 上的死区  之后  AQ 配置正确(可防止在启用 B 但 AQ 仍具有错误值时出现干扰
      3. 强制加载:在一次原子更新中将所有影子寄存器 (DBCTL + AQ) 推至活动状态
    2. 重新打开时、请按照以下顺序操作:
      1. DBCTL first—确保在 AQ 更改生效之前绕过 B 输出
      2. AQ 寄存器—向影子寄存器写入“清除“操作
      3. 强制加载—在一次原子更新中将所有影子寄存器 (DBCTL + AQ) 推至活动状态

    同时、我也很难再现这张嘴唇。 在这种情况下、您的 syncin 来源是什么? 这是另一个 PWM 吗? 您还能否在 ISR 中提供用于打开/关闭序列的逻辑代码?

    请查找随附的基于 P65x(具有类似 ePWM 模块的 MCU)基于 SysConfig 的代码、以展示您可以参考并迁移到器件的逻辑。 使用上述顺序连接不会出现滑动的波形。

    e2e.ti.com/.../epwm_5F00_ex2_5F00_updown_5F00_aq_5F00_blip_5F00_issue.zip

    此致、

    Sumit

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

    您好 Sumit、

    感谢您的答复、我将尝试您的建议。  要回答您的问题、是的、另一个 PWM 通道是我们的同步源。 对于我们的 ISR、它是与同步相同的 PWM 源、并为我们提供了足够的时间在下一次同步之前更新 PWM 寄存器。

    从您的图片中可以看到绿色输出 B 吗?  实际上、当初始状态为 B 高电平和 A 低电平时、我都看不到此结束。  仅当初始状态为 A 高电平和 B 低电平时、我才在输出 B 上看到抖动。

    看看您的动作限定符、看起来 您的输出应该与我的匹配、A 为高、B 为低、才能开始。

    谢谢、
    Will

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

    是的、

    粉色为输出 A、绿色为输出 B

    此致、

    Sumit

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

    您好 Sumit、

    我尝试了你的建议,重新排序我的动作限定符和死区设置,但仍然看到了滑稽.  我仅在 TBCTR = 0 时 PWM 的初始状态为:输出 A 为高电平、输出 B 为低电平时才看到异常。  你的图片有一个低和 B 高,在那里我也看不到嘴唇。

    发生此情况时、我的操作限定符为:
    ZRO:设置输出
    CAU:清除输出
    CAD:设置输出

    问题似乎发生在 ZRO 上。  这就像输出 B 首先响应处于 AHC 极性状态、因此会被设置、然后由于 ZRO 操作而清除输出。  当 OFF 变为高电平和 B LOW 时、您能看到嘟嘟声吗?

    谢谢、

    Will

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

    Sumit,

    我的配置与您共享的配置相同。 为了解释上图、我绘制了如下所示的事件。

    您有两个高或设置事件、一个为零、另一个为 CAD。 同步事件仅在主器件蓝色波形的零事件时发生。  但稳定状态上升沿在 CAD 处发生、如深蓝色波形所示。

    当在零处发生同步(在蓝色 CAD 事件之后)时、底部粉色波形在软件标志从关闭更改为打开时延迟开始。

    在我的配置中、CMPA 是 TBPRD 值的一半。

     

    为了回答您的问题、我没有看到 ePWMB 上的翻页、并且波形配置与您需要的相同。

    此致、

    Sumit

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

    Sumit,

    我想我看到了我们配置的不同之处。   除非我弄错了、否则我看不到您像我一样使用死区寄存器的影子模式。  我认为您的代码通过设置 OUT_MODE 立即启用死区、但像您所说的那样、只有在 ZRO 之前、操作限定符才会加载。  你会看到,就在 ePWMB 的第一个上升沿,你离上升的蓝色边缘,但从那时起,它是完全对齐的。  我添加了一些文本和黑线、以显示图像上的对齐情况。

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

    那么、在您这边、如果您设置死区立即模式、您是否会看到这种抖动也消失了?

    此致、

    Sumit

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

    看着你的照片,我实际上不会说你没有胆怯。  您的唇型正好更大、因为它是从立即加载死区到下一次 ZRO 加载发生的时间量。  我的 PWM 控制栅极驱动、因此不需要在未指定的时间段内通过在立即模式下具有死区来消耗电流。   

    和我的硬件人员交谈时,唇是如此的小,什么都不会真正打开,它很可能是好的。  但是、我想了解为什么会发生这种情况。  在动作限定器之前、死区影子寄存器实际上加载了一两个时钟周期。  这是一种可能性吗?

    例如、加载死区寄存器、启用互补行为并且 ePWMB 变为高电平。  接下来、加载在 ZRO 时将 ePWMA 设置为高电平的动作限定器、ePWMA 变为高电平、ePWMB 变为低电平。

    -will

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

    将会、

    在影子加载中、DB 和 AQ 子模块在 SYNC 事件时同时加载影子、以防止损坏的 PWM 波形。 它们通常配置为同时加载新值、以确保转换清晰、例如在新的 PWM 周期开始时。 因此、这可能不是问题。

    我认为问题可能是同步脉冲与在 TBCTR = 0 下加载这些寄存器之间存在竞速条件。

    TRM 中有一条注意事项、指出同步可能需要 1~2 TBCLK。 如果放大主从 ePWM 的上升沿、您可以看到这种差异。 因此通常我们说、在 TBPHS 寄存器和这些边沿中添加静态偏移将完全对齐。

    考虑到这一限制、保留上述所有建议的补救措施时、您可以尝试执行的另一项操作是将全局加载同步事件设置为开启周期而不是零。 这样、当 TBCTR = 0 时、这些寄存器将在影子寄存器中准备就绪、并准备立即在一个周期内加载到活动状态。

    这将避免同步和全局加载之间出现竞速情况。

    另外、您是否碰巧评估或尝试了我在上面主题中提到的跳闸方法? 你认为这对你有用吗?

    此致、

    Sumit

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

    Sumit,

    尽管全局加载同步事件设置为 SYNCIN 信号、而不是零、但我认为竞态条件介于同步脉冲和 TBCTR = 0 之间是正确的。  非常感谢您对此进行研究。  我正在考虑如何通过更改全局加载事件或使用跳闸区来更改 PWM。

    此致、

    Will

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

    将会、  

    当然、请尝试 上述任一方法。 如果有任何疑问、请告诉我。

    此致、

    Sumit