共计 1624 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
在实际的嵌入式电机控制系统中,6020 无刷电机的速度环 PID 控制常常面临几个典型问题:

- 阶跃响应超调 :当给定速度突然变化时,实际速度会先超过目标值再回落,这种超调不仅影响系统稳定性,还可能导致机械损伤。
- 稳态误差 :在某些工况下,电机转速无法精确达到设定值,总是存在微小偏差。
- 负载扰动抑制差 :当负载突然变化时,电机转速会出现明显波动,恢复时间过长。
传统试错法调参效率低下,往往需要反复修改 Kp、Ki、Kd 参数,耗时耗力且难以达到最优效果。
技术方案
位置式 vs 增量式 PID
- 位置式 PID:直接计算控制量的绝对值,适合执行机构不带积分特性的场合。但存在积分饱和风险,且对计算精度要求高。
- 增量式 PID:计算控制量的增量,抗干扰能力强,不易产生积分饱和,更适合电机控制。
Ziegler-Nichols 临界比例度法
- 先将 Ki 和 Kd 设为 0,逐渐增大 Kp 直到系统出现等幅振荡(临界振荡)。
- 记录此时的临界增益 $K_u$ 和振荡周期 $T_u$。
- 根据 Z - N 公式计算 PID 参数:
- $K_p = 0.6K_u$
- $K_i = 2K_p/T_u$
- $K_d = K_pT_u/8$
抗积分饱和机制
当输出达到限幅值时,停止积分项的累加,避免积分项 ” 无限增长 ” 导致系统响应迟缓。
代码实现
以下是基于 STM32 的增量式 PID 实现(带抗积分饱和):
// PID 参数结构体
typedef struct {
float Kp; // 比例系数
float Ki; // 积分系数
float Kd; // 微分系数
float max_output; // 输出限幅(对应 PWM 占空比)float integral; // 积分项
float prev_error; // 上一次误差
} PID_Controller;
// 增量式 PID 计算
float PID_Update(PID_Controller* pid, float setpoint, float feedback) {
float error = setpoint - feedback;
// 比例项
float P = pid->Kp * error;
// 积分项(带抗饱和)float I = pid->integral + pid->Ki * error;
if (I > pid->max_output) I = pid->max_output;
else if (I < -pid->max_output) I = -pid->max_output;
// 微分项
float D = pid->Kd * (error - pid->prev_error);
// 计算输出
float output = P + I + D;
// 输出限幅
if (output > pid->max_output) output = pid->max_output;
else if (output < -pid->max_output) output = -pid->max_output;
// 更新状态
pid->integral = I;
pid->prev_error = error;
return output;
}
关键点说明:
- 采样周期 :PID 计算频率应与 PWM 频率一致,通常为 10-20kHz。
- Q 格式定点数 :在资源受限的 MCU 上,可使用 Q15 或 Q31 格式提高计算效率。
- 输出限幅 :max_output 应与电机安全电压对应,例如 12V 系统对应 PWM 占空比 100%。
验证与优化
阶跃响应测试
通过示波器捕获电机从 0 到 1000rpm 的阶跃响应波形:
- 初始参数:调节时间 500ms,超调量 20%
- 优化后:调节时间 200ms,超调量 <5%
负载扰动测试
突加 50% 负载时,速度跌落 <3%,恢复时间 <100ms。
频域分析
通过 Bode 图验证相位裕度 >45°,确保系统稳定性。
避坑指南
- 避免积分饱和 :
- 使用增量式 PID
- 设置积分限幅
- 在误差较小时启用积分
- 编码器分辨率 :至少选择每转 1000 线的编码器,确保速度检测精度。
- 死区补偿 :对小信号区间的非线性进行查表补偿。
思考题
如何将本方案扩展为位置 - 速度双环控制?
- 外环(位置环)输出作为内环(速度环)的设定值
- 位置环 PID 参数应比速度环低一个数量级
- 需考虑两环之间的耦合效应
正文完
