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%的启动抖动都能搞定。
- 先调Kp,后调Ki。 先把Ki设成0,只留Kp。让电机空载启动,看它抖不抖。
- Kp从0开始往上加。 每次加10%~20%,直到电机出现轻微抖动。然后退回20%。这个点就是Kp的“临界值”。
- Ki从0开始往上加。 每次加5%~10%,观察稳态电流误差。当误差小于5%时,停。
- 联合微调。 带载启动,如果还抖,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参数整定流程图
下面这张图,是我自己画的一个整定流程。每次调参前,我都会过一遍,避免漏步骤。
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,先空载后带载。遇到抖动,先看波形,再动手。别一上来就猛调,那样只会越调越乱。
嗯,这套方法我用了好几年,基本没翻过车。你试试看,有问题随时回来翻翻这章。