3. 电流环PI控制器设计:带宽选择、参数计算与抗饱和
电流环是PMSM三环控制中最内层、也是响应最快的环。说白了,位置环和速度环的性能天花板,很大程度上取决于电流环能跑多快、多稳。我刚开始调三环时,总喜欢先调速度环,结果发现怎么调都震荡——后来才意识到,电流环没整明白,上面两层全是白搭。
这一章,我们就聚焦电流环PI控制器的三个核心问题:带宽怎么选、PI参数怎么算、饱和了怎么办。嗯,这三个问题搞定了,电流环基本就稳了。
3.1 电流环带宽选择——不是越快越好
带宽,说白了就是电流环能跟踪多高频率的指令。带宽越高,响应越快,但噪声也越容易被放大。我见过有人把电流环带宽设到2000Hz,结果电流波形全是毛刺,电机嗡嗡响。
那么,带宽到底怎么选?我个人习惯遵循以下原则:
- 上限受限于PWM开关频率:理论上,电流环带宽不能超过PWM频率的1/10。比如10kHz的PWM,带宽最多设到1kHz。再高,离散化带来的相位滞后会让系统不稳定。
- 下限受限于电机电气时间常数:带宽至少要高于电气时间常数的倒数,否则电流环跟不上电机的电磁动态。
- 实际推荐值:对于大多数伺服应用,带宽取PWM频率的1/20 ~ 1/10比较稳妥。我常用的经验值是:10kHz PWM → 500Hz~800Hz带宽。
核心公式:
电流环带宽 ωcc = 2π × fbw (rad/s)
其中 fbw 是期望的带宽频率(Hz)。
我的经验:如果你不确定带宽设多少,先从PWM频率的1/20开始试。比如10kHz PWM,先设500Hz。然后看电流阶跃响应——如果超调大、有震荡,就降带宽;如果响应太慢,就升带宽。每次调10%,别贪心。
3.2 PI参数计算——基于电机电气时间常数
电流环的被控对象是电机的电枢回路,说白了就是一个RL串联电路。电气时间常数 τe = L / R,其中L是电感,R是电阻。
我习惯用零极点对消法来设计PI参数。这个方法的核心思想是:让PI控制器的零点抵消掉被控对象的极点。这样,闭环系统就降阶成一阶系统,好分析也好调。
具体步骤如下:
- 获取电机参数:定子电阻Rs、定子电感Ls(对于表贴式PMSM,Ld = Lq = Ls)。
- 计算电气时间常数:τe = Ls / Rs。
- 设定PI控制器的积分时间常数:Ti = τe。这样,PI控制器的零点 (s + 1/Ti) 就和被控对象的极点 (s + Rs/Ls) 对消了。
- 计算比例增益:Kp = ωcc × Ls。其中 ωcc 是前面选好的电流环带宽(rad/s)。
- 计算积分增益:Ki = Kp / Ti = ωcc × Rs。
你看,算出来其实很简单。但我在项目中遇到过一个问题:电机参数是变化的。电阻会随温度升高而变大,电感会随电流增大而饱和。所以,按常温下的参数算出来的PI值,在电机跑热了之后可能就不准了。
注意:零极点对消法依赖于精确的电机参数。如果参数不准,对消就不彻底,系统可能会出现低频振荡。我建议在计算时留一点余量——比如把Ti设得比τe稍大一点(10%~20%),这样即使参数漂移,系统也不容易振荡。
下面是一个参数计算的示例表格:
| 参数 | 符号 | 数值 | 单位 |
|---|---|---|---|
| 定子电阻 | Rs | 0.5 | Ω |
| 定子电感 | Ls | 2.5 | mH |
| 电气时间常数 | τe | 5.0 | ms |
| PWM频率 | fpwm | 10 | kHz |
| 期望带宽 | fbw | 600 | Hz |
| 带宽角频率 | ωcc | 3769.9 | rad/s |
| 比例增益 | Kp | 9.42 | V/A |
| 积分增益 | Ki | 1885.0 | V/(A·s) |
代码实现也很直接。下面是一个离散化后的PI控制器实现(使用后向差分法):
// 电流环PI控制器结构体
typedef struct {
float Kp; // 比例增益
float Ki; // 积分增益
float Ts; // 采样周期 (s)
float integral; // 积分累加值
float out_max; // 输出限幅上限
float out_min; // 输出限幅下限
} CurrentPI_Handle;
// PI控制器计算函数(带抗饱和)
float CurrentPI_Calc(CurrentPI_Handle *pi, float error) {
// 比例项
float p_out = pi->Kp * error;
// 积分项(累加)
pi->integral += pi->Ki * pi->Ts * error;
// 限幅积分项(抗饱和)
if (pi->integral > pi->out_max) {
pi->integral = pi->out_max;
} else if (pi->integral < pi->out_min) {
pi->integral = pi->out_min;
}
// 总输出
float output = p_out + pi->integral;
// 输出限幅
if (output > pi->out_max) {
output = pi->out_max;
} else if (output < pi->out_min) {
output = pi->out_min;
}
return output;
}
3.3 抗饱和策略——别让积分一直涨
积分饱和,是电流环最常遇到的坑。你想想看,当电流指令突然变大,PI输出很快就顶到PWM占空比上限了。这时候,误差还在,积分项还在往上累加——但输出已经限幅了,误差根本消不掉。等指令降下来,积分项里攒了一大堆"债",输出半天降不下来,电流就会过冲。
我曾经在一个项目中遇到过这种情况:电机启动时电流指令给到10A,实际电流才到8A就上不去了(母线电压不够)。结果积分项一路涨到天上去,等指令降到5A时,输出还卡在限幅值,电流过了好几百毫秒才降下来。嗯,那次之后,我再也不敢不做抗饱和了。
常用的抗饱和策略有几种:
- 积分限幅法:给积分项单独设一个限幅值,通常比输出限幅小一些。比如输出限幅是±100%,积分限幅可以设到±80%。这样即使输出饱和了,积分项也不会涨得太离谱。
- 积分冻结法:当输出达到限幅值时,停止积分累加。说白了就是"饱和了就别再积了"。实现起来最简单,效果也不错。
- 反计算法(Back-calculation):当输出饱和时,把实际输出和理想输出的差值反馈回积分项,把多余的积分"退回去"。这种方法动态响应最好,但需要多调一个反馈系数。
我推荐的做法:工程上最稳妥的是"积分限幅 + 积分冻结"组合。先给积分项设一个合理的限幅值(比如输出限幅的80%),然后在输出饱和时冻结积分。这样既简单又可靠,适合大多数工业应用。
下面这张图展示了电流环PI控制器的完整结构,包括抗饱和部分:
3.4 调参实战——从理论到波形
理论讲完了,我们来点实际的。假设你手头有一台PMSM,参数和上面表格一样。你按公式算出了Kp=9.42,Ki=1885。然后呢?
我建议的调参步骤:
- 先给一个小的阶跃指令:比如1A的电流阶跃。看电流响应波形。
- 观察上升时间:如果上升时间明显慢于 1/(2×fbw) ≈ 0.13ms,说明带宽没达到,可以适当增大Kp。
- 观察超调量:如果超调超过10%,说明积分项可能太强了。可以适当减小Ki,或者检查一下抗饱和策略是否生效。
- 观察稳态误差:如果稳态时电流有静差,说明积分增益不够大。可以适当增大Ki。
- 反复迭代:每次调一个参数,调完看波形。别同时调Kp和Ki,不然你都不知道是哪个引起的。
避坑指南:我曾经在调参时犯过一个低级错误——忘记检查电流采样是否对齐了PWM中心。结果电流波形上全是锯齿状的噪声,我还以为是PI参数不对,调了一整天。后来发现是采样时刻没对准。所以,调参之前,先确保硬件和采样没问题。
最后,送你一句话:电流环调好了,三环控制就成功了一半。别急着往上调速度环和位置环,先把电流环的阶跃响应调到让你满意为止。嗯,下一层的事,等电流环稳了再说。