6020电机速度环PID参数调优实战:从基础原理到避坑指南

1次阅读
没有评论

共计 1851 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

为什么需要速度环 PID 控制?

刚开始玩 6020 电机时,我用开环 PWM 直接驱动,结果发现:

6020 电机速度环 PID 参数调优实战:从基础原理到避坑指南

  • 空载时转速稳定
  • 一旦加负载(比如装上轮子),转速立刻下降
  • 不同电池电压下表现差异大

这就是开环控制的致命伤——无法抵抗扰动。PID 闭环控制通过实时检测编码器反馈,动态调整 PWM 输出,就像给电机装了个智能油门。

PID 三兄弟各司其职

用快递小哥送外卖来理解 PID:

  1. 比例 (P):发现离目的地还有 500 米,立马加速(误差越大,修正越猛)
  2. 积分 (I):发现过去 1 分钟一直差 50 米没送到,开始累积焦虑值(消除稳态误差)
  3. 微分 (D):看到距离正在快速缩短,提前松油门防冲过头(抑制超调)

传递函数框图:

G(s) = K_p + \frac{K_i}{s} + K_d s

三种调参方法对比

1. 试凑法(新手友好)

  1. 先设 Ki=0,Kd=0
  2. 慢慢增大 Kp 直到出现轻微振荡
  3. 当前 Kp 值×0.6 作为最终 P 参数
  4. 逐渐增加 Ki 消除静差

2. 临界比例度法(推荐)

  1. 同样先关闭 I 和 D
  2. 增大 P 直到等幅振荡
  3. 记录临界增益 Ku 和振荡周期 Tu
  4. 按 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)

示波器诊断技巧

用阶跃响应测试时,重点关注:

  1. 上升时间(达到 90% 目标值耗时)
  2. 超调量(第一个波峰超出量)
  3. 稳定时间(进入±5% 误差带)

理想波形应该像缓坡上山,而不是过山车。

进阶方向推荐

  1. 位置环 PID:在速度环外再套一层位置控制
  2. 模糊 PID:根据误差大小自动调节参数
  3. 前馈控制 :提前预测负载变化补偿

点击下载 PID 计算工具

调 PID 就像老中医把脉,需要耐心和经验积累。建议先用安全参数(小 P 值、零 I /D)开始,慢慢增量调整。记住我们的终极目标:让电机转速像老司机的油门一样稳!

正文完
 0
评论(没有评论)