☛ 功能说明

利用 Arduino UNO 开发板与 A4988 驱动模块控制一个四线二相步进电机转动,步进电机顺时针转动三圈后,接着逆时针转动二圈。

A4988 驱动模块简介

该模块的核心是 Allegro 的 Microstepping 驱动器 – A4988。它的体积很小 ( 只有 0.8 英寸 × 0.6 英寸 ),但仍然有力气。

A4988 步进电机驱动器具有高达 35V 的输出驱动能力和± 2A 的输出能力,使您可以像 NEMA 17 一样,以每个线圈高达 2A 的输出电流控制一个双极步进电机。

该驱动程序具有内置转换器,易于操作。这样可以将控制针的数量减少到仅仅二个,一个用于控制步进,另一个用于控制旋转方向。

驱动程序提供五种不同的步进分辨率。分别为全步、半步、¼ 步、八步和十六步。

A4988 驱动模块引脚排列

VDD和 GND 用于驱动 3V – 5.5V 的内部逻辑电路。VMOT 和 GND 为电动机提供电源,该电源可以为 8V – 35V。

根据数据表,电动机电源,需要在靠近电路板的地方使用适当的去耦电容器,以维持 4A 的电流。

注意:

该驱动器板上装有 ESR 陶瓷电容器,因此容易受到电压尖峰的影响。在某些情况下,这些峰值可能会超过 35V ( A4988 的最大额定电压 ),可能会永久损坏电路板甚至电动机。保护驱动器免受此类尖峰影响的一种方法是在电动机电源引脚之间放置一个较大的 100μF ( 至少 47μF ) 的电解电容器。

微步选择引脚

A4988 驱动器通过允许中间步进位置来允许微步进。这是通过以中等电流水平向线圈通电来实现的。例如:选择 ¼ 步模式驱动每转 1.8°或 200 步的 NEMA 17,则电动机将给每转 800 微步。

A4988 驱动器有三个步长 ( 分辨率 ) 选择器输入,分别为 MS1、MS2 及 MS3。通过这三个引脚设置适当的逻辑电平,可以将电动机设置为五步分辨率之一。

这三个微步选择引脚被内部下拉电阻拉至低电平。因此,如果将其断开,电动机将以全步模式运行。

控制输入引脚

A4988 有两个控制输入。即 STEP 及 DIR。

STEP 输入控制电机的微步。发送到此引脚的每个 HIGH 脉冲都会通过微步选择引脚设置的微步数来步进电动机。脉冲越快,电机旋转的越快。

DIR 输入控制电机的旋转方向。将其拉高电平将驱动电动机顺时针旋转。将其拉低电平将驱动电动机逆时针旋转。

注意:

由于内部没有将 STEP 和 DIR 引脚拉至任何特定电压,因此您不应在应用中将其悬空。

控制电源状态的引脚

 

A4988 具有三个不同的输入,由于控制其电源状态。分别为 EN、RST 及 SLP。

EN 引脚为低电平有效输入,当拉至低电平 ( 逻辑 0 ) 时,A4988 驱动器使能。默认情况下,该引脚被拉低,因此驱动器始终处于使能状态,除非将其拉高。

SLP 引脚为低电平有效输入。这意味着将该引脚拉至低电平可将驱动器置于睡眠模式,从而将功耗降至最低。特别是在不使用电动机以节省功率时,可以调用此方法。

RST 也是低电平有效输入。将其拉低时,将忽略所有 STEP 输入,直到将其拉高。它还通过将内部转换器设置为预定义的 HOME 状态来重置驱动程序。原始状态基本上是电动机启动的初始位置,并且根据微步分辨率而不同。

注意:

RST 引脚悬空。如果不使用该引脚,则可以将其连接到相邻的 SLP / SLEEP 引脚以将其拉高并启用驱动器。

输出引脚

A4988 电机驱动器的输出通道通过以下方式分解到模块的边缘:1B、1A、2A 和 2B 针脚。

您可以将电压在 8V – 35V 之间的任何双极步进电机连接到这些引脚。

模块上的每个输出引脚都可以为电机提供高达 2A 的电流。但是,提供给电动机的电流取决于系统的电源、冷却系统和电流限制设置。

限流

在使用电动机之前,需要进行一些小的调整。我们需要限制流经步进线圈的最大电流,并防止其超过电机的额定电流。A4988 驱动器上有一个微调电位器,可用于限制电流设置。您应将电流限制设置为等于或小于电动机的额定电流。

要进行此调整,有两种方法:

方法㈠

在这种方法中,我们将通过测量 ” ref ” 引脚上的电压 ( Vref ) 来设置限制电流。

① 查看步进电机的数据表,记下它的额定电流。

② 断开三个选择微步引脚,使驱动器进入全步模式。

③ 不给 STEP 输入计时,将电动机固定在固定位置。

④ 调整时,请测量金属微调电位器本身的电压 ( Vref )。

⑤ 使用公式调整 Vref 电压电流限制 = Vref × 2.5。例如:电动机的额定电流为 350mA,则可将参考电压调整为 0.14V。

方法㈡

在这种方法中,我们将通过测量流经线圈的电流来设置电流极限。

① 查看步进电机的数据表,记下它的额定电流。

② 断开三个微步选择引脚,使驱动器进入全步模式。

③ 不给 STEP 输入计时,将电动机固定在固定位置,不要将 STEP 输入悬空,将其连接到逻辑电源 ( 5V )。

④ 将电流表与步进电机上的线圈之一串连,然后测量实际电流。

⑤ 调节电流限制电位器,直到达到额定电流。

☛ 使用材料

Arduino UNO R3  开发板 × 1、A4988 步进马达控制模块 × 1、电解电容 47μF × 1、四线二相步进马达  × 1。

☛ 电路图及面包板接线图

☛ 程式码

const int dirPin = 2;                          // 驱动模块的 DIR 引脚连接至数位引脚 2
const int stepPin = 3;                         // 驱动模块的 STEP 引脚连接至数位引脚 3
const int stepsPerRevolution = 200;            // 旋转一圈 200 步
int x;
void setup()
{
     pinMode(dirPin,OUTPUT);                   // 数位引脚 2 为输出模式
     pinMode(stepPin,OUTPUT);                  // 数位引脚 3 为输出模式
}

void loop()
{
     digitalWrite(dirPin,HIGH);                // 顺时针旋转
     for(x=0;x < stepsPerRevolution*3; x++)    // 旋转三圈
     {
         digitalWrite(stepPin,HIGH);           // 对 STEP 引脚输出信号
         delayMicroseconds(2000);              // 延迟 2 秒
         digitalWrite(stepPin,LOW);            // 停止 STEP 引脚输出信号
         delayMicroseconds(2000);              // 延迟 2 秒
     }
     delay(1000);

     digitalWrite(dirPin,LOW);                 // 逆时针旋转
     for(x=0; x < stepsPerRevolution*2 ; x++)  // 旋转二圈
     {
         digitalWrite(stepPin,HIGH);           // 对 STEP 引脚输出信号
         delayMicroseconds(2000);              // 延迟 2 秒
         digitalWrite(stepPin,LOW);            // 停止 STEP 引脚输出信号
         delayMicroseconds(2000);              // 延迟 2 秒
     }
     delay(1000);                              // 延迟 1 秒

}

 

☛ 练习

⑴ 利用 Arduino UNO 开发板与 AccelStepper 函式库控制四线二相步进电机的转动。步进电机沿一个方向加速,然后减速以使其静止。旋转一圈后,它将改变旋转方向。而且它将不断重复这样的动作。

#include<AccelStepper.h>                                   //调用 AccelStepper.h 函式库

#define motorInterfaceType 1
const int dirPin = 2;                                      // 驱动模块的 DIR 引脚连接至数位引脚 2
const int stepPin = 3;                                     // 驱动模块的 STEP 引脚连接至数位引脚 3

AccelStepper myStepper(motorInterfaceType,stepPin,dirPin); // 创建 myStepper 物件

void setup()
{
     myStepper.setMaxSpeed(1000);                          // 设定步进马达最大速度为 1000
     myStepper.setAcceleration(50);
     myStepper.setSpeed(200);                              // 设定步进马达恒定速度为 200
     myStepper.moveTo(200);                                // 目标位置设为 200 步
}

void loop()
{
     if(myStepper.distanceToGo()==0)                       // 是否到达目标位置?
        myStepper.moveTo(-myStepper.currentPosition());    // 将当前位置设为负值,使步进马达反向转动
     myStepper.run();
}