一、L298N电机驱动模块有什么用?
我们在做单片机智能循迹小车的时候,经常看到上面有一个L298N电机驱动模块一端连接着小车的电机,另一端连接着单片机的IO口。
那为什么没有直接用单片机的IO口控制电机呢?
其中一个原因就是单片机输出的功率较小,不足以驱动电机工作。这时候就需要外接一个驱动模块,这个驱动模块工作电压高、输出电流大、驱动能力强、发热量低、输出功率高等优点,单片机的IO口只需要控制这个驱动模块的工作,即可实现小功率控制大功率的效果。这种方法与继电器小电流控制大电流很相似。
因此,每当遇到外接设备的工作功率较大,单片机IO口无法直接驱动时,往往都会在中间接一个驱动模块,驱动模块负责输出较大功率来驱动外接设备,单片机IO口负责控制驱动模块。电动小车就是很典型的一个例子:
一个电动小车整体的运行,首先依赖于它的电机驱动模块。电机驱动模块主要功能是驱动小车的电机转动,从而使小车轮子转动,让小车行进。
常用的电机驱动芯片有L297/298 、MC33886 、3L4428等。今天我们主要对L298进行介绍。我们的学习目的就是通过电机驱动模块,驱动电机并且控制电机的转速和正转反转,最终同时驱动两个电机,完成控制小车的轮子转动。
二、L298N电机驱动模块
L298N可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。
引脚定义
-
VCC:驱动电源正(在图示模块中可使用5V或12V)
-
GND:驱动电源地
-
Out1 Out2 Out3 Out4:功率输出(out1和out2是输出A,out3和out4是输出B)
-
IN1 IN2 IN3 IN4:逻辑输入控制( IN1和IN2是控制输出A的,IN3和IN4是控制输出B的)
-
ENA:IN1 & IN2 使能(TTL高电平使能),进而控制输出A工作。
-
ENB:IN3 & IN4 使能(TTL高电平使能),进而控制输出B工作。
其中 ENA 和 ENB 在市面上有部分模组中可能未透出给开发者,此时它们默认连接至芯片内部的VDD,即默认使能。
下面的表格是逻辑输入端IN1、IN2、IN3、IN4以及使能端ENA、ENB与电机转动的关系。
ENA和ENB | IN1(或IN3) | IN2(或IN4) | 电机状态 |
PWM输出或0 | X | X | 停止 |
PWM输出或1 | 0 | 0 | 制动 |
PWM输出或1 | 0 | 1 | 正转 |
PWM输出或1 | 1 | 0 | 反转 |
PWM输出或1 | 1 | 1 | 制动 |
三、接线:
如果只驱动一个电机,接线方面如下:
-
输出A的OUT1与OUT2 ——> 电机的两端
-
12V供电 ——> 7-12V电源
-
供电GND ——> GND (与单片机共地)
-
ENA ——> 单片机IO口 (可自己定义,需要具备PWM功能的IO口)
-
IN1、IN2 ——> 单片机IO口 (可自己定义)
如果要驱动两个电机,同理即可。下图是循迹小车两个电机的接线示意图,单片机io口可自己选择。
四、关键部分代码
我们可以根据前面提到的表格设置电机驱动模块上四个逻辑输入引脚来确定电机状态。
ENA和ENB | IN1(或IN3) | IN2(或IN4) | 电机状态 |
PWM输出或0 | X | X | 停止 |
PWM输出或1 | 0 | 0 | 制动 |
PWM输出或1 | 0 | 1 | 正转 |
PWM输出或1 | 1 | 0 | 反转 |
PWM输出或1 | 1 | 1 | 制动 |
下面就以51单片机为例,结合L298N电机驱动模块的接线图,编写单片机控制电机驱动模块的代码,本代码案例暂不考虑使用PWM算法,只是简单的控制ENA和ENB使能端,PWM算法另起一篇文章介绍。
#include <reg51.h>
sbit IN1=P1^1 ; //定义逻辑输入的io口,根据电机驱动模块的接线选择对应的单片机端口
sbit IN2=P1^2 ;
sbit IN3=P1^3 ;
sbit IN4=P1^4 ;
sbit ENA=P3^6 ; //定义使能端的io口,根据电机驱动模块的接线选择对应的单片机端口
sbit ENB=P3^7 ;
//前进 ,左轮和右轮都正转。
void go(){
ENA=1; //使能输出A
IN1=0 ; // 右轮 正转
IN2=1 ;
ENB=1; // 使能输出B
IN3=0; //左轮 正转
IN4=1;
}
//后退 ,左轮和右轮都反转。
void back(){
ENA=1; //使能输出A
IN1=1 ; // 右轮 反转
IN2=0 ;
ENB=1; // 使能输出B
IN3=1; //左轮 反转
IN4=0;
}
//向左转弯 ,左轮不动,右轮都正转前进。
void turnLeft(){
ENA=1; //使能输出A
IN1=0 ; // 右轮 正转
IN2=1 ;
ENB=1; // 使能输出B
IN3=0; //左轮 不动
IN4=0;
}
//向右转弯 ,右轮不动,左轮都正转前进。
void turnRigth(){
ENA=1; //使能输出A
IN1=0 ; // 右轮 不动
IN2=0 ;
ENB=1; // 使能输出B
IN3=0; //左轮 正转
IN4=1;
}
//制动 ,左轮右轮都不转。
void stop(){
ENA=0; //关闭输出A
IN1=0 ; // 右轮 不动
IN2=0 ;
ENB=0; // 关闭输出B
IN3=0; //左轮 不动
IN4=0;
}
void main(){
while(1){
go();//调用前进函数,让小车一直前进
}
}