NEMA步进电机介绍 |
A4988电机驱动板 |
电路连接(简化版) |
A4988 Vref电压调节 |
示例程序(简化版) |
电路连接(完整版) |
示例程序(完整版) |
使用CNC电机扩展板配合A4988驱动步进电机 |
A4988电机驱动板常见问题 |
请注意:本页面主要针对Arduino通过A4988控制NEMA步进电机(也称42步进电机)。如您需要了解如何使用Arduino控制28BYJ-48双极性步进电机,请参考太极创客网站的“stepper库”页面。
NEMA步进电机(42步进电机)介绍
为了帮助朋友们学习如何使用Arduino控制NEMA17步进电机(42步进电机),我们制作了免费的视频教程。您可以通过以下链接收看这一部分的教程内容。
A4988电机驱动板
假如您需要购买A4988电机驱动板,可前往我站的淘宝网店进行购买。链接如下:
https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111debWWYqm2&ft=t&id=642637978005
A4988是一款十分普及且价格实惠的步进电机驱动板。尤其是在3D打印以及数控机床领域,A4988十分常见。在使用Arduino通过A4988控制步进电机时,我们还需要一个额外的电子元件,那就是电解电容。该电容作用是为了保护A4988控制板。
首先让我们来看一下A4988电机驱动板的引脚功能:
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引脚即可控制步进电机运行。
请留意在以上电路中,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:步进电机工作时,线圈允许流过的最大电流
例: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电机示例程序(简化版)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
/* 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电机驱动板控制NEMA电机示例程序(完整版)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
/* 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等步进电机驱动板。
使用一个CNC电机扩展板配合A4988驱动板可以让Arduuino一次控制1台-4台42步进电机,而且省去了连线的麻烦。如果您想了解如何操作,请点击以下链接进入本站相关教程页面
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度为一个物理位置)。因此步进电机在静止时会有电流声,这属于正常现象,不用担心。