电流环的数学模型: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 本章知识体系总览
下面这张图把本章的核心逻辑串起来了:
这张图把从连续域到离散域再到代码实现的完整链路都画出来了。你写代码的时候,脑子里要有这张图,就知道每一步在干什么。
2.9 小结
这一章我们干了三件事:
- 建立了PI控制器的连续域数学模型
- 理解了离散化的必要性
- 掌握了双线性变换和后向欧拉两种工程实现方法