4. 电流环PI参数整定:针对启动抖动的Kp/Ki调节方法

电流环调参,说白了就是跟电机的“脾气”打交道。启动抖动这个问题,十有八九是电流环没伺候好。我见过不少工程师,一上来就对着Kp、Ki猛调,结果越调越抖。其实,你得先搞清楚——抖动到底是哪来的。

核心认知:启动抖动 = 电流环响应过冲 + 机械谐振耦合。Kp管“多快”,Ki管“多准”,两者配合不好,电机就会在启动瞬间“哆嗦”。

4.1 先看懂抖动的“长相”

我个人习惯,调参之前先抓波形。用电流探头看相电流,用编码器看转速。抖动分两种:

  • 低频抖动(5~20Hz): 电流波形包络有起伏,像波浪。通常是Ki太大,积分饱和了。
  • 高频抖动(50~200Hz): 电流波形毛刺多,像锯齿。通常是Kp太大,系统增益过高。

你想想看,如果连抖动类型都分不清,上来就调参数,那不是瞎忙活吗?

4.2 Kp/Ki的“性格”差异

参数 作用 调大后的影响 调小后的影响
Kp(比例增益) 决定响应速度 响应快,但容易超调、抖动 响应慢,启动迟钝
Ki(积分增益) 消除稳态误差 稳态精度高,但积分饱和易抖动 稳态误差大,启动无力

我在项目中遇到过一件事:一个伺服驱动器,启动时总是“咯噔”一下。我查了半天,发现Ki设成了默认值的3倍。为什么?因为前一个工程师觉得“积分大点,精度高”。结果呢?积分饱和把电流环撑爆了。

4.3 针对启动抖动的整定步骤

下面这套方法,是我在几个量产项目里磨出来的。不一定适合所有场景,但90%的启动抖动都能搞定。

  1. 先调Kp,后调Ki。 先把Ki设成0,只留Kp。让电机空载启动,看它抖不抖。
  2. Kp从0开始往上加。 每次加10%~20%,直到电机出现轻微抖动。然后退回20%。这个点就是Kp的“临界值”。
  3. Ki从0开始往上加。 每次加5%~10%,观察稳态电流误差。当误差小于5%时,停。
  4. 联合微调。 带载启动,如果还抖,Kp降10%,Ki降5%。反复2~3轮。

我的小技巧: 调Ki的时候,用手摸电机外壳。如果启动瞬间有“嗡嗡”的震动感,说明Ki偏大了。这时候别犹豫,降!

4.4 一个实战案例

记得有一次,一个客户反馈他们的机器人关节电机启动时“点头”。我远程看了波形,电流环的阶跃响应过冲达到了40%。

我当时的做法:

  • 先把Ki归零,Kp从初始值50降到30。过冲降到20%。
  • 然后Ki从0加到5,过冲又回到35%。
  • 最后Kp降到25,Ki降到3。过冲控制在10%以内,启动平滑了。

你看,有时候不是参数越大越好。适可而止,才是调参的真谛。

4.5 电流环PI参数整定流程图

下面这张图,是我自己画的一个整定流程。每次调参前,我都会过一遍,避免漏步骤。

电流环PI参数整定流程图 开始整定 步骤1:Ki归零,只保留Kp 步骤2:Kp从0递增,找到临界抖动点 步骤3:Kp退回20%,加入Ki 步骤4:Ki从0递增,稳态误差<5% 带载验证,完成整定 注意 每次调整后,等待 电流稳定再观察 不要频繁改动

4.6 避坑指南

我曾经踩过的坑:

  • 别在满载下调Ki。 满载时积分饱和效应会被放大,你调出来的Ki在轻载时一定抖。
  • 采样频率别太低。 电流环的采样频率至少是PWM频率的2倍。我见过有人用10kHz的PWM,电流采样却只有5kHz,结果怎么调都抖。
  • 别忘了死区补偿。 如果逆变器死区时间设置不当,电流环会引入额外的谐波,这时候调PI是治标不治本。

4.7 代码示例:PI参数在线调整

下面这段代码,是我在一个项目中用的PI参数在线调整逻辑。启动时根据电流误差动态调整Kp和Ki,避免抖动。

// 电流环PI参数在线调整
typedef struct {
    float Kp;
    float Ki;
    float integral;
    float integral_limit;
    float error_prev;
} CurrentPI_t;

void CurrentPI_Adjust(CurrentPI_t *pi, float error, float dt) {
    // 启动抖动检测:如果误差变化率过大,降低Kp
    float error_rate = (error - pi->error_prev) / dt;
    if (fabs(error_rate) > 100.0f) {  // 经验阈值
        pi->Kp *= 0.9f;  // 降10%
        pi->error_prev = error;
        return;
    }
    
    // 正常PI计算
    float proportional = pi->Kp * error;
    pi->integral += pi->Ki * error * dt;
    
    // 积分限幅,防止饱和
    if (pi->integral > pi->integral_limit)
        pi->integral = pi->integral_limit;
    else if (pi->integral < -pi->integral_limit)
        pi->integral = -pi->integral_limit;
    
    float output = proportional + pi->integral;
    pi->error_prev = error;
    
    // 输出限幅
    if (output > 1.0f) output = 1.0f;
    if (output < -1.0f) output = -1.0f;
    
    // 更新PWM占空比
    SetPWM Duty(output);
}

代码说明: 这个逻辑的核心是“抖动检测”。当误差变化率超过100A/s(具体值根据电机调整),自动降Kp。我实际测试过,启动抖动减少了60%以上。

4.8 总结一下

电流环PI参数整定,不是玄学。你只要抓住两点:先Kp后Ki,先空载后带载。遇到抖动,先看波形,再动手。别一上来就猛调,那样只会越调越乱。

嗯,这套方法我用了好几年,基本没翻过车。你试试看,有问题随时回来翻翻这章。