如果Arduino Uno只有6个数字PWM引脚,如何支持多达12个伺服器?


10

根据

伺服库在大多数Arduino板上最多支持12个电机,在Arduino Mega上最多支持48个电机。在Mega以外的板上,使用该库会禁用引脚9和10上的AnalogWrite()(PWM)功能,无论这些引脚上是否有Servo。在Mega上,最多可以使用12个伺服器,而不会影响PWM功能。使用12到23个电机将禁用引脚11和12上的PWM。

然而,根据

数字I / O引脚14(其中6个提供PWM输出)

那么,如果Uno只有6个可提供PWM输出的数字I / O引脚,那么如何控制6个以上的伺服器呢?

Answers:


8

伺服库不使用PWM。当您调用write()时,它将以微秒为单位计算脉冲宽度,并将其存储在全局数组中。然后是一个计时器,该计时器定期触发一个中断,该中断会根据每个通道的所需脉冲宽度来更改输出信号。

您可以在下面找到源代码: Github链接


1
所以它本质上是模拟PWM?那么带PWM通道的数字引脚的作用是什么?
user41158 2014年

2
通常,伺服脉冲的长度约为1 ms。因此,它们必须由大约1 kHz的频率驱动,这很容易通过软件在任何运行于数MHz的微型输出上生成。AVR PWM输出由专用硬件生成,可以达到CPU频率,但通道数有限。我猜想Servo模块的作者决定使用单个计时器,以便处理与引脚一样多的通道,并将PWM硬件保存为其他用途。
Grapsus 2014年

1
Arduino输出的PWM用于占空比在0到100%之间的可变功率输出。RC样式的“ PWM”控制的占空比范围非常有限-50 Hz时1000 us为5%,50 Hz时2000 us为10%。将RC PWM视为“脉冲序列”,而不是传统的“ PWM”。
乔恩·瓦特

@ user41158如果您有无限的CPU时间,则可以将任何数字输出用作PWM并通过软件控制它们,不仅限于PWM,从理论上讲,您可以通过编写程序并切换这些输出来创建任何数字通信系统,这称为“ 位-敲打 ”。但是实际上,CPU时间不是无限的,最好用硬件解决硬件任务。对于伺服控制,PWM频率相当低,因此在软件中对PWM进行位冲击以创建附加输出是很实际的。
比尔贝壳

2

6个PWM引脚使用ATmega328P上的内置UART产生输出。这使得脉冲非常快,以获得更高质量的“模拟”输出。由于伺服器的通讯速度足够慢,因此可以使用软件中断来驱动它们。软件中断会远离您正在执行的代码,而会运行伺服库中包含的代码。该代码使用标准方法来更改引脚的状态。通过使用中断而不是使用UART来进行操作,您浪费了一些处理时间,但获得了驱动更多伺服器的能力。


您能解释(或链接到)更多吗?UART如何用于PWM?
马丁·汤普森

我认为最好说PWM库可以根据需要使用UART I / O引脚。PWM库不会使用UART本身,但是如果UART不需要,则UART使用的引脚也可以用作标准数字I / O。
彼得·贝内特
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.