3. 电流环PI控制器设计:电流环传递函数、PI参数整定方法、数字实现注意事项
好,咱们进入正题。电流环是PMSM矢量控制的基石,说白了,你位置环和速度环调得再好,电流环不行,一切都是白搭。我在项目里见过太多人,上来就调速度环,结果电机嗡嗡响,电流波形乱七八糟,最后发现是电流环根本没整对。
这一节,我就把电流环PI控制器设计的底裤扒干净。从传递函数到参数整定,再到数字实现里的那些坑,咱们一个一个过。
3.1 电流环传递函数推导
先看数学模型。PMSM在d-q坐标系下的电压方程,大家应该都熟:
ud = Rs * id + Ld * (did/dt) - ωe * Lq * iq
uq = Rs * iq + Lq * (diq/dt) + ωe * (Ld * id + ψf)
嗯,这里要注意。电流环设计时,我们通常忽略反电动势项。为什么?因为反电动势是转速的函数,变化相对慢。电流环的带宽远高于速度环,在电流环的响应时间内,反电动势基本不变。我早期做项目时没注意这个,结果低速还行,高速时电流环就抖得厉害。后来才明白,反电动势相当于一个扰动,你得用前馈去补偿它。
忽略反电动势后,d轴和q轴的传递函数就对称了:
G(s) = id(s) / ud(s) = 1 / (Ld * s + Rs)
G(s) = iq(s) / uq(s) = 1 / (Lq * s + Rs)
这是一个典型的一阶惯性环节。时间常数τ = L/R,增益K = 1/R。
加上PI控制器后,系统的开环传递函数为:
G_open(s) = (Kp + Ki/s) * (1 / (L*s + Rs))
我习惯把PI控制器写成零极点形式:
G_PI(s) = Kp * (1 + 1/(Ti * s)),其中 Ti = Kp/Ki
这样设计起来更直观。你想想看,PI控制器的零点在 s = -1/Ti,我们要用这个零点去对消掉电机模型的极点 s = -Rs/L。
核心思想:零极点对消。让PI控制器的零点等于电机模型的极点,这样系统就降阶为一阶系统,设计变得极其简单。
3.2 PI参数整定方法
好,理论讲完了,咱们来点实在的。参数怎么给?
方法一:零极点对消法(我最常用的)
令 Ti = L/Rs,即 Ki/Kp = Rs/L。那么对消后的闭环传递函数为:
G_close(s) = 1 / (1 + (L/Kp) * s)
这是一个一阶低通滤波器,带宽 ωbw = Kp/L。
所以,给定你想要的电流环带宽 ωbw,Kp 和 Ki 直接算:
Kp = ωbw * L
Ki = ωbw * Rs
就这么简单。我一般把电流环带宽设为速度环带宽的5-10倍。比如速度环带宽100Hz,电流环就给500-1000Hz。但注意,带宽不能超过开关频率的1/10,否则数字控制延迟会搞死你。
我的经验值:对于10kHz开关频率,电流环带宽通常取500Hz-1kHz。再高就容易振荡了。我曾经在一个项目里硬拉到1.5kHz,结果电机高频啸叫,电流波形全是毛刺。
方法二:工程整定法(现场调试用)
有时候电机参数不准,或者你懒得算,可以直接现场调。我一般这么干:
- 先给Ki一个很小的值,比如1-10
- 逐渐增大Kp,直到电流环出现振荡
- 取振荡临界值的0.6-0.8倍作为Kp
- 然后增大Ki,消除稳态误差
- 反复微调几次
这个方法虽然土,但很有效。特别是当你手头没有准确的L和Rs参数时。
| 参数 | 增大Kp的影响 | 增大Ki的影响 |
|---|---|---|
| 响应速度 | 变快 | 变快(有限) |
| 超调量 | 增大 | 增大 |
| 稳态误差 | 减小 | 消除 |
| 稳定性 | 降低 | 降低(积分饱和) |
3.3 数字实现注意事项
嗯,这里才是真正的坑。模拟域设计得好好的,一上数字芯片,全变味了。
1. 离散化方法选择
PI控制器在连续域的表达式是:
u(t) = Kp * e(t) + Ki * ∫e(t)dt
离散化后,我推荐用后向欧拉法,简单且稳定:
u(k) = Kp * e(k) + Ki * Ts * Σe(i)
写成增量形式更实用:
Δu(k) = Kp * [e(k) - e(k-1)] + Ki * Ts * e(k)
u(k) = u(k-1) + Δu(k)
为什么用增量式?因为积分饱和处理起来方便。我曾经用位置式,结果积分一饱和,电机直接飞车,吓得我赶紧按了急停。
警告:积分饱和是数字PI控制器的头号杀手。当输出限幅时,积分项还在继续累加,导致输出恢复缓慢,产生超调甚至振荡。必须做抗积分饱和处理。
2. 抗积分饱和实现
我常用的方法有两种:
- 条件积分法:当输出饱和时,停止积分累加
- 反计算法:将饱和量反馈回积分器,反向衰减积分值
代码实现(条件积分法):
// 增量式PI控制器,带抗积分饱和
float pi_controller(float error, float kp, float ki, float ts) {
static float integral = 0.0f;
static float prev_error = 0.0f;
static float output = 0.0f;
float proportional = kp * error;
integral += ki * ts * error;
// 计算输出
float new_output = proportional + integral;
// 限幅
if (new_output > OUTPUT_MAX) {
new_output = OUTPUT_MAX;
// 条件积分:停止积分
integral -= ki * ts * error;
} else if (new_output < OUTPUT_MIN) {
new_output = OUTPUT_MIN;
integral -= ki * ts * error;
}
output = new_output;
prev_error = error;
return output;
}
3. 采样与PWM同步
这个很多人会忽略。电流采样必须在PWM载波的波峰或波谷触发,这样才能采到电流的平均值。我见过有人随便采,结果电流波形全是开关噪声,根本没法用。
一般做法是:
- PWM定时器在载波顶点触发ADC采样
- ADC转换完成后触发中断
- 在中断里执行电流环PI计算
- 计算结果更新PWM比较寄存器,下一个周期生效
这样一拍完成,延迟最小。
4. 计算延迟补偿
数字控制有一个拍的计算延迟。你当前周期采的电流,算出来的电压,要到下一个周期才输出。这个延迟在高带宽时会显著影响稳定性。
我常用的补偿方法是:在PI控制器中引入一个超前环节,或者直接用预测控制。简单点的话,把电流环带宽适当降低,留出裕量。
总结一下数字实现的要点:
- 用增量式PI,方便处理积分饱和
- 必须做抗积分饱和
- 采样与PWM同步
- 考虑一拍延迟的影响
- 参数整定时留出稳定裕量
3.4 本章知识体系
下面这张图,是我自己梳理的电流环PI控制器设计流程。你看一遍,心里就有谱了。
这张图把整个设计流程串起来了。从数学模型出发,到传递函数,再到参数整定,最后落到数字实现。每一步都有坑,每一步也都有解法。
好了,电流环PI控制器设计就讲到这里。记住,理论是基础,但真正让你成为高手的,是那些踩过的坑和积累的经验。下一节咱们聊参数辨识,那又是另一番天地了。
最后送大家一句话:电流环调好了,你的电机控制就成功了一半。别急着往上堆算法,先把基础打牢。
公众号:蓝海资料掘金营,微信deep3321