Answers:
PWM信号由AVR芯片上的计时器生成。每个定时器可以在两个或三个不同的引脚上产生PWM信号。每个引脚可以有自己的占空比,但是它们共享PWM频率。您可以通过更改计时器的时钟源来更改PWM的频率。默认情况下,它们使用CPU时钟除以64,即。他们通过Arduino初始化代码将其预分频器设置为64。更令人困惑的是,有两种不同的PWM模式:快速PWM和相位校正PWM。在快速PWM中,计时器计数到255,然后溢出并从0(256个不同状态)重新开始。在相位校正PWM中,计时器计数到255,然后改变方向并向下计数到零,改变方向,依此类推(510种不同状态)。
Arduino Mega有5个计时器,计时器0-计时器4。由于timer0还用于毫秒和微功能,因此它使用快速PWM,而其他定时器配置为用于相位校正PWM。这导致不同引脚上的频率不同:
引脚4和13,由
计时器0 控制:16 Mhz / 64/256 = 976.56 Hz
由定时器1-4控制的其他PWM引脚:
16 Mhz / 64/510 = 490.20 Hz
计算公式为:时钟/预分频器/ PWM模式的状态数
对于我所知的所有其他Arduino板,情况都是一样的,除了它们连接到不同引脚的计时器更少。
您可以通过更改定时器预分频器来更改PWM频率。参见本页:http : //playground.arduino.cc/Main/TimerPWMCheatsheet
也可以使定时器的计数值不同于255。在8位定时器上,您将松开输出引脚,但在16位定时器上,可以使用输入捕捉寄存器来定义TOP值。输入捕获功能是Arduino社区中很少使用的功能,因此您可能不会错过它。
Arduino库仅允许您使用8位分辨率,即使在16位定时器上也是如此。如果需要更高的分辨率,则必须编写自己的AnalogWrite或使用为此目的而创建的库。在Arduino Mega上,timer0和timer2为8位,其余均为16位。
通过更改16位定时器的模式以利用全分辨率,并结合更改预分频器和TOP值,可以实现非常宽的PWM频率范围。
在快速PWM模式下,通过将预分频器设置为1,将TOP设置为3,可以达到的最大频率是时钟/ 4,不允许使用较低的值。这将为您提供2位分辨率的4 MHz PWM。可以是0%,25%,50%或75%的时间。较高的TOP值将以较低的频率提供较高的分辨率。
更改定时器0的预分频器,PWM模式或TOP值会与millis()
和混为一谈micros()
。