常见双H桥电机驱动模块:
H桥电路通常包含四个独立控制的开关元件,通常用于驱动电流较大的负载,比如电机。如图:
这里有四个开关元件Q1,Q2,Q3,Q4,另外还有一个直流电机M。我们可以通过 对Q开关的控制,来驱动直流电机。而其中的正转和反转是人为规定的方向。
例如正转:
- 打开Q1和Q4
- 关闭Q2和Q3
此时假设电机正转,电流依次流过Q1,M,Q4。如下图:
应用:
实际应用时,市面上常用的电机驱动的型号,通常接上电源,电机,通过控制信号就可以驱动电机了。
由于网上找到的资料为L298N模块为以下,我们以此作为了解:
其属于H桥集成电路,其输出电流为2A,最高为4A。最高工作电压为50V.其输入端可以与带单片机直接相连,从而通过单片机对其进行控制。实现电机的驱动。
这是网上找到的模块介绍图:
- OutputA\B:用于连接两个电机
- 5V enable:如果使用的输入电源为大于12v的电源,要将跳帽线移除,反之,短接其可以提供5v的电源输出
- +5V power:如果输入电源小于12V且短接,可以输出5V的电源
- 连接电机电源,最大为35V.输入电源大于12V时,为了安全,要将5V enble针脚上的跳帽线移除。
- A/B enble:可以用于输入PWM脉宽调制信号对电机进行调速控制:
PWM频率:
指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);
也就是说一秒钟PWM有多少个周期
单位:HZ
PWM周期:
周期=1/频率
例如:59HZ就相当于20ms,也就是说,一秒有50次周期
占空比:
指一个脉冲周期中,高电平的时间与整个周期时间比例。
在单片机中,我们知道IO口输出的是数字信号,IO口只能输出高电平和低电平
假设高电平为5V,低电平为0V.那么通过改变IO口输出的方波的占空比,(即通过对断开和连接时间的控制)理论上可以输出0-5V之间的任意大的电压值。
比方说,占空比为50%,即高电平时间的一半,低电平时间的一半。在此频率下,就可以得到2.5v的输出电压。
- 控制: 控制电机全速运动:
电机对应的两个逻辑输入口,全速则不用拔掉跳线帽。此时使能端为5V的电机满占空比驱动,全速运行。
上图为本次小车使用的电机驱动:
对于逻辑输入口:
- ENA接5V,使能电机A
- ENA接地,电机A不转
- IN1接5V ,IN2接地 电机A正转
- IN1接地 IN2接5V 电机反转
- (对于电机B,则是对于相应的IN3 ,IN4)
下面通过网上找到的一段关于电机驱动代码进行分析学习:
Arduino智能小车——测试篇_不懂音乐的欣赏者的博客-CSDN博客_arduino小车代码
//定义五中运动状态
#define STOP 0
#define FORWARD 1
#define BACKWARD 2
#define TURNLEFT 3
#define TURNRIGHT 4
//定义需要用到的引脚
int leftMotor1 = 4;
int leftMotor2 = 5;
int rightMotor1 = 6;
int rightMotor2 = 7;
void setup() {
// put your setup code here, to run once:
//设置控制电机的引脚为输出状态
pinMode(leftMotor1, OUTPUT);
pinMode(leftMotor2, OUTPUT);
pinMode(rightMotor1, OUTPUT);
pinMode(rightMotor2, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
int cmd;
for(cmd=0;cmd<5;cmd++)//依次执行向前、向后、向左、想有、停止四个运动状态
{
motorRun(cmd);
delay(2000);//每个命令执行2s
}
}
//运动控制函数
void motorRun(int cmd)
{
switch(cmd){
case FORWARD:
digitalWrite(leftMotor1, LOW);
digitalWrite(leftMotor2, HIGH);
digitalWrite(rightMotor1, LOW);
digitalWrite(rightMotor2, HIGH);
break;
case BACKWARD:
digitalWrite(leftMotor1, HIGH);
digitalWrite(leftMotor2, LOW);
digitalWrite(rightMotor1, HIGH);
digitalWrite(rightMotor2, LOW);
break;
case TURNLEFT:
digitalWrite(leftMotor1, HIGH);
digitalWrite(leftMotor2, LOW);
digitalWrite(rightMotor1, LOW);
digitalWrite(rightMotor2, HIGH);
break;
case TURNRIGHT:
digitalWrite(leftMotor1, LOW);
digitalWrite(leftMotor2, HIGH);
digitalWrite(rightMotor1, HIGH);
digitalWrite(rightMotor2, LOW);
break;
default:
digitalWrite(leftMotor1, LOW);
digitalWrite(leftMotor2, LOW);
digitalWrite(rightMotor1, LOW);
digitalWrite(rightMotor2, LOW);
}
}
分析:
- 代码开头通过宏定义,对状态有数字代替,让代码更简便。
- 此代码不管电机的转速,所以ENA,ENB两组引脚默认输出高电平。只需要控制IN1,IN2,IN3,IN4两组引脚
- 当电机的两个输入端的电压差满足一定条件时电机才会转动。控制小车运动时,只需将同一边两个引脚设置成不同的电压即可。
- 为了提高函数的使用性,其代码将控制小车运动状态的语句封装在函数里,方便调用。