2、小信号建模:状态空间平均法、传递函数推导
好,咱们进入正题。Buck变换器设计里,最核心的一步就是小信号建模。说白了,就是给这个开关电路找个“数学替身”,让我们能用经典控制理论去分析它、补偿它。
我刚开始做电源设计那会儿,总觉得建模是理论派干的事。直到有一次,我调一个12V转3.3V的Buck,环路怎么都不稳定,输出纹波大得吓人。后来老老实实把传递函数推了一遍,才发现是零点位置算错了。嗯,从那以后,我再也不敢跳过这一步了。
2.1 为什么需要小信号模型?
Buck变换器本质上是非线性系统——开关管一通一断,电路拓扑都在变。你想想看,直接用非线性系统去设计补偿器,那得多麻烦?
小信号建模的思路很简单:
- 先找一个稳定的直流工作点(比如输出5V,负载1A)
- 在这个点附近,把非线性关系线性化
- 得到一个线性时不变系统,也就是传递函数
这样,我们就可以用波特图、根轨迹这些经典工具了。我个人习惯用状态空间平均法,因为它物理意义清晰,推导过程也规范。
2.2 状态空间平均法——核心思想
状态空间平均法,是R.D. Middlebrook在1976年提出的。它的核心就一句话:在一个开关周期内,用平均值代替瞬时值。
具体怎么做呢?分三步:
- 列写两个子拓扑的状态方程——开关导通时一个方程,关断时另一个方程
- 加权平均——按占空比D加权,得到一个平均状态方程
- 小信号扰动——把变量写成直流+小信号的形式,分离出线性部分
你可能会问:为什么能平均?因为开关频率远高于控制环路带宽,在一个周期内,状态变量(电感电流、电容电压)的变化很小。这就是“小信号”的前提。
关键前提:开关频率 fsw >> 控制环路带宽 fc。一般要求 fsw > 10fc,否则平均模型就不准了。
2.3 Buck变换器的状态方程推导
咱们以连续导通模式(CCM)下的Buck为例。电路参数:输入Vin,输出Vo,电感L,电容C,负载R,开关管Q,二极管D。
2.3.1 开关导通阶段(0 ~ DTs)
开关管导通,二极管截止。电感两端电压为 Vin - Vo,电容向负载放电。
状态变量:x = [iL, vC]T
输入:u = Vin
输出:y = vo
导通状态方程:
diL/dt = (Vin - vo) / L
dvC/dt = (iL - vo/R) / C
写成矩阵形式:
ẋ = A1x + B1u
y = C1x + D1u
2.3.2 开关关断阶段(DTs ~ Ts)
开关管关断,二极管续流。电感两端电压为 -vo,电感电流通过二极管续流。
关断状态方程:
diL/dt = -vo / L
dvC/dt = (iL - vo/R) / C
矩阵形式:
ẋ = A2x + B2u
y = C2x + D2u
2.4 平均化与小信号扰动
现在,我们把两个子拓扑按占空比D加权平均:
平均状态方程:
ẋ = [D·A1 + (1-D)·A2]x + [D·B1 + (1-D)·B2]u
代入Buck的参数:
A = D·A1 + (1-D)·A2
B = D·B1 + (1-D)·B2
接下来,做小信号扰动。每个变量写成直流分量 + 小信号交流分量:
d = D + d̂
vin = Vin + v̂in
vo = Vo + v̂o
iL = IL + îL
代入平均方程,忽略二阶小项(d̂·v̂in这种),就得到小信号模型:
Buck变换器小信号状态方程:
d îL/dt = (D·v̂in + Vin·d̂ - v̂o) / L
d v̂o/dt = (îL - v̂o/R) / C
2.5 传递函数推导
有了小信号状态方程,拉普拉斯变换走起。假设输入扰动 v̂in = 0(只考虑占空比控制),得到:
s·L·îL(s) = Vin·d̂(s) - v̂o(s)
s·C·v̂o(s) = îL(s) - v̂o(s)/R
消去 îL,得到控制到输出的传递函数:
Gvd(s) = v̂o(s) / d̂(s) = Vin · (1 + s·RESR·C) / (s²·L·C + s·L/R + 1)
其中 RESR 是输出电容的等效串联电阻。
这个传递函数有几个关键特征:
- 直流增益: Vin(当 s→0 时)
- 双极点: 由LC滤波器产生,谐振频率 f0 = 1/(2π√(LC))
- 一个零点: 由电容ESR产生,零点频率 fz = 1/(2π·RESR·C)
实战小贴士: 我在项目中遇到过,很多人忽略ESR零点,结果补偿器设计出来相位裕度总是不够。实际上,ESR零点对高频相位有提升作用,千万别扔。如果用的是陶瓷电容(ESR很小),零点频率很高,可以近似忽略;但电解电容的ESR零点往往在几kHz到几十kHz,必须考虑。
2.6 一个完整的计算示例
咱们来算个实际例子。参数如下:
| 参数 | 符号 | 数值 |
|---|---|---|
| 输入电压 | Vin | 12 V |
| 输出电压 | Vo | 5 V |
| 电感 | L | 10 μH |
| 电容 | C | 100 μF |
| 电容ESR | RESR | 50 mΩ |
| 负载电阻 | R | 5 Ω |
| 开关频率 | fsw | 200 kHz |
代入公式:
直流增益 = Vin = 12 → 21.58 dB
LC谐振频率:
f0 = 1/(2π√(10μ·100μ)) = 1/(2π·3.16e-5) ≈ 5.03 kHz
ESR零点频率:
fz = 1/(2π·0.05·100μ) = 1/(3.14e-5) ≈ 31.8 kHz
你看,双极点在5kHz,零点在31.8kHz。这意味着在5kHz到31.8kHz之间,幅频特性以-40dB/dec下降,相位接近-180°。如果不加补偿,环路肯定不稳定。
注意: 这个传递函数是在CCM下推导的。如果负载很轻,进入DCM(断续导通模式),传递函数会变成单极点系统,增益也降低。我曾经在一个低功耗项目中踩过这个坑——轻载时环路啸叫,查了半天才发现是模式变了。所以,设计前一定要确认你的工作范围是否始终在CCM。
2.7 用Python验证一下
理论推导完了,咱们用Python画个波特图,看看长什么样:
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
# 参数
Vin = 12
L = 10e-6
C = 100e-6
R_esr = 0.05
R_load = 5
# 传递函数:Gvd(s) = Vin * (1 + s*R_esr*C) / (s^2*L*C + s*L/R_load + 1)
num = [Vin * R_esr * C, Vin] # 分子系数
den = [L*C, L/R_load, 1] # 分母系数
sys = signal.TransferFunction(num, den)
# 计算频率响应
f = np.logspace(1, 6, 1000) # 10Hz ~ 1MHz
w = 2 * np.pi * f
w, mag, phase = signal.bode(sys, w)
# 画图
plt.figure(figsize=(10, 6))
plt.subplot(2, 1, 1)
plt.semilogx(f, mag)
plt.grid(True, which='both', linestyle='--')
plt.ylabel('增益 (dB)')
plt.title('Buck变换器 Gvd(s) 波特图')
plt.subplot(2, 1, 2)
plt.semilogx(f, phase)
plt.grid(True, which='both', linestyle='--')
plt.ylabel('相位 (°)')
plt.xlabel('频率 (Hz)')
plt.tight_layout()
plt.show()
运行这段代码,你会看到:低频增益约21.5dB,在5kHz附近出现-40dB/dec的滚降,相位从0°开始下降,在谐振点附近接近-180°。到了31.8kHz,零点开始起作用,相位回升,滚降变回-20dB/dec。
我的习惯: 每次设计新项目,我都会先用Python跑一下开环传递函数,看看谐振频率、零点位置、相位裕度大概在什么范围。这样心里有个底,再去调补偿器参数,效率高很多。你也不妨试试。
2.8 小结
这一节我们干了三件事:
- 理解了状态空间平均法的物理意义——用周期平均代替瞬时值
- 推导了Buck变换器在CCM下的小信号模型和传递函数
- 用实际参数算了个例子,并用Python验证了频率特性
有了这个传递函数,下一章我们就可以设计补偿器了。说白了,补偿就是给这个“天生不稳定”的LC双极点系统,加个“拐杖”,让它走稳了。
嗯,今天就到这儿。记住一句话:模型是工具,不是目的。推导过程可以忘,但物理意义要刻在脑子里——双极点来自LC,零点来自ESR,直流增益就是输入电压。下次调环路时,你自然就知道该动哪个参数了。