A4988 内置了 译码器,我们可以可以通过控制器的 2 个引脚来控制步进电机,一个控制旋转方向,另一个控制步数。
A4988 提供了五种不同的微步控制:
此外,它还配备了一个调节电流输出、过热保护和过流保护的 电位计。A4988 的逻辑电压范围是:3~5.5V,如果配备较好的散热条件每相最大电流可达 2A,在没有配备散热器的情况下,每相连续电流最好控制在 1A 范围内。
VMOT
、GND
:外部供电引脚,目的是能给电机提供足够的动力输出,供电范围:8-35V,此处使用一个47uf
的电解电容来保护驱动板免受瞬时电压的冲击。
VDD
和 GND
:连接到Arduino控制板的5V电源
和GND
引脚上。
1A
和 1B
: 连接到步进电机的一相,2A
和2B
引脚连接到步进电机的另一相。
STEP
和 DIR
: 连接至Arduino控制板的P3
和P4
引脚,这两个针脚主要用于控制电机的运动。Direction引脚控制转动方向,STEP针脚用于控制电机旋转的步数控制。
SLEEP
: 低电平使能使模块处于休眠模式,当电机不工作时,它可以最大程度地降低功耗,默认为高电平。
RESET
: 如果这个针脚的输入是低电平,那么所有的微步设置都将被忽略掉。
注意: 将SLEEP和RESET针脚连接起来,目的是将RESET针脚设置为高电平,以便模块可控。
ENABLE
:用于打开和关闭场效应管的输出,低电平打开,高电平关闭。
MS1
, MS2
和 MS3
针脚用于微步设置。
如下图所示:
步进电机全步模式走 1 步是 1.8 度,一圈360° 就是 200 步;若使用 1/16 步进,1 步是 0.1125 度,一圈360° 则需要走 3200 步。
实际电路设计中,Arduino 引脚设置如下:
1、 电路中通过跳帽(连接器 J1)将 MS1
, MS2
和 MS3
针脚拉高,微步设置为 1/16步进( HIGH HIGH HIGH)。
2、将SLEEP
和RESET
针脚连接起来,目的是将RESET针脚设置为高电平,以便模块可控。
3、200Ω 电阻将A1引脚拉低。
对于两相双极混合型步进电机它有四根引出线,通过用万用表测量会得出,其中红色线和蓝色线是阻值较小,它们是同一个绕组;同样绿色线和黑色线阻值较小,它们俩也是同一绕组。接线时,只要把同一绕组的步进电机的驱动器上相应输出端子上,比如上图中的A+和A-接在同一个绕组上,B+和B-接在另一个绕组上即可。接好后开机试车,如果转向与我们的要求不一样,只要把A+、A-和B+、B-对调就可以了。
在示意图上用A-B-C-D来标注。因此这种步进电机就叫“四相”步进电机。
假设先B相绕组闭合导通,这样就会在所对应的定子绕组齿上产生磁极,此时转子的“0”号和“3”号离它们最近,这样就会产生最强的吸引力。
如果按照B相-C相-D相-A相的顺序给步进电机的绕组通电的话,这样步进电机的转子就会按照逆时针的方向不停地运转。
通过分析可以知道,只要给步进电机的电子绕组输入一序列的电脉冲信号,那么步进电机的转子就会不停地转动一个角度,这就是步进电机名称的由来。
1B-1A-2A-2B
红-蓝-绿-黑
黑-绿-红-蓝
问题1:步进电机老振动
原因1:线接错了,
原因2:高速振动,低速振动
// Arduino使用A4988控制电机代码 #define Dir1pin A0 #define Step1pin A1 #define Enablepin 12 #define MSmodoule 3200 int x; void setup() { pinMode(Enablepin,OUTPUT); // Enable pinMode(Step1pin,OUTPUT); // Step pinMode(Dir1pin,OUTPUT); // Dir digitalWrite(Enablepin,LOW); // Set Enable low } void loop() { digitalWrite(Dir1pin,HIGH); // Set Dir high for(x = 0; x < MSmodoule; x++) // Loop 200 times { digitalWrite(Step1pin,HIGH); // Output high delayMicroseconds(800); // Wait 1/2 a ms digitalWrite(Step1pin,LOW); // Output low delayMicroseconds(800); // Wait 1/2 a ms } delay(1000); // pause one second digitalWrite(Dir1pin,LOW); // Set Dir low for(x = 0; x < MSmodoule; x++) // Loop 2000 times { digitalWrite(Step1pin,HIGH); // Output high delayMicroseconds(800); // Wait 1/2 a ms digitalWrite(Step1pin,LOW); // Output low delayMicroseconds(800); // Wait 1/2 a ms } delay(1000); // pause one second }
总 结:
1、D12
(-en) 低电平为启动电机(enable),貌似也可以不接,试过一样能运行(但如果要控制电机的启动关闭还是要用上);
2、A0
(-dir) 用高低电平控制方向;
3、A1
(-step) 用高低电平 驱动电机转动,注意中间间隔等待的微秒值,如果太快会导致电机有声响不转动。
L298N 是专用驱动集成电路,属于H桥集成电路,与 L293D 的差别是起输出电流增大,功率增强。
其输出电流为 2A ,最高电流 4A,最高工作电压50V,可以驱动感性负载,如大功率直流电机,步进电机,电磁阀等等,特别是其输入端可以与单片机直接相连,从而很方便地受单片机控制。
当驱动直流电机时,可以直接控制步进电机,并可以实现电机的正转和反转,实现此功能只需要改变输入端的逻辑电平。为了避免电机对单片机的干扰,本模块加入光耦,进行光电隔离 (光耦合器以光为媒介传输电信号,它对输入、输出电信号有良好的隔离作用)、整流二极管电机保护、从而使系统能够稳定可靠的工作。
4 通道控制、钽(tǎn)电容稳压、光耦隔离、整流二极管电机保护、过流保护、合金散热片、数模电路线路分离、电机电流反馈和PWM调速,电机双闭环控制。
Output A
:接DC 电机 1 或步进电机的 A+和 A-;
Output B
:接DC 电机 2 或步进电机的 B+和 B-;
5V Enable
:输入电源小于12V时短接可以提供5V电源输出,如果使用输入电源大于12V的电源,请将跳线帽移除;
+5V Power
:当输入电源小于12V时且5V Enable处于短接状态,可以提供+5V电源输出(实际位置请参考驱动板上的标注);
Power Gnd
:电源地;
+12V Power
:连接电机电源,最大35V。输入电压大于12V时,为确保安全,请去除 5V Enble 针脚上的跳线帽(实际位置请参考驱动板上的标注);
A/B Enble
:可用于输入PWM脉宽调制信号对电机进行调速控制。(如果无须调速可将两引脚接5V,使电机工作在最高速状态,既将短接帽短接)
实现电机正反转功能:
电机M1正转,输入信号端IN1接高电平输入端IN2接低电平。(如果信号端IN1接低电平, IN2接高电平,电机M1反转。)
电机M2正转,输入信号端IN3接高电平,输入端IN4接低电平。(反之则反转)
PWM信号端A控制M1调速,PWM信号端B控制M2调速。可参考下图表:
实际电路设计中,Arduino 引脚设置如下:
// Arduino使用L298N 控制电机代码 /* 项目名称:直流/步进电机驱动程序 功能: 作者:Naiva 日期:2021/11/19 版本:V1.0 */ #define In1pin 7 #define In2pin 8 #define Speed_Motor 9 #define asingle A6 void setup() { Serial.begin(9600); pinMode(In1pin, OUTPUT); pinMode(In2pin, OUTPUT); pinMode(Speed_Motor, OUTPUT); pinMode(asingle, INPUT); } void loop() { int val = analogRead(asingle); val = map(val,0,1023,0,255); Serial.print("A6类比信号为:"); Serial.println(val); analogWrite(Speed_Motor,val); digitalWrite(In1pin, HIGH); digitalWrite(In2pin, LOW); delay(10); }
参考资料
[1] 三端稳压集成电路 LM7805/LM7809 (LM78xx正电压LM79xx负电压系列)
[2] L298N 电机驱动 (电机驱动板L298N的针脚定义)
[3] FR207 损耗二极管
[4] A4988 步进电机驱动模块 (A4988的引脚图及运用)(Arduino+A4988+步进电机)
电路原理图如下:
附源码:
/*************************************** 项目名称:直流/步进电机驱动程序 功能: 作者:Naiva 日期:2021/11/19 版本:V1.0 *******************************************/ #define In1pin 7 #define In2pin 8 #define Speed_Motor 9 #define asingle A6 #define Dir1pin A0 #define Step1pin A1 #define Enablepin 12 #define MSmodoule 3200 void DC_motor1(){ int val = analogRead(asingle); val = map(val,0,1023,0,255); Serial.print("A6类比信号为:"); Serial.println(val); analogWrite(Speed_Motor,val); digitalWrite(In1pin, HIGH); digitalWrite(In2pin, LOW); delay(10); } void Step_stepper1_forward(int delaytime){ digitalWrite(Dir1pin,HIGH); // 设置方向 high for(int i = 0; i < MSmodoule; i++) // 循环MSmodoule次数 { digitalWrite(Step1pin,HIGH); delayMicroseconds(800); //延时800微秒 digitalWrite(Step1pin,LOW); delayMicroseconds(800); } delay(delaytime); //延时1秒 } void Step_stepper1_backward(int delaytime){ digitalWrite(Dir1pin,LOW); // 设置方向 for(int j = 0; j < MSmodoule; j++) // 循环3200次 { digitalWrite(Step1pin,HIGH); delayMicroseconds(800); digitalWrite(Step1pin,LOW); delayMicroseconds(800); } delay(delaytime); // 延时 } void Stop_DC_motor1(){ digitalWrite(In1pin, LOW); digitalWrite(In2pin, LOW); delay(10); } void Stop_stepper1(){ digitalWrite(Step1pin,LOW); delayMicroseconds(800); digitalWrite(Step1pin,LOW); delayMicroseconds(800); } void setup() { Serial.begin(9600); pinMode(In1pin, OUTPUT); pinMode(In2pin, OUTPUT); pinMode(Speed_Motor, OUTPUT); pinMode(asingle, INPUT); pinMode(Enablepin,OUTPUT); // Enable场效应管的输出 pinMode(Step1pin,OUTPUT); // 转动 pinMode(Dir1pin,OUTPUT); // 方向 digitalWrite(Enablepin,LOW); // 低电平打开 delayMicroseconds(800); } void loop() { DC_motor1(); Stop_DC_motor1(); Step_stepper1_forward(1000); Step_stepper1_backward(1000); Stop_stepper1(); }