3. 传统PI控制局限性:参数失配下的稳态误差与动态响应退化
各位做电机控制的同行,今天我们来聊聊PI控制器的“软肋”。
说实话,PI控制器在工程界用了这么多年,确实皮实耐用。但你要说它完美无缺,那我第一个不同意。尤其是在永磁同步电机这种强耦合、非线性系统里,一旦电机参数跟控制器里设定的参数对不上号——嗯,问题就来了。
我个人习惯把这种“对不上号”叫做参数失配。说白了,就是你控制器里存的电阻、电感、磁链值,跟电机实际的值不一样了。为什么会不一样?温度变化、磁饱和、老化,原因多了去了。
3.1 参数失配怎么来的?
先说说参数失配的几种典型场景。我在项目里遇到过最头疼的一次,是电机跑着跑着温度从25℃升到80℃,电阻直接变了30%。控制器还傻乎乎用着常温下的参数,结果电流环就开始抖了。
常见的参数失配来源:
- 电阻Rs变化:温度每升高10℃,铜线电阻大约增加4%。夏天和冬天,差别很大。
- 电感Ld、Lq变化:电流大了,磁路饱和,电感值会下降。我见过降20%的。
- 永磁磁链ψf变化:温度升高,磁钢退磁,磁链会减小。高温下能掉5%-10%。
3.2 PI控制器在参数失配下的稳态误差推导
我们来点硬核的。推导一下PI控制器在参数失配时,到底会出什么问题。
先看电流环。理想情况下,d轴和q轴的电流环是解耦的。但参数失配后,解耦就不彻底了。
假设实际电机参数为R、L,控制器使用的参数为R0、L0。定义失配系数:
α_R = R / R₀ // 电阻失配系数
α_L = L / L₀ // 电感失配系数
当α_R ≠ 1或α_L ≠ 1时,电流环的传递函数会发生变化。我推导过,q轴电流的稳态误差可以写成:
Δi_q = (α_R - 1) · R₀ · i_q_ref / (K_p + K_i/s) + 耦合项
你看,这个误差跟失配系数直接相关。更麻烦的是,d轴和q轴之间还会互相串扰。本来解耦得好好的,参数一偏,d轴电流变化会影响到q轴,反之亦然。
为什么会这样? 因为PI控制器的解耦项里用了L0和ψf0。实际值变了,解耦就不准了。说白了,你算的补偿电压是错的,那电流自然控不准。
3.3 动态响应退化:不只是稳态问题
稳态误差是一方面,动态响应退化更让人头疼。
我记得有一次调试,电机空载时电流环响应挺好的,带宽能做到500Hz。结果一带负载,带宽直接掉到200Hz。查了半天,发现是电感参数失配导致的。
动态退化的几个表现:
- 响应变慢:参数失配后,系统的闭环极点位置会偏移。本来设计好的带宽,实际达不到。
- 超调增大:失配严重时,系统可能从过阻尼变成欠阻尼,超调量飙升。
- 震荡风险:我见过最极端的情况,参数失配超过50%,电流环直接震荡了。
这里有个经验值:当电感失配超过30%时,电流环的相位裕度会下降15°-20°。你想想看,本来留了45°裕度,一下掉到25°,系统就接近不稳定了。
3.4 仿真验证:眼见为实
光说不练假把式。我们做个仿真看看。
仿真条件:一台表贴式永磁同步电机,额定参数如下:
| 参数 | 额定值 | 失配后值 |
|---|---|---|
| 定子电阻 Rs | 0.5 Ω | 0.65 Ω(+30%) |
| d/q轴电感 L | 8 mH | 6 mH(-25%) |
| 永磁磁链 ψf | 0.175 Wb | 0.158 Wb(-10%) |
控制器里用的还是额定参数。我们看看电流阶跃响应会怎样。
下面是我用Python写的仿真代码,大家可以跑跑看:
import numpy as np
import matplotlib.pyplot as plt
# 电机参数
Rs = 0.5 # 实际电阻
L = 8e-3 # 实际电感
psi_f = 0.175 # 实际磁链
# 控制器参数(未更新)
Rs0 = 0.5
L0 = 8e-3
psi_f0 = 0.175
# PI参数(按额定参数设计)
Kp = 100
Ki = 5000
# 仿真参数
dt = 1e-5
t_end = 0.1
t = np.arange(0, t_end, dt)
# 初始化
id_ref = 0
iq_ref = 10 # 阶跃指令
id = 0
iq = 0
we = 100 # 电角速度
id_err_int = 0
iq_err_int = 0
id_actual = []
iq_actual = []
for k in range(len(t)):
# 电流误差
id_err = id_ref - id
iq_err = iq_ref - iq
# 积分
id_err_int += id_err * dt
iq_err_int += iq_err * dt
# PI输出
vd_pi = Kp * id_err + Ki * id_err_int
vq_pi = Kp * iq_err + Ki * iq_err_int
# 解耦补偿(使用控制器参数)
vd_decouple = -we * L0 * iq
vq_decouple = we * (L0 * id + psi_f0)
vd = vd_pi + vd_decouple
vq = vq_pi + vq_decouple
# 实际电机模型(使用实际参数)
did_dt = (vd - Rs * id + we * L * iq) / L
diq_dt = (vq - Rs * iq - we * (L * id + psi_f)) / L
id += did_dt * dt
iq += diq_dt * dt
id_actual.append(id)
iq_actual.append(iq)
# 绘制结果
plt.figure(figsize=(10, 6))
plt.plot(t, iq_actual, label='q轴电流(参数失配)')
plt.axhline(y=iq_ref, color='r', linestyle='--', label='指令值')
plt.xlabel('时间 (s)')
plt.ylabel('电流 (A)')
plt.legend()
plt.grid(True)
plt.title('PI控制器在参数失配下的电流阶跃响应')
plt.show()
仿真结果会告诉你三件事:
- 稳态误差不为零:q轴电流稳定后,跟指令值之间有个偏差。这个偏差随着负载增大而增大。
- 动态响应变慢:上升时间比参数匹配时长了大约30%。
- 超调量增加:本来设计成无超调的,现在超调了5%左右。
3.5 一张图看懂PI控制的局限性
下面这张SVG图,总结了PI控制在参数失配下的核心问题:
3.6 避坑指南:我踩过的坑
做电机控制这些年,我在参数失配这个问题上栽过不少跟头。分享几个典型的:
3.7 小结
总结一下今天的内容:
- 参数失配是实际系统中必然存在的问题,不是“会不会发生”,而是“什么时候发生”
- PI控制器在参数失配下,稳态误差不为零,动态响应会退化
- 失配严重时,系统可能失去稳定性
- 仿真验证了理论分析,结果是一致的
那怎么办呢?总不能不用PI吧?别急,后面我们会讲各种鲁棒控制方法,比如滑模控制、自适应控制、模型预测控制等。这些方法能在参数失配的情况下,依然保持较好的控制性能。
今天就到这里。下次我们聊聊滑模控制——一种对参数失配“不敏感”的控制方法。
公众号:蓝海资料掘金营,微信deep3321