第十二章 步进电机控制
1. 导入
在第十一章中,我们学习了直流电机的控制,其特点是连续旋转、速度可调,但无法精确定位。本章将介绍步进电机(Stepper Motor) ,它以"步"为单位旋转,每步对应固定角度,能够实现精确的位置与角度控制,广泛应用于打印机、CNC、机器人、摄像头云台等需要精确定位的场合。
本章以常见的四相五线步进电机(28BYJ-48) 为例,配合ULN2003驱动模块,通过51单片机实现正转、反转、调速和角度控制。
学习目标:
- 理解步进电机的工作原理与类型;
- 掌握28BYJ-48的接线与驱动方式;
- 编写单步、连续旋转控制程序;
- 实现精确角度转动(如90°、180°);
- 为后续智能控制、自动化系统打下基础。
2. 硬件设计
2.1 步进电机类型
类型 | 相数 | 特点 |
---|---|---|
单极性步进电机 | 4相 | 每相有中心抽头,易于驱动(如28BYJ-48) |
双极性步进电机 | 2相 | 无中心抽头,需H桥驱动,扭矩大 |
本章使用28BYJ-48 :5V供电,4相单极性,减速比64:1,步距角5.625°,即每圈需要 64 × 64 = 4096步(内部转子5.625°,减速后输出轴一圈为4096步)。
2.2 ULN2003驱动模块
28BYJ-48驱动电流较大,单片机I/O无法直接驱动,需使用ULN2003达林顿阵列芯片,其特点:
- 高耐压、大电流输出;
- 内部集成续流二极管;
- 输入端可直接接TTL电平(兼容51单片机)。
2.3 电路连接
28BYJ-48引脚说明(从电机引出线看):
颜色 | 引脚 | 功能 |
---|---|---|
红 | VCC | 5V电源正极(必须接) |
橙 | IN1 | A相 |
黄 | IN2 | B相 |
粉 | IN3 | C相 |
蓝 | IN4 | D相 |
注意:红为公共端,接5V;其余四线接ULN2003输出。
连接方式:
单片机 | ULN2003输入 | 步进电机 |
---|---|---|
P1.0 | IN1 | 橙线(A) |
P1.1 | IN2 | 黄线(B) |
P1.2 | IN3 | 粉线(C) |
P1.3 | IN4 | 蓝线(D) |
VCC | ULN2003 VDD | 接5V |
GND | ULN2003 GND | 共地 |
ULN2003输出端接电机,输入端接P1口。
3. 软件设计
3.1 工作原理
28BYJ-48采用四相八拍工作方式,即每相依次通电,形成旋转磁场,驱动转子一步步转动。
四相八拍激励序列:
步数 | A (P1.0) | B (P1.1) | C (P1.2) | D (P1.3) | 十六进制 |
---|---|---|---|---|---|
1 | 1 | 0 | 0 | 0 | 0x01 |
2 | 1 | 1 | 0 | 0 | 0x03 |
3 | 0 | 1 | 0 | 0 | 0x02 |
4 | 0 | 1 | 1 | 0 | 0x06 |
5 | 0 | 0 | 1 | 0 | 0x04 |
6 | 0 | 0 | 1 | 1 | 0x0C |
7 | 0 | 0 | 0 | 1 | 0x08 |
8 | 1 | 0 | 0 | 1 | 0x09 |
每步旋转 5.625° / 64 = 0.08789° (减速后),但每步进一拍,电机前进 5.625° / 8 = 0.703125° (电气角度),最终输出轴一圈需 4096拍。
3.2 定义控制序列
c
#include <reg52.h>
// 四相八拍序列(共8步)
unsigned char code step_sequence[8] = {
0x01, 0x03, 0x02, 0x06,
0x04, 0x0C, 0x08, 0x09
};
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 step_motor(unsigned char step) {
P1 = step_sequence[step % 8]; // 输出对应相序
delay_ms(10); // 步进延时,影响速度(可调)
}
3.4 正转与反转控制
c
// 正转:顺序执行序列
void motor_forward(unsigned int steps) {
unsigned int i;
for (i = 0; i < steps; i++) {
unsigned char j;
for (j = 0; j < 8; j++) {
P1 = step_sequence[j];
delay_ms(10); // 每拍延时
}
}
}
// 反转:逆序执行序列
void motor_backward(unsigned int steps) {
unsigned int i;
for (i = 0; i < steps; i++) {
unsigned char j;
for (j = 7; j != 0xFF; j--) {
P1 = step_sequence[j];
delay_ms(10);
}
}
}
j != 0xFF
防止无符号数下溢死循环。
3.5 精确角度控制
计算:每拍对应输出轴角度 = 360° / 4096 ≈ 0.08789°
c
// 转动指定角度(近似)
void rotate_angle(unsigned int angle, unsigned char direction) {
unsigned long total_steps = (unsigned long)(angle * 4096) / 360;
if (direction == 1) {
motor_forward(total_steps);
} else {
motor_backward(total_steps);
}
}
示例:
rotate_angle(90, 1);
→ 正转90°
3.6 主程序示例
c
void main() {
P1 = 0x00; // 初始关闭所有相
while(1) {
motor_forward(1); // 正转一圈(4096拍)
delay_ms(1000);
motor_backward(1); // 反转一圈
delay_ms(1000);
}
}
3.7 调速控制
通过改变delay_ms(10)
中的延时值实现调速:
使用示例:
motor_forward_speed(1, 5);
→ 快速;motor_forward_speed(1, 20);
→ 慢速。
3.8 编译与下载
- Keil中创建工程;
- 确保ULN2003与电机连接正确;
- 编译生成HEX;
- 下载至单片机;
- 观察电机是否平稳旋转,无丢步。
若电机抖动或不转:
- 检查电源电压是否为5V;
- 延时过短会导致扭矩不足,适当增加延时;
- 确认接线顺序是否正确(橙黄粉蓝)。
##4. 小结
本章通过控制步进电机,掌握了精确位置控制技术,主要内容包括:
- 硬件连接:学会使用ULN2003驱动28BYJ-48步进电机;
- 激励方式:掌握四相八拍工作模式;
- 软件实现:编写正反转、角度控制、调速函数;
- 精度控制:实现按角度转动,支持自定义步数;
- 应用拓展:为自动化设备、智能仪表开发奠定基础。
4.1 常见问题与解决
问题 | 原因 | 解决方法 |
---|---|---|
电机抖动不转 | 电源不足、延时太短 | 使用5V独立电源,增加延时 |
旋转方向错误 | 相序接错 | 检查橙黄粉蓝接线顺序 |
丢步 | 负载过大或速度过快 | 减慢速度,减轻负载 |
发热 | 持续通电 | 停止后可关闭输出(P1=0x00) |
4.2 下一步学习建议
- 使用定时器中断实现更平稳的步进控制;
- 引入按键 或红外遥控控制启停与方向;
- 实现多轴联动(如XY平台);
- 结合LCD显示当前角度或状态。
本章标志着你已掌握精确运动控制能力,下一章将进入串口通信(UART) 的学习,实现单片机与PC或其他设备的数据交互。