如何在没有毛刺的情况下实现AVR的零占空比PWM?

Amb*_*jak 7 embedded microcontroller avr atmel pwm

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

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

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

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

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

总体上反转PWM可能是适用的,但是问题恰好变为完全占空比,具有对称问题.

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

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

没有办法让PWM运行一个周期左右,并在它准备就绪时切换到它 - 使能PWM立即强制引脚输出.

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

vla*_*sch 5

你有两个选择:

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

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


小智 5

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

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

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