2. PID控制基础:从原理到实战

各位工程师朋友,今天我们来聊聊PID控制的基础。说实话,PID这东西,我刚开始做电机控制时觉得挺简单的——不就是比例、积分、微分三个参数嘛。但真正上手调参时,才发现坑不少。这一章,我就把这些年踩过的坑和总结的经验,掰开了揉碎了讲给你听。

2.1 PID控制器原理:三兄弟的分工

PID控制器,说白了就是三个环节的配合:

  • 比例(P):看现在,误差有多大就纠正多少
  • 积分(I):看过去,累计误差慢慢消除
  • 微分(D):看未来,预测误差变化趋势

公式很简单:

u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt

我在项目中遇到过不少新手,一上来就调三个参数,结果越调越乱。我的建议是:先只调P,让系统动起来再说。

我的经验: 调PID就像开车。P是油门大小,I是方向盘微调,D是预判刹车。你想想看,新手司机能同时控制好这三样吗?先学会踩油门再说。

2.2 位置式PID vs 增量式PID

这两种实现方式,我当年也纠结过。简单说:

特性 位置式PID 增量式PID
输出含义 直接输出控制量 输出控制量的增量
积分项 有积分饱和风险 天然抗积分饱和
执行器要求 支持绝对位置 支持增量累加
代码实现 需要存储所有误差 只需最近三次误差

我个人习惯在FOC控制中用增量式PID。为什么?因为电机控制中,我们经常需要限幅,增量式天然不会累积过大。我曾经在一个项目中用了位置式,结果积分项飙到天上去了,电机直接抖成筛子。

增量式PID的代码实现:

// 增量式PID
float pid_incremental(float target, float current) {
    static float e_prev = 0, e_prev2 = 0;
    float e = target - current;
    float delta_u = Kp*(e - e_prev) + Ki*e + Kd*(e - 2*e_prev + e_prev2);
    e_prev2 = e_prev;
    e_prev = e;
    return delta_u;  // 外部累加
}
注意: 增量式PID的输出是增量,外部需要做累加。而且每次上电时,累加值要从0开始,否则电机可能会猛冲一下。

2.3 积分饱和:那个让我熬夜的坑

积分饱和,说白了就是积分项积得太多了,导致系统反应迟钝。为什么会这样?

举个例子:电机启动时,目标转速1000rpm,实际转速0。误差很大,积分项疯狂累积。等转速到了1000,积分项已经积了一大堆,还在继续输出,结果转速冲过了头。

我遇到过最惨的一次:一个伺服项目,积分饱和导致电机过冲了30%,直接把负载撞坏了。从那以后,我对积分饱和特别敏感。

2.4 抗积分饱和:三种实用方法

这里我分享三种我常用的方法:

  1. 积分限幅法:给积分项设个上限,比如最大输出的20%
  2. 积分分离法:误差大时停止积分,误差小时再开启
  3. 反馈抑制法:输出饱和时,把积分项往回拉

我个人最常用的是积分分离法,代码简单,效果明显:

// 积分分离PID
float pid_integral_separate(float target, float current) {
    float e = target - current;
    float p_out = Kp * e;
    
    // 误差大于阈值时,不积分
    if (fabs(e) < INTEGRAL_THRESHOLD) {
        integral += Ki * e;
        // 积分限幅
        if (integral > INTEGRAL_MAX) integral = INTEGRAL_MAX;
        if (integral < -INTEGRAL_MAX) integral = -INTEGRAL_MAX;
    }
    
    float d_out = Kd * (e - e_prev);
    e_prev = e;
    return p_out + integral + d_out;
}
关键点: 积分分离的阈值怎么设?我一般取目标值的5%-10%。太大起不到作用,太小又容易频繁切换。

2.5 PID参数对系统的影响:调参的直觉

调参这事,光看理论没用,得靠感觉。我总结了一个口诀:

  • Kp太大:系统震荡,甚至发散。就像你开车猛打方向盘
  • Kp太小:响应慢,像老牛拉车
  • Ki太大:超调严重,积分项收不住
  • Ki太小:稳态误差消不掉,永远差那么一点
  • Kd太大:系统对噪声敏感,电机嗡嗡响
  • Kd太小:抑制超调效果不明显
  • 嗯,这里要注意:微分项在FOC控制中其实用得不多。为什么?因为电机本身有惯性,微分容易放大噪声。我一般只在位置环用微分,速度环和电流环基本不用。

    避坑指南: 我曾经在电流环加了微分,结果电流波形全是毛刺。后来查了半天,发现是电流采样噪声被微分放大了。去掉微分后,波形立马干净了。

    2.6 实战中的调参顺序

    我的调参顺序是这样的:

    1. 先调电流环:Kp从0开始慢慢加,直到电流响应不震荡
    2. 再调速度环:同样先Kp,再加一点Ki消除静差
    3. 最后调位置环:位置环的Kp要小一些,否则容易过冲

    你想想看,电流环是内环,速度环是外环,位置环是最外层。内环不稳,外环调得再好也没用。这个顺序我用了十年,从来没出过问题。

    好了,这一章的内容就到这里。下一章我们聊聊具体的整定方法和工具,到时候我会分享一些我常用的调试技巧。