您好、先生或女士
我正在尝试在 MSP430F149上使用时间 A 生成 SPWM。 但它有故障。 在3/4周期时间内、输出不会按编程方式切换。
TACLK 为2MHz。 紫色通道为 TA0输出、每次计数到 TACCR0、402时都会切换。
黄色通道表示 TA1、蓝色表示 TA2。
您可以看到、每个周期的占空比会以 sin 函数的形式发生变化。 但黄色和蓝色通道上都有一个占空比为100%的周期。 这是错误的。 我不知道为什么。
您知道原因吗? 如何解决? 我可以通过电子邮件向您发送代码。
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上使用时间 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 的作用)、但你可能会得到 一个满足你需要的东西。