ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Buck-Boost变换器建模与仿真:大信号、小信号及开关模型对比

Buck-Boost变换器建模与仿真:大信号、小信号及开关模型对比

简介:面向电力电子技术学习者与电源设计入门者的Buck-Boost变换器建模与仿真资料,聚焦DC-DC变换器动态行为描述与控制器设计这一核心问题。内容从稳态电压传输比入手,依次展开大信号模型、开关周期平均算子与小信号线性化推导,并给出基于C语言源程序的建模实现与Simulink电路仿真两条路径,最后通过理论计算与仿真结果对比验证模型准确性,附录附有源程序便于复现。资源包共1个文件,为1.27MB的PDF文档,按问题提出、理论建模分析、仿真验证、结论、参考文献与附录组织,目录层次清晰,适合按章节循序研读。已有2629人学习,可作为电力电子课程设计、小信号建模练习及控制策略验证的参考材料,帮助读者理解平均开关网络模型法的推导逻辑与仿真对照方法。

1. 从一份 20 页的 PDF 说起:为什么我要把 Buck-Boost 的模型重新跑一遍

第一次拿到这份《Buck-Boost 变换器的建模与仿真》资料时,我其实没抱太大期望——电力电子技术里讲 DC-DC 变换器建模的文档太多了,大多是公式堆砌,推导完就结束,真正能落到仿真和代码上的没几个。但翻到附录部分我停住了:里面附了完整的数值计算源程序,配合 Simulink 的四个仿真模型,把大信号模型、小信号模型和开关器件电路模型放在同一组工况下做了对比。这意味着它不是一篇只让你“看懂”的文档,而是一份能让你“跑起来”的工程资料。

这份资源适合两类人:一类是正在学电力电子建模、需要把状态空间平均法从公式变成波形的学生;另一类是已经上手做电源控制、想搞清楚小信号模型到底在什么条件下才可信的工程师。它解决的核心问题是——当你把开关纹波抹掉、把非线性电路线性化之后,模型和真实电路到底差多少,差在哪里。

2. 理论建模拆解:从开关周期平均算子到小信号状态方程

2.1 开关周期平均算子:把开关纹波“滤”掉的数学工具

整个建模链条的起点是一个看起来不起眼但极其关键的数学工具——开关周期平均算子。它的定义很直白:对一个电量在一個开关周期内做积分再除以周期长度。

# 开关周期平均算子的离散近似实现 # x: 采样得到的电量序列, Ts: 开关周期, dt: 采样步长 def switching_period_average(x, Ts, dt): N = int(Ts / dt) # 一个开关周期内的采样点数 result = [] for k in range(len(x) - N): window = x[k:k+N] # 取一个完整开关周期的数据窗 avg = sum(window) * dt / Ts # 积分除以周期 result.append(avg) return result

这段代码做的是数值层面的周期平均,实际推导中用连续形式更常见。参数Ts是开关周期,对应开关频率 100kHz 时就是 10 微秒;dt是仿真或采样的步长,必须远小于Ts才能保证窗口内有足够多的点。算子的物理意义很明确:保留低频成分,滤掉开关频率及其谐波。这一步做完,电路方程里就不再有高频开关项,后续的线性化才有可能。

提示:数值实现时窗口长度必须是整数个采样点,否则周期平均会引入额外误差。我一般会让Ts/dt至少取 100 以上。

2.2 大信号模型:非线性但直观的平均电路

经过周期平均之后,Buck-Boost 的开关网络被等效成受控源构成的两端口网络。电感电压和电容电流的平均值方程可以直接写出来:

# Buck-Boost 大信号模型状态方程(CCM 模式) # 状态变量: iL (电感电流平均值), vC (电容电压平均值) # 输入: Vg (输入电压), d (占空比), R (负载电阻) def large_signal_model(iL, vC, Vg, d, L, C, R): diL_dt = (d * Vg + (1 - d) * vC) / L # 电感电压平均方程 dvC_dt = (-(1 - d) * iL - vC / R) / C # 电容电流平均方程 return diL_dt, dvC_dt

这里d是占空比,(1-d)就是原文里的D'。注意电感方程里d*Vg和(1-d)*vC两项的符号关系——Buck-Boost 的输出极性是反的,所以电容电压在方程里以负值参与。这个模型是非线性的,因为d和状态变量相乘,不能直接用线性系统理论分析。但它有个好处:不含开关纹波,仿真步长可以放大,跑起来快。

2.3 小信号模型:在稳态工作点附近做线性化

小信号模型的做法是在稳态工作点附近加微小扰动,然后丢掉二阶项。稳态工作点由稳态电压传输比确定:V/Vg = -D/(1-D)。把d = D + d̂、Vg = Vg + v̂g代入大信号方程,整理后得到线性化方程:

# Buck-Boost 小信号模型(线性化后) # 输入: 稳态工作点 D, Vg, IL, VC 以及扰动量 d_hat, vg_hat def small_signal_model(iL_hat, vC_hat, d_hat, vg_hat, D, Vg, IL, VC, L, C, R): diL_dt = (D * vg_hat + (1 - D) * vC_hat + (Vg + VC) * d_hat) / L dvC_dt = (-(1 - D) * iL_hat - vC_hat / R + IL * d_hat) / C return diL_dt, dvC_dt

对比大信号模型,小信号方程里多了(Vg + VC) * d_hat和IL * d_hat这两个由稳态量乘以扰动量产生的项,它们就是线性化过程中从乘积项里“拆”出来的。参数IL和VC是稳态值,由IL = Vg*D/(R*(1-D)^2)和VC = -Vg*D/(1-D)给出。这个模型只描述扰动量的动态,不含稳态成分,也不含开关纹波,所以仿真出来的波形是围绕零点的振荡。

注意:小信号模型的有效性依赖扰动幅度足够小。原文里用的扰动是占空比正 2% 的脉冲,这个量级下线性化误差可以接受;如果扰动加到 20%,被忽略的二阶项就会显著影响结果。

3. 仿真验证:四个 Simulink 模型怎么搭、参数怎么设

3.1 电路参数与两种工况设计

原文给的参数很具体:开关频率 100kHz、输入电压 200V、电感 500μH、电容 47μF、负载 10Ω。这组参数下,CCM 模式的临界电感大约在几十微亨量级,500μH 足够保证电流连续。两种工况分别是:0.1 秒时占空比从 0.5 阶跃到 0.8,以及 0.1 秒时加一个持续 10ms、幅度正 2% 的脉冲扰动。

参数符号数值说明
开关频率fs100 kHz决定周期平均窗口长度
输入电压Vg200 V稳态工作点基准
电感L500 μH保证 CCM 运行
电容C47 μF影响输出电压纹波和动态响应
负载电阻R10 Ω决定稳态电流和阻尼
阶跃占空比D0.5 → 0.8大信号模型验证工况
脉冲扰动Δd+2%, 10ms小信号模型验证工况

阶跃工况用来验证大信号模型:占空比大幅变化,电路从一个稳态过渡到另一个稳态,看的是暂态过程的形状和到达时间。脉冲工况用来验证小信号模型:扰动小、持续时间短,看的是扰动响应是否和开关电路一致。

3.2 开关器件电路模型的搭建要点

开关器件电路模型是最“重”的一个,因为它保留了真实的开关动作。在 Simulink 里搭这个模型,核心是 MOSFET 加二极管的组合,配合 PWM 发生器驱动。几个容易翻车的点:

第一,开关器件的导通电阻和二极管正向压降如果设成理想值(0),仿真器在开关瞬间容易出现数值振荡,步长会被迫压得很小,跑得极慢。我一般会给 MOSFET 设 10mΩ 左右的导通电阻,二极管设 0.7V 正向压降,既接近实际又不至于让求解器崩溃。

第二,求解器选择。开关电路必须用变步长求解器,ode23tb或ode15s比较稳,固定步长求解器在开关跳变点容易漏掉事件。步长上限设成开关周期的百分之一左右,也就是 0.1μs 量级。

第三,PWM 比较器的载波频率必须和开关频率严格一致,相位不影响稳态但影响暂态起始点,做对比仿真时最好固定载波初相。

3.3 大信号与小信号模型的 Simulink 实现

大信号模型在 Simulink 里可以用受控源搭,也可以用积分器加函数模块直接实现状态方程。原文用的是受控源等效电路的方式,直观但连线多。我更倾向直接用状态方程:

# Simulink 命令行搭建大信号模型骨架(示意) # 用 Integrator 模块实现 diL/dt 和 dvC/dt # 输入端口: Vg, d;输出端口: iL, vC add_block('simulink/Continuous/Integrator', 'model/Int_iL'); add_block('simulink/Continuous/Integrator', 'model/Int_vC'); # 函数模块里填入状态方程右端项 set_param('model/Fcn_iL', 'Expression', '(d*Vg+(1-d)*u[2])/L'); set_param('model/Fcn_vC', 'Expression', '(-(1-d)*u[1]-u[2]/R)/C');

这段命令只是骨架示意,实际搭建时u[1]、u[2]对应积分器输出。关键是把d作为外部输入引进来,这样阶跃和脉冲扰动都能直接从工作区变量驱动,不用改模型结构。小信号模型的搭法类似,只是状态变量换成扰动量,稳态量IL、VC作为常数模块输入。

3.4 结果对比:三个模型各自“看到”了什么

把三组波形放在一起看,差异非常清楚。开关器件模型的输出电压和电感电流上叠着明显的开关纹波,纹波幅度和Vg*D/(L*fs)量级吻合。大信号模型的波形平滑,暂态过程的包络和开关模型几乎重合——原文的结论是“忽略开关纹波则暂态过程一致”,我复现时也确认了这一点,阶跃后到达新稳态的时间差在毫秒级以内。

小信号模型的输出则是围绕零点的扰动波形,没有稳态分量。脉冲扰动期间它给出一个衰减振荡,振荡频率对应 LC 滤波器的自然频率,衰减速度由负载电阻和电感电容比决定。和开关模型减去稳态值后的扰动分量对比,前几个周期的吻合度不错,但脉冲结束后尾部有可见偏差——这就是线性化丢掉二阶项的代价。

数值计算部分,原文附录的程序用数值积分求解状态方程,结果和 Simulink 模型一致。这也说明一件事:模型对不对,不取决于你用 Simulink 还是手写代码,取决于状态方程本身是否忠实于周期平均后的电路。

4. 避坑与排查:复现这份资料时最容易踩的五个坑

4.1 仿真跑得极慢甚至卡死

现象:开关器件模型一运行就卡在 0.1 秒之前,进度条几乎不动。原因通常是求解器步长被开关瞬间的数值跳变压到了极小值,或者开关器件设成了理想开关导致代数环。解决办法是把 MOSFET 导通电阻和二极管压降设成非零小值,求解器换成ode23tb,最大步长限制在开关周期的 1/100。

4.2 大信号模型稳态值对不上理论计算

现象:仿真稳定后的输出电压和-Vg*D/(1-D)算出来的差了一截。先检查电感电流是否真的连续——如果参数选得不对进了 DCM,稳态传输比公式就变了。再检查受控源的符号,Buck-Boost 输出是负压,电容电压的参考方向如果接反,方程里(1-d)*vC的符号就会错。我一般先在稳态下跑一个固定占空比,确认稳态值和手算一致,再去做阶跃。

4.3 小信号模型波形和开关模型对不上

现象:脉冲扰动下小信号模型的振荡幅度明显偏大或偏小。最常见的原因是稳态工作点取错了——IL和VC必须用扰动前的稳态值,不能用扰动后的。另一个原因是扰动幅度太大,2% 是原文验证过的量级,加到 10% 以上线性化误差就会肉眼可见。还有一点容易忽略:小信号模型的初始条件必须是零扰动,如果积分器初值没清零,波形会整体偏移。

4.4 周期平均算子的窗口对不齐

现象:数值计算程序跑出来的平均值波形有周期性抖动。这是窗口长度不是整数个采样点导致的,Ts/dt取整之后余数被丢掉,每个窗口的积分区间略有差异。解决办法是让仿真步长整除开关周期,比如Ts=10μs时步长取0.1μs或0.05μs。

4.5 阶跃时刻的波形出现非物理尖峰

现象:占空比在 0.1 秒阶跃的瞬间,电感电流出现一个极窄的尖刺。这多半是 Simulink 里阶跃模块和 PWM 比较器的采样时刻没对齐,占空比在一个开关周期内被“切”成了两段。把阶跃模块的采样时间设成和 PWM 载波同步,或者给阶跃加一个开关周期量级的上升时间,尖刺就消失了。

5. 二次开发:把这份模型改成你自己的控制器验证平台

这份资料的价值不止于“验证模型对不对”,它其实是一个现成的控制器验证骨架。我的做法是在小信号模型外面套一个补偿器,先在线性模型上调参数,再放到开关电路上验证,最后用大信号模型看大范围阶跃下的表现。三步走下来,控制器的鲁棒性基本能摸清。

具体改造时,小信号模型的输出vC_hat就是反馈量,把它引到一个 PID 或 Type-III 补偿器模块,补偿器输出叠加到稳态占空比D上,形成闭环。调参阶段用线性模型跑阶跃响应看相位裕度,这一步很快,几秒钟就能出一组波形。等参数收敛了,把同一组参数搬到开关电路模型上,重点看两件事:启动过程有没有过冲,负载突变时恢复时间够不够。

有一个细节值得单独说:小信号模型调出来的参数搬到开关电路上,增益往往需要微调。原因是小信号模型忽略了开关纹波对采样和调制的影响,实际电路里 PWM 比较器的载波和电感电流纹波之间存在相位关系,等效增益会有几个百分点的偏差。我一般会在开关模型上做一次增益扫描,找到临界稳定的增益值,然后回退 30% 作为最终参数。

验证方法上,我习惯做三组对比:开环阶跃、闭环阶跃、闭环负载突变。每组都同时跑大信号模型和开关电路模型,看两者的包络是否一致。如果大信号模型和开关模型的暂态形状对不上,说明状态方程有问题;如果小信号闭环和开关闭环的稳定边界差太多,说明线性化工作点选得不对或者扰动幅度超出了适用范围。

还有一个改造方向是把数值计算程序从 Python 换成 C。原文关键词里提到 C 语言,附录程序如果用 C 重写,可以直接嵌到嵌入式控制器的开发流程里做离线验证,比在 Simulink 里反复搭模型快得多。状态方程就那两行,用四阶龙格库塔积分,几十行代码就能跑,移植到目标板上做硬件在环也方便。

从那以后我每次拿到一个 DC-DC 变换器的建模资料,都强制自己先跑一遍稳态、再跑阶跃、最后跑小扰动,三步对不上就不往下做控制器。这份资料的四个 Simulink 模型和附录程序,刚好把这套流程完整覆盖了,拿来当模板改参数就能用。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进