Arduino 项目笔记 | 基于 Arduino 单片机的 A4988 和 L298N电机驱动模块实验记录

目录


1. A4988 简介

A4988 内置了 译码器,我们可以可以通过控制器的 2 个引脚来控制步进电机,一个控制旋转方向,另一个控制步数。

A4988 提供了五种不同的微步控制:

  • 全步(full-step)
  • 半步(haft-step)
  • 四分一步(quarter-step)
  • 八分之一步(eight-step)
  • 十六分之一步(sixteenth-step)

Arduino 项目笔记 | 基于 Arduino 单片机的 A4988 和 L298N电机驱动模块实验记录

此外,它还配备了一个调节电流输出、过热保护和过流保护的 电位计。A4988 的逻辑电压范围是:3~5.5V,如果配备较好的散热条件每相最大电流可达 2A,在没有配备散热器的情况下,每相连续电流最好控制在 1A 范围内。

2. A4988 引脚定义图及功能说明

  • VMOTGND外部供电引脚,目的是能给电机提供足够的动力输出,供电范围:8-35V,此处使用一个47uf电解电容来保护驱动板免受瞬时电压的冲击。

  • VDDGND:连接到Arduino控制板5V电源GND引脚上。

  • 1A1B : 连接到步进电机的一相,2A2B引脚连接到步进电机的另一相。

  • STEPDIR : 连接至Arduino控制板P3P4引脚,这两个针脚主要用于控制电机的运动。Direction引脚控制转动方向,STEP针脚用于控制电机旋转的步数控制。

  • SLEEP低电平使能使模块处于休眠模式,当电机不工作时,它可以最大程度地降低功耗,默认为高电平

  • RESET : 如果这个针脚的输入是低电平,那么所有的微步设置都将被忽略掉。

注意: 将SLEEP和RESET针脚连接起来,目的是将RESET针脚设置为高电平,以便模块可控。

  • ENABLE:用于打开和关闭场效应管的输出,低电平打开高电平关闭
    Arduino 项目笔记 | 基于 Arduino 单片机的 A4988 和 L298N电机驱动模块实验记录

  • MS1 , MS2MS3 针脚用于微步设置。

    • 全步(full-step)
    • 半步(haft-step)
    • 四分一步(quarter-step)
    • 八分之一步(eight-step)
    • 十六分之一步(sixteenth-step)

    如下图所示:

步进电机全步模式走 1 步是 1.8 度,一圈360° 就是 200 步;若使用 1/16 步进,1 步是 0.1125 度,一圈360° 则需要走 3200 步。

Arduino 项目笔记 | 基于 Arduino 单片机的 A4988 和 L298N电机驱动模块实验记录

实际电路设计中,Arduino 引脚设置如下:

1、 电路中通过跳帽(连接器J1)将 MS1 , MS2MS3 针脚拉高,微步设置为 1/16步进( HIGHHIGHHIGH)。

2、将SLEEPRESET针脚连接起来,目的是将RESET针脚设置为高电平,以便模块可控

3、200Ω 电阻将A1引脚拉低

Arduino 项目笔记 | 基于 Arduino 单片机的 A4988 和 L298N电机驱动模块实验记录

四相步进电机

对于两相双极混合型步进电机它有四根引出线,通过用万用表测量会得出,其中红色线和蓝色线是阻值较小,它们是同一个绕组;同样绿色线和黑色线阻值较小,它们俩也是同一绕组。接线时,只要把同一绕组的步进电机的驱动器上相应输出端子上,比如上图中的A+和A-接在同一个绕组上,B+和B-接在另一个绕组上即可。接好后开机试车,如果转向与我们的要求不一样,只要把A+、A-和B+、B-对调就可以了。

Arduino 项目笔记 | 基于 Arduino 单片机的 A4988 和 L298N电机驱动模块实验记录

在示意图上用A-B-C-D来标注。因此这种步进电机就叫“四相”步进电机。

假设先B相绕组闭合导通,这样就会在所对应的定子绕组齿上产生磁极,此时转子的“0”号和“3”号离它们最近,这样就会产生最强的吸引力。

如果按照B相-C相-D相-A相的顺序给步进电机的绕组通电的话,这样步进电机的转子就会按照逆时针的方向不停地运转。

通过分析可以知道,只要给步进电机的电子绕组输入一序列的电脉冲信号,那么步进电机的转子就会不停地转动一个角度,这就是步进电机名称的由来。

1B-1A-2A-2B

红-蓝-绿-黑

黑-绿-红-蓝

问题1:步进电机老振动

原因1:线接错了,

原因2:高速振动,低速振动

Arduino 项目笔记 | 基于 Arduino 单片机的 A4988 和 L298N电机驱动模块实验记录

3. Arduino使用A4988控制电机代码

// 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) 用高低电平 驱动电机转动,注意中间间隔等待的微秒值,如果太快会导致电机有声响不转动。


1. L298N 简介

L298N 是专用驱动集成电路,属于H桥集成电路,与 L293D 的差别是起输出电流增大,功率增强。

其输出电流为 2A ,最高电流 4A,最高工作电压50V,可以驱动感性负载,如大功率直流电机,步进电机,电磁阀等等,特别是其输入端可以与单片机直接相连,从而很方便地受单片机控制。

当驱动直流电机时,可以直接控制步进电机,并可以实现电机的正转和反转,实现此功能只需要改变输入端的逻辑电平。为了避免电机对单片机的干扰,本模块加入光耦,进行光电隔离 (光耦合器以光为媒介传输电信号,它对输入、输出电信号有良好的隔离作用)、整流二极管电机保护、从而使系统能够稳定可靠的工作。

4 通道控制、钽(tǎn)电容稳压、光耦隔离、整流二极管电机保护、过流保护、合金散热片、数模电路线路分离、电机电流反馈和PWM调速,电机双闭环控制。

Arduino 项目笔记 | 基于 Arduino 单片机的 A4988 和 L298N电机驱动模块实验记录

2. L298N 外观尺寸和针脚定义

Arduino 项目笔记 | 基于 Arduino 单片机的 A4988 和 L298N电机驱动模块实验记录

  • 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 单片机的 A4988 和 L298N电机驱动模块实验记录

实际电路设计中,Arduino 引脚设置如下:

Arduino 项目笔记 | 基于 Arduino 单片机的 A4988 和 L298N电机驱动模块实验记录
Arduino 项目笔记 | 基于 Arduino 单片机的 A4988 和 L298N电机驱动模块实验记录

3. Arduino使用L298N 控制电机代码

// 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);                      
}

参考资料

Arduino 项目笔记 | 基于 Arduino 单片机的 A4988 和 L298N电机驱动模块实验记录
Arduino 项目笔记 | 基于 Arduino 单片机的 A4988 和 L298N电机驱动模块实验记录


附源码:

/***************************************
项目名称:直流/步进电机驱动程序
功能:
作者: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();              
}
上一篇:了解Arduino


下一篇:arduino学习笔记