您现在的位置是:网站首页> 硬件

Arduino 极客教程

  • 硬件
  • 2021-11-21
  • 905人已阅读
摘要

Arduino 极客教程

步进电机控制

A4988电机驱动板

A4988是一款十分普及且价格实惠的步进电机驱动板。尤其是在3D打印以及数控机床领域,A4988十分常见。在使用Arduino通过A4988控制步进电机时,我们还需要一个额外的电子元件,那就是电解电容。该电容作用是为了保护A4988控制板。

首先让我们来看一下A4988电机驱动板的引脚功能:

A4988电机驱动板引脚说明
A4988电机驱动板引脚说明 以上示意图引自dronebot workshop(www.dronebotworkshop.com)网站

VMOT – 电机电源正极(可用电源电压为8V ~ 35V)注:此引脚用于连接为电机供电的电源
GND – 电机电源接地
2B, 2A – 电机绕组2控制引脚
1A, 1B – 电机绕组1控制引脚
VDD – 逻辑电源正极(3 – 5.5伏)注:此引脚用于为A4988电机驱动板供电
GND – 逻辑电源接地

ENABLE – 使能引脚(低电平有效)
引脚说明:此当此引脚为低电平时,A4988才能进行电机驱动工作,当该引脚为高电平,A4988将不会进行电机驱动工作。如果该引脚悬空,则A4988默认为使能状态。即该引脚没有连接任何电平时,A4988可以正常工作。
MS1, MS2, MS3 – 驱动模式引脚
引脚说明:这三个引脚控制A4988微步细分驱动模式。通过这三个引脚的逻辑电平,我们可以调整A4988驱动电机模式为全、半、1/4、1/8 及 1/16 步进模式。上图中右侧的表格里有具体如何调节这三个引脚电频以及A4988在不同的电平组合下的驱动模式。表格中“L”代表低电平,“H”代表高电平。“FULL”为全步进,“HALF”为半步进,“QUATER”为1/4步进, “EIGHTH”为1/8步进, “SIXTEENTH”为1/16步进。当MS1, MS2, MS3这几个引脚悬空时,A4988默认为全步进电机驱动模式。
RESET – 复位引脚
引脚说明:该引脚为低电平有效,即当该引脚为低电平时,A4988将复位。如果该引脚悬空,则A4988默认为高电平。即该引脚没有连接任何电平时,A4988可以正常工作。
SLEEP – 睡眠引脚
引脚说明:当该引脚连接电平为低电平时,A4988将进入低能耗睡眠状态,即消耗最小的电能。如果无需使用SLeep功能,则可以将SLEEP引脚与RESET引脚连接,则A4988将持续保持正常能耗状态而不会进入低能耗状态。
STEP – 步进引脚
引脚说明:此引脚用于通过Arduino等微控制器向A4988发送脉冲控制信号,A4988接收到此信号后,会根据 MS1, MS2 和 MS3引脚控制电机运转。
DIR – 方向引脚
引脚说明:通过此引脚可以调整A4988控制电机运行方向。当此引脚为低电平,A4988将控制电机顺时针旋转。高电平则逆时针旋转。

Arduino通过A4988电机驱动板控制NEMA电机电路连接(简化版)

A4988电机驱动板只需要两个Arduino引脚即可控制步进电机运行。

Arduino控制Nema-17步进电机
Arduino控制Nema-17步进电机(简化版)

请留意在以上电路中,A4988电机电源引脚上连接了一个100uF的电解电容(电解电容引脚有正负极之分,电容正极引脚应接在A4988电机电源正极引脚,相反的电解电容负极引脚接在A4988电机电源接地引脚)。该电容可以起到A4988驱动板电源保护的作用。如果没有100uF的电解电容,可以使用任何大于47uF的电解电容来替换。请将该电容尽量安装在靠近VMOT和GND引脚。

其它接线连接相对简单,请根据以上示意图进行相应连接。

此示例为简化版电路连接,在此模式下:
1. A4988模块只能全步进驱动,您无法通过Arduino控制A4988进行半步进或微步模式驱动。
2. A4988模块的SLEEP/ENABLE/RESET功能不可用
如需使用这些功能请参考Arduino通过A4988模块控制步进电机(完整版)

注意:连接好接线后,请不要马上通电我们还要进行一项非常重要的工作:A4988电流调节


A4988 Vref电压调节

所谓Vref电压调节,就是通过A4988上的电位器旋钮调节Vref参考电压。该电压将直接影响到步进电机在工作时流过线圈的电流强度。请注意,这一步操作非常重要,如果忽略这一步有可能会产生电机损坏的后果。

A4988 Vref参考电压计算公式:

Vref = Imax X Rcs X 8

Rcs: 市面上A4988模块上的Rcs电阻值一般有3种类型,0.05 欧姆, 0.1 欧姆或0.2 欧姆。大部分A4988模块顺时针旋转电位器可调大Vref,逆时针旋转电位器调小Vref。

Vref: 电位器金属旋钮和GND之间的电压即为Vref。可使用小改锥旋转电位器旋钮从而改变Vref。(如下图所示)

Imax:步进电机工作时,线圈允许流过的最大电流

使用万用表测量A4988步进电机驱动模块Vref参考电压
使用万用表测量A4988步进电机驱动模块Vref参考电压

例:Rcs为0.1欧姆,电机Imax为1.5A,通过以上公式计算,Vref参考电压为1.2 V。即:我们将通过调节电位器旋钮 将Vref调节为1.2伏特左右。

测量Vref时注意:

1. A4988模块的VDD引脚需要连接+5V电压(可连接Arduino的+5V引脚)
2. A4988模块的GND引脚必须与电路中的其它设备共地(可连接Arduino的GND引脚)
3. A4988模块的VMOT引脚无需通电,但是通电也不影响Vref的测量。
4. A4988模块的1A/1B/2A/2B引脚可以不与步进电机连接,但连接也不会影响Vref的测量
5. Arduino无需运行任何程序



Arduino通过A4988电机驱动板控制NEMA电机示例程序(简化版)

无法复制示例程序代码?

/*

  Arduino控制NEMA步进电机测试程序

  by 太极创客()

  本示例程序旨在演示如何通过Arduino控制NEMA步进电机。

  如需获得本示例程序详细电路信息以及如何使用Arduino控制电机的更多知识,请参考太极创客网站:

  http://www.taichi-maker.com/homepage/reference-index/motor-reference-index/arduino-a4988-nema-stepper-motor/

*/

 

// 定义电机控制用常量

 

// A4988连接Arduino引脚号

const int dirPin = 2;  // 方向引脚

const int stepPin = 3; // 步进引脚

 

// 电机每圈步数

const int STEPS_PER_REV = 200;

 

void setup() {

  

  // Arduino控制A4988步进和方向的引脚为输出模式

  pinMode(stepPin,OUTPUT); 

  pinMode(dirPin,OUTPUT);

}

void loop() {

  

  // 设置电机顺时针旋转

  digitalWrite(dirPin,LOW); 

  

  // 电机慢速旋转

  for(int x = 0; x < STEPS_PER_REV; x++) {

    digitalWrite(stepPin,HIGH); 

    delayMicroseconds(2000); 

    digitalWrite(stepPin,LOW); 

    delayMicroseconds(2000); 

  }

  

  // 等待一秒

  delay(1000); 

  

  // 设置电机逆时针旋转

  digitalWrite(dirPin,HIGH);

  

  // 电机快速旋转

  for(int x = 0; x < (STEPS_PER_REV * 2); x++) {

    digitalWrite(stepPin,HIGH);

    delayMicroseconds(1000);

    digitalWrite(stepPin,LOW);

    delayMicroseconds(1000);

  }

  

  // 等待一秒

  delay(1000);

}

Arduino通过A4988电机驱动板控制NEMA电机电路连接(完整版)

Arduino通过A4988模块控制步进电机电路连接说明(完整版)
Arduino通过A4988模块控制步进电机电路连接说明(完整版)


Arduino通过A4988电机驱动板控制NEMA电机示例程序(完整版)

无法复制示例程序代码?

/*

  Arduino控制NEMA步进电机测试程序 (2018-09-25)

  by 太极创客(www.taichi-maker.com)

  本示例程序旨在演示如何通过Arduino控制NEMA步进电机。

  用户可通过串口监视器控制电机的各个功能

  如需获得本示例程序详细电路信息以及如何使用Arduino控制电机的更多知识,请参考太极创客网站:

  http://www.taichi-maker.com/homepage/reference-index/motor-reference-index/arduino-a4988-nema-stepper-motor/

  

  控制指令:

  顺时针旋转/逆时针旋转 - x0/x1

  运行步数 - z100(走100步)

  步进方式 - b1(全步),b2(半步),b4(四分),b8(8分),b16(16分)

  速度 - d2000(转动速度2000)

  允许工作/禁止工作(enable/disable) - g1/g0

  睡眠 - m0(sleep)/m1(awake)  

*/

 

// A4988引脚连接Arduino引脚编号

const int dirPin   = 2;   // Direction

const int stepPin  = 3;   // Step

const int sleepPin = 4;   // Sleep

const int resetPin = 5;   // Reset

const int ms3Pin   = 6;   // Ms3

const int ms2Pin   = 7;   // Ms2

const int ms1Pin   = 8;   // Ms1

const int enPin    = 9;   // Enable

 

// 步进电机旋转一周步数

const int STEPS_PER_REV = 200;

 

char cmd;  //用户指令字符

int data;  //用户指令数据

int motorSpeed = 2000;  //电机转速(数值越小速度越小)

 

void setup() { 

  // 设置引脚模式

  pinMode(stepPin,OUTPUT); 

  pinMode(dirPin,OUTPUT);

  pinMode(sleepPin,OUTPUT); 

  pinMode(resetPin,OUTPUT);  

  pinMode(ms3Pin,OUTPUT);  

  pinMode(ms2Pin,OUTPUT);  

  pinMode(ms1Pin,OUTPUT); 

  pinMode(enPin,OUTPUT);   

 

  // 初始化引脚状态

  digitalWrite(sleepPin, HIGH);  

  digitalWrite(resetPin, HIGH); 

  digitalWrite(enPin, LOW); 

 

  // 初始化电机步进模式为全步进

  digitalWrite(ms1Pin, LOW); 

  digitalWrite(ms2Pin, LOW); 

  digitalWrite(ms3Pin, LOW); 

 

  Serial.begin(9600);

  Serial.println("++++++++++++++++++++++++++++++++++");     

  Serial.println("+ Taichi-Maker A4988 Steper Demo +");   

  Serial.println("+     www.taichi-maker.com       +");  

  Serial.println("++++++++++++++++++++++++++++++++++");  

  Serial.println("");  

  Serial.println("Please input motor command:"); 

}

 

void loop() {    

  if (Serial.available()) {     // 检查串口缓存是否有数据等待传输 

    cmd = Serial.read();        // 获取电机指令中电机编号信息    

    Serial.print("cmd = ");

    Serial.print(cmd);    

    Serial.print(" , "); 

 

    data = Serial.parseInt();

    Serial.print("data = ");

    Serial.print(data);   

    Serial.println("");    

 

    runUsrCmd();

  }

 

//此函数用于运行用户指令

void runUsrCmd(){

  switch(cmd){ 

    case 'x':    // 设置步进电机旋转(顺时针/逆时针)

      Serial.print("Set Rotation To "); 

      if (data == 0){

        digitalWrite(dirPin, 0);

        Serial.println("Clockwise."); 

      } else {

        digitalWrite(dirPin, 1);

        Serial.println("Counter Clockwise."); 

      }

      break;

    

    case 'g':   // 设置A4988 enable功能

      Serial.print("Set Motor To "); 

      if (data == 0){

        digitalWrite(enPin, 1);

        Serial.println("Disable."); 

      } else {

        digitalWrite(enPin, 0);

        Serial.println("Enable."); 

      }

      break;

      

    case 'm':  // 设置A4988 sleep功能

      Serial.print("Set Motor To "); 

      if (data == 0){

        digitalWrite(sleepPin, 0);

        Serial.println("Sleep."); 

      } else {

        digitalWrite(sleepPin, 1);

        Serial.println("Awake."); 

      }

      break;

 

    case 'b':   // 设置步进模式

      if (data == 1 || data == 2  || data == 4  || data == 8 || data == 16){

        Serial.print("Set Motor Step Control To "); 

        setStepMode(data);

      } else {

        Serial.println("Wrong Step Mode Cmd!");

      }

      break;

 

    case 'z': // 设置步进电机运行步数

      runStepper(motorSpeed, data);

      break;

 

    case 'd': // 设置步进电机运行速度      

      motorSpeed = data;

      Serial.print("Set Motor Speed To ");

      Serial.println(data);

      break;

          

    default:  // 未知指令

      Serial.println("Unknown Command");

  }

}

 

//运行步进电机

void runStepper (int rotationSpeed, int stepNum){

  for(int x = 0; x < stepNum; x++) {

    digitalWrite(stepPin,HIGH); 

    delayMicroseconds(rotationSpeed); 

    digitalWrite(stepPin,LOW); 

    delayMicroseconds(rotationSpeed); 

  }  

}

 

 //设置步进模式

void setStepMode(int modeNum){ 

  switch(modeNum){ 

    case 1:   // 全步进

    digitalWrite(ms1Pin, LOW); 

    digitalWrite(ms2Pin, LOW); 

    digitalWrite(ms3Pin, LOW);  

    Serial.println(F("Stepping Mode: Full"));

    break; 

 

    case 2:  // 半步进  

    digitalWrite(ms1Pin, HIGH); 

    digitalWrite(ms2Pin, LOW); 

    digitalWrite(ms3Pin, LOW);  

    Serial.println(F("Stepping Mode: 1/2"));

    break; 

 

    case 4:  // 1/4 步进   

    digitalWrite(ms1Pin, LOW); 

    digitalWrite(ms2Pin, HIGH); 

    digitalWrite(ms3Pin, LOW);  

    Serial.println(F("Stepping Mode: 1/4"));

    break;     

 

    case 8:  // 1/8 步进   

    digitalWrite(ms1Pin, HIGH); 

    digitalWrite(ms2Pin, HIGH); 

    digitalWrite(ms3Pin, LOW);  

    Serial.println(F("Stepping Mode: 1/8"));

    break;  

 

    case 16:  // 1/16 步进   

    digitalWrite(ms1Pin, HIGH); 

    digitalWrite(ms2Pin, HIGH); 

    digitalWrite(ms3Pin, HIGH); 

    Serial.println(F("Stepping Mode: 1/16")); 

    break;    

  }      

}

使用CNC电机扩展板配合A4988驱动步进电机

Arduino CNC 电机扩展板概述

CNC是计算机数字控制(Computerized Numerical Control )的英文缩写。顾名思义,Arduino CNC电机扩展板常用于驱动3D打印机、机械臂或机器人系统中的NEMA17电机(俗称42步进电机)。CNC扩展板可以支持A4988、DRV8825等步进电机驱动板。

Arduino CNC 电机扩展板外观
Arduino CNC 电机扩展板外观

使用一个CNC电机扩展板配合A4988驱动板可以让Arduuino一次控制1台-4台42步进电机,而且省去了连线的麻烦。如果您想了解如何操作,请点击以下链接进入本站相关教程页面

Arduino CNC电机扩展板详解

A4988电机驱动板常见问题

1)4988驱动板可以驱动多大的电流?
如果4988芯片上没有加散热片,电流最好在1.2A以下。如果加散热片,电流可以达到2A。

2)步进电机的连接方式是什么?
如果你的电机线是标准的红蓝绿黑的颜色,可以按照颜色连接为:红-蓝-绿-黑,或相反:黑-绿-蓝-红。

3)接上电后,电机左右抖动不能正常运行是什么原因?
电机出现抖动一般有两个原因,一是缺相:可能是4988与电机没有接好导致4988的输出端某一相断开,造成电机缺相从而抖动。也有可能是步进电机接线接错:如果步进电机没有正确的进行连接,电机会出现抖动的情况。

4)电机丢步如何解决?
相电流的大小跟步进电机的扭力有直接关系,如果感觉你的步进电机扭力不足、丢步,可能是4988输出的电流太小。您可以调节A4988模块上的电位器调节A4988模块的输出电流强度。具体调节方法请参考本页面中关于Vref电压的调节方法。请注意:如A4988输出电流强度大于电机工作电流强可能会烧毁您的步进电机。请小心调节。

5)4988可以驱动两相六线或两相五线的电机吗?
可以,两相连线按照问题2连接,将中间抽头悬空即可。

6)电机停止转动时会有滋滋的电流声。
这是正常现象。步进电机有一个参数-步距角。通过细分驱动可以缩小步进角度,比如步距角为1.8度的步进电机,采用16细分,最小可以走的角度是1.8/16=0.1125度。由于这个角度非常小,当电机停止时,可能处于非电机物理位置(1.8度为一个物理位置)。因此步进电机在静止时会有电流声,这属于正常现象,不用担心。


Top