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控制器的零点抵消掉被控对象的极点。这样,闭环系统就降阶成一阶系统,好分析也好调。

具体步骤如下:

  1. 获取电机参数:定子电阻Rs、定子电感Ls(对于表贴式PMSM,Ld = Lq = Ls)。
  2. 计算电气时间常数:τe = Ls / Rs。
  3. 设定PI控制器的积分时间常数:Ti = τe。这样,PI控制器的零点 (s + 1/Ti) 就和被控对象的极点 (s + Rs/Ls) 对消了。
  4. 计算比例增益:Kp = ωcc × Ls。其中 ωcc 是前面选好的电流环带宽(rad/s)。
  5. 计算积分增益: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控制器的完整结构,包括抗饱和部分:

电流环PI控制器结构图(含抗饱和) 电流环PI控制器结构图(含抗饱和) i* i_fb Σ + - Kp × e Ki × ∫e 积分限幅 ±80% 饱和检测 输出是否限幅 Σ 输出限幅 ±100% V* 冻结积分 说明: 1. 误差 e = i* - i_fb,分别送入比例和积分路径。 2. 积分路径先经过积分限幅(防止积分项过大),再与比例项求和。 3. 饱和检测模块监控输出是否达到限幅值。如果饱和,则冻结积分累加。 4. 最终输出经过输出限幅后,作为电压指令 V* 送入 SVPWM 模块。 5. 虚线表示抗饱和反馈路径:饱和时冻结积分,防止积分饱和。

3.4 调参实战——从理论到波形

理论讲完了,我们来点实际的。假设你手头有一台PMSM,参数和上面表格一样。你按公式算出了Kp=9.42,Ki=1885。然后呢?

我建议的调参步骤:

  1. 先给一个小的阶跃指令:比如1A的电流阶跃。看电流响应波形。
  2. 观察上升时间:如果上升时间明显慢于 1/(2×fbw) ≈ 0.13ms,说明带宽没达到,可以适当增大Kp。
  3. 观察超调量:如果超调超过10%,说明积分项可能太强了。可以适当减小Ki,或者检查一下抗饱和策略是否生效。
  4. 观察稳态误差:如果稳态时电流有静差,说明积分增益不够大。可以适当增大Ki。
  5. 反复迭代:每次调一个参数,调完看波形。别同时调Kp和Ki,不然你都不知道是哪个引起的。

避坑指南:我曾经在调参时犯过一个低级错误——忘记检查电流采样是否对齐了PWM中心。结果电流波形上全是锯齿状的噪声,我还以为是PI参数不对,调了一整天。后来发现是采样时刻没对准。所以,调参之前,先确保硬件和采样没问题。

最后,送你一句话:电流环调好了,三环控制就成功了一半。别急着往上调速度环和位置环,先把电流环的阶跃响应调到让你满意为止。嗯,下一层的事,等电流环稳了再说。