电流环的数学模型:PI控制器的传递函数与离散化方法

好,咱们接着聊。上一章我们把FOC电流环的物理基础打了个底,这一章就该上真家伙了——PI控制器的数学模型。

说实话,我刚入行那会儿,总觉得PI控制器不就是个比例加积分嘛,有啥好研究的?直到我在一个伺服项目里,电流环怎么调都抖,最后发现是离散化方法选错了。嗯,从那以后我再也不敢小看这部分了。

2.1 连续域下的PI控制器传递函数

先看最经典的表达式。在连续域(s域)里,PI控制器的传递函数长这样:

G(s) = Kp + Ki / s

或者写成更工程化的形式:

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

这里:

  • Kp —— 比例增益,决定响应速度
  • Ki —— 积分增益,消除稳态误差
  • Ti —— 积分时间常数,Ti = Kp / Ki

我个人习惯用第一种形式,因为Kp和Ki在代码里就是两个直接可调的系数,调试时更直观。

关键理解:比例项负责“推”,积分项负责“磨”。比例项让电流快速逼近目标,积分项把最后那点偏差一点点吃掉。两者缺一不可。

2.2 为什么必须离散化?

你想想看,我们的MCU是数字芯片,它只能处理离散的采样点,没法直接算连续的积分。所以必须把连续域的PI控制器,转换成离散域的差分方程。

这个过程就叫离散化。说白了,就是用数字世界的“累加”去模拟模拟世界的“积分”。

我在一个48V低压驱动项目里遇到过一个问题:采样频率10kHz,PI参数明明算好了,但实际跑起来电流纹波特别大。查了半天,发现是离散化方法太粗糙,导致相位裕度不够。你看,离散化选不对,再好的参数也白搭。

2.3 三种常用的离散化方法

工程上常用的离散化方法主要有三种。我按推荐程度排个序:

方法 映射关系 精度 稳定性 工程推荐度
前向欧拉 s = (z - 1) / Ts 低 可能不稳定 不推荐
后向欧拉 s = (z - 1) / (z * Ts) 中等 稳定 可用
双线性变换(Tustin) s = (2/Ts) * (z-1)/(z+1) 高 稳定 强烈推荐

我的建议:只要你的MCU算力够,优先用双线性变换。前向欧拉我基本只在仿真里用,从来不敢上产品。

2.4 双线性变换的推导与实现

双线性变换的公式是:

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

把它代入PI控制器的传递函数:

G(z) = Kp + Ki * (Ts / 2) * (z + 1) / (z - 1)

整理后得到差分方程:

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

写成代码就是:

// 双线性变换离散化PI控制器
float pi_tustin(float error, float *integral, float Kp, float Ki, float Ts)
{
    float output;
    static float error_prev = 0.0f;
    
    // 计算当前输出
    output = *integral + (Kp + Ki * Ts / 2.0f) * error 
             + (-Kp + Ki * Ts / 2.0f) * error_prev;
    
    // 更新积分项和误差历史
    *integral = output;
    error_prev = error;
    
    return output;
}

注意:这段代码里的*integral实际上存储的是上一拍的输出值u(k-1),不是传统意义上的积分累加。这是双线性变换的特点,别搞混了。

2.5 后向欧拉法——备选方案

如果MCU算力紧张,或者采样频率特别高(比如超过50kHz),双线性变换的计算量可能偏大。这时候可以用后向欧拉法:

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

代入后得到:

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

代码实现更简洁:

// 后向欧拉离散化PI控制器
float pi_backward_euler(float error, float *integral, float Kp, float Ki, float Ts)
{
    static float error_prev = 0.0f;
    
    // 积分累加
    *integral += Ki * Ts * error;
    
    // 比例+积分输出
    float output = Kp * error + *integral;
    
    // 更新误差历史
    error_prev = error;
    
    return output;
}

后向欧拉的好处是结构简单,积分项物理意义明确。但精度比双线性变换差一些,尤其在低频段会有相位滞后。

2.6 离散化方法对比——我的实战经验

我整理了一个对比表,方便你选型时参考:

场景 推荐方法 原因
通用伺服驱动(8-16kHz) 双线性变换 精度高,相位特性好
高速主轴(20-50kHz) 后向欧拉 计算量小,实时性好
低成本MCU(算力受限) 后向欧拉 代码简单,RAM占用少
仿真/离线分析 双线性变换 最接近连续系统行为

避坑指南:我曾经在一个项目里用了前向欧拉法,结果在积分增益稍大时系统直接发散。后来换成后向欧拉就稳了。所以——前向欧拉法,请直接拉黑。

2.7 离散化对参数整定的影响

这一点很多人会忽略。同样的Kp、Ki值,用不同的离散化方法,实际效果是不一样的。

举个例子:

  • 双线性变换下,Kp = 0.5, Ki = 100 表现良好
  • 换成后向欧拉,同样的参数可能就会有过冲

为什么会这样?因为离散化方法改变了控制器的频率响应特性。双线性变换在低频段更接近连续系统,而后向欧拉会引入额外的相位滞后。

所以我的习惯是:先选定离散化方法,再整定参数。不要换来换去,否则你永远找不到规律。

2.8 本章知识体系总览

下面这张图把本章的核心逻辑串起来了:

电流环PI控制器数学模型与离散化 连续域 PI 控制器 G(s) = Kp + Ki/s 离散化 离散化方法选择 前向欧拉(不推荐) 后向欧拉(备选) 双线性变换(推荐) 离散域 PI u(k) = ... 代码实现:C语言定点/浮点PI控制器 参数整定:Kp、Ki 与采样周期 Ts 的匹配 ⚠ 避坑:离散化方法必须与采样频率匹配,前向欧拉慎用

这张图把从连续域到离散域再到代码实现的完整链路都画出来了。你写代码的时候,脑子里要有这张图,就知道每一步在干什么。

2.9 小结

这一章我们干了三件事:

  1. 建立了PI控制器的连续域数学模型
  2. 理解了离散化的必要性
  3. 掌握了双线性变换和后向欧拉两种工程实现方法