2、小信号建模:状态空间平均法、传递函数推导

好,咱们进入正题。Buck变换器设计里,最核心的一步就是小信号建模。说白了,就是给这个开关电路找个“数学替身”,让我们能用经典控制理论去分析它、补偿它。

我刚开始做电源设计那会儿,总觉得建模是理论派干的事。直到有一次,我调一个12V转3.3V的Buck,环路怎么都不稳定,输出纹波大得吓人。后来老老实实把传递函数推了一遍,才发现是零点位置算错了。嗯,从那以后,我再也不敢跳过这一步了。

2.1 为什么需要小信号模型?

Buck变换器本质上是非线性系统——开关管一通一断,电路拓扑都在变。你想想看,直接用非线性系统去设计补偿器,那得多麻烦?

小信号建模的思路很简单:

  • 先找一个稳定的直流工作点(比如输出5V,负载1A)
  • 在这个点附近,把非线性关系线性化
  • 得到一个线性时不变系统,也就是传递函数

这样,我们就可以用波特图、根轨迹这些经典工具了。我个人习惯用状态空间平均法,因为它物理意义清晰,推导过程也规范。

2.2 状态空间平均法——核心思想

状态空间平均法,是R.D. Middlebrook在1976年提出的。它的核心就一句话:在一个开关周期内,用平均值代替瞬时值

具体怎么做呢?分三步:

  1. 列写两个子拓扑的状态方程——开关导通时一个方程,关断时另一个方程
  2. 加权平均——按占空比D加权,得到一个平均状态方程
  3. 小信号扰动——把变量写成直流+小信号的形式,分离出线性部分

你可能会问:为什么能平均?因为开关频率远高于控制环路带宽,在一个周期内,状态变量(电感电流、电容电压)的变化很小。这就是“小信号”的前提。

关键前提:开关频率 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,直流增益就是输入电压。下次调环路时,你自然就知道该动哪个参数了。