📖 第 15 章:步进电机(Stepper Motor)

⚙️ 正点原子《DMF407 电机控制专题教程》V1.0 · Chapter 15
🗨️ 本章金句:「数着脉冲转圈圈:一步 1.8°,不快,但分毫不差。」
这一章在干嘛? 步进电机是「脉冲电机」:给一个脉冲走一步,角度与脉冲数成正比、转速与脉冲频率成正比——天生适合开环定位。本章讲清结构、单/双极性驱动、整步/半步/细分、参数与驱动器,最后做旋转与定位两个实验。
15.1 步进电机与三大分类15.2 工作原理:整步、半步与细分15.3 指标参数与驱动器 ATK-2MD505015.4 旋转控制实现15.5 定位控制实现

15.1 步进电机与三大分类

步进电机把电脉冲直接变成角位移:脉冲数 → 角度,脉冲频率 → 转速。开环就能精确定位,数控机床、3D 打印机都用它。

原书图 15.1.1
原书图 15.1.1:各种各样的步进电机
类型特点短板
反应式(磁阻式)结构简单,步距角可小至 1.2°噪声震动大
永磁式动态性能好、力矩大步距角大(7.5° 或 15°)
混合式兼顾两者优点,应用最广——

按绕组极性又分单极性(有中心抽头、电流单向,驱动简单但力矩小)与双极性(电流可反向,需 H 桥,力矩大)。

原书图 15.2.1
原书图 15.2.1:单极性与双极性简易示意图

15.2 工作原理:整步、半步与细分

定子是 A/B 两相绕组,转子是永磁体。通电顺序决定转子停的角度:

原书图 15.3.1
原书图 15.3.1:步进电机核心结构图
原书图 15.3.1.1
原书图 15.3.1.1:单极性步进电机整步驱动
原书图 15.3.1.2
原书图 15.3.1.2:单极性整步驱动双相激励方式
原书图 15.3.1.3
原书图 15.3.1.3:单极性半步驱动方式
原书图 15.3.2.1
原书图 15.3.2.1:双极性步进电机驱动原理图
细分的精髓: 硬件上减小步距角(加线圈、加齿数)有物理极限,于是软件来凑——按比例改变两相电流(A 相渐减、B 相渐增),转子就能停在整步之间的任意中间角度,把一个整步拆成多个微步。4 细分就是把 1.8° 拆成 0.45°。
原书图 15.3.3.1
原书图 15.3.3.1:细分驱动原理示意图:两相电流比例变化,转子停在中间角度

15.3 指标参数与驱动器 ATK-2MD5050

参数含义
相数 / 拍数两相电机步距角 1.8°;四相四拍 AB-BC-CD-DA、四相八拍
步距角精度误差 ÷ 步距角 × 100%
定位转矩不通电时转子被「锁住」的力矩
失步 / 失调角负载过大或频率过快导致丢步;细分不能消除失调角

驱动器 ATK-2MD5050:12~50VDC 供电、峰值电流 5.0A、最大 256 细分、双极恒流 PWM 驱动、光耦隔离。接口三根线:ENA(脱机)、DIR(方向)、PUL(脉冲,≤200kHz)。细分拨码 SW1~SW4:8 细分 1600 脉冲/圈;电流拨码 SW5~SW8(SW8=ON 半流减半),实验统一设 8 细分、1.0A。42 电机引脚:1 脚 A+、3 脚 A−、4 脚 B−、6 脚 B+。

接了驱动器之后: STM32 只管发脉冲 + 方向 + 使能,恒流斩波那些脏活驱动器全包了。一个驱动器只能带一个步进电机。

15.4 旋转控制实现

4 路接口:脉冲 TIM8_CH1~4(PI5/PI6/PI7/PC9)、方向 DIR(PF14/PF12/PB2/PH2)、使能 EN(PF15/PF13/PF11/PH3),与驱动器共阳接法(x=1 有效)。定时器 stepper_init(1000-1, 168-1) → 1MHz 计数、1ms 周期(初始 1kHz 脉冲,太快会丢步堵转)。

两种发脉冲方式:PWM 模式直接 Start/Stop;输出比较翻转模式在中断里改比较值持续翻转(两次中断 = 一个完整脉冲)。脉冲计数停机逻辑:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM8) {
        g_run_flag = 1;
        g_stepper.pulse_count--;          /* 每个完整脉冲计数值-- */
        if (g_stepper.dir == CW)
            g_stepper.add_pulse_count++;  /* 绝对位置++ */
        else
            g_stepper.add_pulse_count--;  /* 绝对位置-- */
        if (g_stepper.pulse_count <= 0) { /* 脉冲发完即到位 */
            stepper_stop(STEPPER_MOTOR_1);
            g_run_flag = 0;
        }
    }
}

实验:KEY0 选接口 ID、KEY1 开启旋转、KEY2 关闭。接线顺序口诀:先控制线、再动力线、最后驱动器电源

15.5 定位控制实现

1.8° 电机 8 细分:每步 1.8° ÷ 8 = 0.225°,一圈 360 ÷ 0.225 = 1600 脉冲PULSE_REV=1600.0MAX_STEP_ANGLE=0.225)。角度转脉冲:

void stepper_set_angle(uint16_t angle, uint8_t dir, uint8_t motor_num)
{
    g_stepper.pulse_count = angle / MAX_STEP_ANGLE;  /* 角度 ÷ 0.225° */
    if (g_stepper.pulse_count == 0)
        stepper_stop(motor_num);                     /* 0° 则不动 */
    else
        stepper_star(motor_num, dir);                /* 启动旋转 */
}

实验:KEY0 正向 +90°、KEY1 反向 +90°、KEY2 启动。按两次 KEY0 再按 KEY2,电机顺时针转 180° 后稳稳停下,串口打印累计角度(累计脉冲数 × 0.225°)。

丢步预警: 本章是恒频率发脉冲——起跳就 1kHz。轻负载没事,重负载或高频时就会失步。怎么破?请看第 16 章的梯形加减速。
🧠 小测验
1. 1.8° 步距角电机在 8 细分下一圈需多少脉冲?
每步 1.8/8 = 0.225°,一圈 360/0.225 = 1600 个脉冲。
2. 整步与半步驱动的区别?双相激励有什么好处?
整步每步 90°(单相 A-B-C-D 或双相 AB-BC-CD-DA),半步 A-AB-B-BC-...-DA 八拍每步 45°、更顺滑;双相激励两相同时通电,力矩更大。
3. 细分为什么能减小步距角?
通过按比例改变两相定子电流,让转子停在整步之间的任意中间角度,把一个整步拆成多个微步,同时提升顺畅度与每步精度。
← 上一篇🏠 顶层目录下一篇 →