原文地址:http://www./homepage/reference-index/motor-reference-index/arduino-a4988-nema-stepper-motor/ 请注意:本页面主要针对Arduino通过A4988控制NEMA步进电机(也称42步进电机)。如您需要了解如何使用Arduino控制28BYJ-48双极性步进电机,请参考太极创客网站的“stepper库”页面。 NEMA步进电机(42步进电机)介绍为了帮助朋友们学习如何使用Arduino控制NEMA17步进电机(42步进电机),我们制作了免费的视频教程。您可以通过以下链接收看这一部分的教程内容。 零基础入门学用Arduino -电机专项教程 1-4 步进电机原理(上)零基础入门学用Arduino -电机专项教程 1-5 步进电机原理(下)零基础入门学用Arduino -电机专项教程 1-6 NEMA步进电机(上)零基础入门学用Arduino -电机专项教程 1-7 NEMA步进电机(下) A4988电机驱动板A4988是一款十分普及且价格实惠的步进电机驱动板。尤其是在3D打印以及数控机床领域,A4988十分常见。在使用Arduino通过A4988控制步进电机时,我们还需要一个额外的电子元件,那就是电解电容。该电容作用是为了保护A4988控制板。 首先让我们来看一下A4988电机驱动板的引脚功能: VMOT – 电机电源正极(可用电源电压为8V ~ 35V)注:此引脚用于连接为电机供电的电源 ENABLE – 使能引脚(低电平有效) Arduino通过A4988电机驱动板控制NEMA电机电路连接(简化版)A4988电机驱动板只需要两个Arduino引脚即可控制步进电机运行。 请留意在以上电路中,A4988电机电源引脚上连接了一个100uF的电解电容(电解电容引脚有正负极之分,电容正极引脚应接在A4988电机电源正极引脚,相反的电解电容负极引脚接在A4988电机电源接地引脚)。该电容可以起到A4988驱动板电源保护的作用。如果没有100uF的电解电容,可以使用任何大于47uF的电解电容来替换。请将该电容尽量安装在靠近VMOT和GND引脚。 其它接线连接相对简单,请根据以上示意图进行相应连接。 此示例为简化版电路连接,在此模式下: 注意:连接好接线后,请不要马上通电我们还要进行一项非常重要的工作: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:步进电机工作时,线圈允许流过的最大电流 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RAj4BP6W-1617346332948)(C:%5CUsers%5CAdministrator%5CPictures%5Ctypora%5CVref-889x1024.jpg)]使用万用表测量A4988步进电机驱动模块Vref参考电压 例:Rcs为0.1欧姆,电机Imax为1.5A,通过以上公式计算,Vref参考电压为1.2 V。即:我们将通过调节电位器旋钮 将Vref调节为1.2伏特左右。 测量Vref时注意: \1. A4988模块的VDD引脚需要连接+5V电压(可连接Arduino的+5V引脚) Arduino通过A4988电机驱动板控制NEMA电机示例程序(简化版)// 定义电机控制用常量 // 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电机示例程序(完整版)Arduino通过A4988模块控制步进电机示例程序 /* 控制指令: 顺时针旋转/逆时针旋转 - 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. +"); 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; } } A4988电机驱动板常见问题1)4988驱动板可以驱动多大的电流? 2)步进电机的连接方式是什么? 3)接上电后,电机左右抖动不能正常运行是什么原因? 4)电机丢步如何解决? 5)4988可以驱动两相六线或两相五线的电机吗? 6)电机停止转动时会有滋滋的电流声。 |
|