根据Arduino参考analogWrite()
,大多数引脚上的PWM频率约为490 Hz。但是,Uno上的引脚5和6以及Leonardo上的引脚3和11约为980 Hz。
为什么这些不同?它是故意设计的功能,还是由硬件决定的?
根据Arduino参考analogWrite()
,大多数引脚上的PWM频率约为490 Hz。但是,Uno上的引脚5和6以及Leonardo上的引脚3和11约为980 Hz。
为什么这些不同?它是故意设计的功能,还是由硬件决定的?
Answers:
这些并不是PWM信号可用的唯一频率。但是,它们是由所应用的预分频器确定的频率(您可以按如下所述轻松更改)。
3对PWM引脚中的每对都与一个定时器相连,每个定时器都有自己的基本频率,如下所示:
然后,每组引脚都有许多可以选择的预分频器值,它们将划分该对引脚的基频。可用的预分频器值为:
不同的组合会在给定的PWM引脚中产生不同的频率。请注意,计时器2(与引脚3和11绑定)具有更多可用的预分频器值,从而有更多可用频率。
现在,为什么计时器2不同,这是一个单独的问题。
编辑:这是每个引脚可能的PWM频率的列表(来自本文):
对于引脚6和5(OC0A和OC0B):
- 如果TCCR0B = xxxxx001,则频率为64kHz
- 如果TCCR0B = xxxxx010,则频率为8 kHz
- 如果TCCR0B = xxxxx011,则频率为1kHz(这是Diecimila引导程序的默认设置)
- 如果TCCR0B = xxxxx100,则频率为250Hz
- 如果TCCR0B = xxxxx101,则频率为62.5 Hz
对于引脚9、10、11和3(OC1A,OC1B,OC2A,OC2B):
- 如果TCCRnB = xxxxx001,则频率为32kHz
- 如果TCCRnB = xxxxx010,则频率为4 kHz
- 如果TCCRnB = xxxxx011,则频率为500Hz(这是Diecimila引导程序的默认设置)
- 如果TCCRnB = xxxxx100,则频率为125Hz
- 如果TCCRnB = xxxxx101,则频率为31.25 Hz
TCCRnB
在此处设置timer的预分频器位,根据要设置的定时器n
,将其替换n
为0、1或2。如果仍然不确定按位运算,请阅读此位数学教程。
我的资料来源:
请注意,在这些来源中,关于引脚9和10是否具有与5和6或3和11相同的行为,似乎存在分歧,但是无论如何您都可以理解。我正在阅读数据表,以尝试找出正确的方法,或者这是否是板之间的差异。
我不了解设计注意事项,但是如果您查看Arduino上微控制器的数据表,您会注意到PWM引脚组合在一起,并且每组都连接到定时器。此定时器的增加速度因配置的预分频器而异。如果您为某个定时器更改了预分频器,则将更改相关PWM引脚的PWM频率。我相信某些计时器会为该millis();
功能的其他目的加倍。如果更改该计时器的预分频器,则返回的值millis()
将因相同的因素而偏离。
您可以如下计算预分频器的设置:
$$ \ text {prescaler} = \ dfrac {f_ {CPU}} {PWMresolution×f_ {PWM}} = \ dfrac {16 \ text {MHz}} {256×490} \约128 $$
预分频器= f [CPU] /(PWMresolution×f [PWM])= 16000000 /(256×490)=大约128。
查看数据表,您会发现128确实是您可以选择的预分频器值之一。