H桥驱动
名称的由来在上图中,四个开关和电机构成了一个驱动电路,因为形状像字母“H”,所以称作 H桥驱动
。
在本篇博客中,当电机两端的电压方向为从右到左时,电机的旋转方向为正向.
2.2.1 如上图,闭合开关 S2 和 S3,电机两端的电压方向为从左到右,电机反转
2.2.1 如上图,闭合开关 S1 和 S4,电机两端的电压方向为从右到左,电机正转
在实际的应用中,并不会使用开关去驱动电机,而是一种类似开关的元器件–MOS管
。
MOS管的导通条件比较繁琐,我们可以简单的认为:
所以,实际应用中的 H桥驱动
是下面的样子
当 IN1 = 0,IN2 = 1
当 IN1 = 1,IN2 = 0
当 IN1 = 0,IN2 = 0
当 IN1 = 1,IN2 = 1
三个控制引脚的电机驱动是在 IN1、IN2 控制脚的基础上,增加了一个控制 IN1 和 IN2 通断的管脚 ENA(如下图)。
电机驱动模块除了内部的 H桥驱动
,还由 保护电路、上下拉电阻、MOS管驱动芯片(单片机不能直接控制MOS管) 等组成。
控制转速
调节 ENA 引脚 PWM 的占空比
控制转向
请参考 3.1
Tip:三个控制引脚的电机驱动也可以使用下面的控制方式,但是需要将其中的 ENA脚 接 VCC。
4.2.1.1 接线
要保证 PWM1 和 PWM2 的频率相同(通常为 10k HZ),频率与电机驱动模块和电机的规格有关,具体控制频率需要参考相关规格书。
4.2.1.2 控制方式 1
PWM1 占空比
> PWM2 占空比
(如上图)
PWM1 占空比
- PWM2 占空比
有关PWM1 占空比
< PWM2 占空比
PWM2 占空比
- PWM1占空比
有关PWM1 占空比
= PWM2 占空比
4.2.1.3 控制方式 2
PWM1 占空比
= 0,PWM2 占空比
不为 0
PWM2 占空比
有关PWM2 占空比
= 0,,PWM1 占空比
不为 0
PWM1 占空比
有关PWM2 占空比
= PWM1 占空比
4.2.2.1 接线
4.2.2.2 控制方式
使用的电机驱动是 L298N
它的原理图如下
L298N是一个双路驱动,它可以同时驱动两个电机
- ENA,IN1,IN2 控制左边的电机
- ENB,IN2,IN3 控制右边的电机
使用的控制方式是 4.1 的控制方式。
接线如下:
代码:
/*
* @Author: CloudSir
* @Github: https://github.com/cloudsir
* @Date: 2022-01-11 12:52:48
* @LastEditTime: 2022-01-11 12:58:13
* @LastEditors: CloudSir
* @Description: Arduino 控制电机
*/
#define ENA 11
#define IN1 10
#define IN2 9
// speed的范围 -255 ~ 255
void setMotorSpeed(int speed)
{
if(speed > 0)
{
// 如果速度大于0,则正转
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
}
else (speed < 0)
{
// 如果速度小于0,则反转
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
}
else
{
// 如果速度等于0,则停止转动
digitalWrite(IN1, HIGH);
digitalWrite(IN2, HIGH);
}
analogWrite(ENA, abs(speed));
}
void setup()
{
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
}
void loop()
{
int i = 0;
// 电机正向旋转,速度逐渐增加
for(i = 0; i <= 255; i++)
{
setMotorSpeed(i);
delay(100);
}
// 电机正向旋转,速度逐渐减小
for(i = 255; i >= 0; i--)
{
setMotorSpeed(i);
delay(100);
}
// 电机反向旋转,速度逐渐增加
for(i = 0; i <= 255; i++)
{
setMotorSpeed(-i);
delay(100);
}
// 电机反向旋转,速度逐渐减小
for(i = 255; i >= 0; i--)
{
setMotorSpeed(-i);
delay(100);
}
}
4.2.2 中控制电机驱动的方式最常用,但它的逻辑有些难理解,我们将以这种控制方式为例。
使用的驱动是 5. 中的 L298N
首先对 STM32 的PWM模式进行设置:
向上计数
模式1
高电平
名词规定:
maxPulse
:定时器的最大计数值cnt
:当前计数器值duty
:占空比 ,duty
=pulse
/maxPulse
pulse
:比较寄存器的值
此时在一个PWM周期内,
cnt
< pulse
, PWM 引脚输出高电平cnt
>= pulse
, PWM 引脚输出低电平参考 4.2.2 的控制方式,结合上图:
duty
= pulse
/ maxPulse
duty
= (maxPulse
- pulse
) / maxPulse
所以可以写出下列 伪代码
:
// speed最大值是maxPulse, 最小值是 -maxPulse
// speed为正数时正转,为负数时反转
void setSpeed(int speed)
{
// 限幅
if(speed > maxPulse)
speed = maxPulse;
else if(speed < -maxPulse)
speed = -maxPulse;
if (speed > 0)
{
// 正转
DIR = 0;
pulse = speed;
setPulse(pulse);
}
else if (speed< 0)
{
// 反转
DIR = 1;
pulse = maxPulse + speed; // 这时speed是负数
setPulse(pulse);
}
else
{
// 停止转动
DIR = 1;
pulse = maxPulse;
setPulse(pulse);
}
}
明白了原理后,不难写出上面的代码,所以这里先不给出代码了。
本文为 CloudSir 原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。