3、电流环PI控制器设计:连续域PI设计、离散化方法、抗积分饱和、PI参数整定

好,咱们进入电流环设计的核心环节——PI控制器。说实话,电流环是整个矢量控制的“心脏”,它要是跳不好,后面的速度环、位置环全是白搭。我这些年调过的电机,十有八九的问题都出在电流环上。所以这一节,咱们把PI控制器的来龙去脉彻底讲透。

3.1 连续域PI设计:从原理到传递函数

先看连续域。PI控制器的表达式大家都很熟:

u(t) = Kp * e(t) + Ki * ∫ e(τ) dτ

写成传递函数形式:

Gc(s) = Kp + Ki / s

这里Kp是比例增益,Ki是积分增益。比例项负责“当下”,误差一出现就立刻响应;积分项负责“过去”,把累积的误差慢慢消除。

我个人习惯把PI控制器写成另一种形式:

Gc(s) = Kp * (1 + 1 / (Ti * s))

其中Ti = Kp / Ki,叫积分时间常数。为什么用这个形式?因为Ti的物理意义更直观——它告诉你积分作用要花多长时间才能追上比例作用。Ti越小,积分越猛。

在电流环里,被控对象是电机的电气方程:

Gp(s) = 1 / (Ls * s + Rs)

Ls是电感,Rs是电阻。这是个一阶惯性环节。用PI控制器去补偿它,理论上可以实现零极点对消。把PI的零点放在被控对象的极点位置:

Ti = Ls / Rs

这样闭环传递函数就变成了一个一阶低通滤波器:

Gcl(s) = 1 / (1 + s / ωc)

ωc = Kp / Ls,就是闭环带宽。你想要多快的电流响应,就设多大的ωc。但注意,带宽受限于PWM开关频率和采样频率,一般取开关频率的1/10到1/20。

关键点:连续域设计只是理论起点。实际工程中,电感电阻参数会变,零极点对消不可能完美。但用它作为初始值,再微调,效率高得多。

3.2 离散化方法:三种方式,各有千秋

连续域设计完了,得搬到数字芯片里跑。这就涉及离散化。我见过不少新手直接拿连续域的Kp、Ki往代码里塞,结果跑起来振荡得一塌糊涂。为什么?因为离散化方法没选对,或者根本没做离散化。

常用的离散化方法有三种:前向欧拉、后向欧拉、双线性变换(也叫Tustin变换)。

3.2.1 前向欧拉法

用差分近似微分:

s ≈ (z - 1) / Ts

代入PI传递函数,得到差分方程:

u[k] = u[k-1] + Kp * (e[k] - e[k-1]) + Ki * Ts * e[k-1]

这个方法最简单,计算量最小。但我得提醒你——它不稳定!前向欧拉会把s平面的稳定区域映射到z平面一个偏移的圆上。当Ts较大或Kp较大时,系统很容易发散。我在早期一个项目里吃过这个亏,电流环莫名其妙振荡,查了两天才发现是离散化方法的问题。

警告:前向欧拉法只适用于采样频率远高于系统带宽的场合。一般不建议在电流环中使用,除非你非常确定参数范围。

3.2.2 后向欧拉法

s ≈ (z - 1) / (z * Ts)

差分方程:

u[k] = u[k-1] + Kp * (e[k] - e[k-1]) + Ki * Ts * e[k]

注意看,积分项用的是当前误差e[k],而不是前一个e[k-1]。后向欧拉是隐式方法,稳定性比前向欧拉好得多。它会把s平面的左半平面映射到z平面一个半径为1/2的圆内,但至少不会出现前向欧拉那种“越界”的问题。

我个人在大多数项目中都用后向欧拉。它计算量只比前向欧拉多一点点,但稳定性好很多。你想想看,为了那一点点计算量去冒不稳定的风险,不值得。

3.2.3 双线性变换(Tustin变换)

s ≈ (2 / Ts) * (z - 1) / (z + 1)

差分方程稍微复杂一点:

u[k] = u[k-1] + Kp * (e[k] - e[k-1]) + (Ki * Ts / 2) * (e[k] + e[k-1])

双线性变换的精度最高,它把s平面的左半平面精确映射到z平面的单位圆内。也就是说,连续域稳定的系统,离散后一定稳定。而且频率畸变可以通过预畸变补偿。

但代价是什么?计算量稍大,而且高频段会有频率畸变。对于电流环这种带宽相对较低的场合,其实影响不大。

方法稳定性精度计算量推荐场景
前向欧拉最小几乎不推荐
后向欧拉大多数电流环
双线性变换最好高精度要求

我的建议:如果你刚开始做电流环,直接用后向欧拉。等系统跑稳了,再考虑换成双线性变换提升精度。别一上来就追求“最完美”,工程上稳定压倒一切。

3.3 抗积分饱和:别让积分“撑死”

积分饱和,说白了就是积分项累积了太多误差,导致输出饱和后积分还在涨。等误差反向时,积分项需要很长时间才能“消化”掉,系统响应变得迟钝。

我遇到过最夸张的一次,电机启动时积分项累积到输出限幅值的3倍,等电机转起来后,积分项花了将近1秒才退回来。那一秒里电机就像“抽风”一样,忽快忽慢。

常用的抗积分饱和方法有两种:

3.3.1 条件积分法

只有满足特定条件时才积分:

if (输出未饱和) {
    正常积分;
} else {
    停止积分;
}

或者更精细一点:

if (输出饱和 && 误差与输出同号) {
    停止积分;
} else {
    正常积分;
}

这个方法简单粗暴,但有个问题:停止积分后,系统会变成纯比例控制,稳态误差可能消不掉。

3.3.2 反计算法(Back-Calculation)

这是我在实际项目中最喜欢的方法。思路是:当输出饱和时,把超出部分“反馈”回积分器,让积分项自动退回来。

u_sat = saturate(u, limit);
e_sat = u_sat - u;  // 饱和误差
积分项 += Ki * e * Ts - Kc * e_sat * Ts;

Kc是反计算增益,一般取1/Kp左右。这个方法的好处是积分项能平滑退出饱和,不会出现“急刹车”的感觉。

经验值:反计算增益Kc我通常取1/Kp到2/Kp之间。太小了退饱和慢,太大了积分项会被过度抑制。调的时候可以观察电流阶跃响应,看退出饱和时有没有过冲。

3.4 PI参数整定:从理论到实战

参数整定是电流环设计的“最后一公里”。理论算出来的参数只能当起点,最终还得靠调试。

3.4.1 理论计算法

基于前面说的零极点对消:

Kp = Ls * ωc
Ki = Rs * ωc

ωc取多少?我一般从开关频率的1/20开始试。比如10kHz的PWM,ωc先设500 rad/s(约80Hz)。然后慢慢往上加,直到电流环出现轻微振荡,再回调20%。

3.4.2 工程调试法

如果你没有准确的电机参数,或者参数变化很大,可以用这个方法:

  1. 先调Kp:给一个小的阶跃指令,增大Kp直到电流出现振荡,然后回调到振荡幅度的60%-70%。
  2. 再调Ki:保持Kp不变,增大Ki直到稳态误差消除,但不要引入低频振荡。
  3. 微调:同时微调Kp和Ki,观察电流响应速度和超调量。

我曾经调试一个永磁同步电机,电感参数随电流变化很大(磁饱和)。理论算出来的Kp在轻载时刚好,重载时却振荡。后来我用了增益调度——根据电流大小查表调整Kp和Ki,才把问题解决。

注意:调试时一定要带负载!空载调出来的参数,带载后很可能不能用。因为电机的电气时间常数和机械负载是耦合的,空载时电流环看起来稳,带载后可能振荡。

3.4.3 离散域参数转换

连续域的Kp、Ki算好后,要转换成离散域的系数。以后向欧拉为例:

Kp_d = Kp
Ki_d = Ki * Ts

代码实现:

// 电流环PI控制器(后向欧拉离散化 + 抗积分饱和)
float current_pi_controller(float ref, float fb, float *integral, float limit) {
    float error = ref - fb;
    float output;
    
    // 比例项
    float prop = Kp * error;
    
    // 积分项(后向欧拉)
    *integral += Ki * Ts * error;
    
    // 抗积分饱和(反计算法)
    output = prop + *integral;
    if (output > limit) {
        *integral -= Kc * Ts * (output - limit);
        output = limit;
    } else if (output < -limit) {
        *integral -= Kc * Ts * (output + limit);
        output = -limit;
    }
    
    return output;
}

这段代码我用了很多年,基本没出过问题。你拿去用的时候,记得根据实际采样周期Ts调整Ki_d的值。

最后说一句:电流环PI设计没有“万能公式”。每个电机、每个驱动器都有自己的脾气。理论给你的是方向,调试给你的是答案。多试、多测、多记录,慢慢你就会有感觉。

好了,电流环PI控制器就讲到这里。下一节咱们进入电流环的数字化实现,包括采样时序、PWM更新策略这些实战内容。