这一章在干嘛?
步进电机是「脉冲电机」:给一个脉冲走一步,角度与脉冲数成正比、转速与脉冲频率成正比——天生适合开环定位。本章讲清结构、单/双极性驱动、整步/半步/细分、参数与驱动器,最后做旋转与定位两个实验。
15.1 步进电机与三大分类
步进电机把电脉冲直接变成角位移:脉冲数 → 角度,脉冲频率 → 转速。开环就能精确定位,数控机床、3D 打印机都用它。
原书图 15.1.1:各种各样的步进电机
| 类型 | 特点 | 短板 |
|---|---|---|
| 反应式(磁阻式) | 结构简单,步距角可小至 1.2° | 噪声震动大 |
| 永磁式 | 动态性能好、力矩大 | 步距角大(7.5° 或 15°) |
| 混合式 | 兼顾两者优点,应用最广 | —— |
按绕组极性又分单极性(有中心抽头、电流单向,驱动简单但力矩小)与双极性(电流可反向,需 H 桥,力矩大)。
原书图 15.2.1:单极性与双极性简易示意图
15.2 工作原理:整步、半步与细分
定子是 A/B 两相绕组,转子是永磁体。通电顺序决定转子停的角度:
原书图 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.2:单极性整步驱动双相激励方式
原书图 15.3.1.3:单极性半步驱动方式
原书图 15.3.2.1:双极性步进电机驱动原理图
细分的精髓:
硬件上减小步距角(加线圈、加齿数)有物理极限,于是软件来凑—— 按比例改变两相电流 (A 相渐减、B 相渐增),转子就能停在整步之间的任意中间角度,把一个整步拆成多个微步。4 细分就是把 1.8° 拆成 0.45°。
原书图 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.0、MAX_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. 细分为什么能减小步距角?
通过按比例改变两相定子电流,让转子停在整步之间的任意中间角度,把一个整步拆成多个微步,同时提升顺畅度与每步精度。