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.

[参考译文] CCS/LAUNCHXL-F28069M:每第五个事件触发一次生成 PWM INT

Guru**** 2609685 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/686345/ccs-launchxl-f28069m-generate-pwm-int-each-5th-event-trigger

器件型号:LAUNCHXL-F28069M

工具/软件:Code Composer Studio

您好!

我使用的是 F28069 MCU

我需要在 ePWM1的第5个事件触发时生成中断信号。 我知道我可以将 事件触发器的预分频器更改为第1、第2或第3个事件。 但是、我如何才能使它适用于第四个或第五个事件?

谢谢你

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

    我看到您发布了类似的主题。 原始帖子是否未解决您的查询?
    e2e.ti.com/.../680583

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

    Ahmed、

    对于简单的情况(每1、2或3)、您可以使用预分频器。 对于更复杂的解决方案、您需要添加一些软件来跳过中断"x"次数。

    如果您有一个时间关键型应用无法处理这些额外中断、那么您将需要专用于另一个以较低频率运行的 PWM、该 PWM 将与所需的间隔保持一致。 注意:您仍然可以通过在较慢的 PWM 上使用预分频器获得额外的灵活性。

    此致、
    Cody  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Vasudha、您好!
    我的第一个想法是生成另一个 PWM2并将其与第一个 PWM1每第二个事件同步、然后使 PWM2每第三个事件生成中断。 通过这种方式、中断生成了每6个事件。 遗憾的是、我无法做到这一点、因为我不知道如何使 PWM2每第二个事件与 PWM1同步(频率为一半)。 我按照您的建议返回了 TRM、但我找不到任何有关如何执行该操作的指南。

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

    科迪的好地方!
    实际上、我现在要做的是通过在 PWM ISR 中添加计数器来生成每 n 个事件的软件中断。 但问题是、这种方法会占用额外的处理周期、这对于我的应用至关重要(清除中断标志、确认、 然后进行计数并检查是否发生了第6个事件)、即使在提升软件中断标志和启动软件 ISR 之间存在延迟、我也不知道产生此延迟的原因。 以下是我的代码的一部分:

    中断空 epwm1_ISR (空)  
    {//清除此计时器的 INT 标志
    EPwm1Regs.ETCLR.bit.INT = 1;  
    //确认此中断以接收来自组3的更多中断
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
    //计数周期以更新控制
    cycle_counter++;
    如果(cycle_counter = max_cycle+1)

    //设置软件 INT 标志 INT4.4
    PieCtrlRegs.PIEIFR4.bit.INTx4 = 1;
    cycle_counter = 1;


    中断 void Software_ISR (void)//主中断函数、外部循环是全局状态机


    IER |= M_INT3;  
    PieCtrlRegs.PIEIER3.bit.INTx1 = 1;//通过调整 PIEIER2来设置组优先级以允许 INT3.1中断当前 ISR
    PieCtrlRegs.PIEACK.ALL = 0xFFFF;//启用 PIE 中断
    asm (" NOP");//等待一个周期
    EINT;

    **软件 ISR 代码

    提示



    因此、我更希望有一个硬件解决方案可以节省一些处理时间。
    根据您生成另一个频率较低的 PWM 的建议。 嗯、对于我的应用、PWM 周期经常突然变化、所以我不能仅仅依靠通过设置周期来对齐两个 PWM。 我想以某种方式将它们同步在一起、例如、第二个 PWM 的零点与第一个 PWM 的第二个零点同步、因此无论第一个 PWM 的周期发生什么变化、我都可以保证每6个零点的 INT

    您对如何实现这一目的有什么想法吗?



    谢谢你
    Ahmed

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

    编辑于5/4/18 10:25 CST

    我回复得太快了、很快就回答了您对 Vasudha 的第一次回复:如果启用了同步脉冲、则每个周期都会出现... 有人使用 SWSYNC 来解决这个问题、但我的理解是它并不像听起来那么重要。

    _________________________________________

    Ahmed、

    ePWM 一章讨论了同步方案、它包含在时基子模块的小节(3.2.2)中。

    您将需要配置一个 PWM 的 SYNCO 脉冲、并在下一个 PWM 的 SYNCI 信号上选择该信号。 您还需要使用 TBCTL.PHSEN 启用相位加载、否则脉冲将被忽略。 如果需要、TBPHS 可被用于应用一个相移。

    在测试系统时、我建议您有意添加相位偏移、然后对其进行校正、以确保正确设置同步链。

    所有这些功能以及更多功能的完整详细信息可在先前链接的 TRM 中找到。

    此致、
    Cody  

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

    Ahmed、

    如果您在使用变频 PWM 时需要每6个周期中断一次、我可以看到两种实现这一目的的方法。

    1. 添加一条'if'语句以绕过您只想每6个周期运行的代码。 这与您在上面所做的类似、我认为我不会调用第二个中断、我会将代码嵌套在 if 语句中。
    2. 如前所述定义慢速 PWM、每6个周期仅更新一次更高频率 PWM。  
      1. 使用此解决方案、您需要定义一个无法更新 PWM 周期的阻断周期(除第6个周期之外的所有周期)、从而使两个 PWM 保持同步。

    这有道理吗?


    此致、
    Cody  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Cody、
    关于第一项建议:
    实际上、我的代码需要大约整个周期才能完成、这就是为什么我需要将中断延迟到第6个事件(基本上、我的 PWM 频率为0.8MHz 至1.5MHz、SYSCLK 为90MHz、我处理的时间有限) 因此、我想、如果我在 PWM ISR 中将代码嵌套在 if 语句中、如果我使用1.5MHz PWM、我肯定会错过 PWM 的一个中断。 这就是我将主代码带到 PWM ISR 外部的原因。 这样、如果发生 PWM 中断、程序将跳转到 PWM ISR 并增加计数器、然后再次返回到软件中断。

    我不完全理解您的第二个建议。 我实际上在第6个周期更新了 PRD、但有时在代码中、我需要在第5个周期更新 PRD、然后在第6个周期更新 PRD、如果是、我猜不能保证与低频 PWM 保持一致? 。 无论如何,我会尝试这个建议,看看它是否仍然能提供良好的性能。

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

    Ahmed、

    是的、当 ISR 频率较高时、第一种方法可能会过于繁琐。  

    第二种方法可能会以某种方式降低系统性能、但通常情况下、客户会过度限制其设计。 我不知道您的系统是否能够承受 PWM 周期较低的刷新率、但您应该能够测量其影响。


    此致、
    Cody