伺服电机以及如何使用 Arduino 平台进行控制
投稿人:DigiKey
2017-03-29
本文将讨论以下内容:
(单击以下链接,跳到您所需的部分)
它们如何工作?(基本驱动方法和技术)
什么是伺服电机?
什么是伺服电机,它们的用途是什么,它们由什么组成,以及它们如何工作?
伺服电机是一种根据控制信号确定轴转动位置的电机,通常用于通过调整襟翼来控制遥控飞机,进行无人机飞行定位,在流量控制中用于阀门控制,或用于连续驱动机器人的轮子。它们可用来定位或调整任何您所能想到的东西。伺服电机包括一个直流电机、一个控制电路、几个扭力齿轮以及一个塑料外壳(见图 1)。
图 1:Parallax 的伺服电机 900-00005-ND,图中露出的直流电机和齿轮用于转动电位计,从而为控制 IC 提供反馈以对轴进行定位。其中一个齿轮上有个凹槽,可限制只旋转 180 度。如要进行连续旋转,可以去掉这个凹槽。
它们如何工作?
伺服电机通过利用脉冲宽度调制 (PWM) 信号按顺时针或逆时针方向(具体取决于信号的脉冲宽度)旋转轴,来对轴位置进行控制。通常,1 ms 脉冲宽度会按顺时针方向旋转轴,2 ms 脉冲宽度会按逆时针方向旋转轴。要将轴定位在 ½ 位置(或中间位置),通常使用 1.5 ms 脉冲。每个脉冲之间将需要 20 ms 间隔。下图 2 显示每个位置的定时。
图 2:不同轴位置的 PWM 定时
图 3:Parallax 的规格书中所示的布线连接。
如何为应用选择伺服电机
确定您需要的是有限旋转(最大 180 度)还是连续旋转。您还应注意应用所需的轴扭矩以及旋转速度(以每分钟转数 RPM 表示)。
如果您正在构建一个移动物体(如机器人),通常需使用连续旋转伺服系统来驱动轮子。另一方面,对于定位飞机模型的襟翼以进行飞行控制、水阀、开关或辅助机器人手臂所用的手柄等应用,可以使用有限旋转伺服系统。
图 4:Parallax 的高速伺服电机 900-00025-ND(提供 150 RPM @ 6 VDC 的连续旋转)
下图列出了一些可用的伺服系统模型。更多详细信息及更多产品,请单击此链接。
|
使用 Arduino 平台
(如果您不熟悉 Arduino,可访问此文章链接了解更多信息)
最常用的一款 Arduino 板称为“UNO”。还有几个常用版本是我们分销的产品,来自第三方 供应商,例如 Adafruit、SparkFun、Seeed、DFRobot 等。我个人最喜欢的是来自 SparkFun 的 Red Board,这款产品在原始“UNO”板的基础上新增了一些出色的改进。我还使用过 Adafruit 的“Flora”,它是一款性价比高且易于使用的圆形电路板。要查看 DigiKey 的所有 Arduino 板,请单击此链接。
图 5:左侧是 Arduino UNO,右侧是 SparkFun 的 Red Board (UNO)。
如果您已熟悉如何 Arduino 板,可以跳过下面这一段:
我对 Arduino 的描述如下:这是一款 IC 芯片和/或电路板,可在 Arduino IDE 这一常见的 IDE(集成开发环境)中使用标准 C 语言。您可以在 Arduino IDE 中创建代码/软件(即草图),使主 IC 芯片(在常用电路板中为 ATMEGA328 微控制器)激活 I/O 引脚来执行某些操作。您可以在 IDE 中的屏幕上获得关于 IC 如何处理数据的反馈(使用串行命令),这类似于使用 Windows 超级终端模式查看来自外界的串行反馈。互联网上提供了大量在线支持以及诸多书籍和示例代码。Arduino 一直在更新其 IDE,所以请确保下载了最新版本。它们有许多示例代码和功能库,因此电路板可以充分发挥其作用。正如其称呼一样,Arduino 板具有标准的引脚布局,而且还开发出了一种称为“盾板”的标准版,可以为电路板添加不同的功能——这里是 DigiKey 提供的各种电路板的链接。
我们来看一下如何使用 Red Board 驱动伺服电机:
首先,下载最新版本的 Arduino IDE,并启动该程序。然后连接 Red Board。
该电路板使用 mini-B 转 A USB 电缆进行供电,连接后请将您的草图或编写的代码下载到板载 MCU。在此示例中,使用了称为“Servo- Sweep”的标准库实例来驱动伺服系统(见图 6)。
图 6:Servo Sweep 程序所在位置。
/* Sweep
by BARRAGAN <http://barraganstudio.com>
This example code is in the public domain.
modified 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Sweep
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop() {
for (pos = 0; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees
// in steps of 1 degree
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
for (pos = 180; pos >= 0; pos -= 1) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
图 7:扫描程序的代码。此程序是由 Scott Fitzgerald 通过 BARRAGAN 修改而来的(如上述代码所示)。
然后,将 USB 电缆插入电路板,并在 IDE 左上角的“Tools”下选择“Arduino UNO”板。在同一菜单中,选择“Port”,以验证程序是否选中了电路板所连接的 COM 端口。最后,单击左上角的下载按钮(指向右侧的小箭头)。几秒钟后,Red Board 的一些 LED 会闪烁(表示正在将已编译程序下载到该电路板)。
然后,将伺服电机连接到一个单独的电源,其地线与电路板的地线需连在一起(USB 电源只能驱动这么多的电流,这时伺服系统有点噪音,其感应脉冲会对电路板产生不利影响)。
要控制电机,需要将 PWM 输入连接到电路板上。通过查看上面的代码,我们可以知道要将 PWM 输出连接到引脚 9。通过上图 3,使用白色引线或中间导线,将其连接到电路板的引脚 9。
现在可以开始运行程序了。程序首先按顺时针方向尽可能将轴归零,然后按逆时针方向缓慢扫描 180 度,之后又按顺时针方向归零。使用示波器可以测量程序所产生的 PWM 脉冲宽度。我们会发现 90 度时为 1.5 ms,0 度或顺时针摆动时接近 600 µs。180 度或逆时针摆动时,PWM 脉冲接近 2.2 ms。说明该程序运行良好,您可以更改一些值来查看各种效果,例如更改锁定位置,或者将延迟更改为较小的值以加快扫描速度。
免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。