Buck-Boost电路建模与仿真:CCM/DCM稳态、小信号与MATLAB复现
发布时间:2026/9/24 23:42:29来源:尧图网络
简介Buck-Boost电路建模及分析是一份面向电力电子与开关电源领域的DOCX技术文档适合需要掌握DC-DC变换器建模方法的本科生、研究生或工程师。文档系统阐述Buck-Boost变换器的稳态与小信号建模过程稳态分析部分围绕连续导通模式(CCM)和非连续导通模式(DCM)推导输出电压与占空比的关系式并给出电感电流与输出纹波电压的计算方法小信号分析部分推导输出对输入的传递函数结合零极点分析与MATLAB仿真绘制波特图验证理论正确性。全文采用状态空间平均法覆盖开关管通断状态下的等效电路、伏秒平衡原则与线性化处理步骤。资源包为单个docx文档大小约1.22MB内容结构完整已有231人学习下载适合作为开关电源课程设计、毕业设计或工程入门参考。1. Buck-Boost 电路建模与仿真连着稳态公式和 MATLAB 复现一起交付拿到一份 Buck-Boost 电路建模及分析的课题资料最值得先干的事情不是翻公式而是把 CCM 与 DCM 的临界条件确认掉。这份文档的价值点很集中先用伏秒平衡把连续导通模式和非连续导通模式下的电压转换比、电感电流极值、输出纹波全部串起来再用状态空间平均法做小信号建模最后用 MATLAB 把两种模式下的稳态波形、传递函数波特图全部复现出来。它适合两类人一类是刚接触 DC-DC 变换器、想搞懂 Buck-Boost 为什么输出反极性、为什么既能升压又能降压的初学者另一类是已经有 Buck 和 Boost 基础、想快速拿到一套可复现建模与仿真流程的电源工程师。后面所有推导都跟着文档走参数和踩坑点我单独标出来了。2. 稳态分析伏秒平衡怎么推出电压转换比、临界电感和输出纹波2.1 先判断工作模式CCM 与 DCM 的分界线在哪Buck-Boost 电路在稳态下有两种工作模式连续导通模式CCM和非连续导通模式DCM。CCM 下电感电流在整个开关周期内都不为零DCM 下电感电流会有一段保持为零的状态。判断电路落在哪种模式只取决于开关频率、电感量和负载电流三者的关系不是由设计者主观决定的。文档给出的临界电感公式是工程上最常用的判据$$L_{CCM} \frac{(1-D)^2 R}{2f}$$当实际电感量大于 L_CCM 时电路工作在 CCM小于 L_CCM 时进入 DCM。注意这个公式里的占空比 D 是稳态工作点处的值不同 D 下临界电感不一样。做设计时我会先用目标输出电压算出 D再代进公式判断模式而不是随便取一个电感量就开始仿真。以文档中的 CCM 仿真参数为例Vs12VVo12VR4Ωf10kHzD0.5代入上式得到 L_CCM50uH而实际电感取 300uH远大于临界值所以稳定工作在 CCM。这个判断顺序非常重要后面所有稳态公式都要在正确的模式下使用。2.2 CCM 电压转换关系一次伏秒平衡就能推出来CCM 下每个开关周期只有两种状态开态时开关管导通、二极管截止输入电压直接加在电感两端电感电流线性上升负载电流完全由输出电容提供关态时开关管截止、二极管导通电感电流线性下降同时向负载和电容供电。因为输出电压极性与输入相反所以关态时电感两端电压是 -Vo。电感两端电压满足 $V_L L \cdot di_L/dt$稳态下一个周期内开态电流增量必须等于关态电流减量否则电感电流会逐周期漂移。这就是文档强调的伏秒平衡$$V_s \cdot D \cdot T V_o \cdot (1-D) \cdot T$$整理后得到 Buck-Boost 电路在 CCM 下的电压转换关系$$V_o -V_s \cdot \frac{D}{1-D}$$负号表示输出极性反转幅度由占空比 D 决定D0.5 时是降压D0.5 时是升压D0.5 时输出幅度等于输入。实际做电源设计时我习惯先由这个公式反解出 D再往下算电感电流和纹波而不是靠试凑。文档里还给出了最小和最大电感电流公式$$I_{L,min} \frac{I_o}{1-D} - \frac{V_s D}{2Lf}, \quad I_{L,max} \frac{I_o}{1-D} \frac{V_s D}{2Lf}$$这里有一个非常容易忽略的细节Buck-Boost 电路里电感的平均电流不是负载电流 Io而是 Io/(1-D)。原因是电感只有在关态才向负载传输能量。很多新手在这里直接用 Io 去估算电感电流峰值结果电感选小了跑仿真时发现电流波形已经进入 DCM。输出纹波电压公式也一并给出$$\Delta V_o \frac{V_o D}{R f C}$$从公式可以直观看到要降低输出纹波要么加大输出电容 C要么提高开关频率 f要么减小占空比 D。对 Buck-Boost 来说输出电容承担的电流应力比 Buck 电路大选型时余量要留足。2.3 DCM 电压转换关系输出不再只依赖占空比当负载电流降到临界水平以下电感电流会在周期内某段时间变为零电路进入 DCM。DCM 下每个开关周期有三种状态比 CCM 多了一个空闲态。空闲态时开关管和二极管都不导通电感电流保持为零负载电流完全由输出电容维持。DCM 的推导要点有两个一是伏秒平衡仍成立但关态时间不再是 (1-D)T而是另一个未知时间 D2T二是负载电流等于电感电流在开关周期内的平均值且电流从零开始上升。联立两式得到$$\frac{V_o}{V_s} \frac{D}{\sqrt{2L/(RT)}}$$这个公式和 CCM 有本质区别CCM 下输出电压只由占空比决定与负载无关DCM 下输出电压同时依赖负载电流、电感和开关频率。换句话说DCM 的 Buck-Boost 带载能力变差负载变化会引起输出电压明显漂移。表格对比一下两种模式下的关键参数方便后面仿真时对照项目CCMDCM电感电流特征周期内始终大于零有一段为零电压转换比|Vo/Vs| D/(1-D)|Vo/Vs| D/√(2L/(RT))输出是否依赖负载不依赖依赖电感平均电流Io/(1-D)峰值的一半乘以占空比输出纹波Vo·D/(RfC)与占空比和电感电流波形相关临界判据L L_CCML L_CCM文档对 DCM 的推导过程比较完整最终得到的最小电感电流为零最大电感电流为 Vs·D/(Lf)。但注意DCM 的最大电感电流公式里同样包含了负载电阻 R这再次说明 DCM 的工作点对负载敏感。实际设计时我一般尽量避免让主功率级深陷 DCM除非是轻载待机工况。3. 状态空间平均法与 MATLAB 仿真从状态方程到 CCM/DCM 波形复现3.1 为什么要选状态空间平均法DC-DC 变换器的建模方法不止一种文档里提到基本建模法、开关网络平均模型法和状态空间平均法。前两种方法各有侧重但状态空间平均法是直接把求平均、分离扰动、线性化三步用数学表达式落地推导过程最规整也最容易在 MATLAB 里转成仿真程序。状态空间平均法的基本假设有三个低频假设要求交流小信号频率远小于开关频率小纹波假设要求状态变量的开关纹波远小于直流量小信号假设要求交流分量幅值远小于直流分量。这三个条件在实际电源设计里基本都满足所以这套方法适用范围很广。文档用这个方法来推导 Buck-Boost 的稳态工作点和交流小信号传递函数相当于把非线性开关电路在直流工作点附近近似成线性系统后续就能直接用 Bode 图、零极点这些线性工具来分析。3.2 状态方程怎么列用一个开关函数合并两种拓扑Buck-Boost 在 CCM 下有两个不同的电路拓扑分别对应开态和关态。如果分别列状态方程推导会非常啰嗦。文档的做法是引入一个开关函数 uu1 表示开态u0 表示关态把两套方程合并成一组合并方程$$L \frac{di_L}{dt} u \cdot V_s - (1-u) \cdot v$$$$C \frac{dv}{dt} (1-u) \cdot i_L - \frac{v}{R}$$其中状态变量是电感电流 i_L 和电容电压 v文档按输出电压的绝对值处理。写成矩阵形式就是文档里的式2.38。这种写法的好处是仿真时只需要按照时间切换 u 的值不需要动态切换矩阵结构。下面 CCM 仿真就基于这个方程实现。3.3 CCM 仿真用 ode23 直接解瞬时开关模型文档的 CCM 仿真思路包含两个 m 文件一个定义状态导数函数一个写主程序调用 ode23。这里的仿真不是平均模型而是带开关动作的瞬时模型所以波形里能看到完整的开关纹波和理论纹波公式可以直接对照验证。buck_boost.m 文件定义状态导数function dx buck_boost(t, x, Vs, D, L, C, R, f) % 状态变量: x(1)电感电流 iL, x(2)电容电压绝对值 v iL x(1); v x(2); % 根据时间判断当前处于开态还是关态 % 一个开关周期前 D*T 内 u1(开态), 其余时间 u0(关态) u mod(t, 1/f) D/f; dx zeros(2, 1); % 式(2.37)对应的状态方程 dx(1) (u * Vs - (1-u) * v) / L; dx(2) ((1-u) * iL - v / R) / C; end这个函数在 MATLAB 里被 ode23 在每个时间点反复调用。u 的取值用 mod 函数对时间取余确保每个开关周期内前 D·T 时间处于开态后面处于关态。如果只做平均模型仿真u 直接取常数 D 就行但那样看不到纹波也就没法验证文档给出的纹波公式。主程序 CCM.m 负责设置参数、初始化状态变量并调用 ode23% CCM.m —— CCM 模式时域仿真 clear; clc; Vs 12; % 输入电压 12V R 4.0; % 负载电阻 4Ω L 300e-6; % 电感 300uH C 75e-6; % 电容 75uF f 10e3; % 开关频率 10kHz D 0.5; % 占空比 % 根据理论值预置初始状态让系统更快进入稳态 % CCM 下电感平均电流 Io/(1-D) (12/4)/0.5 6A % 输出电压绝对值理论值 12V x0 [6; 12]; % ode23 解微分方程限制最大步长确保开关边沿不被跨过 opts odeset(RelTol, 1e-4, MaxStep, 1/(f*50)); tspan [0 20e-3]; % 仿真 20ms即 200 个开关周期 [t, x] ode23((t,x) buck_boost(t, x, Vs, D, L, C, R, f), tspan, x0, opts); iL x(:,1); vC x(:,2); % 取稳态段(后5ms)查看输出纹波峰峰值 mask t 15e-3; ripple max(vC(mask)) - min(vC(mask)); fprintf(输出纹波峰峰值: %.3f V\n, ripple); figure; subplot(2,1,1); plot(t*1e3, iL); xlabel(时间 t(ms)); ylabel(电感电流 iL(A)); title(CCM 电感电流波形); grid on; subplot(2,1,2); plot(t*1e3, vC); xlabel(时间 t(ms)); ylabel(输出电压 |Vo|(V)); title(CCM 输出电压波形); grid on;参数说明R 和 C 直接决定纹波大小L 决定电感电流斜率f 和 D 通过 MaxStep 设定间接影响仿真精度。MaxStep 取开关周期的 1/50避免 ode23 的自适应步长把开关边沿漏掉这一步是仿真出正确纹波的关键。初始化 x0 取理论稳态值 [6; 12]能让系统从第一拍就接近工作点而不是从零开始硬爬。文档里强调初始化要让系统更快速达到稳态实际就是这个目的。仿真结果电感电流稳定后大约在 5A 到 7A 之间波动平均值约 6A和式2.13算出的 I_L,min5A、I_L,max7A 完全吻合输出电压稳定在 12V 附近纹波峰峰值约 2V纹波率约 17%与公式 rD/(RCf)0.5/(4×75e-6×10e3)≈16.7% 对应得上。3.4 DCM 仿真固定步长 RK4 才是正解DCM 比 CCM 麻烦一个量级。原因在于 DCM 下电感电流每个周期都要从零开始而 ode23 是变步长求解器步长会根据误差自动调整落在开关边沿上的时刻不固定导致电感电流过零的时机每次都差一点积累几十个周期后波形就会漂移。文档的解决方法是改用四阶 Runge-Kutta 算法RK4用固定小步长跑完整段仿真。下面先写一个通用的 rk4 求解函数function [t, x] rk4(fun, t0, tf, h, x0, varargin) % 固定步长四阶 Runge-Kutta 求解器 % fun: 状态导数函数, t0/tf: 起止时间, h: 固定步长, x0: 初始状态 t t0:h:tf; n length(t); x zeros(n, numel(x0)); x(1,:) x0; for k 1:n-1 tn t(k); xn x(k,:); k1 fun(tn, xn, varargin{:}); k2 fun(tn h/2, xn h/2*k1, varargin{:}); k3 fun(tn h/2, xn h/2*k2, varargin{:}); k4 fun(tn h, xn h*k3, varargin{:}); x(k1,:) xn h/6 * (k1 2*k2 2*k3 k4); end endRK4 的核心思想是每个步长内取四个斜率点加权平均精度比欧拉法高很多同时步长固定每个开关周期内的采样点数完全一致不会出现 ode23 那种步长抖动问题。DCM 主程序要额外做两件事每个周期结束时把电感电流强制归零模拟二极管的单向导通特性以下一周期的末端状态作为下一周期的初始条件逐周期推进% DCM.m —— DCM 模式时域仿真, 固定步长 RK4 电流钳位 clear; clc; Vs 12; R 4.0; L 10e-6; C 220e-6; f 20e3; D 0.5; Ts 1/f; h Ts / 200; % 每个开关周期 200 步 n_cycles 100; % 仿真 100 个开关周期 x [0; 0]; % DCM 每个周期电感电流从零开始 t_all []; x_all []; for cyc 1:n_cycles t0 (cyc-1) * Ts; tf cyc * Ts; [t, xt] rk4((t,x) buck_boost(t, x, Vs, D, L, C, R, f), t0, tf, h, x); % 模拟二极管单向导电: 电感电流小于 0 时强制置 0 xt(xt(:,1) 0, 1) 0; x xt(end, :); t_all [t_all; t(1:end)]; x_all [x_all; xt(1:end,:)]; end iL x_all(:,1); vC x_all(:,2); % 取稳态段查看输出纹波 mask t_all 3e-3; ripple max(vC(mask)) - min(vC(mask)); fprintf(DCM 输出纹波峰峰值: %.3f V\n, ripple); figure; subplot(2,1,1); plot(t_all*1e3, iL); xlabel(时间 t(ms)); ylabel(电感电流 iL(A)); title(DCM 电感电流波形); grid on; subplot(2,1,2); plot(t_all*1e3, vC); xlabel(时间 t(ms)); ylabel(输出电压 |Vo|(V)); title(DCM 输出电压波形); grid on;DCM 的 buck_boost.m 和 CCM 共用同一个函数因为电路方程形式相同区别只在于电流归零的处理。这里 h 取 Ts/200每个周期 200 个采样点对 20kHz 的开关频率来说足够可以适当减小 h 验证结果是否收敛如果纹波数值随 h 变化明显说明步长还不够小。仿真结果和文档描述一致输出电压略低于理论值 12V纹波峰峰值约 0.76V纹波率约 6.4%。文档特意指出增大 C 可以缩小输出电压与理论值的差距并降低纹波。DCM 下输出纹波明显小于 CCM本质原因是电感电流峰值本身很小电容承担的充放电电荷量少。4. 小信号分析传递函数、零极点与波特图的验证路径4.1 状态空间平均法的三个步骤平均、分离扰动、线性化小信号分析的目的是搞清楚低频交流小信号在电路里怎么传递为环路补偿设计提供依据。文档用状态空间平均法完成推导整个过程可以拆成三步第一步在一个开关周期内对状态变量求平均把开关纹波滤掉第二步把平均变量分解成直流分量加交流小信号分量第三步把含小信号乘积项的非线性项直接略去因为两个小信号的乘积远小于单独一项。这三步做完原本强非线性的开关电路在直流工作点附近变成线性系统于是可以用传递函数、零极点、Bode 图这些经典工具分析。文档里强调的三个前提条件——低频假设、小纹波假设、小信号假设——本质都是为了保证平均值近似等于瞬时值和小信号乘积项可忽略这两条成立。4.2 CCM 传递函数与特征参数文档从一般 DC-DC 变换器的平均变量状态方程出发推导出传递函数的一般形式$$G(s) (sI - A)^{-1} B$$然后代入 Buck-Boost 的具体矩阵经过化简得到输出对输入的传递函数$$G(s) \frac{G_0}{1 \frac{s}{Q \omega_0} \left(\frac{s}{\omega_0}\right)^2}$$其中$$G_0 -\frac{D}{1-D}, \quad \omega_0 \frac{1-D}{\sqrt{LC}}, \quad Q (1-D) R \sqrt{\frac{C}{L}}$$注意 G0 带了负号。文档在注释里特意提醒若考虑输出电压方向传递函数表达式要加一个负号因为 Buck-Boost 输出与输入极性相反。这个负号在 Bode 图上表现为低频相位从 -180° 开始而不是 0°。很多人推完公式后漏了这个负号画出来的波特图相位曲线整体差 180°环路补偿参数跟着全错。零极点分析这是一对共轭复数极点自然谐振频率由 L 和 C 决定阻尼由 Q 值决定。Q 越大谐振峰越高相位下降越陡Q 很小则系统接近两个实极点响应偏慢。文档就是用这个式子计算零极点位置再用仿真波特图验证传递函数推导是否正确。4.3 用 MATLAB 画波特图验证传递函数以 CCM 仿真参数为例L300uHC75uFR4ΩD0.5。代入公式$$\omega_0 \frac{0.5}{\sqrt{300 \times 10^{-6} \times 75 \times 10^{-6}}} \approx 3333 \text{ rad/s}$$对应约 530Hz。Q 值$$Q 0.5 \times 4 \times \sqrt{\frac{75 \times 10^{-6}}{300 \times 10^{-6}}} 1$$Q 等于 1说明系统阻尼接近临界。用 MATLAB 的 tf 函数直接构建传递函数并画 Bode 图% bode_check.m —— 验证 Buck-Boost CCM 传递函数的波特图 L 300e-6; C 75e-6; R 4; D 0.5; Dp 1 - D; G0 -D / Dp; % 输出反极性, 必须带负号 w0 Dp / sqrt(L * C); % 自然谐振频率 Q Dp * R * sqrt(C / L); % 品质因数 num G0 * w0^2; den [1, w0/Q, w0^2]; sys tf(num, den); bode(sys); grid on; % 在谐振频率处画竖线标记 hold on; yl ylim; plot([w0 w0]/(2*pi), yl, r--); legend(|G(s)| / ∠G(s), f0 标记);这段代码把传递函数的三个参数一次性算完。G0 带负号后Bode 图低频段幅值约 0dB相位从 -180° 开始频率升高到 ω0 附近时相位继续下降最终趋向 -360°。如果去掉负号相位曲线整体上移 180°和实际电路特性不符。参数说明改变 C 会移动 ω0 的位置改变 R 会影响 Q从而改变谐振峰的高度。用这套脚本做参数扫描特别方便替换几个变量就能看不同工作点下的频率特性。文档的仿真结果和理论推导一致说明状态空间平均法在这个场景下的推导是可靠的。DCM 的传递函数推导文档只推到分离扰动阶段没有给出完整的最终表达式。实际工程中我一般改用开关网络平均模型或者能量守恒等效电路来补全 DCM 小信号模型因为 DCM 下状态空间平均法需要多一个辅助方程手推容易出错不如受控源等效电路直观。5. 常见问题与避坑指南五个容易翻车的细节5.1 临界电感公式抄丢平方项现象按公式算出来的临界电感总是偏大实际电路已经进入 DCM 还误判为 CCM。原因临界电感公式 L_CCM(1-D)²R/(2f) 中的平方项很容易在抄写或 OCR 时丢失丢了之后计算结果直接翻倍。解决代数值验算一遍。文档中 D0.5、R4Ω、f10kHz正确结果是 50uH如果算出来是 100uH说明平方项丢了。我每次都会用这个数值对一遍公式避免低级错误带偏整个设计。5.2 用 ode23 仿真 DCM波形逐周期漂移现象DCM 仿真结果里电感电流每个周期起点不在零波形随时间慢慢上移或下移。原因ode23 是变步长求解器为了满足误差会调整步长开关边沿落点不固定导致电感电流过零的时刻每周期都不一样误差积累后波形漂移。解决换成固定步长的四阶 Runge-Kutta 算法并且每个周期结束时做一次钳位处理把小于零的电感电流强制置零。文档提到的关闭时间电感电流不一致就是这个问题解决方案也是文档里明确给出的。5.3 传递函数画波特图时丢了负号现象Bode 图低频相位从 0° 开始和实测相位差 180°。原因Buck-Boost 输出反极性推导时按输出电压模值处理最后写传递函数忘记补负号。解决在 G0 的表达式里显式写成 -D/(1-D)画图前先看低频相位是不是 -180°如果是 0° 就回头检查符号。这个坑在文档注释里出现过属于典型的概念性错误环路补偿时负号错了轻则相位裕度算错重则补偿方向反掉。5.4 仿真纹波 17% 觉得数据不对现象CCM 仿真跑出来纹波约 17%第一反应是仿真代码写错了。原因演示参数里 C75uF、f10kHz按公式 rD/(RCf)0.5/(4×75e-6×10e3)≈16.7%仿真结果和理论一致。这个纹波值偏大是因为参数本身是为演示推导过程选的不是工程优化后的参数。解决先手算纹波公式再和仿真结果对比两边一致说明仿真没问题。想要更小纹波加大电容或提高开关频率即可别急着调代码。5.5 状态变量初始化离稳态工作点太远现象仿真刚开始的几毫秒波形大幅振荡电感电流出现明显过冲看起来像系统不稳定。原因状态变量初始值给零而稳态工作点附近才有物理意义大偏离会让系统先经历一段大幅度调整过程。解决用理论值预置初始状态。CCM 下电感平均电流是 Io/(1-D)6A输出电压绝对值 12V直接从 [6;12] 开始仿真系统第一拍就接近稳态暂态过程短得多。文档里初始化遵循一个原则即让系统更快速达到稳态说的就是这件事。6. 进阶验证把临界电感公式变成参数扫描脚本前面所有推导都围绕固定的工作点但实际设计时占空比会变负载会变临界电感也随之变化。文档里的公式都是单点计算手工算几组还行做全范围评估就太慢了。这里写一个简单的参数扫描脚本把临界电感随占空比变化的曲线画出来一眼看出电感选型落在哪个区间。% scan_Lccm.m —— 扫描占空比 D, 观察临界电感与模式边界 R 4; f 10e3; D 0.05:0.01:0.95; Lccm (1-D).^2 * R / (2*f); figure; plot(D, Lccm*1e6, b-, LineWidth, 1.5); xlabel(占空比 D); ylabel(临界电感 L_{CCM} (uH)); title(Buck-Boost 临界电感 vs 占空比); grid on; % 画一条实际电感水平线, 区分 CCM 与 DCM 区域 L_practical 100e-6; hold on; plot(D, L_practical*1e6*ones(size(D)), r--, LineWidth, 1.2); legend(L_{CCM}, 实际电感 100uH); % 标记分界区域 text(0.3, 40, DCM 区域, Color, r); text(0.6, 200, CCM 区域, Color, b);脚本的逻辑很简单对每个占空比 D 计算临界电感画成蓝色曲线红色虚线是实际电感值。曲线以上是 CCM 区域以下是 DCM 区域。从曲线形状能明显看到D 接近 1 时临界电感趋近于零因为此时关态时间极短电感电流很容易保持连续D 接近 0 时临界电感最大轻载或小占空比下更容易进入 DCM。用这个脚本做选型评估时我一般会叠加几条不同负载电阻下的曲线看图里工作点裕量够不够。如果实际电感离边界太近温度变化引起电感量衰减就可能从 CCM 掉进 DCM输出电压特性随之变化环路补偿也跟着失效。留 20% 以上的裕量比较稳妥。这套脚本和文档的仿真程序配合起来就可以形成完整的验证闭环先算临界电感确认模式再套稳态公式核对电压转换比和纹波然后用传递函数做频率特性分析最后用 MATLAB 时域仿真把波形和纹波测出来。四步走完一份 Buck-Boost 电路的分析才算是真正落地而不是停留在公式推导层面。从那以后我拿到任何 Buck-Boost、反激或者类似的 DC-DC 项目第一件事永远是先算临界电感把它当作验证所有后续推导的锚点。这个习惯帮我省了不少来回调仿真的时间也希望这次整理的推导路径和踩坑记录能帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网