4. 建模与仿真:功率级小信号建模、数字控制器建模、MATLAB/Simulink仿真实践

说到数字电源的稳定性验证,我个人的习惯是:先建模,再仿真,最后才上板。很多工程师喜欢直接搭电路调参数,觉得建模太理论、太麻烦。嗯,我以前也这么干过,结果调了三天三夜,环路还是不稳定。后来老老实实把模型建出来,仿真跑一遍,问题根源一目了然。

这一章,我们就来聊聊功率级的小信号建模、数字控制器的建模方法,以及怎么用 MATLAB/Simulink 把这些模型跑起来。

4.1 功率级小信号建模

功率级建模,说白了就是把你电源的“物理特性”用数学公式描述出来。我常用的方法是状态空间平均法,它特别适合 Buck、Boost、Buck-Boost 这类 DC-DC 变换器。

4.1.1 状态空间平均法

为什么叫“平均”?因为开关管一直在开和关之间切换,电路结构也在变。我们取一个开关周期内的平均值,把非线性系统近似成线性系统。这样就能用传递函数来分析它了。

以 Buck 变换器为例,它的状态变量是电感电流 \( i_L \) 和输出电压 \( v_o \)。在连续导通模式(CCM)下,我们可以写出两个状态方程:

  • 开关管导通时(\( 0 \le t < dT_s \)):
L * di_L/dt = V_in - v_o
C * dv_o/dt = i_L - v_o/R
  • 开关管关断时(\( dT_s \le t < T_s \)):
L * di_L/dt = -v_o
C * dv_o/dt = i_L - v_o/R

然后,我们对这两个状态方程做加权平均,得到平均模型。再引入小信号扰动(比如输入电压扰动 \( \hat{v}_{in} \)、占空比扰动 \( \hat{d} \)),忽略高阶小项,就能得到小信号传递函数。

核心结论: Buck 变换器从控制到输出的传递函数 \( G_{vd}(s) \) 为:

G_vd(s) = V_in * (1 + s*R_c*C) / (s²*L*C + s*(L/R + R_c*C) + 1)

其中 \( R_c \) 是输出电容的等效串联电阻(ESR)。

这个公式里有一个零点(由 ESR 引起)和两个极点。我在项目中遇到过,如果电容 ESR 太小,零点频率会很高,相位裕度可能不够。这时候就需要在补偿器里加一个零点来抵消。

4.1.2 不同拓扑的传递函数对比

不同的拓扑,传递函数长得不一样。我整理了一个表格,方便你对比:

拓扑 控制到输出 \( G_{vd}(s) \) 特点
Buck \( V_{in} \cdot \frac{1 + sR_cC}{s^2LC + s(\frac{L}{R} + R_cC) + 1} \) 二阶系统,右半平面无零点
Boost \( \frac{V_{in}}{(1-D)^2} \cdot \frac{1 - s\frac{L}{(1-D)^2R}}{1 + s\frac{L}{(1-D)^2R} + s^2\frac{LC}{(1-D)^2}} \) 有一个右半平面零点(RHPZ),限制带宽
Buck-Boost \( \frac{V_{in}}{(1-D)^2} \cdot \frac{1 - s\frac{DL}{(1-D)^2R}}{1 + s\frac{L}{(1-D)^2R} + s^2\frac{LC}{(1-D)^2}} \) 同样有 RHPZ,且更复杂

注意: Boost 和 Buck-Boost 的右半平面零点(RHPZ)是限制环路带宽的关键因素。我曾经在一个 48V 转 12V 的 Boost 项目中,因为没考虑 RHPZ,把穿越频率设得太高,结果负载突变时输出电压振荡了很久。后来把带宽降到 RHPZ 频率的 1/5 以下,问题才解决。

4.2 数字控制器建模

功率级模型建好了,接下来是数字控制器。数字控制器和模拟控制器最大的区别在于:它有延时。采样、计算、PWM 更新都需要时间,这些延时会影响相位裕度。

4.2.1 数字控制器的结构

典型的数字控制器包括三个部分:

  • ADC 采样:把模拟电压/电流转换成数字量。
  • 补偿器(数字滤波器):对误差信号进行运算,生成控制量。
  • 数字 PWM(DPWM):把控制量转换成占空比信号。

补偿器通常用 IIR 或 FIR 滤波器实现。我个人偏爱 IIR,因为它可以用较少的阶数实现较高的增益。常用的补偿器类型有:

类型 传递函数(z 域) 用途
PI 控制器 \( K_p + \frac{K_i T_s}{1 - z^{-1}} \) 消除稳态误差
PID 控制器 \( K_p + \frac{K_i T_s}{1 - z^{-1}} + \frac{K_d}{T_s}(1 - z^{-1}) \) 提高动态响应
双极点-双零点 \( \frac{(z - z_1)(z - z_2)}{(z - p_1)(z - p_2)} \) 灵活补偿,适合复杂系统

4.2.2 延时建模

数字控制器的延时主要来自:

  1. 采样延时:ADC 转换需要时间,通常为 1~2 个时钟周期。
  2. 计算延时:补偿器运算需要时间,通常为 1 个开关周期。
  3. PWM 更新延时:DPWM 模块在下一个周期开始时才更新占空比。

总延时通常为 1.5~2 个开关周期。在 s 域中,延时可以近似为 \( e^{-sT_d} \),其中 \( T_d \) 是总延时。这个延时会在高频段引入额外的相位滞后,降低相位裕度。

我的经验: 在设计数字控制器时,我会把延时造成的相位损失提前算进去。比如,如果开关频率是 100 kHz,延时 2 个周期(20 μs),那么在穿越频率处(比如 10 kHz),延时带来的相位滞后是 \( 360° \times 10k \times 20μ = 72° \)。这意味着你的补偿器需要提供足够的相位提升。

4.3 MATLAB/Simulink 仿真实践

理论讲完了,我们来点实际的。我用 MATLAB/Simulink 做数字电源仿真已经有七八年了,下面是我常用的步骤。

4.3.1 搭建功率级模型

Simulink 里有现成的电力电子模块,比如 MOSFET、二极管、电感、电容。我习惯用 Simscape Electrical 工具箱来搭建功率级模型。这样可以直接用物理模型,不需要自己推导微分方程。

举个例子,一个 Buck 变换器的 Simulink 模型包括:

  • 直流电源(DC Voltage Source)
  • MOSFET 和二极管(MOSFET / Diode)
  • 电感和电容(Inductor / Capacitor)
  • 负载电阻(Series RLC Branch)
  • PWM 信号源(PWM Generator)

把这些模块拖出来,连好线,设置好参数(比如电感值 10 μH,电容值 100 μF,开关频率 100 kHz),一个基本的功率级模型就搭好了。

4.3.2 数字控制器实现

数字控制器可以用 Discrete Filter 模块或 MATLAB Function 模块来实现。我推荐用 Discrete Filter,因为它更直观,而且支持直接输入 z 域传递函数。

比如,一个 PI 控制器的 z 域传递函数是:

H(z) = K_p + K_i * T_s / (1 - z^{-1})

在 Discrete Filter 模块中,设置分子系数为 [K_p + K_i*T_s, -K_p],分母系数为 [1, -1] 即可。

关键点: 别忘了在控制器后面加一个 Unit Delay 模块,用来模拟计算延时。这个延时对相位裕度影响很大,不能忽略。

4.3.3 仿真与结果分析

仿真跑起来后,我通常会看三个东西:

  1. 时域响应:启动过程、负载突变时的输出电压波形。
  2. 频域响应:用 Linear Analysis Tool 提取开环传递函数的 Bode 图。
  3. 稳定性指标:相位裕度(PM)和增益裕度(GM)。

下面是一个典型的仿真结果分析流程:

步骤 操作 预期结果
1 设置 PI 参数 \( K_p = 0.5, K_i = 1000 \) 输出电压稳定,但可能有超调
2 运行 Linear Analysis,查看 Bode 图 穿越频率约 5 kHz,相位裕度 45°
3 调整 \( K_p \) 增大到 1.0 穿越频率提高到 8 kHz,但相位裕度降到 30°
4 增加一个零点补偿,重新仿真 相位裕度恢复到 55°,动态响应改善

我曾经在一个项目中,仿真时相位裕度只有 20°,但我觉得“差不多就行了”,结果上板测试时,负载跳变导致输出电压振荡了 5 个周期才稳定。从那以后,我坚持仿真时相位裕度至少做到 45°,增益裕度大于 10 dB。

4.4 本章知识体系

为了让你更直观地理解本章的知识结构,我画了一张流程图:

数字电源建模与仿真知识体系 数字电源建模与仿真知识体系 功率级小信号建模 数字控制器建模 MATLAB/Simulink仿真 状态空间平均法 传递函数推导 补偿器设计(IIR) 延时建模 模型搭建 结果分析 稳定性验证:相位裕度 > 45°,增益裕度 > 10 dB 上板调试,一次通过 说明:建模是基础,仿真是验证手段,最终目标是上板一次通过,减少反复调试的时间成本。

这张图把本章的知识点串起来了。从功率级建模到控制器建模,再到仿真验证,每一步都有对应的工具和方法。你想想看,如果每个环节都做到位,上板调试时还会手忙脚乱吗?

我的建议: 刚开始做数字电源设计时,不要急着上板。先在 Simulink 里把模型跑通,把参数调好。仿真时多试几组参数,看看不同工况下的表现。这样上板后,你心里就有底了。