资讯动态

升、降压直流斩波电路Matlab仿真:从Buck/Boost原理到Simulink闭环实战

发布时间:2026/10/15 5:09:55 来源:尧图企业网站定制
简介这份资源面向电力电子、电气工程及相关专业的课程设计学习者围绕升压与降压直流斩波电路展开重点解决DC/DC变换器拓扑选择、工作模式分析、储能电感参数设计及控制系统实现等问题。压缩包内共1个doc文档约823KB内容涵盖降压斩波电路原理、直流斩波电路输入输出关系、DC/DC变换器设计、测试结果、MATLAB建模与仿真、课设体会与总结及参考文献等完整章节可帮助读者系统掌握PWM控制、占空比调节与闭环反馈等核心知识点。目前已有3246人学习下载适合需要完成课程设计、撰写实验报告或借助MATLAB验证斩波电路动态响应与纹波、效率等指标的学生与工程人员参考。1. 升、降压直流斩波电路到底在解决什么问题做电力电子的人迟早会撞上同一个场景手里只有 24V 的开关电源负载却要 12V 或者 36V中间还要求效率不能低于 90%线性稳压一上电就烫得摸不住。这时候升、降压直流斩波电路就是绕不开的选项。它本质上是靠一个开关管、一个电感、一个二极管加电容通过控制开关管的导通占空比把固定的直流输入变成可调的直流输出。降压斩波Buck让输出低于输入升压斩波Boost让输出高于输入两者合起来就是标题里说的升、降压直流斩波电路。Matlab 仿真在这里的角色不是锦上添花而是帮你把电感、电容、开关频率、占空比这几个参数在烧管子之前先算清楚。很多新手直接焊板子结果电感选小了电流断续输出纹波大得示波器都看不清或者占空比给到 0.9 才发现 Boost 根本升不上去。用 Matlab/Simulink 搭一遍这些坑在电脑里就能暴露。这篇笔记面向的是刚接触电力电子、需要交课程设计或者要快速验证一个 DC-DC 方案的人从 Buck 和 Boost 的数学关系讲到 Simulink 里怎么搭、参数怎么设、波形怎么读最后落到一个能直接抄的仿真框架上。2. 降压斩波电路从占空比公式到 Simulink 搭出第一条波形2.1 Buck 电路的电压关系为什么是 D 乘以 Vin降压斩波电路工作在连续导通模式CCM时电感电压在一个周期内伏秒平衡。开关管导通期间电感两端电压是 Vin 减去 Vout开关管关断期间电感通过续流二极管释放能量两端电压是负的 Vout。一个周期内电感电压平均值为零所以(Vin - Vout) × D × T Vout × (1 - D) × T化简后得到 Vout D × Vin。这个公式说明降压斩波电路的输出完全由占空比 D 决定D 从 0 到 1 变化输出就从 0 到 Vin 变化。但实际电路里 D 不能取到 1因为开关管需要关断时间而且电感电流不能突变D 太大会导致电流纹波过大。这里有个容易被忽略的点上面的推导假设电感电流始终大于零也就是 CCM。如果负载电流很小电感电流会降到零并保持一段时间进入断续导通模式DCM这时候 Vout 就不再等于 D × Vin 了而是和负载、电感量都有关系。仿真时如果发现输出电压比理论值高先检查是不是进了 DCM。2.2 电感量和电容量的估算方法电感量决定了电流纹波的大小。工程上一般把电感电流纹波控制在额定输出电流的 20% 到 40% 之间。计算公式是L (Vin - Vout) × D / (fsw × ΔIL)其中 fsw 是开关频率ΔIL 是允许的电感电流纹波。举个例子Vin24VVout12Vfsw50kHz额定输出电流 2A取纹波为 0.6A那么 D0.5L (24-12)×0.5 / (50000×0.6) 200μH。输出电容主要看纹波电压要求。CCM 下输出纹波近似为ΔVout ΔIL / (8 × fsw × Cout)如果要求纹波不超过 50mVΔIL0.6Afsw50kHz那么 Cout 0.6 / (8×50000×0.05) 30μF。实际选型要留余量并且注意电容的等效串联电阻ESR会额外贡献纹波ESR 上的纹波是 ΔIL × ESR很多时候这一项比容性纹波还大。2.3 在 Simulink 里搭一个最小 Buck 模型下面这段脚本用 Matlab 命令行的方式创建一个 Buck 电路的仿真模型框架。实际在 Simulink 里拖模块也可以但用脚本建模型更方便批量改参数。% 创建一个新的 Simulink 模型 modelName buck_chopper_demo; new_system(modelName); open_system(modelName); % 添加电源、开关管、二极管、电感、电容、负载 add_block(simulink/Sources/DC Voltage Source, [modelName /Vin]); set_param([modelName /Vin], Amplitude, 24); add_block(simulink/Simscape/Electrical/Semiconductors/Diode, ... [modelName /D1]); add_block(simulink/Simscape/Electrical/Passive/Inductor, ... [modelName /L1]); set_param([modelName /L1], L, 200e-6); add_block(simulink/Simscape/Electrical/Passive/Capacitor, ... [modelName /C1]); set_param([modelName /C1], C, 30e-6); add_block(simulink/Simscape/Electrical/Passive/Resistor, ... [modelName /Rload]); set_param([modelName /Rload], R, 6); % 12V/2A 6欧 % 脉冲发生器驱动开关管频率50kHz占空比0.5 add_block(simulink/Sources/Pulse Generator, [modelName /PWM]); set_param([modelName /PWM], Period, 2e-5, ... PulseWidth, 50, Amplitude, 1); % 设置仿真时间 set_param(modelName, StopTime, 0.01); save_system(modelName);这段代码的逻辑是先把主电路元件按 Buck 的拓扑连起来然后用脉冲发生器给开关管提供驱动信号。关键参数有三个电感 200μH 是按 2.2 节的公式算出来的电容 30μF 对应 50mV 纹波要求负载 6Ω 对应 12V/2A 的输出。脉冲发生器的 Period 设为 2e-5 秒对应 50kHz 开关频率PulseWidth 设为 50 表示占空比 50%。搭好之后运行仿真用 Scope 看输出电压。如果输出在 12V 附近有轻微纹波说明 CCM 下工作正常。如果输出明显偏离 12V先检查电感电流波形是不是进了 DCM再检查二极管方向有没有接反。提示Simscape 里的二极管模块默认正向压降是 0.8V 左右实际选肖特基二极管可以降到 0.3V 到 0.5V仿真时可以把正向压降改小更接近真实效率。3. 升压斩波电路为什么占空比不能给到 13.1 Boost 电路的电压关系与右半平面零点升压斩波电路在 CCM 下的输出电压是 Vout Vin / (1 - D)。当 D 趋近于 1 时Vout 理论上趋近无穷大但实际电路里电感电阻、开关管导通电阻、二极管压降都会限制最大升压比。更麻烦的是 Boost 电路存在右半平面零点这个零点会让闭环控制变得不稳定动态响应变慢。仿真时如果只开环跑看不到这个问题一旦加电压反馈环就会发现负载突变时输出先反向变化再恢复这就是右半平面零点在作怪。从能量守恒的角度看Boost 电路在开关管导通时电感储能关断时电感电压叠加在输入电压上一起给输出供电所以输出能高于输入。占空比越大电感储能时间越长释放时叠加的电压越高。但占空比超过 0.8 以后电感电流纹波会急剧增大开关管和电感的电流应力也跟着上去效率反而下降。工程上一般把 Boost 的占空比限制在 0.7 到 0.85 之间。3.2 电感电流连续与断续的边界条件Boost 电路进入 DCM 的边界和 Buck 类似但公式不同。临界电感量是Lcrit D × (1 - D)^2 × R / (2 × fsw)其中 R 是负载电阻。以 Vin12VVout24Vfsw50kHzR24Ω对应 1A 输出为例D 1 - Vin/Vout 0.5Lcrit 0.5 × 0.25 × 24 / (2 × 50000) 30μH。如果实际电感小于 30μH轻载时就会进 DCM输出电压会高于理论值。仿真时判断 DCM 的方法很简单看电感电流波形如果在开关管关断期间电流降到零并保持一段平线就是 DCM。这时候电压调整率会变差负载变化时输出波动明显。3.3 用 Matlab 脚本参数化扫描占空比下面这段脚本用循环的方式扫描不同占空比下的输出电压帮你快速找到合适的 D 值。这里用简化的平均模型代替开关模型速度快适合做参数扫描。% Boost 电路参数 Vin 12; L 100e-6; C 100e-6; R 24; fsw 50e3; % 扫描占空比从 0.1 到 0.9 D_range 0.1:0.05:0.9; Vout_avg zeros(size(D_range)); for k 1:length(D_range) D D_range(k); % 平均模型下的理想输出电压 Vout_ideal Vin / (1 - D); % 考虑电感电阻和二极管压降的修正 Rl 0.1; % 电感等效串联电阻 Vd 0.5; % 二极管正向压降 % 简化修正公式实际仿真需要用开关模型验证 Vout_avg(k) (Vin - Vd*(1-D)) / ((1-D) Rl/(R*(1-D))); end % 画图 figure; plot(D_range, Vout_avg, b-o, LineWidth, 1.5); xlabel(占空比 D); ylabel(输出电压 Vout (V)); title(Boost 电路输出电压随占空比变化); grid on;这段代码的逻辑是用平均模型快速估算不同占空比下的输出电压其中考虑了电感等效串联电阻和二极管正向压降的修正。参数说明Rl 取 0.1Ω 是常见电感的直流电阻量级Vd 取 0.5V 对应肖特基二极管。运行后会看到一条曲线在 D 小于 0.7 时输出电压随 D 近似线性上升D 超过 0.8 后曲线变平甚至下降这就是寄生参数限制升压能力的表现。注意平均模型只能看稳态趋势不能替代开关模型的波形验证。确定 D 的大致范围后还是要回到 Simulink 里用开关模型跑一遍看电感电流应力和输出纹波。4. 仿真参数怎么设开关频率、步长和求解器的选择4.1 开关频率与仿真步长的关系Simulink 仿真开关电路时步长必须远小于开关周期否则会漏掉开关动作。经验法则是步长取开关周期的 1/100 到 1/1000。50kHz 开关频率对应周期 20μs步长取 0.1μs 到 0.2μs 比较合适。如果步长太大PWM 波形会失真输出电压算不准步长太小仿真时间会拉得很长。在 Simulink 里如果用的是固定步长求解器直接把步长设成 1e-7 秒0.1μs。如果用的是变步长求解器把最大步长限制在 1e-7最小步长可以放到 1e-9。变步长在稳态时步长会自动放大速度快一些但在开关瞬间会缩小步长保证精度。4.2 求解器选择ode23tb 还是 ode45电力电子仿真常用 ode23tb 或 ode15s这两个是刚性求解器适合处理开关动作带来的不连续。ode45 是非刚性求解器在开关电路里容易卡在开关瞬间反复计算速度慢甚至报错。我一般先用 ode23tb 跑如果发现仿真速度可以接受就不换。如果模型里还有控制环路ode23tb 也能稳定处理。下面是一个设置求解器参数的脚本片段% 设置仿真求解器参数 set_param(modelName, Solver, ode23tb); set_param(modelName, MaxStep, 1e-7); set_param(modelName, RelTol, 1e-3); set_param(modelName, AbsTol, 1e-6); set_param(modelName, StopTime, 0.02); % 运行仿真 simOut sim(modelName);这里 MaxStep 设为 1e-7 秒对应 50kHz 开关周期的 1/200。RelTol 和 AbsTol 控制求解精度电力电子仿真里 RelTol 取 1e-3 通常够用要求高可以取 1e-4。StopTime 设为 0.02 秒包含 1000 个开关周期足够看到稳态波形。4.3 用 To Workspace 模块导出波形做后处理Simulink 的 Scope 看波形方便但要做定量分析还是得把数据导到 Matlab 工作区。用 To Workspace 模块把电感电流、输出电压、开关驱动信号存成数组然后用 plot 命令画图、算纹波、算效率。% 假设 simOut 里已经保存了 Vout 和 IL 的时间序列 t simOut.tout; Vout simOut.Vout.Data; IL simOut.IL.Data; % 取稳态段去掉前 50% 的启动过程 idx t 0.01; Vout_steady Vout(idx); IL_steady IL(idx); % 计算输出电压平均值和纹波 Vout_mean mean(Vout_steady); Vout_ripple max(Vout_steady) - min(Vout_steady); % 计算电感电流平均值和纹波 IL_mean mean(IL_steady); IL_ripple max(IL_steady) - min(IL_steady); fprintf(输出电压平均值: %.3f V\n, Vout_mean); fprintf(输出电压纹波: %.3f V\n, Vout_ripple); fprintf(电感电流平均值: %.3f A\n, IL_mean); fprintf(电感电流纹波: %.3f A\n, IL_ripple);这段代码先截取稳态段避免启动过程的冲击影响统计。然后分别算输出电压和电感电流的平均值与峰峰值。参数说明idx 的条件 t 0.01 表示只取仿真后半段具体阈值根据启动时间调整。算出来的纹波值可以和 2.2 节的理论估算对比如果差太多检查电感和电容的实际值是不是和设定一致。5. 避坑与排查仿真跑不通时先看这几个地方5.1 输出电压远低于理论值现象Buck 电路设 D0.5Vin24V理论输出 12V实际仿真只有 8V 左右。原因最常见的是电感进入了 DCM或者开关管驱动信号没有正确加到开关管上。另一个可能是二极管方向接反导致续流路径不通。解决先看电感电流波形如果电流在关断期间降到零说明电感太小或负载太轻换大电感或加大负载。再看驱动信号确认脉冲发生器的输出接到了开关管的控制端。最后检查二极管方向阳极接电感侧阴极接输出侧。5.2 仿真速度极慢或报错“步长太小”现象仿真跑了几分钟才前进几毫秒或者直接报错说步长小于最小步长。原因求解器选错了用了 ode45 这类非刚性求解器或者模型里有代数环比如电压源直接并联电容没有串联电阻。解决把求解器换成 ode23tb 或 ode15s。检查模型里有没有电压源和电容直接并联、电流源和电感直接串联的情况这些会形成代数环。在电容支路串一个小电阻比如 1mΩ通常能解决。5.3 输出纹波比理论计算大很多现象按公式算出来纹波 50mV仿真跑出来 200mV。原因电容的等效串联电阻ESR没考虑。实际电容 ESR 在几十毫欧到几百毫欧纹波电流在 ESR 上产生的压降可能远大于容性纹波。另一个原因是仿真步长太大PWM 波形失真导致开关瞬间的尖峰被平均掉了。解决在电容模块里设置 ESR 参数一般电解电容取 50mΩ 到 200mΩ陶瓷电容取 5mΩ 到 20mΩ。同时把仿真步长减小到开关周期的 1/500 以下重新跑一遍看纹波是否接近理论值。5.4 Boost 电路占空比超过 0.8 后输出反而下降现象D 从 0.7 加到 0.85输出电压不升反降。原因电感等效串联电阻和开关管导通电阻上的压降随电流增大而增大占空比越大电感电流越大损耗也越大。当损耗吃掉的电压超过升压带来的增益时输出就下降了。解决换更大电感量的电感降低直流电阻或者换导通电阻更小的开关管。仿真时把电感串联电阻和开关管导通电阻设成实际值不要用理想 0Ω否则看不到这个现象。5.5 启动时输出电压过冲很大现象Buck 电路上电瞬间输出冲到 18V 再回落到 12V。原因启动时电容电压为零误差放大器输出饱和占空比跑到最大电感电流快速上升给电容充电导致过冲。解决加软启动电路让占空比从零慢慢升到目标值。仿真里可以用一个斜率限制模块或者用一个随时间上升的参考电压代替固定参考。实际电路里很多 PWM 控制器自带软启动引脚外接一个电容就能设定启动时间。6. 从开环到闭环加一个电压反馈环看动态响应开环仿真只能看稳态实际电源都要闭环稳压。在 Simulink 里加一个 PI 控制器把输出电压采样回来和参考值比较误差经过 PI 调节后去控制占空比。这里的关键是 PI 参数怎么整定以及 Boost 电路右半平面零点带来的相位滞后怎么补偿。先看 Buck 电路的闭环。PI 控制器的输出限幅在 0 到 0.95 之间防止占空比饱和。比例系数 Kp 先取小一点比如 0.01积分系数 Ki 取 100跑一遍看阶跃响应。如果输出上升太慢加大 Kp如果有振荡减小 Kp 或加大 Ki 的积分时间。我一般先用 Ziegler-Nichols 法粗调再手动微调。% 在 Simulink 里添加 PI 控制器模块 add_block(simulink/Continuous/PID Controller, [modelName /PI]); set_param([modelName /PI], Controller, PI); set_param([modelName /PI], P, 0.01); set_param([modelName /PI], I, 100); set_param([modelName /PI], LimitOutput, on); set_param([modelName /PI], UpperSaturationLimit, 0.95); set_param([modelName /PI], LowerSaturationLimit, 0); % 添加参考电压和误差计算 add_block(simulink/Sources/Constant, [modelName /Vref]); set_param([modelName /Vref], Value, 12); add_block(simulink/Math Operations/Sum, [modelName /Error]); set_param([modelName /Error], Inputs, -);这段代码添加了 PI 控制器、参考电压和误差求和模块。PI 输出限幅在 0 到 0.95对应占空比的物理限制。Kp0.01、Ki100 是一个保守的起点实际调试时根据阶跃响应调整。Boost 电路的 PI 参数更难调因为右半平面零点会让相位裕度变小Kp 不能太大否则振荡。一个实用的技巧是在 PI 输出和 PWM 比较器之间加一个低通滤波器把高频增益压下去牺牲一点响应速度换稳定性。验证闭环性能时看三个指标阶跃响应的上升时间、超调量、恢复时间。Buck 电路一般能做到上升时间几百微秒、超调小于 5%。Boost 电路上升时间会更长超调也更大这是拓扑决定的不用强求。如果负载突变时输出跌落后恢复很慢说明积分系数太小如果恢复过程中有低频振荡说明 Kp 太大或者相位裕度不够。最后说一个我踩过的坑闭环仿真时如果 PI 输出没有限幅启动瞬间占空比会冲到 1 以上仿真直接报错或者波形完全不对。限幅不是可选项是必须项。另外仿真步长在闭环下要比开环更小因为控制环的带宽虽然远低于开关频率但误差计算和 PI 运算在每个步长都会执行步长太大会让控制信号出现阶梯影响稳定性判断。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑