共计 1595 个字符,预计需要花费 4 分钟才能阅读完成。
背景痛点
工业控制中,520 编码器电机常面临两个核心问题:

- 惯性滞后 :电机转子质量导致加速 / 减速响应延迟,表现为阶跃响应曲线上升缓慢
- 超调震荡 :PID 参数整定不当会引起速度环持续振荡(如 $K_p$ 过大时振幅达±15% 额定转速)
典型现象是给定目标转速 1500rpm 时,实际输出呈现阻尼不足的衰减振荡,稳态误差约±3%,严重影响定位精度。
算法选型
位置式 PID
- 计算公式:$u(k) = K_p e(k) + K_i \sum_{j=0}^k e(j) + K_d [e(k)-e(k-1)]$
- 优势:理论精度高
- 缺陷:每次需计算全量累加和,STM32F407 在 168MHz 下耗时约 12μs
增量式 PID
- 计算公式:$\Delta u(k) = K_p [e(k)-e(k-1)] + K_i e(k) + K_d [e(k)-2e(k-1)+e(k-2)]$
- 优势:仅需保存前两次误差,计算耗时降至 4μs
- 特别适合 PWM 周期 1kHz 的应用场景
核心实现
带死区的增量式 PID 伪代码
float IncPID_Calc(float target, float feedback) {static float err[3] = {0};
err[2] = err[1];
err[1] = err[0];
err[0] = target - feedback;
// 死区处理(±5rpm 不响应)if(fabs(err[0]) < 5.0f/60*encoder_ppr)
return 0;
// 微分先行(仅对反馈量微分)float d_term = K_d * (feedback - 2*err[1] + err[2]);
return K_p*(err[0]-err[1]) + K_i*err[0] - d_term;
}
编码器脉冲转换公式
物理量转换需注意采样同步问题:
- 转速计算:
$$ rpm = \frac{\Delta counts \times 60}{encoder_ppr \times control_period} $$ - 位置计算(32 位计数器防溢出):
$$ angle = \frac{(int32_t)(count_now – count_last) \times 360}{encoder_ppr} $$
进阶优化
积分抗饱和 Clamping 实现
// 在 PID 输出限幅时同步限制积分项
void PID_Clamp(PID_TypeDef* pid, float max_out) {
float out = pid->p_term + pid->i_term + pid->d_term;
if(out > max_out) {
pid->i_term = max_out - pid->p_term - pid->d_term;
out = max_out;
}
else if(out < -max_out) {
pid->i_term = -max_out - pid->p_term - pid->d_term;
out = -max_out;
}
return out;
}
速度前馈补偿
前馈系数 $K_{ff}$ 通过开环测试获取:
1. 记录电机在 50%PWM 占空比下的稳态转速 $rpm_{50}$
2. 计算:$K_{ff} = \frac{0.5 \times PWM_max}{rpm_{50}}$
避坑指南
- 采样周期匹配 :
- 编码器采样频率 ≥ 2 × PWM 频率(Nyquist 定理)
-
典型配置:PWM=10kHz 时,控制中断应≤100μs
-
信号消抖方案 :
- 硬件:在 AB 相线上并联 100pF 电容
- 软件:连续 3 次采样一致才判定为有效边沿
验证环节
阶跃响应测试(目标 1500rpm)
| 参数组 | 上升时间 (ms) | 超调量 (%) | 稳态误差 (rpm) |
|---|---|---|---|
| 纯 P 控制 | 120 | 25 | ±8 |
| 标准 PID | 80 | 12 | ±3 |
| PID+ 前馈 | 65 | 5 | ±1 |
执行时间测量
使用 DWT_CYCCNT 寄存器测得:
– 增量式 PID 计算:3.8μs @168MHz
– 编码器脉冲换算:1.2μs
思考题
当电机负载从空载突变为额定负载时,原 $K_i$ 系数可能导致积分项累积过慢。有哪些方法可实现 $K_i$ 的动态调整?
(提示:可考虑根据误差变化率自动调节积分增益)
正文完
