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.

[参考译文] MSP430F149:定时器作为 PWM 发生器工作故障。

Guru**** 2535750 points
Other Parts Discussed in Thread: MSP430F149

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/594583/msp430f149-timer-working-as-pwm-generator-malfunction

器件型号:MSP430F149

您好、先生或女士

我正在尝试在 MSP430F149上使用时间 A 生成 SPWM。 但它有故障。 在3/4周期时间内、输出不会按编程方式切换。  

TACLK 为2MHz。 紫色通道为 TA0输出、每次计数到 TACCR0、402时都会切换。

黄色通道表示 TA1、蓝色表示 TA2。  

您可以看到、每个周期的占空比会以 sin 函数的形式发生变化。 但黄色和蓝色通道上都有一个占空比为100%的周期。 这是错误的。 我不知道为什么。

您知道原因吗? 如何解决? 我可以通过电子邮件向您发送代码。

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

    由于未缓冲 TimerA CMR、因此更新占空比接近0%和100%时存在危险(竞态)。 症状通常是"毛刺脉冲"周期、如您所看到的周期。

    比赛必须在计数器(TAR)计数超过 CCR 后进行更新。 如果您在之前或之后不断更新、您将不会看到干扰、但这种一致性难以在边界上管理。  

    这并不是微不足道的补救措施、但如果考虑可能的订购、您通常可以获得所需的产品。 一种可能是更新 CCIFG 上的 CCR、而不是 TAIFG。 OUTMOD 的一个好选择很有帮助。

    如果您可以选择使用 TB0而不是 TA0、则可以避免这些危险、因为使用 TB0时、硬件会在众所周知的时间可靠地更新 CCR。

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

    您好、感谢您的回复。

    CCR0始终为402。  

    我更新 了计时器 A0中断服务函数中的 CCR1和 CCR2。 因此、我认为我正在使用 TACCR0 CCIFG 更新 TACCR1和 CCR2。

    当我更新 CCR1和 CCR2时、由于 CCR0>=CCR1=CCR1=CCR2=6或9、因此 CCR1和 CCR2在计数器(TAR)计数超过它们之后更新。

    并且  "毛刺脉冲"周期每次都在同一位置(CCR1=9 CCR2=6)上进行计算。 这是否意味着什么?

    谢谢

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

    > 由于 CCR0>=CCR1=CCR2=6或9、因此 CCR1和 CCR2在计数器(TAR)计数超过它们之后更新

    几乎。 CCR0不是问题。 而是从 CCR0中断的时刻到更新 CCR (每个 CCR0中断)的时刻所花费的(执行)时间。 这将始终为非0、实际上6 (或9)个节拍是相当好的。 如果该时间大于要放入 CCR 的值、则(如您所说) TAR 已经计数到超过该值("未命中")、因此该周期将不会有 OUTMOD 转换、这是干扰产生的地方。

    关键 CCR 值始终相同这一事实意味着您的 MCU 不是很忙。 如果您要添加代码(尤其是可能会延迟 ISR 的另一个中断)、这些数字可能会跳转。 这使得检测这种情况变得很复杂。

    您可能会考虑基于 CCTLn:CCIFG (A1_vector)而不是 CCR0:CCIFG (A0_vector)更新 CCRn。 这意味着您总是"错过"、但您随后会在下一个时间段"点击"。

    这有不同的危险:如果将 CCR 更改为更大的值,则在一个时间段内可能会得到两个 CCR 匹配。 如果您使用诸如 Reset/Set 的 OUTMOD、这不会立即影响波形(因为您要重置两次)、但您将在一个周期内更新 CCR 两次、这将丢失该步骤。 您可能能够证明、根据您的序列、这种情况不会发生。 否则、您可以设置互锁、这样您就不会在 CCR0中断之间更新两次。

    正如我说过的、没有微不足道的补救措施(这就是 TimerB 的作用)、但你可能会得到 一个满足你需要的东西。