我试图在快速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模式没有此问题,在我的情况下是可以接受的。我已经尝试过并确认它适用于零占空比和全占空比。
答案 0 :(得分:5)
我刚刚遇到同样的问题,但需要在atmega2560上坚持使用快速PWM设置。
我发现的解决方案是暂时将输出引脚置于正常端口操作(即,当需要零占空比时,将TCCRnA寄存器的COMnX1和COMnX1位设置为零:
TCCR1A &= (0<<COM1A1) & (0<<COM1A1);
答案 1 :(得分:3)
您有两种选择:
如果您使用快速pwm: 你可以使用倒置的pwm。您需要做的就是将OC Pins设置为反向模式并反转您的pwm比较值。但是 - 你现在有100%占空比的故障
使用相位正确的pwm。退回是最大频率减半。
答案 2 :(得分:0)
在快速pwm模式下,占空比为: (OCRx + 1)/(TOP + 1)* 100% 因此,在非反相模式下永远不能达到0%,在反相模式下永远不会达到100%。
答案 3 :(得分:0)
还有另一种选择,只需将引脚方向改为输入,如下所示:
DDRB &= ~(1<<PB1);
..当你想实现零占空比时。我知道这是某种黑客攻击,有时不希望执行这样的操作,但无论如何它都有效。