2. 数字电源被控对象建模
各位工程师朋友,咱们直接进入正题。数字电源控制的核心,说白了就是三个字:调参数。但调参数不能靠瞎蒙,你得先搞明白背后的理论。这一章我会把PID原理、传递函数、零极点还有Z变换这些基础概念,用我实际项目中的经验串起来讲。
嗯,先别被这些名词吓到。你想想看,数字电源本质上就是个“采样-计算-输出”的循环。理论就是帮你理解这个循环里每个环节怎么配合的。
本章核心脉络:从连续域的PID公式 → 传递函数与零极点分析 → 离散化方法(Z变换),最终落到数字控制器能实现的差分方程上。
2.1 PID控制原理——从公式到直觉
PID,比例-积分-微分。教科书上的公式长这样:
u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt
但我更喜欢这么理解:
- 比例(P):看现在错多少,直接拉回来。我习惯叫它“大力出奇迹”。
- 积分(I):看过去一直错多少,慢慢消除静差。说白了就是“算旧账”。
- 微分(D):预测未来会错多少,提前刹车。相当于“踩一脚预防”。
我在项目中遇到过一件事:一个Buck电路,空载时输出电压稳得很,一带载就掉下去2%。调大Kp,掉压少了但开始震荡。后来加了点Ki,静差没了,但响应变慢了。最后加了少量Kd,才把动态响应提上来。你看,三个参数各管一摊,谁也替不了谁。
个人经验:刚开始调PID时,先把Ki和Kd设成0,只调Kp让系统稳定但不震荡。然后加Ki消除静差,最后加Kd改善动态。这个顺序我用了十年,基本没翻过车。
2.2 传递函数与零极点——系统的“基因”
传递函数,说白了就是输出和输入的比值,用拉普拉斯变换表示。你想想看,一个电源系统,输入是占空比,输出是电压,中间那个关系就是传递函数。
G(s) = Vout(s) / D(s)
零点和极点是什么?我这么跟你讲:
- 极点:让分母等于0的s值。它决定了系统的稳定性——极点如果在右半平面,系统必炸。我在调试一个Boost PFC时遇到过,极点跑到右半平面去了,输出电压直接发散,吓得我赶紧断电。
- 零点:让分子等于0的s值。它影响系统的动态响应,比如超调量、上升时间。
嗯,这里要注意:零极点图是判断系统稳定性的最快方法。你画出来一看,所有极点都在左半平面,基本稳了;但凡有一个在右边,赶紧改参数。
避坑指南:我曾经在数字电源项目里,连续域仿真跑得好好的,一上硬件就炸。后来发现是采样频率太低,导致离散化后的极点位置偏移了。记住:连续域稳定不代表离散域稳定,采样频率必须足够高。
2.3 离散化方法——Z变换与差分方程
数字控制器不能直接处理连续信号,得把连续域的传递函数变成离散域的差分方程。Z变换就是干这个的。
常用的离散化方法有三种,我列个表对比一下:
| 方法 | 映射关系 | 特点 | 我推荐的使用场景 |
|---|---|---|---|
| 前向欧拉 | s = (z-1)/Ts | 简单,但可能不稳定 | 很少用,除非采样率极高 |
| 后向欧拉 | s = (z-1)/(z*Ts) | 稳定,精度一般 | 快速原型验证 |
| 双线性变换(Tustin) | s = (2/Ts)*(z-1)/(z+1) | 精度高,频率畸变需预矫正 | 数字电源首选 |
我个人习惯用双线性变换。为什么?因为它把s平面的左半平面映射到z平面的单位圆内,稳定性有保证。而且精度比欧拉法高一个档次。
举个例子,一个简单的积分器 G(s) = 1/s,用双线性变换离散化:
G(z) = (Ts/2) * (z+1)/(z-1)
对应的差分方程:
y[n] = y[n-1] + (Ts/2) * (x[n] + x[n-1])
你看,这就是数字控制器里实际跑的代码。每次中断来的时候,算一次这个式子,输出占空比。
关键点:离散化不是随便选个方法就行的。采样频率和控制器带宽的比值(fs/fc)决定了离散化误差的大小。我一般要求 fs/fc ≥ 20,这时候双线性变换的误差可以忽略。
2.4 从传递函数到代码——实战步骤
好了,理论讲完了,咱们串一下实际怎么干:
- 建立连续域模型:写出电源主电路的传递函数 G(s)。比如Buck电路的小信号模型。
- 设计连续域控制器:根据性能指标(带宽、相位裕度)设计 C(s)。
- 离散化:用双线性变换把 C(s) 变成 C(z)。
- 写差分方程:从 C(z) 反推出 y[n] = ... 的形式。
- 代码实现:在中断服务函数里跑这个差分方程。
我记得第一次完整走完这个流程,是在一个48V转12V的DC-DC项目上。从建模到代码跑通,花了三天。但后面调参数只用了半天,因为理论已经把范围缩得很小了。
小技巧:写差分方程时,先把所有系数算成定点数(Q格式),避免浮点运算拖慢中断。我一般用Q15或Q31,具体看你的MCU位宽。