📖 第 20 章:步进电机闭环系统(位置环)(Stepper Closed-Loop Position Control)

6次阅读
没有评论
这一章在干嘛?

步进电机开环控制便宜简单,但突加负载、快速启停会
丢步/堵转
且控制器毫不知情。给它装上编码器 + PID 位置环,丢一步纠一步,精度和可靠性双升级。

20.1 为什么步进电机也要闭环

20.2 位置闭环原理与关键参数

20.3 控制实现与验证

20.1 为什么步进电机也要闭环

开环的隐含假设是「脉冲数 = 转角,永远成立」。现实中机械老化、突加较大负载、快速启停都会打破它——定子磁场跑太快,转子跟不上,就是失步;负载太大拖不动,就是堵转。控制器发出去的脉冲管不了实际转角,高精度场合不能忍。

📖 第 20 章:步进电机闭环系统(位置环)(Stepper Closed-Loop Position Control)
原书图 20.2.1:步进电机闭环系统控制原理:编码器反馈实际位置,PID 纠偏

方案 优点 缺点
开环 价格低、控制简单 无反馈不能纠偏、可靠性低
闭环(电机+编码器+PID) 精度高、消除位置误差、噪音明显降低 价格贵、控制复杂

20.2 位置闭环原理与关键参数

结构就是第 12 章的位置环换了个执行器:编码器反馈实际位置 → 与目标求偏差 → PID → 输出「期望脉冲速度」作用于步进电机。关键换算参数:

宏 值 含义
PULSE_REV 1600 步进电机每圈脉冲数(8 细分)
ENCODER_SPR 2400 编码器每圈计数:600 线 × 4 倍频
MPR 5 丝杠导程 5mm/r
PPM 480 2400/5 = 每毫米编码器脉冲数
FEEDBACK_CONST 1600/2400 编码器脉冲 → 步进脉冲的换算比值

PID 参数 L_KP=0.5、L_KI=0.05、L_KD=0,采样周期 20ms(TIM6);积分限幅 ±20、输出限幅 ±150。PID 输出的是「编码器脉冲期望值」,经 FEEDBACK_CONST 换算成步进脉冲数,再算每个脉冲的时间:

$$Step_Delay = frac{20,text{ms}}{text{期望值} times FEEDBACK_CONST} ,qquad text{比较值 } c = Step_Delay times 500 (text{翻转模式半周期})$$

20.3 控制实现与验证

/* TIM6 更新中断(20ms 一次) */
if (g_run_flag) {
    g_step_motor.location = gtim_get_encode();       /* 读编码器实际位置 */
    g_motor_pwm = increment_pid_ctrl(&g_location_pid,
                     g_step_motor.location);
    (g_motor_pwm > 0) ? (g_step_motor.dir = CW) : (g_step_motor.dir = CCW);
    g_motor_pwm = abs(g_motor_pwm);                  /* 方向由符号决定 */
    stepper_motion_ctrl(g_step_motor.dir, g_motor_pwm);  /* 作用于电机 */
}
速度换算:

RPM = 编码器脉冲差 × (1000/20) × 60 / 2400。波形呈斜线是因为对步进电机做了限速——PID 输出期望值受限,每次位置增量一致,所以速度曲线是匀速斜坡。

实验:接口三驱动步进电机(TIM8_CH3=PI7),编码器接 TIM3(PC6/PC7),驱动器 8 细分、12~50V 供电。KEY0 启动/停止,KEY1 目标 +20×PPM(上限 60×PPM),KEY2 −20×PPM,初始目标 50×PPM(约 50mm)。可用 PID 调试助手在线整定并看波形:按 KEY0 后电机平稳转到目标位置,曲线近似斜线。

1. 步进电机开环运行时为什么会出现丢步/堵转?闭环如何解决?

机械老化或突加负载、快速启停使定子磁场与转子脱拍,脉冲与实际转角不再成正比且控制器无从知晓;闭环用编码器反馈实际位置,与目标比较得偏差,经 PID 实时纠偏。

2. 宏 FEEDBACK_CONST 的含义是什么?

编码器与步进电机的脉冲比值(PULSE_REV/ENCODER_SPR = 1600/2400),用于把 PID 输出的编码器脉冲期望值换算成步进电机所需的脉冲数。

3. 本实验的 PID 输出是什么?怎么变成电机动作?

输出是「编码器脉冲期望值」(带符号定方向)。经 FEEDBACK_CONST 换算成步进脉冲数,再按 Step_Delay 求出每脉冲的定时器比较值,输出比较翻转模式发脉冲。

正文完
 0