这一章在干嘛?

步进电机是「脉冲电机」:给一个脉冲走一步,角度与脉冲数成正比、转速与脉冲频率成正比——天生适合开环定位。本章讲清结构、单/双极性驱动、整步/半步/细分、参数与驱动器,最后做旋转与定位两个实验。

15.1 步进电机与三大分类

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

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

15.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:步进电机核心结构图

  • 单极性整步(单相激励):A→B→C→D 轮流通电,每步 90°;
  • 双相激励:AB→BC→CD→DA,两相同时通电,力矩更大
  • 半步:A→AB→B→BC→C→CD→D→DA 八拍,每步 45°,更顺滑;
  • 双极性:用 H 桥改变电流方向(A+ 接正 → A+ 接负),同样实现整步/半步/八拍。

原书图 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:1250VDC 供电、峰值电流 5.0A、最大 256 细分、双极恒流 PWM 驱动、光耦隔离。接口三根线:ENA(脱机)、DIR(方向)、PUL(脉冲,≤200kHz)。细分拨码 SW1SW4: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 章的梯形加减速。