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.

[参考译文] TMS320F28377D:TMS320F28377D 上的间歇性 ePWM 全局加载故障导致 PWM 输出不正确

Guru**** 2952510 points

Other Parts Discussed in Thread: PMP41017

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1647125/tms320f28377d-intermittent-epwm-global-load-failure-on-tms320f28377d-causing-incorrect-pwm-outputs

器件型号: TMS320F28377D
主题中讨论的其他器件: PMP41017

您好、

我使用 ePWM 全局加载功能。 下图显示了我的配置。

image.pngimage.pngimage.pngimage.png

每次执行控制时、我都会将 PWM1 和 PWM2 的 PRD 值更改 10 个计数。 我设置 CMPA = PRD - 7 和 CMPB = 7、并将 PWM1 配置为仅在 CTR = PRD 时进入中断、其中 I set。 EPwm1Regs.GLDCTL2.bit.OSHTLD = 1但是、在测量 PWM 输出 B 时、我发现 PWM2 经常产生不正确的输出。

“可能会发生两种类型的错误情况。

蓝色为 PWM1B、绿色为 PWM2B。

image.png

image.png

在第一个图中、PWM2B 晚于 PWM1B 变为高电平。 发现 PWM2 未加载新的 PRD 和 CMPA/B 值。

在第二个图中、虽然 PWM2B 和 PWM1B 同时变为高电平、但 PWM2B 之后不会变为低电平。 PWM2 似乎更新了 CMPA/B、但没有更新 PRD。

只要 PRD 的变化大于 CMPB 值、这种情况就会随机发生。

 

如有任何建议或建议、将不胜感激。 谢谢你。

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

    您好、Li

    这需要进行一些调查。 您能否在此处以文本而不是图像的形式共享配置?  

    谢谢你  

    Amir Hussain

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

    您好、
    感谢您的答复。 下面是用于我的配置的代码。

    EPwm1Regs.GLDCTL.bit.OSHTMODE = 1;
    EPwm1Regs.GLDCTL.bit.GLDMODE = 0;
    EPwm1Regs.GLDCTL.bit.gLD = 1;
    EPwm1Regs.GLDCFG.all = 0x00E7;

    EPwm1Regs.TBCTL.BIT.CLKDIV = 0;
    EPwm1Regs.TBCTL.BIT.HSPCLKDIV = 0;
    EPwm1Regs.TBCTL.BIT.PRDLD = 0;
    EPwm1Regs.TBCTL.BIT.CTRMODE = 2;

    EPwm1Regs.CMPCTL.bit.LOADBMODE = 0;
    EPwm1Regs.CMPCTL.bit.LOADAMODE = 0;

    EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0;
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0;

    EPwm1Regs.TBPRD = 500;
    EPwm1Regs.TBCTR = 0;
    EPwm1Regs.CMPA.bit.CMPA = 0;
    EPwm1Regs.CMPB.bit.CMPB = 0;

    EPwm1Regs.AQCTLA.bit.CAU = 1;
    EPwm1Regs.AQCTLA.bit.CBD = 2;
    EPwm1Regs.AQCTLB.bit.CAU = 1;
    EPwm1Regs.AQCTLB.bit.CBD = 2;
    EPwm1Regs.AQCSFRC.bit.CSFA = 1;
    EPwm1Regs.AQCSFRC.bit.CSFB = 2;

    EPwm1Regs.DBCTL.BIT.OUT_MODE = 3;
    EPwm1Regs.DBCTL.BIT.POLSEL = 2;
    EPwm1Regs.DBCTL.bit.IN_MODE = 2;

    EPwm1Regs.DBCTL.BIT.LOADREDMODE = 0;
    EPwm1Regs.DBCTL.BIT.LOADFEDMODE = 0;
    EPwm1Regs.DBCTL.BIT.SHDWDBREDMODE = 1;
    EPwm1Regs.DBCTL.BIT.SHDWDBFEDMODE = 1;
    EPwm1Regs.DBCTL.BIT.HALFCYCLE = 1;
    EPwm1Regs.DBRED.bit.DBRED = 40;
    EPwm1Regs.DBFED.bit.DBFED = 40;

    EPwm1Regs.TBCTL.BIT.PHSEN = 0;
    EPwm1Regs.TBCTL.bit.SYNCOSEL = 1;
    EPwm1Regs.TBCTL.bit.PHSDIR = 1;
    EPwm1Regs.TBPHS.bit.TBPHS = 0;

    EPwm1Regs.ETSEL.bit.INTSEL = 2;
    EPwm1Regs.ETSEL.bit.intEn = 1;
    EPwm1Regs.ETPS.bit.INTPRD = 1;

    EPwm2Regs.GLDCTL.bit.OSHTMODE = 1;
    EPwm2Regs.GLDCTL.bit.GLDMODE = 0;
    EPwm2Regs.GLDCTL.bit.gLD = 1;
    EPwm2Regs.GLDCFG.all = 0x00E7;

    EPwm2Regs.TBCTL.BIT.CLKDIV = 0;
    EPwm2Regs.TBCTL.BIT.HSPCLKDIV = 0;
    EPwm2Regs.TBCTL.bit.PRDLD = 0;
    EPwm2Regs.TBCTL.BIT.CTRMODE = 2;

    EPwm2Regs.CMPCTL.bit.LOADBMODE = 0;
    EPwm2Regs.CMPCTL.bit.LOADAMODE = 0;

    EPwm2Regs.CMPCTL.bit.SHDWBMODE = 0;
    EPwm2Regs.CMPCTL.bit.SHDWAMODE = 0;

    EPwm2Regs.TBPRD = 500;
    EPwm2Regs.TBCTR = 0;
    EPwm2Regs.CMPA.bit.CMPA = 0;
    EPwm2Regs.CMPB.bit.CMPB = 0;

    EPwm2Regs.AQCTLA.bit.CAU = 1;
    EPwm2Regs.AQCTLA.bit.CBD = 2;
    EPwm2Regs.AQCTLB.bit.CAU = 1;
    EPwm2Regs.AQCTLB.bit.CBD = 2;
    EPwm2Regs.AQCSFRC.bit.CSFA = 1;
    EPwm2Regs.AQCSFRC.bit.CSFB = 2;

    EPwm2Regs.DBCTL.bit.OUT_MODE = 3;
    EPwm2Regs.DBCTL.BIT.POLSEL = 2;
    EPwm2Regs.DBCTL.bit.IN_MODE = 2;

    EPwm2Regs.DBCTL.BIT.LOADREDMODE = 0;
    EPwm2Regs.DBCTL.BIT.LOADFEDMODE = 0;
    EPwm2Regs.DBCTL.BIT.SHDWDBREDMODE = 1;
    EPwm2Regs.DBCTL.BIT.SHDWDBFEDMODE = 1;
    EPwm2Regs.DBCTL.BIT.HALFCYCLE = 1;
    EPwm2Regs.DBRED.bit.DBRED = 40;
    EPwm2Regs.DBFED.bit.DBFED = 40;

    EPwm2Regs.EPWMXLINK.bit.gLDCTL2LINK = 0x0;
    EPwm2Regs.EPWMXLINK.bit.TBPRDLINK = 0x0;

    EPwm2Regs.TBCTL.BIT.PHSEN = 1;
    EPwm2Regs.TBCTL.bit.SYNCOSEL = 0;
    EPwm2Regs.TBCTL.bit.PHSDIR = 1;
    EPwm2Regs.TBPHS.bit.TBPHS = 2;

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

    我想提供其他一些测试结果。

    我修改了 PWM2、使其在接收到同步信号 (TBPHS = 0) 时同步到 0。 这应该允许 PWM2 寄存器正确更新、但实验中的 PWM 输出仍然不正确。  

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

    亲爱的埃米尔、

    你能帮李鸿检查一下吗?

    此致、

    彼得

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

    嗨、Li

    您只触发 EPwm1 的一次性加载、而不触发 EPwm2 的一次性加载。

     当您设置 EPwm1Regs.GLDCTL2.bit.OSHTLD = 1 为 CTR = PRD 时、会加载 EPwm1 的影子寄存器。 但 EPwm2 的 GLDCTL2.bit.OSHTLD 从未设置,因此 EPwm2 的寄存器保持在阴影模式,等待 CTR = 0(基于) GLDMODE = 0。

    有两种方法可以解决此问题
    1.  

    // Inside EPwm1 interrupt when CTR = PRD:
    EPwm1Regs.GLDCTL2.bit.OSHTLD = 1;   // Load EPwm1's shadow registers
    EPwm2Regs.GLDCTL2.bit.OSHTLD = 1;   // Load EPwm2's shadow registers simultaneously


    2.

    我还看到您正在使用
     EPwm2Regs.EPWMXLINK.bit.GLDCTL2LINK = 0x0;

    该 GLDCTL2LINK 寄存器控制哪个模块的 OSHTLD 事件会触发 此模 块的加载:

    • GLDCTL2LINK = 0x0 =使用 EPwm2 自己的 OSHTLD(独立)
    • GLDCTL2LINK = 0x1 =使用 EPwm1 的 OSHTLD(与 EPwm1 同步)

    尝试将 EPwm2 的配置更改为

    EPwm2Regs.EPWMXLINK.bit.GLDCTL2LINK = 0x1;  // EPwm2 loads when EPwm1's OSHTLD fire

    现在、当您 EPwm1Regs.GLDCTL2.bit.OSHTLD = 1 在 EPwm1 中断中设置时、 EPwm1 和 EPwm2 将同步加载 、而无需单独设置 EPwm2 的 OSHTLD。

    这样可确保在两个模块中 TBPRD、CMPA 和 CMPB 都一起更新。

    谢谢你  

    Amir Hussain

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

    尊敬的 Amir:

    我再次查看了参考手册、其中明确说明了这一点

    EPWMXLINK.bit.GLDCTL2LINK = 0x0000 映射到 ePWM1。

    因此、我的当前配置是基于文档的。

    谢谢您、

    Li-Hung

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

    嗨、Li

    我看到你的观点。 我会更深入地研究它、然后返回给您。

    谢谢你  

    Amir Hussain

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

    嗨、Li

    您可以尝试以下配置

    
    EPwm1Regs.GLDCTL.bit.GLDMODE = 1;      // Load on every cycle (no CTR = 0 wait)
    EPwm1Regs.GLDCTL.bit.OSHTMODE = 1;
    EPwm2Regs.GLDCTL.bit.GLDMODE = 1;
    EPwm2Regs.GLDCTL.bit.OSHTMODE = 1;
    

    现在 OSHTLD = 1、设置后、 所有影子寄存器 (TBPRD、CMPA、CMPB) 都会立即加载 、而无需等待 CTR = 0。

    谢谢你  

    Amir Hussain

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

    尊敬的 Amir:

    我检查了手册、似乎没有立即加载的选项。

    谢谢您、

    Li-Hung

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

    尊敬的 Li-Hung:

    一个用于阐明限制的后续问题是、您更新 ePWM 寄存器的 ISR 频率是否高于开关频率还是低于开关频率? 如果 ePWM 配置中显示的该通道与其他通道相同或同步、为什么需要全局功能?  

    你能否详细说明你的情况、以便我们能够提出相应的建议?

    此致、

    Sumit

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

    您好 Sumit、

    我目前正在开发一款全桥 LLC 转换器。 新的 PWM 寄存器值在 CLA 内计算、且 CLA 执行速率低于开关频率。

    使用 Global Load 的原因是 PWM 开关频率在运行过程中会发生变化。 我想确保在 ePWM 模块更新其活动寄存器之前、所有相关 PWM 参数(包括 TBPRD 和 CMPA/CMPB)都已完全计算完毕并准备就绪。

    根据我的理解、全局加载功能提供了一种一次性更新机制、由于它允许在一个受控时序点同步更新多个寄存器、因此似乎适合此要求。 因此、我选择使用全局加载单次触发模式来确保在开关频率变化时 PWM 更新一致。

    谢谢您、

    Li-Hung

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

    你好、LI

    Sumit 在星期一推出之前已停止工作。 同时、我建议参考 pmp41017。 这是交错式半桥 LLC 设计。 您可以在 Digital Power SDK 中找到该固件。

    谢谢你  

    Amir Hussain