我正在尝试在 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 模式没有这个问题,在我的情况下是可以接受的。我已经尝试过并确认它适用于零占空比和全占空比。