9

我正在尝试在 ATmega2560 上使用硬件 PWM,在快速 PWM 模式下使用 TC0(一个 8 位定时器)。我需要动态调整占空比,这包括零占空比。然而,这似乎并不容易,甚至是不可能的。引用数据表:

OCR0A 寄存器的极值代表在快速 PWM 模式下生成 PWM 波形输出的特殊情况。如果 OCR0A 设置为 BOTTOM,则每个 MAX+1 个定时器时钟周期的输出将是一个窄尖峰。将 OCR0A 设置为 MAX 将导致输出持续高电平或低电平(取决于 COM0A1:0 位设置的输出极性)。

因此,将 OCR0A 设置为 0 (=BOTTOM) 实际上不会导致占空比为零,我的测试证实了这一点。需要采取其他一些方法。

首先,我已经教过如何使用上面引用中描述的 OCR0A=MAX 特殊情况。结合临时切换到反转模式,这将导致零占空比。但是,由于 COM0A1:0 位不是双缓冲的(并且不与 OCR0A 同步),如果在输出为高电平时切换模式(它将一直保持高电平直到下一次溢出),这可能会导致输出出现毛刺)。OCR0A 更改和模式更改的顺序似乎无关紧要,两者都可能出现故障。

我还考虑了另一种解决方案,通过设置 COM0A1:0=0 来关闭 PWM。这将立即将输出设置为 PORT 寄存器中的值,该值将为零。但是仍然存在从零输出回到非零占空比的问题。根据我在数据表中读到的内容,将 COM0A1:0 设置为重新启用 PWM 会立即将输出引脚切换到 PWM 的输出,这可能是一个不正确的值,直到下一次比较匹配或定时器溢出。因此,出现故障。

将 PWM 整体反相可能是适用的,但随后问题就变成了实现全占空比,并存在对称问题。

请注意,在通过 PORT 强制引脚输出时,不能保持启用 PWM 波形生成,如数据表中所述:

比较输出模式 (COM0x1:0) 位有两个功能。波形发生器使用 COM0x1:0 位来定义下一次比较匹配时的输出比较 (OC0x) 状态。此外,COM0x1:0 位控制 OC0x 引脚输出源。

没有办法让 PWM 运行一个周期左右并在它准备好时切换到它 - 启用 PWM 会立即强制引脚输出。

更新。相位校正(中心对齐)PWM 模式没有这个问题,在我的情况下是可以接受的。我已经尝试过并确认它适用于零占空比和全占空比。

4

4 回答 4

5

你有两个选择:

  1. 如果您使用快速 pwm:您可以使用倒置 pwm。您需要做的就是将 OC 引脚设置为反向模式并反转您的 pwm 比较值。但是 - 你现在有 100% 占空比的故障

  2. 使用相位正确的 pwm。缺点是最大频率减半。

于 2014-05-26T15:04:22.687 回答
5

我刚刚遇到了同样的问题,但需要在 atmega2560 上坚持使用快速 PWM 设置。

我找到的解决方案是暂时将输出引脚置于正常端口操作(即在需要零占空比时将 TCCRnA 寄存器的 COMnX1 和 COMnX1 位设置为零:

TCCR1A &= (0<<COM1A1) & (0<<COM1A1);

于 2016-09-29T19:45:49.240 回答
1

在快速 pwm 模式下,占空比为:(OCRx+1)/(TOP+1) * 100% 因此,在同相模式下永远不会达到 0%,在反相模式下永远不会达到 100%。

于 2015-05-15T10:08:34.027 回答
0

还有另一种选择,只需将引脚方向更改为输入,如下所示:

DDRB &= ~(1<<PB1);

..当您想要实现零占空比时。我知道这是一种黑客行为,有时不希望执行这样的事情,但无论如何它都有效。

于 2016-08-26T13:04:45.060 回答