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.

[参考译文] TMS320F28P550SJ:使用全局加载时的 EPWM、如何知道是否加载了影子寄存器?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1595618/tms320f28p550sj-epwm-when-use-global-load-how-can-i-know-whether-shadow-register-is-loaded-or-not

器件型号: TMS320F28P550SJ

当 ePWM 配置为向上计数模式并且启用全局加载时。 为了确保同时加载所有寄存器、我们需要检查 TBCTR 是否接近 TBPRD、如果是、将会等待、否则将更新所有寄存器。  

但这里的 EPwm1Regs.TBPRD 是影子寄存器、而不是活动寄存器。 因此使用它进行检查是不正确的。 有时、会出现意外的 PWM 波形。

那么我可以知道有效周期了吗? 或者我是否可以知道影子寄存器是否已加载?

或者是否有任何其他解决方案来替代此检查?

在本 LLC 工程中、ISR 为 100k、LLC MOSFET fre 约为 48K-200k。

while (EPwm1Regs.TBCTR >=(EPwm1Regs.TBPRD - 60))
      {
        ;
      }
      EPwm1Regs.TBPRD  = PWM_PERIOD;
      EPwm1Regs.TBPRDHR =(uint16_t) hres_pwm_period;
      EPwm1Regs.CMPA.all = pwmH_on_time;
      EPwm1Regs.CMPB.all = pwmH_off_time;
      EPwm4Regs.CMPA.all = pwml_on_time;
      EPwm4Regs.CMPB.all = pwml_off_time;
      EPwm2Regs.CMPA.all = synL_ON_TIME;
      EPwm2Regs.CMPB.all = synL_OFF_TIME;
      EPwm3Regs.CMPA.all = synH_ON_TIME;    
      EPwm3Regs.CMPB.all = synH_off_time;
      debug12 = EPwm1Regs.CMPCTL.all;
      EPwm1Regs.GLDCTL2.bit.OSHTLD = 1;

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

    Juan、

    有关如何缓解您描述的问题、请参阅以下应用手册: https://www.ti.com/lit/an/spradk6/spradk6.pdf

    请告诉我该解决方法是否适合您。

    此致、

    Sumit

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

    感谢您发送编修。 但是、 本文档没有解决当前的问题、我遇到的问题具体涉及文档末尾所用的方法。 我遵循了该文件第 3.1 节中所述的方法、但这种方法存在缺陷。 这里的条件依赖于 EPwm1Regs.TBPRD、这可能表示影子周期而不是当前实际周期。 因此、这种情况不正确。

    我们可以通过下面的方框图来理解这一点:第三个 PWM TB 计数器表示通过箭头 1 的 ISR 计算的结果、而不是箭头 2 的 ISR。 如果我在箭头 3 处执行循环计算来更新影子寄存器、则该点处的 EPwm1Regs.TBPRD 值由箭头 2(而不是箭头 1)计算。 使用它进行确定是不正确的。

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

    Jaun、

    您的假设是正确的、我们只能读取 TBPRD 的影子值。 针对这种临界情况的权变措施是使用下图中描述的两种 ISR 方法。

    在此图中、第一个波形是固定频率的 ISR1、由 ADC-EOC(转换结束)触发、该 ISR1 执行大部分控制律计算并将相关计数存储在变量(如 prd_ticks、CMP_ticks、red_ticks、feed_ticks、AQ 等)中。 如图所示、ADC-SOC(转换开始)由固定频率的 EPWM 触发。  另请注意、 固定频率 ISR1 不写入 PWM 寄存器。 一旦准备好加载寄存器中的所有时钟周期、ISR1 会写入 CMPC = TBPRD-20、其中“20"是“是与 ISR 延迟相关的时钟周期。

    与控制律计算相比、ePWM 寄存器写入是短暂的确定性操作。 这就是 ePWM 寄存器更新/写入发生在第二个变频 ISR1 中的原因、该 ISR1 由另一个以可变开关频率 PWM 同步运行的 ePWM 触发。 一旦计算出所有控制律并且所有周期均准备好加载到 ePWM 寄存器中、则由 ISR1 直接写入的 CMPC 值触发。 寄存器写入完成后、ISR2 直接将 CMPC 值写入饱和值 (0xFFFF)、以便在下一个已设置的周期准备好加载时由 ISR1 触发之前不会自行触发。 请确保对代码进行性能分析、以便寄存器写入操作时序小于 与开关 ePWM 的最大开关频率相关的最小 TBPRD。

    第三个图像显示了仅针对上下文的实际开关 EPWM。

    请告诉我、此变通办法是否有帮助、或者是否有任何有关此问题的后续问题。

    此致、

    Sumit

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

    您好 Sumit、感谢您的详细描述。 在这里、CMPC 也使用 TBPRD、而是影子寄存器。 我不确定。 我要试试。

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

    Juan、

    CMPC 使用直接加载来决定是否触发变频 ISR2。

    此外、您还可以通过其他方式将应用手册方法考虑如下: 如果您可以在应用中以向上/向下模式运行 ePWM 时基计数器、则不需要减去 TBPRD、因为计数器在该模式下恢复为零、只需将 TBCTR 与更新时间进行比较、就可以决定是否有足够的时间进行更新。 因此、对于 TBPRD 在照片中、我们无需担心它是影子模式。 如果这是合理的、请告诉我您的想法。

    此致、

    Sumit

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

    谢谢您、Sumit。 我已验证此解决方案更改为向上/向下计数模式 可以解决该问题。