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.
您好!
我和 Nima Eskandari 交谈、但线程已关闭、因此我尝试提出这一相关问题。
你好、Nima、我在这里再次打扰你... 我希望我们可以重新打开线程!
要继续处理中断问题、"TMS320F28379D:TBCTR = CMPA 且 TBCTR = CMPB 上的 EPWM 中断"、
我已经使我的测试和你的想法运行良好、但是我发现我也可以使用 ePWMxA 上的周期和 ePWMxB 上的 CMPB 来生成我需要的中断。 看起来更简单...
但是、时序不符合我的预期:
ePWM2上的中断 A 和 B 应该激活 ePWM1上的中断、这会在 ePWM1的 A 引脚变为高电平后将 GPIO56引脚清零为低电平。
理想情况下、这应该在大约5 us 后发生、但这并不是那么重要、只要这种情况保持不变。
中断工作、但时序不工作。
GPIO56会在任何时候变为低电平、但不会在我需要的那一刻变为低电平。
我的逻辑分析仪还显示、在 ePWM2输出 A 变为低电平或高电平之前、ePWM2的中断通信大约(随机) 4到7us、
虽然我只是在这个时间或稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍
我有两个问题:
1 -为什么中断比它应该到达的时间早得多?
到目前为止、这对我的应用不是很令人不安、但:
2 -为什么 Pin56会在时间上随机降低?
我知道、在调用 ISR 之前、有大约14个 SYSCLK 的传播延迟、但这并不能解释这种行为。
包含代码的 TE 相关部分。
我希望你度过一个美好的周末,或者,更好的,一个美好的周末!
Gustavo
你好、Nima、
感谢您的回答。
我包括一个简化的屏幕截图。
您看到的是:
通道2上是 ePWM2的信号。 在该边沿(标记 A2)上、CMPB 触发中断。
在这个试验中、ePWM2就在那里。 在此之前、信号一直处于低电平。
(我想肯定的是、以前没有进行计数、这可能会触发等待中断。 无论如何、该模式始终如此继续)
Ch5上的 Gpio56在 ISR 内部变为低电平。 (标记 A1)
如您所见、在 ePWM 引脚变为高电平之前、引脚56变为低电平7、25us。
我意识到、CMPB 计数和引脚的实际切换之间存在延迟、但是
7、25 us 不是太大?
(我们必须添加来自中断本身的传播延迟、以及切换引脚56所需的时间)
ePWM2速度慢(496Hz) 这是原因吗?
EPwm2Regs.TBPRD = 786;
EPwm2Regs.CMPB.bit.CMPB = 451;
EPwm2Regs.CMPA.bit.CMPA = 451;
使用
EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0b100;
EPwm2Regs.TBCTL.bit.CLKDIV = 0x4;
A 我说过、这在我的申请中并不令人不安、但了解原因对未来可能会很有趣。
此致、
你好、Nima、谢谢你的回答。
是的、我看到在 CMPB 上的 EPWM 引脚切换之前、GPOI 会在7us 左右切换
你好、Nima、
很抱歉耽误你的时间、我又在旅行。
下面是一个小代码(我从所有其他任务中清除了它)和一个屏幕截图、您可以在其中看到正在发生的情况。
在 CPMB 上切换 GPIO56和 ePWB2B (GPIO3)之间的时间比导通周期(7.375us)短(4.875us)
也许是我的设备?
奇怪的是、ePWM1上的中断执行我所期望的操作。
e2e.ti.com/.../forTi28102018_5F00_V05_2D00_14102018.cIHope,我是罪魁祸首:)
此致
Gustavo
你好、Nima、
我想、我找到了这个问题的原因。 但是、我没有解决方案:
按照您的想法、ePWM1的 ISR 出现了问题、我清理了所有内容、只剩下 ePWM2-ISR。 ePWM1上无内部、ePWM1与 ePWM2没有交互。
ISR 如下所示:
引脚56是我的测试引脚
_interrupt void epwm2_ISR (void)
{
GpioDataRegs.GPBTOGGLE.bit.GPIO56=1;
DELAY_US (1);
GpioDataRegs.GPBTOGGLE.bit.GPIO56=1;
DELAY_US (1);
GpioDataRegs.GPBTOGGLE.bit.GPIO56=1;
DELAY_US (1);
EPwm2Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
}
问题仍然存在。
原因似乎是 TBCTL.bit.CLKDIV 的值
任何高于0的 CLKDIV 值都会导致 ISR 更早开始。
但低于1.14kHz 的任何频率也是问题所在。
正如我在代码中所说:
TBPRD = 512
EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0b100;
EPwm2Regs.TBCTL.bit.CLKDIV = 0x4;
我已将其设置为获得极低的频率(761 Hz)。
GPIO56在 ePWM 引脚变为高电平之前切换4.66us
请参阅屏幕截图 D
将其更改为
TBPRD = 512
EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0b100;
EPwm2Regs.TBCTL.bit.CLKDIV = 0x0;
从而提供更高的频率(12.18kHz)。
在 ePWM-Pin 变为高电平后、GPIO56切换83.33us
请参阅屏幕截图 E
该问题在频率低于1.14kHz 时开始:
设置
TBPRD = 0x1111
EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0b101;
EPwm2Regs.TBCTL.bit.CLKDIV = 0x0;
从而得出1.144kHz 的频率。
GPIO56在 ePWM 引脚变为高电平时精确切换
请参阅屏幕截图 F
设置
TBPRD = 0x1111
EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0b110;
EPwm2Regs.TBCTL.bit.CLKDIV = 0x0;
其频率为953.3kHz。
GPIO56在 ePWM 引脚变为高电平之前切换83.3 NS
请参阅屏幕截图 G
现在、我想我可以通过使用事件触发预分频逻辑来获得更低的中断频率而不将 CLKDIV 设置为高于0来解决这个问题。
但是、我想知道、当使用非常低的 PWM 频率时、这种行为是否正常。
美好的一天!
此致、
Gustavo