步进电机与Arduino使用教程
介绍
了解如何使用 Arduino 使用 ULN2003、L298N 和 A4988 等驱动器控制双极和单极步进电机。在本文中,我将向您展示开始使用步进电机所需了解的所有信息。
步进电机用于各种设备,从 3D 打印机和 CNC 机器到 DVD 驱动器、加热管道,甚至模拟时钟。然而,尽管步进电机很受欢迎,但许多实验者都回避使用步进电机,因为它们似乎需要复杂的连接和代码。
步进电机
步进电机是以精确增量或“步进”旋转的直流电机。当您需要非常准确地定位某些东西时,它们非常有用。它们在 3D 打印机中用于正确定位打印头,在 CNC 机器中使用它们的精度来定位切割头。如果您的数码相机具有自动对焦或远程变焦功能,则可能会使用步进电机来执行此操作。
与直流电机不同,步进电机是通过向其内部线圈施加直流电脉冲来控制的。每个脉冲使电机前进一步或几分之一步,后者称为“微步进”,稍后将进行解释。
一些用户将步进电机与伺服电机混淆,但实际上它们是两种不同的野兽。伺服电机的独特之处在于它的电机轴可以移动到精确的角度,大多数伺服电机只能旋转 180 或 270 度,尽管有改进的伺服电机可以旋转 360 度。伺服电机“知道”它的位置,即使有外力移动电机轴,也可以移动到特定角度。
另一方面,步进器“不知道”他们的位置。它们可以根据它们开始步进的位置(即顺时针 36 度)移动到精确位置,但与伺服系统不同,如果它们的轴被外力移动,它们可能会错位。在许多应用中,伺服在被控制之前首先移动到“归位”或参考位置,打印机通常在首次初始化时执行此操作。
由于步进电机以离散步骤移动,因此在需要平滑连续旋转的情况下不经常使用步进电机,但是通过使用齿轮和微步进,它们可以实现平滑旋转,并且它们非常精确定位的能力通常超过它们运动的粗糙度.
步进电机相对于直流电机的另一个优势是能够在不失速的情况下以非常低的速度移动艺术,事实上,失速确实不是步进电机的概念。它们还将大量扭矩装入相对较小的包装中。
步进电机的工作原理
步进电机有一个磁化齿轮芯,周围环绕着许多充当电磁铁的线圈。尽管电气线圈数量很多,但步进电机中实际上通常只有两个线圈,分为许多小线圈。
通过精确控制线圈中的电流,可以使电机轴以离散步骤移动,如下图所示:
在第一张图中,顶部的线圈通过按所示极性施加电流来通电。磁化轴被吸引到这个线圈,然后锁定到位。
现在看看当电流从顶部线圈移除并施加到另一个线圈时会发生什么。轴被第二个线圈吸引并锁定到位。
两个位置之间的跳转是一步(在此图中,一步是 90 度,实际上,步进电机通常只是步数的一小部分。为清楚起见,对图表进行了简化)。
微步进
我们已经看到电机轴如何移动以将自身锁定在吸引电磁铁前面的位置,每个磁铁代表一个步骤。然而,可以将电机轴移动到步骤之间的位置。这被称为“微步进”。
为了了解微步进如何工作,请看下一张图:
在此图中,电流已以相等的量施加到两个线圈。这会导致电机轴锁定到两个线圈之间的中间位置。这将被称为“半步”。
该原则可以扩展到包括四分之一步、八步,甚至十六步。这是通过控制施加到两个线圈的电流比率来完成的,以将电机轴吸引到线圈之间的位置,但比另一个更靠近一个线圈。
通过使用微步进,可以将步进电机的轴移动几分之一度,从而实现极其精确的定位。
步进电机的类型
在内部有多种设计步进电机的方法,例如可变磁阻、永磁和混合式步进电机。这些设计差异主要涉及在电机内产生磁场的方法。
对于大多数实验者来说,这些差异只是学术上的差异,但如果您为非常具体的设计选择步进电机,您可能需要对此进行更多研究。
对于大多数用户来说,步进电机设计之间的主要区别归结为线圈在电机内的接线方式。有两种方法——双极和单极。这两种类型的步进电机不可互换(尽管可以“破解”单极电机以创建双极电机)。
让我们看看这两种类型的步进电机。
双极步进电机
双极步进电机由两个线圈组成(在电气上,实际上分成几个物理线圈)并且通常有四个连接,每个线圈两个。您刚刚在上一节中看到的步进操作简化图都是双极步进电机。
双极步进电机的一个优点是它们利用了整个线圈绕组,因此效率更高。然而,它们需要更复杂的控制器或驱动器来操作以反转施加到线圈的电压的极性需要反转。
单极步进电机
单极步进电机也由两个线圈(电气)组成,但每个线圈都有一个中心抽头,因此每个线圈上有三个连接。这导致六个连接,但是许多单极步进电机只有五个连接,因为两个中心抽头是内部连接的。
在单极步进电机中,一次仅使用每个线圈的一半。在大多数配置中,正电压施加到中心抽头并留在那里。然后在线圈的一侧施加负电压以吸引电机轴,如下图所示:
与双极电机一样,当电流从顶部线圈移除并施加到第二个线圈的一侧时,单极步进电机可以前进一步:
您还可以使用与双极步进电机相同的技术对单极步进电机进行微步,将电流施加到两个线圈。
现在要反转单极电机的方向,您不需要反转极性。相反,负电压被施加到线圈的另一侧。这导致电流在线圈内以相反的方向流动,这反过来又使电机轴沿相反的方向移动。
单极步进电机更容易控制,因为不需要反转电流极性来改变方向。然而,由于单极步进电机在任何给定时刻仅使用一半的线圈绕组,因此效率不高,因为一半的布线基本上被浪费了。
在即将进行的实验中,我们将同时使用单极和双极步进电机。
应该注意的是,还有可以连接为双极和单极的步进电机。这些电机有四个线圈,可以连接成两个中心抽头线圈(单极配置)或两个大线圈(双极配置)。这些步进电机将有八根电线,每个线圈两根。
阅读步进电机规格
选择步进电机可能是一项艰巨的任务,但并非必须如此。许多初次使用的用户被一些步进电机附带的大量规格吓跑了。事实上,它们并不难理解。
以下是步进电机随附的一些关键规格及其简短定义:
相位:这是指步进电机中各个线圈的分组。步进电机可能有多个线圈,但它们连接在一起并分相控制。二相、四相和五相步进电机很常见。步进电机通常会附带一个相位图,指示电机相位的驱动顺序。
步进角: 这是电机轴在每个完整步进中旋转的量,以度为单位,在某些步进电机中,这被称为每转步数,这两个数字只是表达同一事物的不同方式.
例如,步进电机的常见额定值是 1.8 度步距角。由于完整旋转有 360 度,这相当于每转 200 步 (1.8 x 200 = 360)。
电压:只是电机线圈的额定电压。它也是额定电流和线圈电阻的函数,您可以使用欧姆定律相互计算。
电流:额定电压下的最大电流。这是一个有用的规范,因为它可以让您为步进电机选择合适的驱动器和电源。
电阻:线圈电阻,单位为欧姆。
电感:每个电机线圈的电感,以毫亨为单位测量。这是一个重要的规格,因为电感会限制您能够有效驱动步进电机的最大速度。通常,单极步进电机在这里具有优势,因为它们仅使用半个线圈,因此电感低于双极等效电机。
保持扭矩:这将是步进电机通电时产生的力的大小。
制动扭矩:这是在电机未通电时可以预期的保持扭矩量。
轴样式:电机轴的物理形状。您需要知道这一点,以便将您的步进电机与齿轮、皮带轮和其他外部连接件(如联轴器)配对。有几种常用的形状,此外,由于显而易见的原因,轴的长度可能很重要。
一些常见的轴类型如下:
圆轴- 很好地说明了一切!
“D”轴——一种“D 形”轴,可用于使用固定螺钉安装齿轮。
齿轮轴——刻有齿轮的轴。
导螺杆轴——形状像螺钉的轴,用于构造线性执行器。
步进电机(或任何电机)的另一个明显规格是它的物理尺寸。有一组具有标准尺寸的步进电机,我们现在将看看这些。
试验步进电机
好的,足够的理论!是时候挖掘我们的 Arduino 并开始试验步进电机了。
今天我们将进行四个实验,其中两个使用单极步进电机,另外两个使用单极步进电机。此外,我们将使用几个 Arduino 库,其中一个已包含在 Arduino IDE 中。
尽管这些实验已经使用 Arduino Uno 进行了说明,但任何 Arduino 都可以工作。如果需要,您也可以随意更改引脚号,因为那里没有特殊要求,如果您决定这样做,请务必更改草图以反映这些更改。
让我们开始吧!
演示 1 – 带 ULN2003 的 28BYJ-48 单极步进电机
28BYJ -48是一种 5 线单极步进电机,内部每转移动 32 步,但具有将轴移动 64 倍的齿轮系统。结果是电机每转旋转 2048 步。应该注意的是,其中一些电机可能具有不同的齿轮系统,因此电机每转的步数可能不同。28BYJ-48 在 5 伏电压下运行。
电机通常封装有基于 ULN2003 达林顿晶体管阵列的微型驱动板。该板有一个连接器,可与电机电线完美匹配,因此非常易于使用。还有用于四个 5 伏数字输入的连接以及电源连接。
关于电源,需要注意的一件非常重要的事情是,无论多么诱人,您都永远不要使用 Arduino 的 5 伏电源为这个(或任何)步进电机供电。即使 28BYJ-48 不会消耗太多电流,它也会在其电源线上产生电“噪声”,这可能会损坏您的 Arduino。始终使用单独的电源为步进电机供电!
我们将按如下方式连接电机、驱动器和 Arduino:
现在我们已经连接好了所有东西,我们需要对 Arduino 进行编程。这是我们将用来执行此操作的代码:
/*
Stepper Motor Demonstration 1
Stepper-Demo1.ino
Demonstrates 28BYJ-48 Unipolar Stepper with ULN2003 Driver
Uses Arduino Stepper Library
DroneBot Workshop 2018
https://dronebotworkshop.com
*/
//Include the Arduino Stepper Library
#include <Stepper.h>
// Define Constants
// Number of steps per internal motor revolution
const float STEPS_PER_REV = 32;
// Amount of Gear Reduction
const float GEAR_RED = 64;
// Number of steps per geared output rotation
const