亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

使用 Arduino 掌握步进电机:综合指南

在本教程中,我们将学习有关使用 Arduino 控制步进电机所需的所有知识。我们将介绍如何结合 A4988、DRV8825 和 TMC2208 步进驱动器来控制 NEMA17 步进电机。

这种步进电机和驱动器的组合用于无数需要位置控制的应用,例如 3D 打印机、数控机床、机器人、自动化机器等。

我自己已经在许多 Arduino 项目中使用过它,如下所示:

我将详细解释它们的工作原理、如何将步进电机与 Arduino 连接、如何设置驱动器的电流限制以及如何使用或不使用 Arduino 库对其进行编程。另外,我将向您展示如何使用 Arduino CNC 扩展板轻松控制任何类型的 Arduino 项目的多个步进电机。 

因此,我们在本教程中需要介绍很多内容。您可以观看以下视频或阅读下面的书面教程,其中还包括所有示例代码和接线图。

什么是步进电机及其工作原理?

我将首先简要解释什么是步进电机及其工作原理,因为它将帮助我们更好地理解本教程中的其他所有内容。 

步进电机是一种独特的无刷直流电机,即使没有任何反馈也可以精确控制位置。

步进电机的工作原理基于磁场。它有两个主要部件:定子和转子。转子通常是永磁体,定子上围绕着一些线圈。

当我们通电或让电流流过线圈时,定子中会产生特定的磁场,吸引或排斥转子。通过按一定顺序一步一步、一个接一个地激活线圈,我们可以实现转子的连续运动,也可以使其停止在任意位置。

因此,这就是为什么这些电机被称为步进电机,它们以离散的步骤移动。 

通过增加转子上的磁极数量,我们可以增加可能的停止位置的数量,从而提高电机的分辨率或精度。请注意,这只是一个基本说明,您可以在我的步进电机工作原理教程中找到更多详细信息。 

典型的步进电机(例如 NEMA17)在转子上有 50 个停止点或步长。另一方面,定子可以有多个线圈,分为两相,提供四种不同的磁场方向或位置。

因此,转子的 50 步乘以 4 个不同的磁场方向,总共 200 步即可完成完整的旋转。或者,如果我们将 360 度除以 200 步,则每步的分辨率为 1.8 度。

我提到定子线圈分为两相,如果我们看一下步进电机的电线数量,我们也可以注意到这一点。它有 4 根四线,每相两根。四种不同的磁场方向是可能的,因为我们可以让电流在两个方向上流过相。

还有 5 线、6 线甚至 8 线的步进电机,但它们仍然工作在两相上,或者我们只用四个端子来控制它们。

它们的问题在于,它们可以提供不同的性能特征,例如更大的扭矩或更高的速度,具体取决于我们如何将这些电线连接到四个控制端子上。

尽管如此,通过这个简短的解释,现在我们明白了,为了驱动步进电机,我们不能只是将电源连接到它,否则什么也不会发生。相反,我们必须在两个方向上为两个电机相通电,并按特定顺序及时激活或向它们发送脉冲。因此,这就是为什么我们需要驱动器来控制步进电机。 

驱动器的类型和尺寸有多种,对应步进电机的类型和尺寸也有多种。然而,它们的基本工作原理是它们有两个 H 桥,可以在两个方向上为电机各相通电。

当然,它们还有很多其他的功能,比如微步进、限流等等,让我们可以轻松地控制步进电机,这就是它们的全部目的。

如何使用 Arduino 和 A4988 步进驱动器控制 NEMA17 步进电机

好吧,现在我们可以看一下本教程的第一个示例,如何使用 A4988 步进驱动器控制 NEMA 17 步进电机。 

好的,现在我们可以看一下本教程的第一个示例,如何使用 A4988 步进驱动器控制 NEMA 17 步进电机。

NEMA17 是制造商中最受欢迎的步进电机,因为它具有出色的性能,同时价格实惠。几乎所有桌面 3D 打印机和激光雕刻机中都可以找到它。 

一般来说,NEMA17步进电机具有200步,或每步分辨率1.8度,但也有400步和每步分辨率0.9度的型号。这里我们应该注意,NEMA17 名称实际上仅描述了电机前面板尺寸的尺寸。

该数字代表面板的尺寸(以英寸为单位)除以 10,或者在本例中,17 除以 10 等于 1.7 英寸面板,如果是 NEMA23,则等于 2.3 英寸面板。

因此,面板尺寸是固定的,但NEMA17步进器的长度可以从20mm到60mm变化,并且电机的功率要求也随之变化。功率要求通常由电机允许消耗的电流来定义,这些 NEMA17 步进电机的电流范围为 0.3A 至 2.5A。

现在,根据步进电机的额定电流,我们需要选择能够处理该电流的合适驱动器。最流行的控制 NEMA17 步进电机的驱动器是 A4988 步进电机驱动器。

A4988 每个线圈的最大额定电流为 2A,但这实际上是峰值额定值。建议将电流保持在 1A 左右,当然,也可以达到 2A,为 IC 提供良好的冷却。 

A4988 步进驱动器的一个重要功能(实际上所有其他驱动器都具有)是电流限制。这样,无论电机额定值如何,我们都可以轻松设置电机消耗的电流量。例如,我们甚至可以连接额定值为 2.5A 的步进电机,但我们会将驱动器的电流限制为 1.5A。所以,虽然电机不能发挥最大能力,但我们仍然可以使用它。

另一方面,如果电机的额定值低于驱动器上设定的电流限制,电机就会过热。当然,始终建议尝试将电机的额定电流与驱动器的额定电流相匹配。

A4988 和 Arduino 连接

好了,现在我们来看看如何将A4988驱动器与步进电机和Arduino控制器连接起来。

您可以从以下链接获取本 Arduino 教程所需的组件:

披露:这些是附属链接。作为亚马逊合作伙伴,我通过符合条件的购买赚取收入。

在驱动器的右上角,我们有 VMOT 和 GND 引脚,在这里我们连接电机的电源,电压范围为 8 至 36V。这里还建议在这两个引脚之间使用去耦电容器,以保护电路板免受电压尖峰的影响。应使用容量至少为47uF的大电解电容。 

接下来是连接步进电机的四个引脚。电机的一相连接到 1A 和 1B 引脚,另一相连接到 2A 和 2B 引脚。 

有时,识别电机的哪两根线构成一个相可能有点困难,但有几种方法可以识别它们。最简单的方法是用手旋转步进电机的轴,然后将两根电线相互连接。如果连接两根电线形成一个相位,轴的旋转会有点困难。

另一种方法是使用万用表检查两根电线之间的连续性。如果连接形成一个相的两根电线,则会发生短路,并且万用表将开始发出蜂鸣声。

一旦找到一个相位,我们就可以将其连接到驱动器上两个位置中的任意位置,顺序无关紧要。 

接下来,我们有 IC 或逻辑电源引脚 VDD 和 GND,可以是 3V 到 5V。另一侧有 Step 和 Direction 引脚,可以连接到 Arduino 板的任何引脚。使用方向引脚,我们选择电机的旋转方向,使用步进引脚,我们控制电机的步数。当我们发送到步进引脚的每个脉冲时,电机将沿选定的方向前进一步。 

在这些引脚的正上方,我们有睡眠和重置引脚,顾名思义,它们用于将驱动器置于睡眠模式或将其重置。我们应该注意,这两个引脚均处于低电平有效。睡眠引脚默认为高电平状态,但 RST 引脚悬空。这意味着为了启用驱动程序,最简单的方法是将这两个引脚相互连接,假设我们不会使用这些引脚功能。 

启用引脚也是低电平有效,因此除非我们将其拉高,否则驱动器将被启用。 

接下来的三个引脚 MS1、MS2 和 MS3 用于选择电机的步进分辨率。我们已经说过,步进分辨率取决于电机的结构,对于 NEMA 17 步进电机,通常为每转 200 步。然而,所有步进驱动器都具有称为微步进的功能,它允许以更高分辨率驱动电机。这是通过以中间电流水平为线圈通电来实现的,从而产生中间步进位置。

例如,如果我们选择四分之一步分辨率,则电机的 200 步将变为 200 乘以 4 等于每转 800 微步。驱动器将在线圈上使用四种不同的电流水平来实现这一点。 

A4988 驱动器的最大分辨率为 16 微步,这将使 200 步 NEMA17 电机每转具有 3200 步,即每步 0.1125 度。这确实是令人印象深刻的精度,这就是为什么这些类型的步进电机和驱动器被用于如此多的应用。实际上,步进驱动器的步数高达 256 微步,即每转 51200 步,或每步 0.007 度。

不过,这三个引脚都有下拉电阻,因此如果我们将它们断开,驱动器将工作在全步模式下。为了选择不同的微步分辨率,我们需要根据此表将 5V 连接到适当的引脚。 

A4988 电流限制

好吧,现在我们知道了如何将步进电机和驱动器连接到 Arduino 板,我们可以继续解释如何对 Arduino 进行编程或编码来控制步进器。不过,在我们这样做之前,或者说在给电机供电之前,我们还需要做一件非常重要的事情,那就是调整驱动器的电流限制。

正如我们已经解释过的,我们需要将驱动器的电流限制调整为低于电机的额定电流,否则电机会过热。

A4988 驱动器上有一个小型微调电位器,我们可以通过它调整电流限制。顺时针旋转电位器,电流限制升高,反之亦然。有两种方法可用于确定电流限制的实际值。 

第一种方法涉及测量电位计本身和 GND 之间的参考电压。我们可以使用万用表测量参考电压,并使用该值通过以下公式计算驱动器的电流限制:

电流限制 =Vref / (8 x Rcs)

Rcs 是电流检测电阻或位于芯片旁边的电流检测电阻的值。根据制造商的不同,这些值通常为 0.05、0.1 或 0.2 欧姆。因此,我们需要仔细研究这些电阻的值,以便用这种方法准确计算电流限制。在我的例子中,这些电阻被标记为 R100,这意味着 0.1 欧姆。

例如,如果我们测量 0.7V 的参考电压,并且有 0.1 欧姆的电阻,则电流限制将为 0.875A。或者,如果我们想将电流限制为 1A,我们应该将参考电压调整为 0.8V。 

设置电流限制的第二种方法是直接测量通过线圈的电流。为此,我们需要按照前面的说明连接步进电机和驱动器。我们可以跳过控制器连接,而是将 5V 连接到方向和步进引脚,以便电机保持活动状态并保持一个位置。 MS 引脚应保持断开状态,以便驱动器可以在全步模式下工作。然后我们可以从电机上断开一根线路或线圈,并将其与电流表串联。这样,在我的例子中,一旦我们使用逻辑电压 5V 和电机电源 12V 为驱动器供电,我们就可以读取流经线圈的电流量。

不过,这里需要注意的是,当驱动器工作在全步模式时,线圈中的电流只能达到实际电流限制的70%。因此,在其他微步模式下使用驱动器时,电流表的读数应乘以1.3,才能得到驱动器的实际限流值。 

我尝试了两种设置驱动程序电流限制的方法,它们给了我大致相同的结果。

步进电机和 Arduino – 示例代码

尽管如此,现在我们可以继续对 Arduino 进行编程,或者看一下使用 Arduino 板控制步进电机的几个示例代码。

让我们从一个非常基本的示例代码开始,了解如何在不使用库的情况下控制步进电机。

示例代码1

<前>09

代码说明:

这里我们要做的就是定义 STEP 和 DIR 引脚连接到哪个引脚编号,并将它们定义为输出。在循环中,首先我们通过将方向引脚状态设置为高电平来设置电机的旋转方向。然后使用“for”循环,我们向 STEP 引脚发送 200 个脉冲,这将使电机旋转一个完整周期,考虑到它工作在全步模式下。只需将 STEP 引脚的状态从高电平切换到低电平,并在它们之间有一定的时间延迟,即可生成脉冲。该时间延迟实际上定义了旋转速度。如果我们降低它,旋转速度会增加,步数会加快,反之亦然。 

然后我们改变旋转方向,并使用另一个“for”循环发送 400 个脉冲,这将使电机旋转两个完整周期。但是,如果我们改变驱动器的微步模式,比如说四分之一步,这将使电机现在有 800 步,第一个循环将使电机仅旋转 90 度,第二个循环仅旋转半圈。

示例代码2

这是另一个简单的例子,使用电位器控制步进电机速度。

为此,只需将电位计连接到 Arduino 并使用 AnalogRead() 函数读取其值。

<前>18

代码说明:

然后,我们可以将 0 到 1023 之间的电位计值映射或转换为适合步进脉冲的延迟时间(以微秒为单位)的值。我发现步骤之间的延迟最小值约为 300 微秒。通过降低步进电机开始跳步。 

总的来说,用这种方法控制步进电机很容易并且有效,但前提是所需的控制很简单,如示例所示。如果我们需要更复杂的控制,最好的方法是使用Arduino库。

使用 Arduino 和 AccelStepper 库控制步进电机 - 示例

使用 Arduino 控制步进电机的最流行的库是 Mike McCauley 的 AccelStepper 库。它是一个极其通用的库,具有速度、加速和减速控制、设置目标位置、同时控制多个步进电机等功能。

该库有一个很好的文档,解释了每个函数的工作原理。我已经在我的几个 Arduino 项目中使用了这个库,用于控制 DIY 相机滑块、3D 弯线机、SCARA 机器人手臂等的运动。如果您有兴趣,网站上有每个项目的详细信息和代码说明。 

现在让我们看一下使用该库的一些示例代码。

示例代码 - 使用电位计控制步进电机速度

第一个示例将使用电位计控制电机的速度。

<前>26

代码说明:

因此,首先我们需要包含 AccelStepper 库。当然,在此之前,我们需要安装该库,我们可以通过 Arduino IDE 库管理器来完成此操作。我们只需搜索“AccelStepper”,该库就会显示出来,我们就可以安装它了。 

然后,我们需要为电机创建 AccelStepper 类的实例。这里的第一个参数是驱动程序的类型,在本例中,对于具有两个控制引脚的驱动程序,该值为 1,另外两个参数是我们的驱动程序连接到 Arduino 的引脚号。如果我们有多个步进电机,我们需要像这样定义每个电机,并且可以根据需要命名它们,在本例中我将电机命名为stepper1。 

在设置部分,我们只需设置电机的最大速度,定义为每秒步数。该值最高可达 4000,但在库文档中指出,每秒超过 1000 步的速度值可能不可靠。 

在循环部分,使用 setSpeed() 函数设置电机的当前速度,在本例中,这是来自电位器的模拟输入,范围为 0 到 1023。

为了让电机移动并实现恒定速度,我们需要在每个时间间隔调用 runSpeed() 函数。这里的负值,或者简单地在值前添加一个负号,将使步进电机沿相反方向旋转。

示例代码 - 通过加速和减速控制两个步进电机

这是使用 AccelStepper 库控制两个步进电机并实现加速和减速的另一个示例。

<前>30

代码说明:

因此,我们需要定义两个步进电机,并在设置中使用 setAcceleration() 函数设置电机的加速度值。使用 setCurrentPosition() 函数,我们将电机的位置设置为 0 步。 

在循环部分,我们从 moveTo() 函数开始,通过该函数我们告诉电机要移动到哪个位置或应该移动多少步。在四分之一步分辨率的情况下,800 步意味着一次完整旋转。然后,runToPosition() 函数将电机移动到该位置,同时实现加速和减速。然而,这是一个阻塞函数,因此代码执行将停留在那里,直到步进电机到达该位置。 

使用相同的方法,我们以四分之一步分辨率将第二个电机移动 1600 步或两整圈。 

如果我们不希望代码在电机到达目标位置之前被阻塞,那么我们应该使用 run() 函数,而不是使用 runToPosition() 函数。 run() 还实现了加速和减速以达到目标位置,但每次调用仅执行一步。因此,我们需要尽可能频繁地调用它。因此,这里我们将两个电机的 run() 函数放在这个 while 循环中,该循环将一直执行,直到两个步进器到达位置 0。我们之前使用 moveTo() 函数将两个电机设置为转到位置 0。 

我们还可以在“while”循环中添加更多代码,并在电机运行过程中执行其他操作。实际上,运行电机以及执行其他操作的方法有很多种。我建议您仔细阅读该库的详细描述文档,以便您可以了解每个功能的工作原理并根据您的需要实现它们。

示例代码 - 使用 AccelStepper 库控制多个步进电机

我想向您展示另一个使用 AccelStepper 库的示例,该示例以协调的方式控制多个步进电机。这意味着,我们可以为每个步进器设置目标位置,并且无论它们需要行进的距离不同,它们都可以同时到达其位置。

使用 AccelStepper 库附带的 MultiStepper 类可以轻松完成此操作。

<前>48

代码说明:

这里我们还需要包含 MultiStepper 类,并创建它的实例。然后我们需要定义一个数组,类型为“long”,它将用于存储电机的目标位置。在设置部分,我们需要定义步进器的最大速度值,并将步进器添加到之前创建的 MultiStepper 实例中,在我的例子中,我将其命名为“steppersControl”。 

在循环部分,我们首先将目标位置值存储在之前创建的数组中。我将第一个步进器设置为移动一圈,第二个步进器移动两圈,第三个步进器移动三圈。然后我们可以将此数组分配给 moveTo() 函数,该函数将计算所有电机同时到达这些位置所需的速度。然后我们只需调用 runSpeedToPosition() 函数即可将电机移动到其位置。但我们应该注意到,该函数会阻塞代码,直到步进器到达目标位置。如果我们不想阻塞代码,我们可以使用 run() 函数。我们还应该注意,MultiStepper 类不支持加速和减速。 

不过,如果您想从更高级的示例中了解更多信息,您可以查看我已经提到的我的 Arduino 项目,所有详细信息和代码都在网站上。

CNC 扩展板,用于控制任何 Arduino 项目的多个步进电机

仍然考虑控制多个步进电机,值得一提的是 Arduino CNC 扩展板。

Arduino CNC 扩展板的主要用途是控制 2 轴或 3 轴 CNC 机器,但它实际上是控制需要控制多个步进电机的任何类型项目的绝佳选择,因为它结构紧凑,并且为驱动器和电机提供了轻松的连接。 

该扩展板位于 Arduino UNO 板的顶部,最多可以控制 4 个单独的步进电机,并且所有剩余的 Arduino 引脚都可供使用。我使用 Arduino UNO 板和 CNC 扩展板的组合来控制我的 4 轴 SCARA 机器人手臂。

我将很快更新文章的这一部分,如何将 CNC 扩展板与 Arduino 结合使用,并提供更多详细信息。

DRV8825 与 A4988

好吧,现在让我们继续看看如何使用我在开头提到的另一个驱动器 DRV8825 来控制步进电机。

实际上,到目前为止我们解释的有关使用 A4988 步进驱动器控制步进电机的所有内容也适用于 DRV8825。这两种驱动程序的工作原理、连接和编码几乎相同。它们之间的区别在于它们的技术特性,现在我们来看看它们并进行比较。

DRV8825 是 Texas Instruments 的步进驱动器,可直接替代 Allegro A4988 驱动器,因为它们的连接相同。它们之间的三个主要区别是,DR8825 可以提供比 A4988 更多的电流,无需额外冷却(1.5A 与 1A),具有更高的最大电源电压(45V 与 35V),并且提供更高的微步分辨率(32 与 16 微步)。 

当然,它们还有一些其他的细微差别。例如,限流电位器的位置不同,限流设置与参考引脚电压之间的关系也不同。 DRV8825不需要逻辑电源,该引脚位置用作FAULT输出。

然而,将 FAULT 引脚直接连接到 5V 是安全的,因此 DRV8825 可以用作专为 A4988 驱动器设计的系统中的直接替代品。 

但值得注意的是,当用 DRV8825 替换 A4988 驱动器时,确保驱动器方向正确非常重要。我已经提到过,它们的电位器位于不同的位置,在 A4988 上位于芯片下方,而在 DRV8825 上位于芯片上方,这有时会导致混乱,并且驱动器很容易放置在错误的一侧。 

为了设置电流限制,我们可以用一个探针测量GND,另一个探针测量电位器本身的参考电压。

DRV8825步进驱动器的计算公式如下:

电流限制 =Vref x 2

至于微步分辨率的选择,我们可以参考下表。

总体而言,DRV8825 是比 A4988 更好的步进驱动器,因为它提供更高的电流和电压额定值以及更高的微步分辨率,从而使步进电机运行更平稳、更安静。

TMC2208 步进驱动器

说到更平稳、更安静的操作,我们来看看 TMC2208 步进驱动器。 TMC2208 芯片由 Trinamic 制造,Trinamic 是一家专门从事运动控制电子产品的德国公司。 TMC2208 是一款静音步进电机驱动器,也可直接替代为 A4988 或 DRV8825 驱动器设计的系统。广泛应用于桌面3D打印机、激光雕刻机、扫描仪等。

该驱动器与其他两个驱动器的不同之处在于其集成插值单元,可提供 256 个细分或微步。这允许在芯片内部生成完美的正弦控制。这意味着驱动器将向步进电机输出 256 微步,无论我们通过两个 MS 引脚选择什么微步分辨率(2、4、8 或 16 微步)。这提供了更流畅的操作并显着减轻了微控制器的负担。

驱动器的这一功能与其无噪声电流控制 StealthChop2 技术相结合,可实现步进电机的超静音控制。这是三个驱动器之间的噪音水平比较。

步进驱动器噪音水平: A4988约65dB,DRV8825约67dB,TMC2208约41dB。

TMC2208 完全无声地驱动步进电机,这确实令人印象深刻。

TMC2208 的额定电流略高于 A4988 驱动器,即 1.2A,峰值电流为 2A。为了设置驱动程序的电流限制,我们可以再次使用与其他驱动程序解释相同的方法。我们需要用一个探针在 GND 上测量参考电压,另一个探针在 Enable 引脚旁边的整个位置上测量。

限流计算公式如下:

电流限制 =Vref x 0.71

尽管可以直接替换,但 TMC2208 驱动器的引脚排列与 A4988 驱动器略有不同。这里我们只有两个引脚用于选择微步分辨率,为了启用驱动器,我们需要将启用引脚连接到 GND。

在编码方面,它与其他两个驱动程序相同。 

与其他两个驱动器相比,TMC2208 驱动器还具有一些其他更高级的功能,例如,一个简单易用的 UART 接口,只需一条线即可控制驱动器,而不是两个 Step 和 Dir 引脚。除此之外,我还提供了更多的调整和控制选项。 

总体而言,TMC2208 是比 A4988 和 DRV8825 更好的驱动器,但这很正常,因为它的价格更高。不过,如果您不需要这些额外的功能,并且噪音水平也不关心您,那么其他两个驱动器也是不错的选择。

结论

我们已经涵盖了有关使用 Arduino 控制步进电机所需了解的几乎所有内容。 NEMA17 和三个驱动器 A4988、DRV8825 和 TMC2208 的用途非常广泛,可用于需要位置控制的许多应用。您始终可以通过探索我的一些 Arduino 项目来了解更多信息。

如果您有兴趣学习如何控制更大的步进电机(如 NEMA23 或 NEMA34),我也会有专门的教程。 

我希望您喜欢本教程并学到一些新东西。不要忘记订阅并随时在下面的评论部分提出任何问题。


制造工艺

  1. 隐形眼镜
  2. 水下无人机:疯狂的故事
  3. 使用激光模块的莫尔斯电码通信(两者)
  4. CNC加工结构可制造性、零件精度及技术要求分析
  5. Arduino Blind Stick
  6. 什么是潜水泵?
  7. Raspberry Pi 上的简易温度和湿度
  8. 亲爱的
  9. 婴儿配方奶粉
  10. Arduino 遥控飞机 | 100% 自己动手
  11. 不同领域使用的不同类型的锤子
  12. 收银机