详细介绍:51单片机基础-步进电机控制

第十二章 步进电机控制

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引脚说明(从电机引出线看):
颜色引脚功能
VCC5V电源正极(必须接)
IN1A相
IN2B相
IN3C相
IN4D相

注意:红为公共端,接5V;其余四线接ULN2003输出。

连接方式:
单片机ULN2003输入步进电机
P1.0IN1橙线(A)
P1.1IN2黄线(B)
P1.2IN3粉线(C)
P1.3IN4蓝线(D)
VCCULN2003 VDD接5V
GNDULN2003 GND共地

ULN2003输出端接电机,输入端接P1口。


3. 软件设计

3.1 工作原理

28BYJ-48采用四相八拍工作方式,即每相依次通电,形成旋转磁场,驱动转子一步步转动。

四相八拍激励序列:
步数A (P1.0)B (P1.1)C (P1.2)D (P1.3)十六进制
110000x01
211000x03
301000x02
401100x06
500100x04
600110x0C
700010x08
810010x09

每步旋转 5.625° / 64 = 0.08789°(减速后),但每步进一拍,电机前进 5.625° / 8 = 0.703125°(电气角度),最终输出轴一圈需 4096拍


3.2 定义控制序列

#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 单步控制函数

// 单步执行
void step_motor(unsigned char step) {
P1 = step_sequence[step % 8];  // 输出对应相序
delay_ms(10);  // 步进延时,影响速度(可调)
}

3.4 正转与反转控制

// 正转:顺序执行序列
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°

// 转动指定角度(近似)
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 主程序示例

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或其他设备的数据交互。


posted @ 2026-01-30 22:49  gccbuaa  阅读(5)  评论(0)    收藏  举报