【步进电机与Arduino使用教程】

步进电机与Arduino使用教程

  • 介绍
  • 步进电机
  • 步进电机的工作原理
  • 微步进
  • 步进电机的类型
  • 双极步进电机
  • 单极步进电机
  • 阅读步进电机规格
  • 试验步进电机
  • 演示 1 – 带 ULN2003 的 28BYJ-48 单极步进电机
  • 演示 2 – 两个带有 ULN2003 的 28BYJ-48 单极步进电机
  • 演示 3 – 带 L298N H 桥的双极步进电机
  • 演示 4 – 采用 A4988 的双极步进器
  • 结论
  • 介绍

    了解如何使用 Arduino 使用 ULN2003、L298N 和 A4988 等驱动器控制双极和单极步进电机。在本文中,我将向您展示开始使用步进电机所需了解的所有信息。
    步进电机用于各种设备,从 3D 打印机和 CNC 机器到 DVD 驱动器、加热管道,甚至模拟时钟。然而,尽管步进电机很受欢迎,但许多实验者都回避使用步进电机,因为它们似乎需要复杂的连接和代码。

    步进电机

    步进电机是以精确增量或“步进”旋转的直流电机。当您需要非常准确地定位某些东西时,它们非常有用。它们在 3D 打印机中用于正确定位打印头,在 CNC 机器中使用它们的精度来定位切割头。如果您的数码相机具有自动对焦或远程变焦功能,则可能会使用步进电机来执行此操作。

    带 Arduino 的步进电机

    与直流电机不同,步进电机是通过向其内部线圈施加直流电脉冲来控制的。每个脉冲使电机前进一步或几分之一步,后者称为“微步进”,稍后将进行解释。

    一些用户将步进电机与伺服电机混淆,但实际上它们是两种不同的野兽。伺服电机的独特之处在于它的电机轴可以移动到精确的角度,大多数伺服电机只能旋转 180 或 270 度,尽管有改进的伺服电机可以旋转 360 度。伺服电机“知道”它的位置,即使有外力移动电机轴,也可以移动到特定角度。

    另一方面,步进器“不知道”他们的位置。它们可以根据它们开始步进的位置(即顺时针 36 度)移动到精确位置,但与伺服系统不同,如果它们的轴被外力移动,它们可能会错位。在许多应用中,伺服在被控制之前首先移动到“归位”或参考位置,打印机通常在首次初始化时执行此操作。

    由于步进电机以离散步骤移动,因此在需要平滑连续旋转的情况下不经常使用步进电机,但是通过使用齿轮和微步进,它们可以实现平滑旋转,并且它们非常精确定位的能力通常超过它们运动的粗糙度.

    步进电机相对于直流电机的另一个优势是能够在不失速的情况下以非常低的速度移动艺术,事实上,失速确实不是步进电机的概念。它们还将大量扭矩装入相对较小的包装中。

    步进电机的工作原理

    步进电机有一个磁化齿轮芯,周围环绕着许多充当电磁铁的线圈。尽管电气线圈数量很多,但步进电机中实际上通常只有两个线圈,分为许多小线圈。

    通过精确控制线圈中的电流,可以使电机轴以离散步骤移动,如下图所示:

    在第一张图中,顶部的线圈通过按所示极性施加电流来通电。磁化轴被吸引到这个线圈,然后锁定到位。

    现在看看当电流从顶部线圈移除并施加到另一个线圈时会发生什么。轴被第二个线圈吸引并锁定到位。
    两个位置之间的跳转是一步(在此图中,一步是 90 度,实际上,步进电机通常只是步数的一小部分。为清楚起见,对图表进行了简化)。

    微步进

    我们已经看到电机轴如何移动以将自身锁定在吸引电磁铁前面的位置,每个磁铁代表一个步骤。然而,可以将电机轴移动到步骤之间的位置。这被称为“微步进”。

    为了了解微步进如何工作,请看下一张图:

    双极步进电机理论3

    在此图中,电流已以相等的量施加到两个线圈。这会导致电机轴锁定到两个线圈之间的中间位置。这将被称为“半步”。

    该原则可以扩展到包括四分之一步、八步,甚至十六步。这是通过控制施加到两个线圈的电流比率来完成的,以将电机轴吸引到线圈之间的位置,但比另一个更靠近一个线圈。

    通过使用微步进,可以将步进电机的轴移动几分之一度,从而实现极其精确的定位。

    步进电机的类型

    在内部有多种设计步进电机的方法,例如可变磁阻、永磁和混合式步进电机。这些设计差异主要涉及在电机内产生磁场的方法。

    对于大多数实验者来说,这些差异只是学术上的差异,但如果您为非常具体的设计选择步进电机,您可能需要对此进行更多研究。

    对于大多数用户来说,步进电机设计之间的主要区别归结为线圈在电机内的接线方式。有两种方法——双极和单极。这两种类型的步进电机不可互换(尽管可以“破解”单极电机以创建双极电机)。

    让我们看看这两种类型的步进电机。

    双极步进电机

    双极步进电机由两个线圈组成(在电气上,实际上分成几个物理线圈)并且通常有四个连接,每个线圈两个。您刚刚在上一节中看到的步进操作简化图都是双极步进电机。
    双极步进电机的一个优点是它们利用了整个线圈绕组,因此效率更高。然而,它们需要更复杂的控制器或驱动器来操作以反转施加到线圈的电压的极性需要反转。

    单极步进电机

    单极步进电机也由两个线圈(电气)组成,但每个线圈都有一个中心抽头,因此每个线圈上有三个连接。这导致六个连接,但是许多单极步进电机只有五个连接,因为两个中心抽头是内部连接的。

    单极步进电机线圈连接

    在单极步进电机中,一次仅使用每个线圈的一半。在大多数配置中,正电压施加到中心抽头并留在那里。然后在线圈的一侧施加负电压以吸引电机轴,如下图所示:

    单极步进电机理论1

    与双极电机一样,当电流从顶部线圈移除并施加到第二个线圈的一侧时,单极步进电机可以前进一步:

    单极步进电机理论2

    您还可以使用与双极步进电机相同的技术对单极步进电机进行微步,将电流施加到两个线圈。

    现在要反转单极电机的方向,您不需要反转极性。相反,负电压被施加到线圈的另一侧。这导致电流在线圈内以相反的方向流动,这反过来又使电机轴沿相反的方向移动。

    单极步进电机原理3

    单极步进电机更容易控制,因为不需要反转电流极性来改变方向。然而,由于单极步进电机在任何给定时刻仅使用一半的线圈绕组,因此效率不高,因为一半的布线基本上被浪费了。

    在即将进行的实验中,我们将同时使用单极和双极步进电机。

    应该注意的是,还有可以连接为双极和单极的步进电机。这些电机有四个线圈,可以连接成两个中心抽头线圈(单极配置)或两个大线圈(双极配置)。这些步进电机将有八根电线,每个线圈两根。

    阅读步进电机规格

    选择步进电机可能是一项艰巨的任务,但并非必须如此。许多初次使用的用户被一些步进电机附带的大量规格吓跑了。事实上,它们并不难理解。

    以下是步进电机随附的一些关键规格及其简短定义:

    相位:这是指步进电机中各个线圈的分组。步进电机可能有多个线圈,但它们连接在一起并分相控制。二相、四相和五相步进电机很常见。步进电机通常会附带一个相位图,指示电机相位的驱动顺序。

    步进角: 这是电机轴在每个完整步进中旋转的量,以度为单位,在某些步进电机中,这被称为每转步数,这两个数字只是表达同一事物的不同方式.

    例如,步进电机的常见额定值是 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 float STEPS_PER_OUT_REV = STEPS_PER_REV * GEAR_RED;
    
    // Define Variables
    
    // Number of Steps Required
    int StepsRequired;
    
    // Create Instance of Stepper Class
    // Specify Pins used for motor coils
    // The pins used are 8,9,10,11 
    // Connected to ULN2003 Motor Driver In1, In2, In3, In4 
    // Pins entered in sequence 1-3-2-4 for proper step sequencing
    
    Stepper steppermotor(STEPS_PER_REV, 8, 10, 9, 11);
    
    void setup()
    {
    // Nothing  (Stepper Library sets pins as outputs)
    }
    
    void loop()
    {
      // Slow - 4-step CW sequence to observe lights on driver board
      steppermotor.setSpeed(1);    
      StepsRequired  =  4;
      steppermotor.step(StepsRequired);
      delay(2000);
    
       // Rotate CW 1/2 turn slowly
      StepsRequired  =  STEPS_PER_OUT_REV / 2; 
      steppermotor.setSpeed(100);   
      steppermotor.step(StepsRequired);
      delay(1000);
      
      // Rotate CCW 1/2 turn quickly
      StepsRequired  =  - STEPS_PER_OUT_REV / 2;   
      steppermotor.setSpeed(700);  
      steppermotor.step(StepsRequired);
      delay(2000);
    
    }
    

    在此代码中,我们使用Arduino IDE随附的Arduino Stepper 库。步进库负责对我们将发送到步进电机的脉冲进行排序,它可用于各种单极和双极电机。

    28BYJ-48 步进电机具有内部齿轮装置,可将输出旋转减少 64 倍(如上所述,有些是不同的)。所以我们定义了三个常量来处理电机旋转:

    STEPS_PER_REV 是实际电机每转的步数。设置为 32。
    GEAR_RED 是齿轮减速量。我将我的设置为 64,但如果你的电机不同,你可能需要调整它
    STEPS_PER_OUT_REV 是齿轮减速后电机轴的最终输出。它是上述两个数的倍数。
    如果您想知道为什么上述常量使用浮点数而不是整数,那是因为齿轮减速有时是一个数字,如 63.5。如果你的是 64,你总是可以使用整数。

    变量“StepsRequired”将用于定义我们希望电机旋转的步数。

    28BYJ-48单极步进电机的步进顺序为:1-3-2-4。此信息将用于通过创建名为“steppermotor”的步进类实例来驱动电机,其引脚序列为 8,10,9,11。确保您正确设置,否则电机将无法正常运行。

    在设置例程中无需设置任何内容,因为 Arduino Stepper 库类已将四个 I/O 引脚设置为输出。

    在循环中,我们有三个演示运行,您可以根据需要随意添加或更改现有的。

    第一次运行非常缓慢地使电机步进四步。在运行时观察 UNL2003 上的 LED 很有趣。

    第二次运行非常缓慢地顺时针转动电机半圈。最后一次运行使电机以更快的速度返回半圈。您可以尝试使用“setSpeed”参数来确定电机的最高速度。

    演示 2 – 两个带有 ULN2003 的 28BYJ-48 单极步进电机

    对于下一个演示,我们将在图片中添加第二个 28BYJ-48 步进电机和 ULN2003 驱动器组以同时驱动两个电机。我们还将使用您需要在 Arduino IDE 中安装的高级步进电机库。

    在我们开始编写代码之前,让我们将一个额外的电机和驱动器连接到我们的 Arduino。保留您在演示 1 中建立的连接,并按如下方式连接新设备:
    我们将再次使用外部 5 伏电源为驱动器和电机供电。

    此草图将使用AccelStepper 库,这是一个由 Mike McCauley 编写的高级库。您需要使用 Arduino IDE 库管理器安装此库,因为它不包含在 Arduino IDE 中。

    /*
      Stepper Motor Demonstration 2
      Stepper-Demo2.ino
      Demonstrates Two 28BYJ-48 Unipolar Steppers with ULN2003 Driver
      Uses Accelstepper Library
    
      DroneBot Workshop 2018
      https://dronebotworkshop.com
    */
    
    // Include the AccelStepper Library
    #include <AccelStepper.h>
    
    // Define Constants
    
    // Define step constants
    #define FULLSTEP 4
    #define HALFSTEP 8
    
    // Define Motor Pins (2 Motors used)
    
    #define motorPin1  8     // Blue   - 28BYJ48 pin 1
    #define motorPin2  9     // Pink   - 28BYJ48 pin 2
    #define motorPin3  10    // Yellow - 28BYJ48 pin 3
    #define motorPin4  11    // Orange - 28BYJ48 pin 4
                            
                            
    #define motorPin5  4     // Blue   - 28BYJ48 pin 1
    #define motorPin6  5     // Pink   - 28BYJ48 pin 2
    #define motorPin7  6     // Yellow - 28BYJ48 pin 3
    #define motorPin8  7     // Orange - 28BYJ48 pin 4
    
    // Define two motor objects
    // The sequence 1-3-2-4 is required for proper sequencing of 28BYJ48
    AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
    AccelStepper stepper2(FULLSTEP, motorPin5, motorPin7, motorPin6, motorPin8);
    
    void setup()
    {
      // 1 revolution Motor 1 CW
      stepper1.setMaxSpeed(1000.0);
      stepper1.setAcceleration(50.0);
      stepper1.setSpeed(200);
      stepper1.moveTo(2048);  
      
      // 1 revolution Motor 2 CCW
      stepper2.setMaxSpeed(1000.0);
      stepper2.setAcceleration(50.0);
      stepper2.setSpeed(200);
      stepper2.moveTo(-2048); 
    
    }
    
    
    void loop()
    {
      //Change direction at the limits
      if (stepper1.distanceToGo() == 0) 
        stepper1.moveTo(-stepper1.currentPosition());
        if (stepper2.distanceToGo() == 0) 
        stepper2.moveTo(-stepper2.currentPosition());
      
      stepper1.run();
      stepper2.run();
    
    }
    

    在此演示中,我们将以整步驱动一个电机,以半步驱动第二个电机。为此,我们将在草图的开头定义两个常量。我们还将定义八个常量,一个用于 Arduino 上的每个电机输出引脚。

    接下来我们设置两个电机对象,每个电机一个。我们使用我们的引脚定义和步骤定义来设置它们。

    在设置例程中,我们设置了最大速度、加速系数、初始速度和我们将移动到的步数(我使用 2048,因为电机每转旋转 2048 步)。请注意,第二个电机的步数为负数,这表明它在初始化时是逆时针移动的。

    在循环中,我们使用 If 语句检查电机需要行驶多远才能使用 AccelStepper 库的“distanceToGo”参数到达“moveTo”位置。一旦达到零,我们将“moveTo”位置更改为当前位置的负值,这将导致电机沿相反方向移动到行程的另一端。

    电机实际上是使用 AccelStepper 库的“运行”函数启动的。

    两个电机的运动很有趣,因为它们以相反的方向加速和减速。请注意,一个电机以整步运行,而另一个以半步运行,观察电机启动和停止时 UNL2003 控制器上的指示灯,您会发现步进模式有所不同。

    演示 3 – 带 L298N H 桥的双极步进电机

    现在我们已经使用了单极步进电机,是时候切换到双极步进电机了。在本实验中,我使用了额定电压为 12 伏的 NEMA 17 尺寸双极步进电机,但只要您遵守额定电压并使用合适的电源,就可以使用任何双极步进电机。再次请不要尝试从 Arduino 电源为电机供电。

    正如您所记得的那样,双极步进电机需要一个可以反转电机线圈极性的驱动器,以便反转电机方向。实现此目的的一个很好的组件是“H 桥”。

    在我们讨论控制有刷直流电机时,我们已经讨论过使用H 桥。从本质上讲,这是一种包含四个内部功率晶体管的设备,可以控制通过电机线圈的电流方向。

    我们将使用与上一篇文章 L298N 模块相同的 H 桥控制器。这些模块非常便宜且非常可靠,可用于控制两台直流电机或一台步进电机。显然,我们今天将使用它来控制步进电机,L298N 是双 H 桥,因此每个 H 桥将驱动双极步进电机中的一个线圈。

    以下是我连接 L298N H 桥、双极步进电机和 Arduino Uno 的方法:
    请注意,您可能不需要进行所有这些连接,这取决于您如何配置 L298N 模块。还要注意您使用的电机电源应符合您的电机要求。

    L298N 模块有一个跳线,用于设置其内部 5 伏逻辑电路使用外部电源(跳线关闭)或使用内置稳压器并从电机电源中获取 5 伏电压(跳线打开) . 如果您选择使用电机电源,请确保它至少为 7.5 伏,并消除 Arduino 5 伏输出的电源连接。

    一些 L298N 模块还有一组跳线,允许您将两条启用线连接到高电平,以便始终启用电机,这就是我们在这里想要的。如果你有这些,你也可以取消从 Arduino 5 伏输出到 ENA 和 ENB 的连接,而只是设置跳线。

    我们还将使用电位器作为速度控制。10k 以上的任何值都可以工作,较低的值会给 Arduino 5 伏输出带来很大的负载。

    一旦你把所有东西都连接起来,就可以将代码加载到 Arduino 上了。这是代码:

    /*
      Stepper Motor Demonstration 3
      Stepper-Demo3.ino
      Demonstrates NEMA 17 Bipolar Stepper with L298N Driver
      Uses Potentiometer on Analog Input A0
      Uses Arduino Stepper Library
    
      DroneBot Workshop 2018 
      https://dronebotworkshop.com
    */
    
    // Include the Arduino Stepper Library
    #include <Stepper.h>
    
    // Define Constants
    
    // Number of steps per output rotation
    const int STEPS_PER_REV = 200;
    const int SPEED_CONTROL = A0;
    
    // Create Instance of Stepper Class
    // Specify Pins used for motor coils
    // The pins used are 8,9,10,11 
    // Connected to L298N Motor Driver In1, In2, In3, In4 
    // Pins entered in sequence 1-2-3-4 for proper step sequencing
    
    Stepper stepper_NEMA17(STEPS_PER_REV, 8, 9, 10, 11);
    
    void setup() {
      // nothing to do inside the setup
    }
    
    void loop() {
      // read the sensor value:
      int sensorReading = analogRead(SPEED_CONTROL);
      // map it to a range from 0 to 100:
      int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
      // set the motor speed:
      if (motorSpeed > 0) {
        stepper_NEMA17.setSpeed(motorSpeed);
        // step 1/100 of a revolution:
        stepper_NEMA17.step(STEPS_PER_REV / 100);
      }
    }
    

    该代码再次使用 Arduino Stepper 库。如果您喜欢挑战,可以改写它以使用 AccelStepper 库。

    在包含库之后,我们定义了几个常量:

    STEPS_PER_REV 是我们的电机额定每转的步数。我的额定值为 200,相当于每步 1.8 度。更改它以匹配您的电机。
    SPEED_CONTROL 是我们接电位器的模拟口。它被设置为 A0。
    我们的双极步进器的顺序是 1-2-3-4,所以我们在创建步进器类的实例时考虑到这一点。我们的 L298N 连接到引脚 8、9、10 和 11。

    同样,步进器库将引脚设置为输出,因此无需在设置例程中执行此操作。

    在循环中,我们通过使用 Arduino analogRead 函数测量模拟引脚上的输入电压来读取电位器位置。然后我们使用有用的 Arduino 映射函数将其映射到 0 到 100 的范围。

    然后使用映射函数得出的值来设置电机速度。只要它超过零,我们就可以设置电机速度,然后将其步进百分之一转,在我的电机的情况下,它将移动两步或 3 度。

    之后我们再做一遍。结果是电机速度将由电位器控制。

    请注意,在本设计中未尝试控制电机方向。如果您愿意,可以通过将电机速度设置为负数来逆时针旋转电机来实现。H 桥将完成反转电机电压极性的工作以反转电机。

    如您所见,L298N 是一款出色的步进电机控制器和直流电机控制器。但与 UNL2003 一样,它仍然需要 Arduino 来完成所有电机排序。在我们的下一个实验中,我们将使用专用电机控制器。

    演示 4 – 采用 A4988 的双极步进器

    最后的演示将使用称为 A4988 的专用双极步进电机控制器。使用专用控制器有很多优点:

    步进电机的逻辑都包含在控制器中,释放 Arduino(或其他微控制器或微型计算机)来做其他事情。
    减少了与微控制器或微型计算机的连接数量,使得控制多个步进电机变得更加容易
    无需使用任何特殊库或占用计算资源,即可轻松完成微步进等高级操作
    您实际上可以在没有微控制器的情况下控制电机,一个简单的方波振荡器在许多情况下就足够了。
    A4988是一种非常常见且价格低廉的步进电机控制器,在需要管理多个步进电机的 3D 打印机和 CNC 机器中大量使用。除了控制器和电机外,它只需要一个其他部件,即安装在控制器附近的去耦电容器。使用散热器,该设备可以处理高达 2 安培的电流。

    在使用A4988模块之前,让我们先看看它的引脚排列:


    从右上角开始往下看,我们看到以下引脚:

    VMOT – 电机直流电源电压(正)。最大电压为 35 伏。
    GND——电机电源电压地。
    2B、2A – 双极步进电机线圈 2 的连接。
    1A、1B – 双极步进电机线圈 1 的连接。
    VDD – 逻辑电源直流电压(正)。这可以在 3 到 5.5 伏之间。
    GND——逻辑电源地。
    现在俯视 A4988 模块的另一侧:

    ENABLE——这是一个低电平有效连接,当变为低电平(接地)时,A4988 模块被启用。默认情况下,它被拉低,因此该模块始终处于启用状态,除非您在此处应用逻辑高电平。
    MS1、MS2、MS3——这三个连接决定了 A4988 模块的微步进模式。通过在此处设置逻辑电平,您可以将电机设置为全步、半步、四分之一、八分之一或十六分之一步。有关详细信息,请参见连接图上的图表。
    RESET——这是一条低电平有效线,将重置模块。默认情况下,它被拉高。
    SLEEP——如果这条线设置为低电平,模块将进入低功耗睡眠模式并消耗最小电流。通过将这条线连接到复位引脚,模块将始终处于全功耗状态。
    STEP – 这是您从外部微控制器或方波振荡器驱动电机的方式。此处发送的每个脉冲都会使电机步进 MS1、MS2 和 MS3 设置所设置的任何步数或微步数。脉冲越快,电机运行得越快。
    DIR – 方向控制 这里的高电平输入驱动电机顺时针方向,低电平将驱动电机逆时针方向。
    这里要注意的关键是 A4988 只需要来自 Arduino 的两个输入来控制步进电机,不需要 Arduino 来“弄清楚”步进逻辑。这使得控制高级项目的多个步进电机变得容易得多。

    现在我们已经了解了 A4988 的布局,我们将把其中一个连接到我们的 Arduino。

    请注意,此电路中有一个额外的组件,一个 100uf 电容器。这对于去耦电源至关重要。47uf 以上的任何值都足够,尝试将电容器安装在尽可能靠近 A4988 VMOT 和 GND 引脚的位置。

    否则连接非常简单。确保观察电机连接,A4988 的布局很方便,可以匹配几种双极电机上常见的 4 针连接器,但您应该检查电机连接以确保它们正确无误。

    A4988 电流调整
    在我们加载代码之前,需要做一件事。我们需要使用 A4988 模块上的小型电位计来设置流过电机线圈的电流。

    这样做的一种方法是在调整电位器时测量电位器附近测试点(标记为“+”)的电压。使用以下公式推导电流:

    I= Vref*2.5 – “Vref”是您测量的电压,“I”是电流。

    另一种方法是将“STEP”输入连接到高电压(5 伏)并将电流表与其中一个电机线圈串联。这是我在视频中使用的方法。

    调整电机电流后,就可以加载代码了:

    /*
      Stepper Motor Demonstration 4
      Stepper-Demo4.ino
      Demonstrates NEMA 17 Bipolar Stepper with A4988 Driver
    
      DroneBot Workshop 2018
      https://dronebotworkshop.com
    */
    
    // Define Constants
    
    // Connections to A4988
    const int dirPin = 2;  // Direction
    const int stepPin = 3; // Step
    
    // Motor steps per rotation
    const int STEPS_PER_REV = 200;
     
    void setup() {
      
      // Setup the pins as Outputs
      pinMode(stepPin,OUTPUT); 
      pinMode(dirPin,OUTPUT);
    }
    void loop() {
      
      // Set motor direction clockwise
      digitalWrite(dirPin,HIGH); 
      
      // Spin motor one rotation slowly
      for(int x = 0; x < STEPS_PER_REV; x++) {
        digitalWrite(stepPin,HIGH); 
        delayMicroseconds(2000); 
        digitalWrite(stepPin,LOW); 
        delayMicroseconds(2000); 
      }
      
      // Pause for one second
      delay(1000); 
      
      // Set motor direction counterclockwise
      digitalWrite(dirPin,LOW);
      
      // Spin motor two rotations quickly
      for(int x = 0; x < (STEPS_PER_REV * 2); x++) {
        digitalWrite(stepPin,HIGH);
        delayMicroseconds(1000);
        digitalWrite(stepPin,LOW);
        delayMicroseconds(1000);
      }
      
      // Pause for one second
      delay(1000);
    }
    

    在此代码中,我们不会使用任何步进器库,因为我们需要做的就是向 A4988 发送脉冲并让它完成所有“繁重的工作”。

    我们首先定义常量来表示我们将 A4988 STEP 和 DIR 引脚连接到的引脚。我们还像在上一个草图中所做的那样定义了 STEPS_PER_REV,即电机完成一圈旋转所需的步数。同样,您应该将其设置为符合您的步进电机规格。

    在设置中,我们将两个定义的 A4988 引脚设置为输出。

    现在进入循环。我们将在这里做两件事,顺时针缓慢旋转电机一圈,然后逆时针旋转两圈。我们将在每次旋转之间插入一秒的延迟。

    为了设置电机的方向,我们将 DIR 引脚设置为高电平或低电平,具体取决于我们要走的路。此处为高电平将导致电机顺时针旋转。

    速度由我们在 STEP 引脚上发送的脉冲频率设置。脉冲以与 Arduino Blink 草图非常相似的方式手动生成,通过将输出调高,稍等片刻,然后调低并再次等待。根据需要重复多次,以将我们的电机旋转到我们想要的量,第一个例程旋转一整圈,第二个例程旋转两圈。

    当然,您可以根据需要添加任意数量的例程,让您的马达以您喜欢的速度和方向运动。

    正如您所看到的,A4988 使得用最少的代码驱动双极步进电机变得非常容易。您还可以为您的 Arduino 获取一个扩展板,该扩展板允许您驱动多个 A4988 模块,如果您要构建 CNC 机器或 3D 打印机,这将非常有用。

    结论

    希望这篇文章和随附的视频已经向您展示了步进电机毕竟不是那么难用。如果您正在设计一个项目,需要您能够精确定位某物,那么步进电机是一个理想的选择。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【步进电机与Arduino使用教程】

    发表评论