第十三章 直流电机控制
1. 导入
在前几章中,我们学习了LED、数码管、蜂鸣器、按键等人机交互设备的控制。本章将引入直流电机(DC Motor),作为执行机构的重要代表,广泛应用于风扇、小车、机器人等系统中。
直流电机通过输入直流电压产生旋转运动,但51单片机I/O口输出电流有限,无法直接驱动电机。因此,需要通过驱动电路(如H桥、三极管)实现控制。
本章目标:
- 理解直流电机的工作原理;
- 掌握使用L298N驱动电机;
- 实现电机启停、正反转控制;
- 通过PWM调节电机速度(软件模拟);
- 为后续智能小车、电机控制系统打下基础。
2. 硬件设计
2.1 直流电机特性
- 工作电压:3V ~ 12V(常见5V、6V、12V);
- 转速与电压成正比;
- 转向与电压极性有关;
- 启动电流较大(可达1A以上),需外部驱动。
2.2 驱动方案选择
常用驱动芯片:
芯片 | 特点 |
---|---|
L298N | 双H桥,可驱动两个电机,最大2A,支持PWM调速 |
L9110 | 单通道H桥,驱动能力强,逻辑清晰 |
ULN2003 | 达林顿阵列,适合小功率电机 |
三极管(如TIP122) | 简单电路,但仅支持单向控制 |
本章采用L298N模块,因其稳定、易用、支持正反转与PWM。
2.3 L298N引脚说明
引脚 | 功能说明 |
---|---|
VCC | 电机电源输入(5~35V) |
GND | 公共地 |
5V | 输出5V(当ENA、ENB接跳线时,可对外供电) |
IN1, IN2 | 通道A输入控制(接单片机I/O) |
IN3, IN4 | 通道B输入控制 |
ENA | 通道A使能(接PWM或高电平) |
ENB | 通道B使能 |
OUT1, OUT2 | 接电机A |
OUT3, OUT4 | 接电机B |
2.4 电路连接
单电机控制(使用通道A):
L298N引脚 | 连接说明 |
---|---|
IN1 | → P2.0(控制方向) |
IN2 | → P2.1(控制方向) |
ENA | → P2.2(使能,接PWM) |
OUT1, OUT2 | 接直流电机两端 |
VCC | 接12V电源(或6V) |
GND | 与单片机共地 |
5V | 不接(若外部供电)或接VCC(若需给单片机供电) |
注意:L298N的逻辑电压与电机电压可分离,确保GND共地。
3. 软件设计
3.1 控制逻辑(H桥原理)
IN1 | IN2 | ENA | 电机状态 |
---|---|---|---|
1 | 0 | 1 | 正转 |
0 | 1 | 1 | 反转 |
0 | 0 | 1 | 刹车(快速停止) |
1 | 1 | 1 | 刹车 |
X | X | 0 | 不转(使能关闭) |
"X"表示任意状态。
3.2 定义控制引脚
c
#include <reg52.h>
sbit IN1 = P2^0;
sbit IN2 = P2^1;
sbit ENA = P2^2;
void delay_ms(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 125; j++);
}
3.3 电机基本控制函数
c
// 电机停止
void motor_stop() {
IN1 = 0;
IN2 = 0;
ENA = 1; // 使能开启,但输入为0 → 刹车
}
// 电机正转
void motor_forward() {
IN1 = 1;
IN2 = 0;
ENA = 1;
}
// 电机反转
void motor_backward() {
IN1 = 0;
IN2 = 1;
ENA = 1;
}
// 电机关闭(使能关闭)
void motor_disable() {
ENA = 0;
}
3.4 主程序:正反转控制
c
void main() {
while(1) {
motor_forward(); // 正转3秒
delay_ms(3000);
motor_stop(); // 停止1秒
delay_ms(1000);
motor_backward(); // 反转3秒
delay_ms(3000);
motor_stop();
delay_ms(1000);
}
}
3.5 软件模拟PWM调速
由于51单片机无硬件PWM(部分增强型有),可使用软件模拟。
c
// 软件PWM控制速度(占空比0~100)
void pwm_motor(unsigned char duty) {
unsigned char i;
for (i = 0; i < 100; i++) {
if (i < duty) {
ENA = 1; // 高电平
} else {
ENA = 0; // 低电平
}
delay_ms(1); // 周期100ms,频率10Hz(可优化)
}
}
注意:此方法占用CPU,建议在主循环中调用,避免影响其他功能。
使用示例:
c
void main() {
IN1 = 1; IN2 = 0; // 设定正转方向
while(1) {
pwm_motor(30); // 30% 速度
delay_ms(2000);
pwm_motor(70); // 70% 速度
delay_ms(2000);
}
}
实际中可通过按键调节
duty
值。
3.6 结合按键控制电机
引入独立按键控制电机模式:
- K1:正转
- K2:反转
- K3:停止
3.7 编译与下载
- Keil中创建工程;
- 确保L298N连接正确,电机电源独立;
- 编译生成HEX;
- 下载至单片机;
- 按下按键或运行程序,观察电机是否按预期转动。
若电机不转:
- 检查VCC供电是否正常;
- 确认GND共地;
- 测量IN1/IN2电平是否变化;
- 检查ENA是否开启。
##4. 小结
本章通过控制直流电机,掌握了执行机构的基本驱动方法,主要内容包括:
- 硬件连接:学会使用L298N模块安全驱动电机;
- 控制逻辑:掌握H桥正反转、刹车、使能控制;
- 软件实现:编写启停、正反转函数;
- 速度调节:通过软件PWM模拟调速;
- 人机交互:结合按键实现手动控制。
4.1 常见问题与解决
问题 | 原因 | 解决方法 |
---|---|---|
电机不转 | 电源未接、ENA为低 | 检查电机供电与使能信号 |
只能单向转 | IN1/IN2逻辑错误 | 检查方向控制代码 |
发热严重 | 电流过大、散热不足 | 加散热片,避免堵转 |
PWM无效 | 占空比太低或周期过长 | 优化PWM频率(建议1~2kHz) |
4.2 下一步学习建议
- 使用定时器中断生成更精准PWM;
- 驱动两个电机实现智能小车;
- 引入编码器实现速度反馈;
- 学习红外避障 或循迹功能。
本章标志着你已掌握基本的电机控制能力,下一章将进入步进电机的学习,实现精确角度控制。