L298N是一个常见的电机驱动模块,也是我学习嵌入式的过程中使用的第一种此类型模块。本文将以当时作为初学者的我的视角讲解该模块。

模块的引脚

电源端口

首先看到模块右下角三个蓝色的接线端子,分别是“+12V”、“GND”和“+5V”,这三个端子是整个模块的供电端。“+12V”为输入正极,“GND”接地,这两个很好理解,但这“+5V”是个什么玩意儿?大家仔细看我在“+5V”端口旁边写的标注,它既可以输入又可以输出,这是什么意思呢?其实它究竟是输入还是输出,取决于“+12V”输入口输入的电压,并且跟这三个端子旁我画绿框的跳线帽有关。

“+12V”端口输入电压低于12V

此时绿框跳线帽应接上,输入电压给模块的芯片供电,并且以电源电压输出给电机。这种情况下,“+5V”端口是输出端,输出+5V,可以给其他设备供电(如需供电,请共用GND)

“+12V”端口输入电压高于12V

大电压可能会损坏内置的7805稳压芯片,所以此时应拔掉绿框跳线帽,12V以上电压用于驱动电机,“+5V”端口应输入5V给模块芯片供电,同时应共GND。

OUT输出口

OUT1和OUT2(组1)、OUT3和OUT4(组2)是两对输出引脚,它们直接连接电机的驱动引脚,它们输出0或1。我们知道,只有回路中有电流电机才能转,所以OUT1和OUT2中输出的信号必须不同电机才能转,如果我们把两个引脚信号都翻转一下,电机就会反转;同时,如果两个引脚都输出0或1,那么电机就不会转。

IN输出口

输入口IN1和IN2(组1)、IN3和IN4(组2)为两对输入引脚,可用单片机控制,拿组1来说,IN口的输入信号对应OUT口的输出信号,信号相反电机转、信号翻转电机反转、信号相同电机不转。但是L298N仅仅凭IN口输入信号是无法控制电机旋转的,还需要使能。

EN使能口

在IN输入口两侧有两个使能端口,使能的意思就是给它能量,其反义词为失能。EN端口在这里控制OUT是否输出信号,ENA和ENB分别控制两侧。若IN1给1、IN2给0,但ENA不给信号,那么OUT1、2就不会有输出,ENB同理。我用蓝色箭头引出ENB的跳线端,这里可以看到左侧是一个+5V的输出,我们拿到一个新的L298N时跳线帽默认是接上的,也就是说上电之后5V电压就会给到使能口,只要你接上电源再控制输入口就可以让电机旋转了。
但如果我希望使用PWM对电机调速,那么只能控制输入端的信号,我手头现成给LED调光的代码就没法直接用了。此时我们就可以拆掉使能口的跳线帽,让单片机给它信号使能,这样代码中实际翻转的就只有ENA、ENB这两个变量,控制电机正转反转的代码就可以写在别的地方了。

示例代码

我们以51单片机为例写一下控制代码,用于控制一个三轮小车运动。(两个传动轮,一个万向轮)
要有PWM输出,首先我们需要开启一个定时器,我们这里开启定时器0,周期设为100毫秒:

1
2
3
4
5
6
7
8
void Timer0_Init(void)
{
//初始化代码
//......
ET0=1;
EA=1;
PT0=0;
}

然后我们写一下终端函数代码,由于我们选择使能口控制电机是否旋转,所以这里的PWM只需要翻转ENA和ENB控制口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Timer0_Routine() interrupt 1
{
TL0 = 0xA4; //设置定时初值
TH0 = 0xFF; //设置定时初值

Counter++;

if (Counter<PWMA) {ENL = 1;} //左轮使能端口打开
else {ENA = 0;} //左轮使能端口关闭

if (Counter<PWMB) {ENR = 1;} //右轮使能端口打开
else {ENB = 0;} //右轮使能端口关闭

Counter%=100; //计数值变化范围限制在0~99
}

到这里我们PWM部分就结束了,剩下的就是给控制IN口的引脚0或1的信号,这样小车就可以按照预定速度(与定时器中的PWM预定值有关)行驶了。添加相关控制代码就可以控制小车转向了!

(本文完)