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.

[参考译文] TMS320F28379D:TBCTR = CMPA 且 TBCTR = CMPB 上的 ePWM 中断

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/736844/tms320f28379d-epwm-interrupts-on-tbctr-cmpa-and-also-on-tbctr-cmpb

器件型号:TMS320F28379D

您好!

我和 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

e2e.ti.com/.../6472.forTi_5F00_13102018.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好!
    阳光明媚的周日,晚上充满梦想,我解决了,至少部分解决了!

    对于记录、如果有人读取它:

    问题2:“为什么 Pin56会在时间上随机降低?”
    这是因为、虽然我在需要之前禁用了该通道的中断、但计数器正在运行并"保存"计数以供以后使用。 因此、一旦我启用中断、它就会在任何时间触发。

    解决方案是根据需要禁用/启用计数器:
    EPwm1Regs.ETPS.bit.INTPRD = 0x0;

    但是、问题1 "为什么中断比它应该到达的时间早得多?" 对我来说没有答案。

    我怀疑引脚的传播时间(过长)。 因此、EPwm1Regs.ETSEL.bit.INTSEL 寄存器被处理并触发中断、而实际信号需要更多时间来激活物理引脚。

    ISR 在 CMPB 或周期前的大约4到7us 处于活动状态、这不是太大?

    来自 ePWM1的中断不会发生这种情况。 在 CMPB 之后、ISR 正在响应0.53us。
    该 ePWM 的运行速度要快得多。 这是区别吗?

    如果有人为我提供了答案、我将使该主题保持打开状态。

    总之、我按照与处理来自 ePWM1的中断相同的方式解决了这个问题:
    现在、ePWM2B 上的 CMPC 和 CMPD 会在 ePWM1A 上的 CMPB 和 CTR=PRD 之后略微触发一个中断、我可以及时控制该中断。

    我祝大家一个美好的星期日和一个富有成效的星期。
    Gustavo
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Gustavo、

    我对您对计时的描述有点困惑,您能否上传一个图表及备注来描述您所看到的内容?

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

    你好、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 我说过、这在我的申请中并不令人不安、但了解原因对未来可能会很有趣。

    此致、

    Gustavo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、只需澄清一下、
    在 CMPB 上生成中断、在中断中切换 GPIO56。
    在 CMPB 切换以生成中断之前,您看到 GPIO 切换?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Nima、谢谢你的回答。

    是的、我看到在 CMPB 上的 EPWM 引脚切换之前、GPOI 会在7us 左右切换

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否有用于此目的的小示例代码? 我以前从未见过这种情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Nima、  

    很抱歉耽误你的时间、我又在旅行。

    下面是一个小代码(我从所有其他任务中清除了它)和一个屏幕截图、您可以在其中看到正在发生的情况。

    在 CPMB 上切换 GPIO56和 ePWB2B (GPIO3)之间的时间比导通周期(7.375us)短(4.875us)

    也许是我的设备?

    奇怪的是、ePWM1上的中断执行我所期望的操作。

    e2e.ti.com/.../forTi28102018_5F00_V05_2D00_14102018.cI Hope,我是罪魁祸首:)

    此致

    Gustavo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    只是看了一下所有东西。 这不是从寄存器到引脚的传播延迟。 这是由于代码中的逻辑错误造成的。 您将在 EPWM1的周期/零(因为它们相同)上为 EPWM2生成中断。 当您更改 EPWM1中断内部的中断选择时、在0 / prd 时、将为 EPWM2生成中断、并在此处切换引脚。 这就是您看到此行为的原因。

    总的来说、如果您切换中断中的引脚、如果您看到它在您发生中断的时间之前发生、这意味着中断是由于标志未被清除或逻辑中出现错误而触发的。 在这种情况下、我想只要您更改 EPWM2的中断源、在 EPWM1 ISR 内部以零/周期发生、就会为 EPWM2生成中断。

    最后、从器件寄存器到引脚的传播延迟不会那么大。 如果您看到较大的延迟、则您的逻辑不会按照您假定的逻辑创建的时序执行。

    很高兴能帮助你 Gustavo。

    NIMA Eskandari
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Nima:
    非常感谢您的宝贵帮助。
    毫无疑问、这是我的代码、是麻烦制造者。 这是我第一次对这种深度的机器进行编程、我仍在学习中断的工作原理。
    但是,我不理解你的观点。 如果在 EPWM1-ISR 内 EPWM2的 INTSEL 改变时、EPWM2-ISR 的计数器到达 CMPC 或 CMPD 的值之前、会在 EPWM2上产生中断、那么我认为这种情况应该早得多。 相反、这在 EPWM1的35个周期之后发生。
    我希望 EPWM2等待 CMPC 或 CMPD 与计数器匹配。 引脚56在 EPWM2-ISR 内部设置。

    我现在意识到,我已经包括了 EPWM1B 的图,这是否会引起混乱?

    短接后恢复:

    EPWM2在 CMPC 或 CMPD 上触发中断
    此行为在 EPWM1-ISR 内部进行调整
    您可以说、由于这种情况、EPWM2会更早地触发中断、进而触发引脚56 (在 EPWM2-ISR 内部)
    如果是这种情况,难道我们不应该在 Pin61变为高电平之后不久看到 Pin56的切换,而不是在35个周期之后?
    我…EPWM2开始寻找 EPWM2上 CMPC 或 CMPD 的下一个转换、并且不会对 EPWM1 μ s 的零/周期做出反应

    我现在又远离原型、无法检查、但:

    要解决此问题:

    如果我首先设置 EPwm2Regs.ETPS.bit.INTPRD = 0x0;在 EPWM2-ISR 内部
    然后在 EPWM1-ISR 内部再次将其设置为0x1、恰好在更改 EPwm2Regs.ETSEL.bit.INTSEL 之前
    以避免这种情况?

    就像这样(我删除了不相关的内容):

    _interrupt void epwm2_ISR (void)

    EPwm2Regs.ETPS.bit.INTPRD = 0x0;//禁用 ePWM2上的 int。 在 EPWM1-ISR 内部对其进行调用

    GpioDataRegs.GPBTOGGLE.bit.GPIO56=1;

    EPwm1Regs.ETCLR.bit.INT = 1;//清除 ePWM1定时器的 INT 标志
    EPwm1Regs.ETPS.bit.INTPRD = 0x2;//在 EPWM1上激活第二个事件时激活中断

    EPwm2Regs.ETCLR.bit.INT = 1;//清除此计时器的 INT 标志
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;//确认此中断以接收来自组3的更多中断


    _interrupt void epwm1_ISR (void)

    EPwm1Regs.ETPS.bit.INTPRD = 0x0;//在 ePWM1上停用 int 直到 ePWM2上的下一个 int

    if (modo =0b110)

    MODO = 0b100;//为 ePWM2上的下一个 INT 100选择 INT 100:当定时器递增时、时基计数器等于 CMPC

    其他

    MODO = 0b110;//为 ePWM2上的下一个 INT 110选择 INT 110:当定时器递增时、时基计数器等于 CMPD


    EPwm2Regs.ETPS.bit.INTPRD = 0x1;//激活 ePWM2上的 int
    EPwm2Regs.ETSEL.bit.INTSEL = MODO;//更改 ePWM2上的时基计数器
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;//确认此中断以接收来自组3的更多中断


    祝你度过美好的一天!
    Gustavo
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    问题不是、即使您已关闭 EPWM2的中断、这并不意味着中断标志未被设置。 因此、当您启用中断时、由于该标志已设置、因此会立即生成中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、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

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

    我只是写了一些代码来做你想做的事,但却是专业的,没有遗漏任何边缘。
    请参阅此代码、

    e2e.ti.com/.../2770270

    NIMA Eskandari
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢、Nima
    我会坚持你的建议,这是很好的帮助!
    此致、
    Gustavo
x 出现错误。请重试或与管理员联系。