Arduino上PWM输出的频率是多少


22

当您使用analogWrite()时,Arduinos用于正常PWM的频率是多少?

不同的Arduino模型是否有所不同?我对Mega 2560特别感兴趣,但也想知道两个型号之间是否一致。

我看过使用500 Hz的Arduino的引用,这似乎很慢。


这也取决于您使用的引脚。
Gerben 2014年

Answers:


31

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()


1
然后,我得出的结论是,PWM可获得的最快频率是16Mhz / 256(预分频器= 1)或62.5Khz?
邓肯C

而且,PWM频率必须是62.5KHz的偶数因子吗?另一个线程上的某人想要控制4针PC风扇的风扇速度。显然,它需要25KHz的PWM控制信号。62.5 / 25为2.5,这不是整数值。
Duncan C

我更新了答案,以详细说明实现特定频率的可能性,
user2973

在低频端,您可以通过1024预分频器在相位校正模式下预分频一个16位定时器,以获得16e6 / 1024/2 ^ 16/2 = 0.119Hz或7.1个周期/分钟。低于此值,则需要基于millis()之类的内容切换位。或者触发外部输入引脚T?上的计数器。
戴夫X
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.