转载:L298N电机驱动模块详解
直流电机内部有磁铁、转子和碳刷等组件组成,将电机的+、-极和电池相连,即可正转或逆转。
电机在运转时,碳刷和整流子之间会产生火花,进而引发干扰,影响到微处理器或无线遥控器的运行。为了消除噪声,通常在碳刷电机的+、-极之间焊接一个0.01~0.1uF的电容。
步进电机 是一种易于控制旋转角度和转动圈数的电机,常见于需要精确定位的自动控制系统,比如:打印机、光驱等,仅仅接上电源,步进电机是不会转动的,步进电机有四条控制线和两条电源线,微处理器从控制线输入脉冲(即:高、低电位变化),步进电机的转子就会配合脉冲数转动到对应的角度。
脉冲产生器发出的信号,轮流驱使电机转动一个角度,转动一圈所需要的次数以及每次转动的角度,分别称为“步数”和“步进角”。
缺点: 体积、重量以及消耗电力都比较大,因此许多需要控制旋转角度的装置,都改用 舵机
直流电机 又称为“碳刷电机”,因为它通过碳刷将电力传输给转子。碳刷需要清理也会损耗,因此许多电器逐步改用无刷电机,无刷电机的结构以及驱动方式,都和一般碳刷电机不同
直流电机的技术文件
从电机的技术文件所列举的转速和扭力参数,可得知该电机是否符合转速和负重的需求;工作电压和消耗电流参数,则关系到电源和控制器的配置。
表:RF-300电机
最大效率 | 堵转(STALL) | |||||||
---|---|---|---|---|---|---|---|---|
工作电压 | 转速 | 电流 | 扭力 | 输出 | 扭力 | 电流 | ||
1.6~6.5V | 1710转/分钟 | 0.0525A | 0.27mN·m | 2.8g·cm | 0.049W | 1.22mN·m | 12g·cm | 0.18A |
最大效率 | 堵转(STALL) | |||||||
---|---|---|---|---|---|---|---|---|
工作电压 | 转速 | 电流 | 扭力 | 输出 | 扭力 | 电流 | ||
1.5~3V | 6990转/分钟 | 0.66A | 0.59mN·m | 6.0g·cm | 0.43W | 2.55mN·m | 26g·cm | 2.20A |
晶体管是最基本的驱动接口,微处理器只需要送出微小的信号,即可通过它控制外部装置。它很像水管中的阀门,平时处于关闭状态,但只要稍微施力,就能启动阀门,让大量水流通过。
晶体管有三只引脚,分别叫做B(基极)、C(集电极)和E(发射极),集电极(Collector) 代表收集电流,发射极(Emitter) 代表射出电流,基极(Base) 相当于控制台。
L298内部包含两组H桥式电路,可以驱动并控制电机的正反转,
L298N内部原理图
L298N 有两组电源输入脚,一个用于IC本身(芯片电源,5V),另一个用于电机;有两个使能引脚,用于决定是否供电给电机。L298N 有检测电机是否处于“堵转”状态,原理是:“当电机的负荷增加时,消耗的电流量也跟着增加,因此,从电流的消耗量,可得知电机是否运行平顺。”如果要启用这项功能,必须在“电流监测”脚位连接电阻;若不适用“电流监测”功能,请将电流监测的1和15脚位接地。
一组电机都有三个控制引脚,使能、输入A和输入B,这三个引脚和电机的运转关系:
L298N逻辑功能表
将IN1~4分别接到arduino上digital的口,初始化后使用digitalWrite就可以实现正反转了,将ENA/ENB(接到arduino上带 ~ 的端子(3 5 6 9 10 11,就是能输出PWM波的端子)初始化后使用analogWrite输出PWM波就可以调速了:
使能A | 输入1A | 输入1B | 电机状态 |
---|---|---|---|
高 | 高 | 低 | 正转 |
高 | 低 | 高 | 反转 |
高 | 输入1B | 输入1A | 快速停止(刹车) |
低 | × | × | 停止(自由滑行) |
×:代表任何状态
在需要精确定位的场合,可以将两个输入信号反转,造成“刹车”效果
有些L298N电机控制器,使用另一个IC(型号:74HC14)来简化电机正反转控制,每个输入端只有使能和正反转两个引脚
这种控制器的输入输出关系表
EA/EB(使能) | IA/IB(正反转) | 电机状态 |
---|---|---|
高 | 高 | 正转 |
高 | 低 | 反转 |
低 | × | × |
实验说明: 采用一个L298N控制器以及超声波传感器,制作一个遇到前方有障碍物时,能自动转向的自走车。
实验材料:
物品 | 数量 |
---|---|
超声波传感器 | 1 |
L298N电机控制模块 | 1 |
电机(请在小电机的电源焊接一个0.1uF(104)电容,避免电机的噪声干扰处理器 | 2 |
const byte TrigPin = 13;
const int EchoPin = 12;
const int dangerThresh =580;
cont byte speed = 100;
long distance ;
const byte ENA = 5;
const byte ENB = 6;
const byte IN1 = 10;
const byte IN2 = 9;
const byte IN3 = 8;
const byte IN4 = 7;
byte dir = 0;
void stop() {
analogWrite(ENA, 0);
analogWrite(ENB, 0);
}
void forward() {
analogWrite(ENA, speed);
digitalWrite(IN1, HIGH);
dititalWrite(IN2, LOW);
analogWrite(ENB, speed);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void backward() {
analogWrite(ENA, speed);
digitalWrite(IN2, HIGH);
dititalWrite(IN1, LOW);
analogWrite(ENB, speed);
digitalWrite(IN4, HIGH);
digitalWrite(IN3, LOW);
}
void turnLeft() {
analogWrite(ENA, speed);
digitalWrite(IN2, HIGH);
dititalWrite(IN1, LOW);
analogWrite(ENB, speed);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void turnRight() {
analogWrite(ENA, speed);
digitalWrite(IN1, HIGH);
dititalWrite(IN2, LOW);
analogWrite(ENB, speed);
digitalWrite(IN4, HIGH);
digitalWrite(IN3, LOW);
}
long ping() {
digitalWrite(TrigPin, HIGH);
delayMicroseconds(5);
digitalWrite(TrigPin, LOW);
return pulseIn(EchoPin, HIGH);
}
void loop() {
distance = ping();
if (distance > dangerThresh) {
if (dir != 0) {
dir = 0;
stop();
delay(500);
}
forward();
} else {
if (dir != 1) {
dir = 1;
stop();
delay(500);
}
turnRight();
}
delay(1000);
}
实验结果: 编译与下载程序之后,两个电机将开始正转,若超声波传感器感知到遮挡,两个电机首先暂停0.5秒,接着,A电机将持续正转,B电机则会反转;若前方无障碍物,两个电机首先暂停0.5秒,再一起正转。每次在切换电机状态之前先暂停0.5秒,可以避免电机频繁地正、反转而导致寿命降低。