开关电源环路设计实战:SIMPLIS与Matlab联合验证开环传递函数
发布时间:2026/9/28 18:07:51 作者:尧图编辑部 阅读量:1,286

刚接触开关电源环路设计那阵子我最头疼的不是推导公式而是怎么确认自己算出来的传递函数到底是真是假。书上写了一大堆零极点、相位裕度公式推得头头是道可一上实际电路就翻车。后来在项目里同时用了SIMPLIS和Matlab做交叉验证才慢慢摸出一条踏实的路子。今天这篇就聊聊我用这两套工具做开关电源开环传递函数建模、再用伯德图闭环验证的完整过程包括仿真怎么搭、解析模型怎么写、两组结果怎么对比以及中途踩过的一些坑。先说清楚这个流程解决的是什么问题。开关电源本质上是一个非线性系统PWM调制、开关管通断、二极管续流每一环都带着强烈的非线性特征。但环路补偿设计又必须在线性框架下进行所以业内通行做法就是把系统在某个静态工作点附近做小信号线性化得到开环传递函数再用伯德图判断穿越频率、相位裕度、增益裕度是否满足要求。SIMPLIS和Matlab正好覆盖了这个流程的两头SIMPLIS靠分段线性模型做时域仿真可以直接注入扰动测出环路增益Matlab则靠状态空间平均法把功率级、补偿网络、PWM调制器写成解析表达式从数学上把系统掰开揉碎。两条路互相对照基本上能把“算的”和“仿的”对上让结论站得住。1. 为什么用SIMPLIS测环路增益不用Matlab直接画1.1 开关电源仿真工具的场景差异做电源仿真的人都知道传统通用电路仿真器在开关电源上有个尴尬问题——收敛慢。开关管每一周期都在高速通断电压电流波形带大量高频分量如果按纳秒级步长仿真几十毫秒的启动过程算到天荒地老也不一定能出结果。SIMPLIS的厉害之处在于它用了分段线性建模开关管导通、关断被抽象成两个线性状态状态切换瞬间用事件驱动机制处理仿真速度比普通SPICE类工具快好几个数量级。做环路增益测量时SIMPLIS的AC Analysis功能可以直接在一个稳定工作的开关周期上叠加小信号扰动快速扫出频域响应这是它在这个场景下不可替代的原因。Matlab/Simulink则适合做另一件事——机理建模。把功率级电感电容、开关管占空比到输出的传递函数用公式表达出来再串上补偿网络、PWM调制器的增益整个环路就变成一张清晰的信号流图。好处是你能精确控制每一个参数随时修改补偿零点、极点看系统怎么变化完全不受仿真步长和收敛问题影响。缺点是模型本身是近似的寄生参数、非线性效应得自己补进去补得不够模型就会偏离真实电路。1.2 环路补偿设计的完整流程我实际项目中的流程是这样的先用Matlab写解析模型快速确定补偿参数的大致范围然后把补偿参数带进SIMPLIS做时域仿真验证用AC Analysis扫出实际环路伯德图最后对比两组曲线如果穿越频率、相位裕度差异在合理范围内就可以放心打样。这样做的好处是两层保险Matlab模型帮理解电路本质SIMPLIS仿真帮验证实际效果两个工具互相兜底比起单靠一个工具要稳妥得多。有人可能会问直接用SIMPLIS扫伯德图不行吗当然行。但SIMPLIS不太擅长回答“为什么”你很难直接看出某个零点是补偿网络引入的还是功率级自带的也很难快速做参数扫描。Matlab的优势恰好在这——公式写在明面上参数一改曲线立变推导过程本身就是加深理解的过程。等理解透了再回头去调仿真效率高很多。2. 用SIMPLIS搭建待测开关电源并注入扰动2.1 搭建Buck电路作为被测对象我这次演示以同步Buck拓扑为例因为结构简单波形直观适合把流程讲清楚。输入12V输出3.3V开关频率200kHz电感4.7uH输出电容用两颗22uF陶瓷电容并联低ESR场景负载电阻直接设成1欧姆。主控用电压模式PWM占空比由误差放大器输出和锯齿波比较产生。在SIMPLIS里搭电路时特别注意三点第一功率器件模型要选合适的复杂度原理验证阶段用理想开关模型就够没必要上带寄生参数的详细MOSFET模型否则仿真速度会明显变慢第二补偿网络要用真实运放搭出来因为后面要测量包含补偿在内的完整环路增益直接从理想受控源搭会让结果失去参考价值第三给电感串联一个很小的DCR比如10毫欧给电容串联ESR建议50毫欧左右这些寄生参数对高频段增益曲线有实际影响完全忽略会让仿真结果偏乐观。2.2 SIMPLIS中环路增益注入点的选择SIMPLIS测环路增益的核心思路是Middlebrook方法在闭环回路里插入一个交流扰动源分别测扰动源两侧的信号两者之比就是该点的环路增益。注入点位置有讲究通常选在反馈分压电阻之后、误差放大器之前的位置也就是高阻抗节点。高阻抗节点对扰动源负载效应小测量结果更接近真实环路特性。实际操作中我会把电压扰动源串接在反馈路径上设成AC幅值1V、DC偏置0V。扰动源一侧接分压电阻输出另一侧接误差放大器输入。然后运行AC Analysis扫频范围设10Hz到1MHz对数分布扫描点数量设100个左右就足够。仿真器会自动在每个频点计算扰动源两侧的比值输出增益幅值和相位两条曲线。这里注意扫描点别设太少不然相位曲线在穿越频率附近会显得很毛糙影响判读。2.3 SIMPLIS伯德图输出与数据导出跑完AC Analysis后SIMPLIS会给出完整的伯德图。我习惯把增益曲线和相位曲线单独看增益从低频开始经过主极点后以-20dB/dec斜率下降穿越0dB时的频率就是穿越频率相位曲线对应频率处的值减去-180度就是相位裕度。数据可以导出成文本文件或CSV格式里面每一行是一个频率点对应的增益和相位。这个文件后面要和Matlab解析模型画出来的曲线放到同一张图里对比。3. 用Matlab建立开关电源开环传递函数的解析模型3.1 状态空间平均法的核心表达式Matlab建模我选状态空间平均法这是最经典也最好上手的方法。核心思路是把开关周期内不同开关状态下系统方程取时间平均把非线性时变系统等价成一个近似线性时不变系统。对Buck电路占空比d到输出v的传递函数可以写成Gvd(s) Vin * (1 sESRC) / (1 s*(L/R) s²LC)这个式子相信很多做过电源的人都见过。L是电感值C是输出电容ESR是电容等效串联电阻R是负载电阻Vin是输入电压。分母是二阶系统标准形式可以改写成用自然频率和阻尼比表达的格式方便直接观察功率级的谐振峰。在此基础上再乘上补偿网络传递函数和PWM调制器增益就得到完整开环传函。PWM调制器增益是锯齿波幅值的倒数比如锯齿波峰值是2V那增益就是0.5。3.2 补偿网络与PWM调制器的解析建模我用的补偿网络是Type II也就是单个零点加单个极点的经典结构非常适合电压模式Buck这种功率级相位滞后不是特别夸张的场景。Type II传递函数写成Gc(s) gm * (1 sωz) / (s * (1 sωp))这里gm是中频带增益由误差放大器跨导和外围电阻决定ωz是零点频率对应串联的RC网络ωp是极点频率对应补偿电容和运放自身带宽。把Gvd(s)和Gc(s)相乘再乘上PWM调制器增益就是整个环路的开环传递函数。用Matlab控制系统工具箱可以很轻松地建模Vin 12; L 4.7e-6; C 44e-6; ESR 0.05; R 1; Gvd tf([Vin*ESR*C, Vin], [L*C, L/R, 1]); % Type II补偿网络参数 gm 0.002; wz 2*pi*5e3; wp 2*pi*50e3; Gc tf([gm, gm*wz], [1, wp]); % PWM调制器增益 PWM_gain 0.5; Loop series(Gc*PWM_gain, Gvd); bode(Loop, {2*pi*10, 2*pi*1e6}); grid on;这段代码跑完Matlab会直接画出开环增益和相位曲线。注意这里tf函数传的是多项式系数零点、极点直接展开成多项式写进去不需要手动化简非常省事。实际用的时候我建议把L、C、R这些参数定义成变量后面做参数扫描或者改工况时只需要改一行数值就行。3.3 解析模型里的关键近似与偏差预估解析模型天然带着近似这一点心里要有数。第一个近似是忽略了开关管的导通电阻和二极管导通压降重载情况下这些损耗会让实际直流增益略低于理想值。第二个近似是输出电容的ESL等效串联电感没有考虑ESL会在很高频处引入额外零点一般超过穿越频率好几倍就不用管但如果穿越频率本身设计得很高ESL影响就不能忽略。第三个近似是采样保持效应峰值电流模式控制会有斜坡补偿问题电压模式控制相对单纯但如果补偿网络带宽推得太高运放有限增益带宽也会带来额外延迟。我一般在Matlab模型里先不加这些效应看基础曲线等和SIMPLIS对不上了再逐一往模型里补看看是哪个因素主导了偏差。这种做法比一开始就把模型做得特别复杂要实用得多因为复杂模型一旦出问题很难定位。4. Matlaab与SIMPLIS的双重验证法对比分析4.1 开环传递函数对比与一致性判断两边数据都准备好以后把曲线叠加在一起看。我通常用Matlab的hold on命令分别画两条增益曲线一条来自解析模型连续曲线另一条来自SIMPLIS仿真输出的离散点。如果模型正确两条曲线在中低频段应该高度重合增益斜率一致穿越频率误差在10%以内相位裕度误差不超过5到10度。我实测下来的情况用上面的Buck参数Matlab模型算出的穿越频率约28.6kHz、相位裕度约52度SIMPLIS仿真的穿越频率约30.5kHz、相位裕度约49度。差异主要来自解析模型用了理想器件参数SIMPLIS仿真里含有DCR、ESR这些寄生量以及PWM比较器延时的等效影响。这种程度的偏差属于正常范围说明模型基本正确。如果差异远大于这个水平就要回头查模型是不是漏了关键项或者SIMPLIS仿真中注入点的位置选得不对。4.2 参数一致性差异来源的排查两张图对不上时最有效的排查手段是列出可能偏差来源清单逐一核对。常见来源弯有这几项SIMPLIS仿真里的负载电阻是否与解析模型一致输出电容容值是否按标称值设的陶瓷电容DC偏置后会降容这是一个很容易踩的坑电感量是否用的实际DCR调整后的等效值补偿网络是否真的按设计参数实现运放输入偏置和输出摆幅极限会改变有效增益还有测量探针位置是否和理论中假定的注入点一致。之前有一次怎么都对不上最后发现是仿真里负载电阻设成了0.9欧姆而解析模型里写的1欧姆低负载阻抗把低频增益整体压低了一截。4.3 环路稳定性判据的工程化解读伯德图不算白画关键是要能用它做决策。工程上判断环路稳定主要看两点增益曲线穿越0dB时相位是否大于-180度也就是相位裕度是否为正通常要求至少45度最好能做到60度左右。另一个是相位曲线在穿越频率附近不能太陡如果相位在穿越点前后快速掉头说明系统存在很高的共轭极点对抗扰动性能会很差。另外还要看一眼增益裕度也就是相位到-180度时增益离0dB还有多远一般要求大于6dB约等于10dB更好。撕开表面看实质相位裕度反映了系统在受到扰动后能否快速恢复、以及恢复过程中有没有明显振铃。裕度太小动态响应会有持续振荡裕度太大响应变慢但稳定。我一般设计目标定在45-60度之间低频增益尽量高以保证稳态精度穿越频率取开关频率的1/10到1/5之间也就是20k到40k兼顾稳定性和动态速度。5. 实操中的进阶技巧与避坑经验5.1 SIMPLIS仿真的加速收敛技巧SIMPLIS虽然快但参数设置不合理也会拖慢速度甚至不收敛。我的经验是仿真步长不要设得太小默认值通常够用盲目缩小步长只会让仿真时间成倍增加精度却没有实际提升。低频扫描点可以适当增大间隔比如10Hz到1MHz用50个点就够没必要100多个。补充一个点SIMPLIS的AC分析是基于周期稳态工作点做的小信号扫描所以仿真前必须确保系统已经稳定到周期稳态可以用瞬态方式预跑一段时间等输出电压稳定后再切到AC分析。如果直接从零状态开始扫结果会包含暂态分量伯德图会非常奇怪。5.2 Matlab脚本化批处理参数扫描解析模型的另一个价值是可以批量扫描参数。我把Matlab脚本包装成一个函数输入L、C、ESR、R和补偿参数输出穿越频率和相位裕度然后用for循环批量跑一次性看几十组参数组合的表现。这样做比在SIMPLIS里反复改参数仿真要快得多适合前期方案筛选。批量跑的时候注意输出统一格式方便后期画表格对比。5.3 从仿真结果到实际硬件的坑仿真验证通过只是第一步实际硬件上还会遇到更多麻烦。比如真实运放的开环增益不是无穷大补偿网络的高频极点会和运放带宽耦合导致实际相位裕度比仿真值低5到10度又比如PCB布局引入的寄生电感和走线电阻会让开关节点振铃耦合进反馈回路高频处相位曲线出现明显毛刺。所以我的做法是仿真留出充分裕量目标相位裕度比理论值多留10度左右这样即使实际硬件有偏差也不至于一上电就振荡。6. 常见问题速查表现象可能原因排查方法仿真穿越频率远高于解析值输出电容ESR设置过小检查SIMPLIS中电容模型是否带ESR相位裕度比解析值低很多补偿运放带宽不够改用更高带宽模型重新仿真低频增益两边对不上负载电阻或输入电压参数不一致逐个核对解析模型和仿真参数高频段增益有非预期凸起输出电容ESL或寄生谐振在解析模型中加入ESL项重算相位曲线在穿越点附近剧烈下坠模型中漏了PWM比较器延时增加一阶Pade近似延时项这几个问题我在项目中基本都遇到过每次排查都花不少时间。比如第一行这个ESR问题当时用理想电容模型仿真出来的穿越频率比解析模型高了将近一倍查了半天才发现是电容模型没设ESR解析模型里却是按50毫欧计算的。这种事说出来简单但没经验时真的很容易忽略。再分享一个很有用的小技巧用Matlab画伯德图时可以用bodeplot函数搭配setoptions调显示效果把频率单位改成kHz增益单位改成dB相位角度显示方式调成“从-180度开始增加”这样曲线更贴近电源工程师的习惯。具体写法h bodeplot(Loop, {2*pi*10, 2*pi*1e6}); setoptions(h, FreqUnits, kHz, MagUnits, dB, PhaseUnits, deg);这段代码很小但我自己收益很大看曲线直观多了。数据需要导入SIMPLIS对比时先做插值把解析模型频率点对齐到仿真输出的频率点。做环路补偿这几年我最大的体会是工具链本身并不复杂难的是建立验证闭环。SIMPLIS给的是“现实”的参考Matlab给的是“理解”的框架两者互相对标的过程其实就是不断加深对电源系统本质认识的过程。等你跑通一遍完整流程后面再遇到反激、正激、LLC这些拓扑思路都是一样的先根据拓扑写状态方程再在Matlab快速建模最后用SIMPLIS验证修正。这套方法比死记硬背公式要靠得住也比纯仿真不思考要深入很多。