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引脚说明(从电机引出线看):
颜色 引脚 功能
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或其他设备的数据交互。


相关推荐
清风6666664 小时前
基于单片机的智能收银机模拟系统设计
数据库·单片机·毕业设计·nosql·课程设计
第二层皮-合肥5 小时前
RTC时钟原理
单片机·嵌入式硬件
小莞尔8 小时前
【51单片机】【protues仿真】基于51单片机送带计数器系统
c语言·单片机·嵌入式硬件·物联网·51单片机
云知谷9 小时前
【嵌入式基本功】单片机嵌入式学习路线
linux·c语言·c++·单片机·嵌入式硬件
小叮当⇔10 小时前
IOT项目——STM32
stm32·嵌入式硬件·物联网
光子物联单片机10 小时前
STM32G474单片机开发入门(十五)CAN通信功能详解及实战
stm32·单片机·嵌入式硬件·mcu
A9better11 小时前
嵌入式开发学习日志40——stm32之I2C协议层
stm32·单片机·嵌入式硬件·学习
来生硬件工程师11 小时前
【STM32笔记】:P03 ISP 一键下载电路详解
c语言·笔记·stm32·嵌入式硬件·硬件工程·接口隔离原则·硬件设计
可爱的鸡仔14 小时前
STM32--------ADC转换
stm32·单片机·嵌入式