文章目录
- 1. 基本原理
- 1.1 控制电机转速
- 1.2 控制电机旋转方向
- 2. H桥驱动
- 2.1 `H桥驱动`名称的由来
- 2.2 H桥驱动控制电机旋转方向
- 2.3 H桥驱动
- 3. 电机驱动模块
- 3.1 两个控制引脚的电机驱动
- 3.2 三个控制引脚的电机驱动
- 3.3 电机驱动模块的组成
- 4. 使用单片机控制电机驱动
- 4.1 三个控制引脚的电机驱动
- 4.1.1 接线
- 4.1.2 控制方式
- 4.2 两个控制引脚的电机驱动
- 4.2.1 方式1 - 两路PWM
- 4.2.2 :star2: 方式2 - 一路PWM,一路 GPIO
- 5. 实战 - 使用 Arduino 控制电机
- 6. 实战 - 使用 STM32F103 控制电机
- 6.1 接线
- 6.2 PWM设置
- 6.3 原理分析
- 6.4 代码
1. 基本原理
1.1 控制电机转速
在电机两端施加电压,电机就会旋转,而且电压越大,转速越快
1.2 控制电机旋转方向
通正向电压电机正转,反向电压电机反转
2. H桥驱动
2.1 H桥驱动
名称的由来
在上图中,四个开关和电机构成了一个驱动电路,因为形状像字母“H”,所以称作 H桥驱动
。
2.2 H桥驱动控制电机旋转方向
在本篇博客中,当电机两端的电压方向为从右到左时,电机的旋转方向为正向.
2.2.1 如上图,闭合开关 S2 和 S3,电机两端的电压方向为从左到右,电机反转
2.2.1 如上图,闭合开关 S1 和 S4,电机两端的电压方向为从右到左,电机正转
2.3 H桥驱动
在实际的应用中,并不会使用开关去驱动电机,而是一种类似开关的元器件–MOS管
。
MOS管的导通条件比较繁琐,我们可以简单的认为:
- 接入高电平,MOS管导通
- 接入低电平,MOS管断开
所以,实际应用中的 H桥驱动
是下面的样子
3. 电机驱动模块
3.1 两个控制引脚的电机驱动
-
当 IN1 = 0,IN2 = 1
- M2 和 M5 导通,电机两端的电压方向为从左到右,电机反转
-
当 IN1 = 1,IN2 = 0
- M3 和 M4 导通,电机两端的电压方向为从左到右,电机正转
-
当 IN1 = 0,IN2 = 0
- M2、M3、M4、M5 全部断开,电机不转
-
当 IN1 = 1,IN2 = 1
- M2、M3、M4、M5 全部导通,电机不转(电机驱动模块中s包含保护电路,所以在这种情况下并不会发生短路)
3.2 三个控制引脚的电机驱动
三个控制引脚的电机驱动是在 IN1、IN2 控制脚的基础上,增加了一个控制 IN1 和 IN2 通断的管脚 ENA(如下图)。
- 当 ENA = 1
- 控制方式与 3.1 的控制方式相同
- 当 ENA = 0
- 电机停止转动
3.3 电机驱动模块的组成
电机驱动模块除了内部的 H桥驱动
,还由 保护电路、上下拉电阻、MOS管驱动芯片(单片机不能直接控制MOS管) 等组成。
4. 使用单片机控制电机驱动
4.1 三个控制引脚的电机驱动
4.1.1 接线
- ENA <-> PWM引脚
- IN1 <-> 普通IO口
- IN2 <-> 普通IO口
4.1.2 控制方式
控制转速
调节 ENA 引脚 PWM 的占空比
- 当 PWM = 0,电机停止转动
- 当 PWM = 100%,电机转速达到最大
控制转向
请参考 3.1
4.2 两个控制引脚的电机驱动
Tip:三个控制引脚的电机驱动也可以使用下面的控制方式,但是需要将其中的 ENA脚 接 VCC。
4.2.1 方式1 - 两路PWM
4.2.1.1 接线
- IN1 <-> PWM1
- IN2 <-> PWM2
要保证 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 占空比
- 电机停止转动
- 建议此时的占空比为 0 或 100%
4.2.2 ???? 方式2 - 一路PWM,一路 GPIO
4.2.2.1 接线
- IN1 <-> PWM (通常为 10k HZ)
- IN2 <-> DIR (普通GPIO引脚)
4.2.2.2 控制方式
- DIR = 0(见上图)
- 电机正转
- 转速与 PWM 的正向占空比有关
- PWM = 100% 时,电机正向转速最大
- PWM = 0 时,电机停止转动
- DIR = 1 (见上图)
- 电机反转
- 转速与 PWM 的反向占空比有关
- PWM = 0 时,电机反向转速最大
- PWM = 100% 时,电机停止转动
5. 实战 - 使用 Arduino 控制电机
使用的电机驱动是 L298N
它的原理图如下
L298N是一个双路驱动,它可以同时驱动两个电机
- ENA,IN1,IN2 控制左边的电机
- ENB,IN2,IN3 控制右边的电机
使用的控制方式是 4.1 的控制方式。
接线如下:
- ENA <-> D11 (注意:一定要接PWM引脚)
- IN1 <-> D10
- IN2 <-> D9
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78/* * @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); } }
6. 实战 - 使用 STM32F103 控制电机
4.2.2 中控制电机驱动的方式最常用,但它的逻辑有些难理解,我们将以这种控制方式为例。
6.1 接线
使用的驱动是 5. 中的 L298N
- ENA <-> VCC (改装为2线驱动)
- IN1 <-> DIR (任意一个GPIO口)
- IN2 <-> PWM (任意一个PWM输出口)
6.2 PWM设置
首先对 STM32 的PWM模式进行设置:
- 定时器为
向上计数
- 定时器频率设置为 10k HZ
- PWM模式为
模式1
- PWM有效电平为
高电平
名词规定:
maxPulse
:定时器的最大计数值cnt
:当前计数器值duty
:占空比 ,duty
=pulse
/maxPulse
pulse
:比较寄存器的值
此时在一个PWM周期内,
- 当
cnt
<pulse
, PWM 引脚输出高电平 - 当
cnt
>=pulse
, PWM 引脚输出低电平
6.3 原理分析
参考 4.2.2 的控制方式,结合上图:
- 当 DIR = 0 时,电机正转,电机的转速取决于正向占空比 ,此时
duty
=pulse
/maxPulse
- 当 DIR = 1 时,电机反转,电机的转速取决于反向占空比,此时
duty
= (maxPulse
-pulse
) /maxPulse
所以可以写出下列 伪代码
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35// 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); } }
6.4 代码
明白了原理后,不难写出上面的代码,所以这里先不给出代码了。
版权声明:本文为CSDN博主 云朵先生_ 的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34802028/article/details/122431195
致正在学习嵌入式的小伙伴们:
嵌入式的学习是要基础知识 + 动手实践同步进行的,在这里给大家推荐一个可以系统学习嵌入式和刷题的网站:牛客网(传送门:牛客网)。
牛客网原本是一个刷 IT 题库的网站,经过多年的发展,已经成为了一个集 课程+刷题+面经+求职+讨论区分享 的一站式求职学习网站,最最最重要的里面的资源全部免费, 而最近他们正打算将这套模式推广到嵌入式行业,专门为嵌入式工程师开设了相应的板块,正在学习嵌入式、寻找嵌入式专项题库、想要找嵌入式相关工作但又缺乏经验的小伙伴们,千万不要错过(链接在下面哦)!
- 牛客网 - 嵌入式专项题库
- 牛客网 - 嵌入式学习专区
最后
以上就是潇洒奇迹最近收集整理的关于【嵌入式 · 单片机】一文带你搞懂电机驱动模块的全部内容,更多相关【嵌入式内容请搜索靠谱客的其他文章。
发表评论 取消回复