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.

[参考译文] TMS320F28335:有关 DSP F28335的 ePWM 的问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1034927/tms320f28335-question-about-epwm-of-dsp-f28335

器件型号:TMS320F28335

您好!

 我有一个长期困扰我的问题,关于 ePWM:

如上所示、高级表示 ADC ISR、如果我在此 ADC ISR 中的每个周期更新 PWM 寄存器值、并且我使用 PWM 比较影子寄存器、 C 代码就像这样:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
interrupt void ADCISR(void)
{
· · ....
· · EPwm1Regs.CMPA.half.CMPA = a1;
· · EPwm4Regs.CMPA.half.CMPA = a2;
· · EPwm2Regs.CMPA.half.CMPA = b1;· · · · · · //<------------------------
· · EPwm5Regs.CMPA.half.CMPA = b2;
· · EPwm3Regs.CMPA.half.CMPA = c1;
· · EPwm6Regs.CMPA.half.CMPA = c2;
· · ...
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

您可以看到 、ADC ISR 应严格执行一次、速度为50us、但由于 freemodbus 在处理数据帧时关闭了全局中断、因此 ADC ISR 延迟。 如红色框所示。

因此、在这种情况下、是否存在这样的可能性:  当 DSP  完成 “EPwm2Regs.CMPA.half.CMPA = B1;”后 ,PWM 将所有影子寄存器的值传输到 PWM 操作寄存器,这会导致“EPwm2Regs.CMPA.half.CMPA”的值成为新周期计算的结果,而“EPwm5Regs.CMPA.CMPA”的值仍是前一半周期计算结果。 如果这两个 PWM 控制同一电桥的上管和下管,是否可以  直接连接上桥和下桥?

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

    尊敬的 Fei:

    这里似乎有两个单独的问题、一个是 ADC ISR 被延迟、另一个是 ISR 不会完全执行? 我的回答是否正确?

    [引用 userid="478764" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1034927/tms320f28335-question-about-epwm-of-dsp-f28335 当 DSP  完成 "EPwm2Regs.CMPA.half.CMPA = B1;"时 ,PWM 会将所有影子寄存器的值传输到 PWM 操作寄存器, 这会导致"EPwm2Regs.CMPA.half.CMPA"的值成为新周期计算的结果、而"EPwm5Regs.CMPA.half.CMPA"的值仍然是计算的前一个周期结果。[/QUERPIES]

    进入 ISR 后、它将完成、然后再继续执行另一项任务。  我不明白为什么在写入 EPWM2后程序会立即停止。 ADC ISR 延迟不会影响 ISR 内发生的情况。 请您详细说明上述评论吗?

    此致、

    Marlyn

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

    你好!

     当 DSP  完成 “EPwm2Regs.CMPA.half.CMPA = B1;”后 ,PWM 将所有影子寄存器的值传输到 PWM 操作寄存器,这会导致“EPwm2Regs.CMPA.half.CMPA”的值成为新周期计算的结果,而“EPwm5Regs.CMPA.CMPA”的值仍是前一半周期计算结果。

    在我看来、"PWM 将所有影子寄存器的值传输到 PWM 操作寄存    器"是硬件操作(当 PWM 计数等于0时、该操作)、它可以与软件操作(写入 EPWM2)同时执行。  是并行操作。

    因此、这个硬件操作可 在 ADC ISR 执行期间的任何时间发生!

    我是否理解错了?

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

    尊敬的 Fei:

    如果为 CMPA 启用了影子模式、则意味着对 CMPA 寄存器的任何写入都不会传输到活动寄存器中、直到出现加载模式条件(在 ZRO 事件中)。 在 ADC ISR 内、您可以将新的 CMPA 值写入 EPWM1、EPWM2、EPWM3、EPWM4、EPWM5、 和 EPWM6。 在发生 ZRO 事件之前、这些新值不会被传输到活动寄存器中。

    现在、由于 ADC ISR 和 ePWM 波形不同步、可能会在 ADC ISR 期间发生一个或所有 ePWM 模块的 ZRO 事件。 这可能会导致某些 ePWM 模块更新 CMPA 值、而其他模块可能不更新。 为了避免这种情况,我建议如下:

    创建一个 ePWM ISR、该 ISR 在 ePWM 周期内执行已知的良好点(例如在 ZRO 事件中)。然后、在 ePWM ISR 内、您可以写入 您计算出的新 CMPA 值。 在下一次 ZRO 事件发生之前、这些新的 CMPA 值将不会传输到活动寄存器中、但这样您就不会冒仅更新某些 ePWM 模块而不更新其他模块的风险。 此方法假设相关模块(ePWM 2/5) 配置的周期和相位相同。  

    此致、

    Marlyn

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

    您好!

    这似乎不能从根本上解决问题。
    ADC ISR 延迟且未与 PWM 同步的原因是我使用的是 FreeModbus。 当 FreeModbus  处理通信数据帧时、DINT 将用于关闭所有中断、而 EINT 将在处理完成后打开所有中断。
    如果是这种情况、即使打开 PWM ISR、PWM ISR 是否会延迟、并且它  PWM 周期不同步?

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

    尊敬的 Fei:

    您能否描述 ePWM 2/5是如何配置的? 如果它们具有相同的周期、则 ePWM 2和5的影子到活动负载将同时发生。 这可以最大程度地降低两个比较值之间出现不匹配的风险。  即使设置了 DINT、如果 ISR 当前正在执行、它仍应完成其任务。  

    此致、

    Marlyn

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

    您好、  Marlyn Rosales Castaneda20、  

    ePWM 2/5配置为与 PWM1同步、因此它们是 同步计数。

    写入 PWM2/5的点应 在安全的时间内处于活动状态(如果 ADC ISR 未受到干扰)、但现在 它在  ePWM 2/5影子到活动负载时处于活动状态(概率很小)。

    非常感谢!

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

    尊敬的 Fei:

    我对 FreeModBus 不是很熟悉、但您是否能够知道何时设置 DINT (例如、当您有一个通信帧即将被处理时)? 如果可以设置一个变量来反映这一点、则可以在 ISR 中检查该变量(如果未设置 DINT、则没有延迟、因此应写入 CMPA 寄存器。 如果该位被置位、则不要将新值写入 CMPA 寄存器、这样 ePWM 2和 EPWM5就会保留与之前相同的值、直到 ISR 处于所需的时间范围内。)

    此致、

    Marlyn

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

    您好!

    似乎还有其他更好的解决方案、我会尝试您的方法。