4. 电流环调优:自整定算法原理与实现
电流环是电机控制的基石。你想想看,速度环和位置环调得再好,如果电流环响应慢半拍,整个系统就像踩在棉花上。我个人习惯,拿到一个新电机平台,第一件事就是把电流环的底子打好。
但手动调PI参数,说实话挺烦的。电阻电感得测,带宽得算,还得反复试。所以这一章,我们来聊聊怎么让控制器自己把这事干了——电流环自整定。
核心观点:自整定的本质,是用算法代替人工试凑。它通过注入激励信号,在线辨识电机电气参数,然后根据目标带宽自动算出PI增益。
4.1 为什么需要自整定?
我在项目中遇到过好几次这样的情况:电机标称参数和实际测量值差了一大截。尤其是温升之后,电阻能变20%~30%。如果还用出厂那组PI参数,轻则电流震荡,重则直接过流保护。
手动整定的问题在于:
- 依赖经验——新手调PI像猜谜,老手也得试好几轮
- 费时间——换一个电机型号就得重来一遍
- 不准确——靠示波器看波形调,误差其实挺大的
自整定就是为了解决这些痛点。它能在几十毫秒内完成参数辨识,然后自动算出合适的PI值。说白了,就是把工程师从重复劳动里解放出来。
4.2 自整定的核心原理
电流环自整定分两步走:
- 参数辨识——测出电机的电阻R和电感L
- 增益计算——根据R、L和目标带宽算出Kp和Ki
嗯,这里要注意,参数辨识的精度直接决定了自整定的成败。如果R和L测偏了,后面算出来的PI就是错的。
4.2.1 参数辨识方法
最常用的方法是直流注入法。原理很简单:给d轴注入一个直流电压,然后测电流响应。
具体步骤是这样的:
- 电机静止,转子锁住(或者用制动器)
- 注入一个已知的直流电压Vd
- 等待电流稳定,记录稳态电流Id
- 根据欧姆定律算出电阻:R = Vd / Id
- 然后注入一个电压阶跃,记录电流上升时间,算出电感:L = τ × R
你可能会问:为什么不直接用万用表测?我在项目里试过,万用表测的是直流电阻,而电机在高频PWM开关下的等效电阻是不一样的。而且,线路阻抗、接触电阻都会引入误差。所以还是让控制器自己测最靠谱。
小技巧:注入电压不要太大,一般选额定电压的5%~10%就行。太大了电流会冲过头,太小了信噪比不够。我习惯先试5%,看电流响应是否平滑,再微调。
4.2.2 增益计算公式
有了R和L,接下来就是算PI参数了。电流环一般设计成一阶低通滤波器的形式,目标带宽用ωc表示。
标准公式:
Kp = L × ωc
Ki = R × ωc
等等,这个公式看起来简单,但有个坑。你看,Kp和Ki都跟ωc成正比。如果目标带宽设得太高,Kp会很大,电流环容易震荡。我曾经在一个项目里把带宽设到了2000 rad/s,结果电流波形像锯齿一样,吓得我赶紧降下来。
实际工程中,目标带宽一般取:
| 应用场景 | 推荐带宽 (rad/s) | 说明 |
|---|---|---|
| 通用伺服 | 500 ~ 1000 | 兼顾响应和稳定性 |
| 高速主轴 | 1000 ~ 2000 | 需要快速响应,但要注意噪声 |
| 机器人关节 | 300 ~ 600 | 刚性要求高,带宽不宜过大 |
| 大惯量负载 | 200 ~ 400 | 带宽太高容易震荡 |
警告:千万不要把带宽设得超过PWM开关频率的1/10。比如10kHz的PWM,带宽最多设1000 rad/s。再高就超出控制器的能力范围了,系统会不稳定。
4.3 自整定流程
下面这张图展示了完整的自整定流程。我建议你仔细看看,每一步都有讲究。
这个流程看起来简单,但实际实现时有很多细节。我踩过的坑,下面一个一个说。
4.4 实现细节与避坑指南
4.4.1 采样时机
注入直流电压后,电流不会立刻稳定。因为电机绕组有电感,电流上升需要时间。我建议等3~5个电气时间常数(τ = L/R)再采样。
举个例子:如果L=5mH,R=1Ω,那么τ=5ms。等15~25ms再读数,基本就稳了。
4.4.2 噪声处理
PWM开关会产生高频噪声,直接采样的数据波动很大。我曾经吃过这个亏——第一次测出来的R值跳来跳去,根本没法用。
解决办法:
- 硬件滤波——在ADC前端加RC低通滤波器,截止频率设到PWM频率的1/10
- 软件滤波——连续采10~20个点,去掉最大最小值,取平均
- 同步采样——在PWM载波的波峰或波谷时刻触发ADC,避开开关噪声
我的习惯:软件滤波用滑动平均,窗口大小设16。既平滑了噪声,又不会引入太大延迟。你试试看,效果不错。
4.4.3 温度补偿
电阻随温度变化很明显。铜绕组的温度系数大约是0.0039/°C。也就是说,温升50°C,电阻能涨20%。
如果你在冷机状态下自整定,然后电机跑热了,电流环性能就会下降。我建议:
- 在自整定完成后,记录当前温度
- 运行时实时监测温度(用NTC或估算)
- 根据温度实时修正R值,进而修正Ki
代码实现大概是这样:
// 温度补偿示例
float R_actual = R_nominal * (1 + 0.0039 * (T_current - T_calibrate));
float Ki_compensated = R_actual * omega_c;
4.4.4 电感饱和效应
大电流时,磁路会饱和,电感会下降。如果你在轻载下自整定,然后重载运行,实际电感比测出来的小,电流环会偏慢。
我的做法是:在多个电流点下分别测电感,然后做一张查找表。运行时根据当前电流查表修正。
| 电流 (A) | 电感 (mH) | 备注 |
|---|---|---|
| 0.5 | 5.0 | 轻载,未饱和 |
| 2.0 | 4.7 | 开始饱和 |
| 5.0 | 3.8 | 明显饱和 |
| 10.0 | 2.9 | 深度饱和 |
4.5 代码实现示例
下面是一个简化的自整定函数。实际产品中要加更多保护逻辑,但核心思路都在这里了。
// 电流环自整定函数
void current_loop_autotune(float target_bandwidth) {
float R, L, Kp, Ki;
float V_inject = 0.05 * Vdc; // 注入5%额定电压
float I_steady;
float tau;
// 第一步:锁转子(假设外部已锁住)
// 第二步:测电阻
set_d_voltage(V_inject);
delay_ms(20); // 等待电流稳定
I_steady = get_d_current();
R = V_inject / I_steady;
// 第三步:测电感
set_d_voltage(V_inject * 1.5); // 阶跃
uint32_t t_start = get_timer();
while (get_d_current() < I_steady * 0.632) {
// 等待电流上升到63.2%
}
tau = (get_timer() - t_start) / 1000.0; // 单位ms转s
L = tau * R;
// 第四步:计算PI
Kp = L * target_bandwidth;
Ki = R * target_bandwidth;
// 第五步:写入寄存器
set_Kp(Kp);
set_Ki(Ki);
// 恢复零电压
set_d_voltage(0);
}
注意:上面的代码为了清晰做了简化。实际工程中,你需要在测电感时加一个过流保护,防止电流冲过头。我曾经有一次忘了加保护,结果电流直接飙到额定值的两倍,还好保险丝扛住了。
4.6 自整定后的验证
整定完了别急着跑。我习惯做三步验证:
- 阶跃响应测试——给一个电流阶跃指令,看上升时间是否接近理论值(约0.35/带宽)
- 稳态误差检查——让电流稳定在某个值,看实际值和指令值的偏差
- 带宽扫频——用扫频仪测电流环的闭环频率响应,确认-3dB点是否在目标带宽附近
如果验证结果不理想,别灰心。自整定不是万能的,有时候电机参数太特殊(比如极低电感电机),或者噪声太大,自整定结果会有偏差。这时候可以手动微调一下Kp和Ki,或者重新做一次自整定,取多次结果的平均值。
嗯,电流环自整定就聊到这里。记住,自整定是个工具,不是万能药。理解它的原理,知道它的局限,你才能真正用好它。