共计 1851 个字符,预计需要花费 5 分钟才能阅读完成。
为什么需要速度环 PID 控制?
刚开始玩 6020 电机时,我用开环 PWM 直接驱动,结果发现:

- 空载时转速稳定
- 一旦加负载(比如装上轮子),转速立刻下降
- 不同电池电压下表现差异大
这就是开环控制的致命伤——无法抵抗扰动。PID 闭环控制通过实时检测编码器反馈,动态调整 PWM 输出,就像给电机装了个智能油门。
PID 三兄弟各司其职
用快递小哥送外卖来理解 PID:
- 比例 (P):发现离目的地还有 500 米,立马加速(误差越大,修正越猛)
- 积分 (I):发现过去 1 分钟一直差 50 米没送到,开始累积焦虑值(消除稳态误差)
- 微分 (D):看到距离正在快速缩短,提前松油门防冲过头(抑制超调)
传递函数框图:
G(s) = K_p + \frac{K_i}{s} + K_d s
三种调参方法对比
1. 试凑法(新手友好)
- 先设 Ki=0,Kd=0
- 慢慢增大 Kp 直到出现轻微振荡
- 当前 Kp 值×0.6 作为最终 P 参数
- 逐渐增加 Ki 消除静差
2. 临界比例度法(推荐)
- 同样先关闭 I 和 D
- 增大 P 直到等幅振荡
- 记录临界增益 Ku 和振荡周期 Tu
- 按 Ziegler-Nichols 表格计算参数:
| 控制类型 | Kp | Ki | Kd |
|---|---|---|---|
| P | 0.5Ku | 0 | 0 |
| PI | 0.45Ku | 0.54Ku/Tu | 0 |
| PID | 0.6Ku | 1.2Ku/Tu | 0.075Ku*Tu |
3. 自整定法(需硬件支持)
某些驱动器支持自动整定,比如让电机做阶跃响应自动计算参数。
Arduino 实战代码
// PlatformIO 项目配置
[env:arduino_uno]
platform = atmelavr
board = uno
framework = arduino
// PID 控制器类
class SafePID {
private:
float kp, ki, kd;
float integral = 0;
float lastError = 0;
float outMax = 255; // PWM 最大值
float deadZone = 5; // 死区阈值 (RPM)
public:
SafePID(float p, float i, float d) : kp(p), ki(i), kd(d) {}
float compute(float setpoint, float feedback) {
float error = setpoint - feedback;
// 死区处理
if(fabs(error) < deadZone) return 0;
// 抗积分饱和
if(integral > 1000) integral = 1000;
if(integral < -1000) integral = -1000;
integral += error;
float derivative = error - lastError;
lastError = error;
float output = kp*error + ki*integral + kd*derivative;
// 输出限幅
if(output > outMax) output = outMax;
if(output < -outMax) output = -outMax;
return output;
}
};
// 电机控制对象
SafePID pid(1.2, 0.5, 0.05); // 示例参数
void setup() {pinMode(ENCODER_A, INPUT);
pinMode(PWM_PIN, OUTPUT);
Serial.begin(115200);
}
void loop() {float rpm = readEncoder(); // 获取当前转速
float pwm = pid.compute(targetRPM, rpm);
analogWrite(PWM_PIN, abs(pwm));
delay(10); // 控制周期 10ms
}
三大常见翻车现场
1. 电机抽风式抖动
现象 :电机像得了帕金森一样高频震动
解决 :
– 降低 Kp 值
– 增加 D 参数抑制震荡
– 检查编码器信号是否有噪声
2. 反应迟钝像树懒
现象 :转速变化总是慢半拍
解决 :
– 适当增大 Kp
– 检查控制周期是否过长(建议 5 -20ms)
3. 积分饱和导致失控
现象 :电机突然飙到最高速停不下来
解决 :
– 代码中增加积分限幅
– 采用积分分离策略(误差大时关闭 I)
示波器诊断技巧
用阶跃响应测试时,重点关注:
- 上升时间(达到 90% 目标值耗时)
- 超调量(第一个波峰超出量)
- 稳定时间(进入±5% 误差带)
理想波形应该像缓坡上山,而不是过山车。
进阶方向推荐
- 位置环 PID:在速度环外再套一层位置控制
- 模糊 PID:根据误差大小自动调节参数
- 前馈控制 :提前预测负载变化补偿
调 PID 就像老中医把脉,需要耐心和经验积累。建议先用安全参数(小 P 值、零 I /D)开始,慢慢增量调整。记住我们的终极目标:让电机转速像老司机的油门一样稳!
正文完
