ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SIMPLIS与MATLAB联合分析反激开关电源环路稳定性

SIMPLIS与MATLAB联合分析反激开关电源环路稳定性 做开关电源设计的都清楚环路补偿是又重要又磨人的一件事。仿真里跑得稳稳当当的电路一上真实负载就开始抖输出纹波大得吓人动态负载一拉电压直接塌掉。我入行那几年没少吃这个亏后来才想明白问题根源往往不在芯片或磁性元件选型而是压根没把反馈环路的开环传递函数当回事全凭经验调补偿碰上多交点环路或者反激这种带右半平面零点的拓扑自然就翻车了。准确的做法是量化它。把开环传递函数算出来、画成伯德图看穿越频率、看相位裕度、看增益裕度用数学去指导补偿参数而不是用耳朵听啸叫、用眼睛看示波器蒙。这一篇我重点讲一套我已经用了很久的组合流程从SIMPLIS提取真实的环路响应再到MATLAB里重建传递函数模型并验证最后落到伯德图上的差异分析和稳定性判断。核心对象就选大家问得最多的反激式开关电源峰值电流模式控制和UC3843这类常用控制器都能套得上。过程比较长但每一步都能落地。适合已经会用SIMPLIS画原理图、正在被环路补偿折磨、想系统搞清楚开环传递函数怎么来的电源工程师看。1. 建模前必须想清楚的三件事1.1 你实际要测的“开环传递函数”是哪一段不少初学者在建模之前就被术语绕晕了开环传递函数到底是功率级的Gvd(s)还是包含了反馈和补偿在内的环路增益T(s)这两者完全是两个东西。Gvd(s)是指从PWM控制脉冲的占空比d到输出电压vout之间的传递函数描述的是“功率级本身”的小信号特性。而做环路稳定性分析时我们真正关心的是整个反馈环路的开环传递函数也就是把环路在某个点断开、注入扰动、再测它围绕环路一圈回来的增益和相位这个量在控制理论里一般叫环路增益T(s)。T(s) Hdiv(s) · Gc(s) · Gpwm(s) · Gvd(s)其中Hdiv(s)是反馈分压网络Gc(s)是补偿器或误差放大器Gpwm(s)是PWM调制器的等效增益Gvd(s)是功率级。我们在SIMPLIS里用AC扫描直接测的通常是T(s)这个整体或者单独把Gvd(s)导出来。做MATLAB建模时也要明确建模对象如果目标是验证整个环路的稳定性那就必须把后面这几项乘起来而不是只建一个功率级模型就拿着伯德图去对比。一句话总结先把任务定义清楚再动手建模型。否则两边数据对不上最常见的原因就是测的和算的根本不是同一条传递函数。1.2 为什么把SIMPLIS和MATLAB放在一起用SIMPLIS在开关电源仿真里的地位不用多说它最大的特点是使用分段线性模型可以模拟真实的开关过程又不像SPICE那样在开关切换时死磕迭代速度非常快。尤其在“中频域”AC扫描这个功能上它可以保留开关动作本身的小信号效应直接把环路增益拉出来这一点是平均模型仿真相比不了的优势。MATLAB的优势在于数学处理。它的Bode、margin、tf、feedback这些工具箱函数用来做传递函数化简、补偿器设计、参数扫描都非常顺手。你可以在MATLAB里快速改变补偿电阻电容的参数看几十种组合的相位裕度变化而在SIMPLIS里每次改完参数再重新仿真效率就差了不少。所以我的工作流通常是SIMPLIS负责“高保真提取”MATLAB负责“快速迭代验证”。先把真实的频响数据从SIMPLIS拿出来再到MATLAB里建一个能对上曲线的传递函数模型之后补偿参数的优化就都在MATLAB里完成最后再回SIMPLIS做一次闭环验证。两边交叉印证比单靠一个工具靠谱得多。1.3 贯穿全文的实例参数为了后面讨论不至于太空泛我统一用一个典型的单端反激DC-DC作为参考对象参数如下参数数值说明拓扑CCM反激连续导通模式输入电压Vin_nom50 V额定点输出电压Vout12 V/输出功率Pout24 W满载负载电阻R6 Ω阻性负载开关频率fsw100 kHz/变压器匝比n1原副边1:1初级励磁电感Lm50 μH/输出电容Cout330 μFESR按10 mΩ处理控制方式峰值电流模式电流内环电压外环按照Vout Vin·D/(n·(1-D))额定点占空比D大约在0.19左右。这个工作点数据后面在SIMPLIS里用来核POP结果、在MATLAB里用来算传递函数的直流增益全都用得上。2. SIMPLIS端怎么做开环提取2.1 模型搭建和POP工作点检查SIMPLIS里建反激原理图不算复杂把变压器用带励磁电感的互感模型表示开关管用MOSFET或者理想开关模型反馈环路按实际电路接好。做频域扫描之前我建议先跑一次POP分析检查电路是否处于正确的周期工作状态。POP结果重点关注三件事输出电压是否在12V附近占空比是否和计算值D≈0.19对得上电感电流波形是否处于CCM状态。如果输出电压差太多先检查变压器同名端、匝比和反馈极性。反馈极性接反在SIMPLIS里通常直接表现为POP不收敛或者输出电压饱和这个坑我见很多人踩过。还有一个容易被忽略的点POP分析结束后SIMPLIS会自动把电路状态更新到周期稳态。此时不要直接接交流扫描先把POP结果保存好因为后面的中频域AC扫描是基于这个稳定工作点展开的。2.2 环路段开和注入点选择在SIMPLIS里做开环传递函数测量常见有两种做法。第一种是直接开环把反馈环路断开给控制端一个直流偏置加小信号扰动然后测输出端的响应。这种做法适合测功率级本身的Gvd(s)但不太适合测整个环路因为你很难保证开环状态下工作点和闭环相同尤其是反激这种对占空比敏感的结构。第二种是闭环注入法也就是Voltage Injection或Current Injection。具体操作是保持环路闭环在其某一个节点串入一个小信号交流源然后测这个源两侧的信号差。这样系统的工作点不会跑偏而且测到的就是真实环路增益T(s)。对反激电源来说我习惯把注入点选在反馈分压电阻网络和误差放大器输入端之间也就是电压采样回来后、进入UC3843的COMP或FB之前的那根线。这个位置的阻抗中等用电压注入比较合适。操作上在SIMPLIS原理图中把这个节点的连线断开插入一个标称值为0V的AC扫描电压源。源的直流偏置设成0这样它不会改变静态工作点。注入点的阻抗高低会影响测量精度这是后面排查时的重点先记在这里。2.3 中频域AC扫描的设置与探针摆放SIMPLIS的AC Analysis有两类一类是普通的线性小信号扫描建模对象是平均化的线性模型速度快但会丢掉开关频率附近的部分效应另一类是Medium Frequency Domain扫描也叫中频域分析它把开关动作保留在小信号模型里非常适合开关电源的环路增益测量。我用的是后者。设置参数大致如下扫描频率范围10 Hz到1 MHz覆盖从低频到开关频率10倍的范围扫描点数每十倍频程50到100个点太少了曲线不光滑太多了浪费时间注入信号幅度0.1 V到0.5 V保证小信号激励同时又不至于引起占空比饱和在注入源两端分别放置测量探针一个标IN一个标OUT。SIMPLIS会计算这两个探针位置之间的环路增益。需要注意探针参照地要一致否则引入共模噪声后测出来的相位曲线会莫名其妙地多出一个极点或者零点。跑完之后在结果窗口里应该能看到幅频和相频两条曲线。正常反激环路在低频段增益较高过了主极点之后以约-20dB/dec斜率下降在穿越频率附近相位裕度应该清晰可辨。如果曲线出现明显谐振尖峰或者相位在低频就快速跌落先不要急着导出数据回头查一下负载类型和变压器模型参数。2.4 把频响数据导出成CSVSIMPLIS的波形窗口支持数据导出。在伯德图窗口上右键选择导出格式选CSV数据通常包含频率、幅值、相位。导出前确认一下幅值单位有些版本导出的幅值是线性值而不是dB这会直接影响MATLAB那边构造频响函数时的正确性。导出后的文件结构大概是三列第一列频率单位Hz第二列增益单位dB或者线性第三列相位单位度。拿到这个文件后不要着急关掉SIMPLIS把仿真模型留着后面在MATLAB里改了补偿参数很可能还要回来重扫。我自己会在文件名里标注工作条件比如flyback_T12_50Vin_24W_loopgain.csv后面多工作点比较时一眼就能分清。3. MATLAB端如何重建传递函数模型3.1 由平均状态方程推导功率级传递函数MATLAB里建模可以从第一性原理出发用平均状态空间法手推功率级的小信号传递函数。这个方法对任何开关电源拓扑都适用思路是先写出状态变量的平均方程然后施加小信号扰动把非线性方程线性化最后整理成s域传递函数。以CCM反激为例状态变量选输出电压vout和励磁电感电流ilm。写出电容和电感的平均状态方程后经过小信号线性化得到的控制到输出传递函数通常可以写成下面的通用形式Gvd(s) Kc · (1 s/ω_ESR) · (1 - s/ω_RHP) / ((1 s/ω_p1) · (1 s/ω_p2))分子上的ω_ESR对应输出电容ESR引入的零点ω_RHP则对应反激最大的坑右半平面零点。在CCM模式下这个零点的频率和负载电流、初级电感量直接相关负载越重、电感越小RHP零点频率越低。它给系统带来的是相位“负向”贡献这和大零点正好相反。即使幅频曲线上看它像个正常的零点会拉起增益相位却会在它的频率处继续向下掉所以设计增益交叉频率时要尽量远离RHP零点。对峰值电流模式控制的反激功率级的低频极点会被电流环压缩成一个单极点传递函数又不太一样。我建议在MATLAB里建立一个通用的频响表达式模板把极点和零点位置作为参数接下去用实测数据去拟合而不是一上来就执着于从物理公式手推完整表达式。物理推导用来确定极零点的次数和大致范围曲线拟合用来修正具体位置两条腿走路效率最高。3.2 补偿器和反馈网络折算进开环传递函数如果目标是验证完整的环路增益仅仅有Gvd(s)是不完整的。前面说了还要乘上Hdiv(s)、Gc(s)和Gpwm(s)这几项。反馈分压网络就是一个电阻分压器假设上拉电阻为R1、下拉电阻为R2忽略输入偏置电流那么分压增益是R2/(R1R2)理想情况下它是频率无关的常数。补偿器这一项要看你用的是哪一种结构。现在小功率反激电源很多用光耦加TL431的环路方案误差放大器是跨导型的传递函数要以跨导放大器的形式去建。如果用的是UC3843这类控制器内部的误差放大器配合RC反馈网络则常采用Type II补偿。MATLAB里写起来很简单s tf(s); % 假设补偿网络参数 R0 10e3; C1 4.7e-9; C2 1e-10; % 跨导放大器 gm 0.5e-3; Gc gm * (1 s/(1/(R0*C1))) / (s*(C1C2) * (1 s/(R0*C2)));这一段的意义在于你可以直接在MATLAB里改变C1、C2的数值立刻看到整个环路相位裕度的变化不需要每次都在SIMPLIS里重新跑一遍。后面我还会沿用这个参数在仿真里对比验证。此外PWM调制器在小信号意义下通常等效为一个比例增益Gpwm其大小等于开关周期的倒数乘以电流采样电阻或斜坡补偿相关项。中频段以下可以按常数近似但往开关频率靠近时采样和PWM更新会引入等效延迟这个部分下一步专门讲。3.3 PWM延迟导致高频相位对不上的元凶用理想平均模型和SIMPLIS对比时最容易出现的问题是低频和中频段对得非常好到了开关频率附近MATLAB模型算出的相位比SIMPLIS高而且越靠近fsw差得越大。原因就是模型中漏掉了PWM和数字控制带来的延迟效应。峰值电流模式或电压模式PWM从比较器输出到驱动实际改变占空比存在一个离散更新过程。工程上常用的是1.5倍开关周期延迟模型其中0.5个周期是采样保持引起的1个周期是PWM调制本身的零阶保持效果。在MATLAB里近似这个延迟可以用一阶Padé逼近也可以用e的复指数直接写。用指数项在频域上更直接但转换成状态空间会麻烦不过我们只做频域验证直接用指数项没毛病Tsw 1e-5; % 100kHz delay exp(-1.5 * Tsw * s);把delay乘到开环传递函数里再画伯德图高频相位会立刻落下来。这个细节是我调试环路时很有用的一招很多博主不会提但对得上对不上SIMPLIS全靠它。3.4 从SIMPLIS导出数据做系统辨识拟合如果你不想从物理原理一个一个推极点还有一个很务实的办法直接从SIMPLIS导出的频响数据在MATLAB里做系统辨识拟合出传递函数。方法不复杂。先把CSV读进来用频率点上的复数响应构造一个frd对象然后用tfest做拟合。我的示例代码大致是这样data readmatrix(flyback_loopgain.csv); freq_hz data(:,1); gain_db data(:,2); phase_deg data(:,3); w 2*pi*freq_hz; resp 10.^(gain_db/20) .* exp(1j*phase_deg*pi/180); frd_sys frd(resp, w); opt tfestOptions(SearchMethod,lm, Display,on); sys_fit tfest(frd_sys, 3, 2);这里npole取3、nzero取2通常可以拟合出带一个右半平面零点的反激环路模型。如果拟合效果不好可以先手动给定初始系统init_sys idtf([100 1000], [1 100]).*idtf(1, [1 2000]); sys_fit tfest(frd_sys, init_sys);初始值不用非常准只要极点和零点的大致量级对就能极大提高收敛概率。拟合完成后用bode(sys_fit, w)画出来和原始frd数据叠在一起看误差如果偏差超过2dB和5度就说明模型阶数不够或者RHP零点漏了。这套拟合方法特别适合那种结构复杂、手推太费劲的多路输出电源。你先用SIMPLIS把真实曲线拿全再用MATLAB去拟合和化简相当于用仿真数据反推等效模型精度已经远高于凭经验猜参数。4. 伯德图对比验证标准与结果判读4.1 稳定判据的三个关键点拿到两条伯德图重叠在一起后第一件事不是看它们贴得有多紧而是直接用稳定判据去评估整个环路。工程上最常用的三个指标是穿越频率、相位裕度、增益裕度。穿越频率指的是环路增益降到0dB时的频率它决定系统的带宽和动态响应速度。对反激电源穿越频率一般取开关频率的1/10到1/5之间也就是10kHz到20kHz的量级但RHP零点较近时需放低保守一些。相位裕度是穿越频率处环路相位距离-180度的余量。行业里的通行做法是大于45度至少要大于30度裕度太低负载瞬态时容易振铃甚至振荡。增益裕度则是在相位达到-180度时增益距离0dB还有多少余量一般要求大于6dB。另外还有一个容易被忽略的经验增益曲线穿越0dB的斜率最好是-20dB/dec。如果以-40dB/dec穿越就算相位裕度看着还行这个系统对噪声和元件参数变化也会非常敏感不推荐。4.2 SIMPLIS结果与MATLAB理想模型差异的常见来源把SIMPLIS扫出来的曲线和MATLAB模型画在一起通常低中频段应该比较贴合但两条线不可能完全重合。差异主要来自几个方面我整理成了一份速查表遇到对不上时可以直接拿来排查。差异现象可能原因处理建议低频增益不同工作点不一致例如输入电压或负载设定不同核对SIMPLIS的POP结果确保D、Vin、R与MATLAB参数一致中频极点位置偏移输出电容ESR、负载电阻取值有偏差在MATLAB参数里加入ESR不要用理想电容高频相位始终差一截缺少PWM延迟或采样延迟补上1.5倍开关周期延迟项曲线在开关频率附近出现谐振峰未建模输出电容寄生电感或变压器漏感增加一个高频极点模拟ESL效应反激相位在低频就开始持续下降RHP零点确实存在且频率较低确认占空比和励磁电感取值RHP零点频率算准这几种差异里我遇到最多的是PWM延迟缺失导致的高频相位对不上以及RHP零点位置算错导致的中频相位走向不对。这两种情况在伯德图上表现出的特征差别挺大前者只在高频段分开后者从中频就开始明显分化通过观察曲线形状可以快速锁定原因。4.3 多工作点扫描确认环路在全范围内稳定只在一个工作点验证稳定性远远不够。开关电源的输入电压可以从20V到80V变化负载从空载到满载每一个极端条件下的环路特性都可能和额定点差很多尤其是反激的RHP零点它随着负载变重而往低频移动相位恶化得厉害。我的习惯是在MATLAB里把小信号模型参数化把D、Vin、Rload这些都写成变量然后循环算出多个工作点的伯德图一次性输出相位裕度和增益裕度表格Vin_list [30 50 70]; Rload_list [3 6 20]; for vi Vin_list for rl Rload_list % 重新计算工作点和传递函数系数 [gm, pm, wc] margin(loop_tf); fprintf(Vin%g, R%g, GainMargin%.1f dB, PhaseMargin%.1f deg\n, ... vi, rl, 20*log10(gm), pm); end end跑完这个循环你会立刻知道哪个工况的相位裕度最低哪个工况的穿越频率太高。然后在SIMPLIS里挑最恶劣的一两个工况做复核。这样比每一个工况都跑一遍SIMPLIS高效得多又比纯靠MATLAB放心得多——毕竟SIMPLIS那个模型里带了真实开关和寄生效应。5. 排查与避坑清单5.1 单位与数据格式的坑用CSV导入数据时最常见的坑有三个。第一幅值单位混淆。SIMPLIS某些界面显示的是线性增益但导出CSV时又默认是dBMATLAB读取时如果你统一按dB处理结果就是整个伯德图相差一个对数变换的关系。建议在CSV里专门加一列或者用表格头标注清楚别靠肉眼确认。第二相位的解缠绕。SIMPLIS导出的相位曲线有时会在±180度附近跳变MATLAB在拟合frd对象时如果不能正确解缠绕会导致tfest的初始相位严重不对。用unwrap函数把相位先解缠一次phase_rad unwrap(phase_deg * pi / 180);第三频率轴单位。确认导出的频率是Hz而不是rad/s我用过一次某个版本导出的频率列其实是角频率导致所有极点位置算错了6.28倍检查半天才发现。5.2 系统辨识拟合不收敛的应对用tfest拟合反激环路时因为右半平面零点的存在标准的线性搜索可能卡在局部最优解。一个很实用的办法是分两步走先固定一个低阶模型比如先拟合一个没有RHP零点的一阶模型把它作为初值再把模型阶数提高给RHP零点留自由度重新拟合。还可以用bode选项里面的输入激励权重让拟合时更重视穿越频率附近的点而不是停止在增益非常高的低频段。低频增益动辄好几十分贝误差权重一旦失衡拟合算法会为了压低低频误差而牺牲穿越频率附近的精度最后结果在关键频段歪得没法看。我自己做的时候会在tfestOptions里把权重向量设置成和1/增益成比例或者只提取穿越频率前后十倍频程的数据做拟合。这个小技巧能显著提升环路模型在稳定性判据关心区域内的精度。5.3 注入点位置选错导致测出的增益不对如果发现SIMPLIS测出来的环路增益和MATLAB模型差得离谱而且高频段尤为离谱先检查注入点位置。注意要避免把注入点选在低阻抗节点比如直接跨接在误差放大器的输出端和地之间。理想电压源直接并到低阻抗点相当于短路了半个环路测出来的东西不再是环路增益。分压电阻网络之后到误差放大器输入端之间是相对合适的注入位置。这里阻抗适中信号完整而且误差放大器的高输入阻抗不会给注入源造成额外负载效应。如果遇到的是电流型控制的芯片建议多试着在不同注入点分别测一次结果应该一致两次结果差异很大说明某个点已经破坏了环路条件需要重新选择。5.4 补偿设计的时候别贪带宽最后一条经验也是我最想强调的做补偿设计时不要为了追求“更快的动态响应”把穿越频率推得过高。反激电源在高频处有RHP零点带宽太高等于把相位裕度往火坑里推。我的实用建议是对100kHz开关频率的反激穿越频率保守起见先设在5kHz到10kHz之间相位裕度目标50度以上。等MATLAB仿真确认全工况都达标再考虑能不能往上提。否则你优化出一个在额定点40度相位裕度的系统看着还行实际生产时电感量和电容容差一浮动就可能恶化到30度以下上线就炸。6. 个人体会与后续扩展这套SIMPLIS到MATLAB的流程我大概在两三个反激项目里完整跑过最大的感触是它把环路补偿这事从“玄学”变成了“工程”。以前调补偿像在黑暗中拧旋钮现在就是先看伯德图再算参数一次改到位。流程中的另一个收获是当你用MATLAB把SIMPLIS的频响数据拟合出解析传递函数后很多衍生分析就变得方便了。可以用bode比较不同负载下的曲线变化可以用margin查看每个工作点的相角余量甚至可以把延迟项、ESR效应全部参数化做成一个一键出报告的脚本。后续再碰到新项目只需要改掉拓扑参数和电路参数整个分析模板可以复用。最后再分享一个我自己的小习惯写完MATLAB验证脚本后我会把SIMPLIS里的关键工况截图、CSV数据、MATLAB的拟合代码和最终的伯德图对比一并归档到项目文件夹。调试记录和结果复盘后来帮了我大忙特别是过了一段时间重新Review设计时不用重新再做一遍仿真就能完全还原当时的设计分析和决策过程。这次把完整流程拿出来分享也是希望正在被反激电源环路稳定性困扰的朋友少走几步弯路。
返回列表