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.

[参考译文] MSP430G2553:定时器 A1与放大器;CCR2作为 PWM 控制器-在高 CPU 负载下发生故障

Guru**** 2589265 points
Other Parts Discussed in Thread: MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/719439/msp430g2553-timer-a1-ccr2-as-pwm-controller---malfunctioning-under-heavy-cpu-load

器件型号:MSP430G2553

您好!

我正在使用上面的 MSP430G2553微控制器、并且需要生成 PWM 信号、我正在使用计时器 A1及其 CCR2执行此操作。

我已将时钟源设置为 SMCLK、并将运行模式设置为 OUTMOD_7 (复位/置位)。 为了设置 PWM 周期、TA1CCR0是手机代码中的0x00FF。 在软件中设置 TA1CCR2以设置占空比。

即使我将 TA1CCR2设置为始终等于一个常量并且不在代码中的其他任何位置触摸它、我的输出信号也会在随机的时间段内将自身置为高电平。

我已确保微控制器永远不会进入睡眠模式。 当我关闭 GIE 时、问题似乎消失了、因此我怀疑我的代码中可能存在堆栈溢出问题、但即使我有了堆栈溢出问题、也绝不会发生这种情况。 我在启动时有一个断点、微控制器从未复位。

我已经阅读了器件勘误表、并且有一些关于 Timer A 上错误中断等的评论。但数据表、手册或勘误表中没有任何内容表明这种情况应该发生。

我错过了什么吗? 是否有可能导致这种情况的东西我错过了?

此致、Keir

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否在代码的其他位置修改了定时器的寄存器(尤其是在中断处理程序中)?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Keir、

    我可以在这里看到的一个问题是、如果你有来自不同源的大量中断、或者有很长的中断、那么你可能会饿着计时器中断、从而导致它们的处理延迟、从而在你的 PWM 中产生毛刺脉冲或毛刺脉冲。

    例如、中断优先级可能会出现问题、因为经常设置较高优先级的中断源或中断源的速度会非常快或持续。 因此、计时器中断不会及时得到处理、以确保 PWM 不受影响。 或者、你可以有一个较长的 ISR (无论优先级如何)、在定时器中断进入时、你仍在另一个中断的 ISR 例程中。 因此、在运行之前、无法为另一个 ISR 的计时器中断提供服务。

    我建议您在主代码循环中执行 ISR 中的大多数运算。 为此、只需标记 ISR 设置/清除的标志、以便在主循环中检查以执行操作。 这样、您就可以限制为其他 ISR 提供服务的时间、而计时器 ISR 则可以提供服务。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可能会使计时器中断快得要死

    使用 OUTMOD_7生成 PWM 不需要中断。

    影响输出的唯一方法是混乱硬件(时钟或计时器)。

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

    感谢 Jace H、

    不幸的是、我有一个非常繁忙的 UART 接口、因此它的 ISR 经常会触发。 尽管根据数据表、两个计时器模块的中断优先级都高于我也使用的 UART 或 ADC。

    虽然我仍然觉得自己是一个硬件模块、我并不关心它自己的中断、但 TimerA 和它的 CCP 模块应该能够继续生成 PWM 波形、而不管微控制器的其余部分的状态、除了功率和时钟。

    CCP 模块是否取决于中断状态、即使它自己的中断使能被关闭也是如此?

    在理想情况下、我会选择一个带有 DMA 控制器的微控制器、这样我就不必担心所有 UART 中断。 但是、由于这些 ISR 仅从存储器传输数据、因此执行起来非常快、非常频繁。

    此致、Keir

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不、我在任何地方都搜索了计时器寄存器。 它们仅在初始化例程和单个 PWM 更新例程中引用、如原始文章中所述、如果我注释掉写入 TACCR2的更新例程中的行、则问题仍然存在。

    当然、计时器使用的是 SMCLK、在某些功耗模式下、它可能会被关闭、但我再次确保它绝不会进入低功耗模式。

    更新例程位于主循环中、不在中断上-尽管它由从 ADC 中断更新的状态机触发。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当您将 SMCLK 输出到 P1.4时、它看起来是否正常?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尽管为 true、计时器将在无干预的情况下输出正确的脉冲宽度、但如果您希望在信号中没有或无法察觉的"毛刺脉冲"的情况下、在周期之间更改该脉冲宽度、 然后、您需要在一个完整周期结束后更改定时器 ISR 内的 CCR 值。 这一点尤其重要、例如为声音输出创建 PWM DAC。 (请参阅 www.ti.com/.../TIDM-VOICEBANDAUDIO )链接的项目是我之所以提到这种可能性的主要原因,因为我在首次创建该项目时遇到了类似的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Keith、

    如果看不到确切的波形和计时器设置、我就无法确定问题是什么。 话虽如此、另一种查看方法是查看您是否可以提高 MCLK 频率、以便器件使用更少的时间来处理 ISR 并通过主循环。