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

时间:2014-05-25 07:32:24

标签: embedded microcontroller avr atmel pwm

我试图在快速PWM模式下使用TC0(一个8位定时器)在ATmega2560上使用硬件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模式没有此问题,在我的情况下是可以接受的。我已经尝试过并确认它适用于零占空比和全占空比。

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

您有两种选择:

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

DDRB &= ~(1<<PB1);

..当你想实现零占空比时。我知道这是某种黑客攻击,有时不希望执行这样的操作,但无论如何它都有效。