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.

[参考译文] TMS320F28035:ePWM ISR 停止随机触发

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/789979/tms320f28035-epwm-isr-stops-triggering-randomly

器件型号:TMS320F28035

您好!

因此、在大约几千个周期后、不会随机调用 ePWM ISR。

那么、我对 ePWM 的初始化或设置有什么问题吗? 它运行时间几乎很长、很难找到问题。

谢谢、

Sagar

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

    您能否提供有关此方面的更多详细信息? "在1000个脉冲后停止脉冲"、然后"在几千个周期后随机调用 ePWM ISR "、这意味着什么?

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

    我想我理解您要做的是什么。 如果我是对的、您需要定期禁用 PWM1、并且您要通过将周期寄存器设置为零并关闭时钟来执行此操作。 大概在一段时间后、您恢复周期寄存器并重新启动时钟。

    首先、注释:将 ETSEL 设置为0xB 将触发周期或零匹配事件的中断、而不仅仅是注释中所述的零匹配。 通常情况下、可以在递增/递减计数器模式下使用该值、但我不知道"TBCTLVAL"的值、因此我无法确定计数器在哪种模式下运行。 我也无法确定您使用的 TBPRD 值、因为我不知道"***"。

    在任何情况下、我都怀疑您通过将周期值设置为零来禁用中断的方法。 可以想象的是、你在计数达到它之前强制 TBPRD 为零、所以匹配发生在 EALLOW 或下一条指令期间、在这种情况下、当你重新启用并且没有中断时、TBCTR 已经通过了周期匹配。 在这种情况下、计数器将继续计数到0xFFFF 并进行换行。 在这种情况下、您可能会丢失中断。 这就是我的理论、您知道。

    最好将 TBPRD 和 CMPA 保持单独并禁用时钟、或者通过将 CMPA 移到 TCPRD 之外来触发比较匹配的中断并禁用、但在执行此操作时、请确保禁用中断。

    这只是一个需要注意的问题。 请务必回答 Vasudha 的问题、以便我们有更多的工作要做。 谢谢。

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在下面的 ISR 中发现 EPwm1Regs.ETCLR.bit.INT = 1;有助于在 TBPRD 结束时生成下一个 ISR 触发。 但是、在 ISR 触发几乎定期持续100万个脉冲(我运行控制直流电机的代码) 7-8小时后、它会错过中断、然后我在 ISR 中完成的所有变量更新都将被处理。 因此、我想了解我设置寄存器的方式是否有误。

    谢谢、



    _interrupt void epwm1_ISR (void)


    EPwm1Regs.ETCLR.bit.INT = 1;
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的代码的这一部分是正确的。

    此致、

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

    您能否提供有关此方面的更多详细信息? "在1000个脉冲后停止脉冲"、然后"在几千个周期后随机调用 ePWM ISR "、这意味着什么?

    我的意思是提供1000脉冲 PWM 论坛直流电机并禁用时钟和关闭 PWM。 然后、我启动 PWM 以实现1000 PWM 脉冲。

    对于 PWM 脉冲的每一端、我都生成了 ePWM ISR 中断。 但是、在具有上述模式后、当我仍有一段时间继续脉冲运行时、不会调用 ePWM ISR。

    因此、这次我连接了探头、并在 命令窗口中手动将 EPwm1Regs.ETCLR.bit.INT = 1 (即使我在 ePWM ISR 中将其清除)、然后它再次开始 触发 ISR。

    因此、我不确定我的行为是否不正确或其他问题。

    谢谢、

    Sagar Shah

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为最可能的解释是、中断发生在您关闭 PWM 时钟之前、它不会被处理。 正如我说过的、通过打开和关闭外设时钟来控制脉冲的技术并不是一种很好的方法。 您可以尝试按照我之前的建议操作 CMPA、或使用 AQ 将 PWM 操作从脉冲生成重新配置为强制低电平。 另一种方法是在 PWM 和 I/O 之间重新配置 GPIO 引脚

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不理解您在操作 CMPA 或 AQ ro 重新配置 PWM 操作的部分? 请解释一下。

    谢谢、
    Sagar Shah
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当然。 从第一个帖子中的初始化代码中、您已按如下方式配置 PWM1A:
    EPwm1Regs.AQCTLA.bit.ZRO = 0x02;//输出高电平为零
    EPwm1Regs.AQCTLA.bit.PRD = 0x00;//不受影响。
    EPwm1Regs.AQCTLA.bit.CAU = 0x01;// CMPA 输出低电平

    因此、要禁用 PWM、您只需写入:
    EPwm1Regs.AQCTLA.bit.ZRO = 0x01;//输出低电平为零

    ...并通过以下方式重新启用:
    EPwm1Regs.AQCTLA.bit.ZRO = 0x02;//输出高电平为零

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在我的第一个帖子中、系统发出1000个脉冲、然后等待来自其他系统(API)的信号、然后再次发送1000个脉冲并等待 API 信号。 因此、这就是我在未收到来自 API 的信号时禁用时钟的原因。 因此、您的意思不是让 EPwm1Regs.CMPA.half-CMPA=0;
    EPwm1Regs.TBPRD=0;
    EALLOW;
    SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 0;
    EDIS;

    我应该这样做、要禁用 PWM、您只需写入:
    EPwm1Regs.AQCTLA.bit.ZRO = 0x01;//在零时输出低电平???

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

    当您只想停止产生 PWM 脉冲时、我不明白为什么您需要禁用时钟。  您最初描述的问题可能是由于执行此操作时出现的一些计时问题引起的。  我已经介绍了如何在不禁用时钟的情况下完成相同的操作-您可以使 PWM 保持运行、但可以将其重新配置为始终输出低电平。  是的。

    此致、

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想补充一点、可能有一些关于您尝试执行的操作的事情、这对我来说是不清楚的。 如果您的目的是在另一个系统响应的精确时刻启动 PWM、那么您可以尝试使用 TBCTL.CTRMODE 禁用 TBCLK 并复位 TBCTR。 您必须仔细思考细节、然后尝试一下。

    如果您可以附加所需的时序图、它可能会有所帮助。 谢谢。

    此致、

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

    下面是从 API 接收 START 命令后我需要的一个完整周期的脉冲

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢。 以下是几个问题:
    1、在收到某种触发信号时、脉冲是否正确启动? 如果是、触发器是软件还是硬件?
    2、脉冲从低电平开始、在高电平结束。 在下一个序列开始时、什么会将输出复位回低电平?
    此致、
    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此外、我还对如何在完成如上所示的脉冲移动后启用 ePWM 时钟和其他序列有疑问。

    从 API 接收起始后为 void Start(){//
    EALLOW;
    SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;
    EDIS;

    EPwm1Regs.TBCTL.bit.CLKDIV = 0x6;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x0;

    EPwm1Regs.ETSEL.bit.INTEN = 1;//启用 INT
    EPwm1Regs.ETSEL.bit.INTSEL = 1;
    EPwm1Regs.ETCLR.bit.INT = 1;
    EPwm1Regs.TBPRD = CPU_CLK/(2个 PULSE_SPEED);// PULSE_SPEED 是一个 uint16 (范围从400- 1500)
    EPwm1Regs.CMPA.half.CMPA =(EPwm1Regs.TBPRD +1)/2;





    从 API 接收停止后为 void STP(){//
    EPwm1Regs.CMPA.half.CMPA=0;
    EPwm1Regs.TBPRD=0;
    EALLOW;
    SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 0;
    EDIS;



    那么、上述顺序是否正确? 我应该将 EPwm1Regs.TBCTR=0置于起始位置还是其它位置?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1) 1)是否应在触发时启动。 但几个周期的延迟是可以的。
    2)忽略处于高电平状态的零件。 它应该在 STOP 命令之后进入低电平状态。(在周期结束时示波器图像不正确)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为 PWM 中断的丢失与您何时启用和禁用相对于中断的时钟的时序有关。 在我看来、通过更改时基计数器使时钟保持活动状态并控制 PWM 突发将会更安全。 我沿这些线路编码了一些内容、似乎可以正常工作。 下面是我所做的事情的摘要。

    整个 PWM 初始化:

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;// TB 时钟停止
    EDIS;
    EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结 TB 计数器
    EPwm1Regs.TBCTL.bit.PRDLD = 1;//立即加载
    EPwm1Regs.TBCTL.bit.PHSEN = 0;//禁用相位加载
    EPwm1Regs.TBCTL.bit.SYNCOSEL = 3;//禁用 SYNCOUT 信号
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;// TBCLK = SYSCLKOUT
    EPwm1Regs.TBCTL.bit.CLKDIV = 0;//时钟分频器=/1
    EPwm1Regs.TBCTL.bit.FREE_SOFT = 0; //在仿真挂起时停止
    EPwm1Regs.TBPRD = 1600;//为 ePWM1设置周期
    EPwm1Regs.TBPHS.ALL = 0;//时基相位寄存器
    EPwm1Regs.TBCTR = 0;//时基计数器寄存器
    EPwm1Regs.ETSEL.bit.SOCAEN = 1;//在组上启用 SOC
    EPwm1Regs.ETSEL.bit.SOCASEL = 1;//从零匹配中选择 SOC
    EPwm1Regs.ETSEL.bit.INTEN = 1; //启用 PWM 中断
    EPwm1Regs.ETSEL.bit.INTSEL = 1; //在零匹配时生成中断
    EPwm1Regs.ETPS.bit.INTPRD = 1; //在发生第一个事件时生成脉冲
    EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0;//启用影子模式
    EPwm1Regs.CMPCTL.bit.LOADAMODE = 2;//在 CTR 上重新加载=零
    EPwm1Regs.CMPA.half.CMPA = 0x0080;//设置比较值
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;// CMPA 上的低电平匹配
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;//零匹配时为高电平
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;//启动 TB 时钟
    EDIS;


    我将 CPU 计时器设置为1Hz 频率以启动突发。 在您的实施中、触发器将来自响应系统。 在计时器 ISR 中、我有以下行来启动突发:

    EPwm1Regs.TBCTL.bit.CTRMODE = 0; //释放计数器
    EPwm1Regs.AQCSFRC.bit.CSFA = 0; //强制拉低

    PWM ISR 如下所示:

    #define PRDMAX 1600

    无符号长整型 PwmIsrCount = 0L;
    unsigned int pulseCount = 0U;
    unsigned int xprd = PRDMAX;

    //中断服务例程-由 PWM1 (EPWM1_INT)触发
    中断空 PwmIsr (空)

    PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
    EPwm1Regs.ETCLR.bit.INT = 1;

    EPwm1Regs.TBPRD = xprd--;
    EPwm1Regs.CMPA.half.CMPA =(xprd >> 1);

    IF (1000U < PwmIsrCount++)

    xprd = PRDMAX;
    PwmIsrCount = 0L;
    EPwm1Regs.TBCTL.bit.CTRMODE = 3;
    EPwm1Regs.TBCTR = 0;
    EPwm1Regs.AQCSFRC.bit.CSFA = 1;
    asm (" NOP");



    引脚上的电流、则信号看起来很好。 但愿这对您有所帮助。

    此致、

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

    感谢你的帮助。

    我相信我的代码中有类似的 Init。 但我仍然不明白、在我的所有启动条件之后、启用 EPwm1 ISR 后、会触发一次。 这是不进入 ISR 的一些方法、在命令窗口中、我放置了 EPwm1Regs.ETCLR.bit.INT 、并使其等于1。 然后、突然它开始定期进入 ISR。

    那么、如果您能让我明白为什么会发生这种情况呢?

    在上面的代码中还有 PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
    EPwm1Regs.ETCLR.bit.INT = 1;在 ISR 开始时(而是在结束时)、而在 ISR 结束时。 那么、它是按这样的目的完成的吗?

    谢谢

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

    PIE 模块和内核之间存在一种握手。 当您写入 PIEACK 寄存器时、您会告诉内核该线路上的中断已经被处理、并且可以生成另一个中断。 您还必须清除触发源、这正是这两条线所做的。

    在您的代码中、存在一种间歇性情况、即发生握手、但不清除触发器、反之亦然。 很可能在清除旧中断触发器后出现新的中断触发器。 我不知道这是怎么发生的、但在退出 ISR 之前清除触发器可能会有所帮助。 我还怀疑这与按照您的方式移除外设时钟有关。 我建议的方法避免了这种情况。

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、您的意思是、如果我想禁用时钟并启用时钟-

    那么、我应该在哪里设置时钟分频值呢? 在启用时钟之后、会怎么样? 是否有适合的顺序?
    谢谢、
    Sagar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    萨加尔

    我建议的方法不要求停止并重新启动 PWM 时钟。 如果您想这样做、可以、但在写入任何寄存器之前、必须设置 SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1。

    此致、

    Richard