ARTICLE DETAIL

资讯详情

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

LTspice分立器件BUCK环路仿真:从建模到传递函数测量

LTspice分立器件BUCK环路仿真:从建模到传递函数测量 1. 为什么要在 LTspice 里用分立器件搭 BUCK 而不是直接跑平均模型很多人做 BUCK 环路仿真第一反应是找一个现成的平均电流模型或者电压模平均模型把功率级往里面一塞AC 扫描一出波特图就出来了。快是快但问题也明显平均模型把开关纹波、死区、驱动能力、寄生参数全部抹平了你看到的是一个理想化的结果。真到板子上跑相位裕度可能比仿真少十几度增益交越频率也可能对不上。用分立器件搭 BUCK 功率级本质上是在做一件更“笨”但更接近真实的事用真实的 MOSFET、真实的驱动、真实的电感电容 ESR、真实的负载让 LTspice 在时域里跑开关波形再通过 AC 扫描或者时域注入的方式把传递函数测出来。这样做的好处是你不仅能看到环路的频响还能同时观察开关节点振铃、电感电流纹波、驱动损耗这些平均模型根本给不出的信息。我自己的习惯是先用平均模型快速迭代补偿器参数确定大致方向然后用分立器件搭一版开关级模型做最终验证。两版结果如果差得不多心里就有底了如果差得多那说明平均模型里某些寄生或者延迟被忽略了这时候分立模型就是唯一的裁判。LTspice 在这个场景下的优势很明显免费、SPICE 引擎快、支持自定义行为源、支持.step参数扫描、支持 FFT 和.meas测量。尤其是它的行为源Behavioral Voltage/Current Source可以非常方便地注入小信号扰动这是测传递函数的关键。注意LTspice 的 AC 扫描默认是线性化工作点对于开关电路直接跑.ac得到的是周期平均后的结果但前提是你得先让电路在时域里跑到稳态。很多人忽略这一步直接.ac结果完全不对。2. 分立 BUCK 功率级的搭建细节与器件选型逻辑2.1 主功率回路的拓扑确认先明确我们要搭的是什么。同步 BUCK 还是非同步 BUCK如果是非同步续流用肖特基二极管如果是同步下管用 MOSFET。两者在传递函数上的差异主要体现在轻载和死区期间重载 CCM 下差别不大。为了通用性我建议先搭同步 BUCK因为现在大部分数字电源和 GaN 方案都是同步整流。主回路包括输入电容 Cin、上管 Q1、下管 Q2、电感 L、输出电容 Cout、负载 Rload。驱动部分可以用 LTspice 自带的脉冲电压源加一点死区也可以直接用理想开关先跑通再换成真实 MOSFET 模型。2.2 MOSFET 模型的选择与导入LTspice 自带一些 MOSFET 模型比如IRF540、IRFZ44等但这些是硅基器件导通电阻和栅极电荷都偏大。如果你做的是低压大电流 BUCK建议去厂商官网下载 SPICE 模型比如 Infineon、Vishay、ON Semi 都有.lib或.mod文件。导入方法很简单把.lib文件放到 LTspice 的lib/sub目录下然后在原理图里放一个nmos符号右键选择Pick New MOSFET如果模型已经注册会出现在列表里。如果没有可以用.include语句直接指向文件路径。.include C:\Users\YourName\Documents\LTspiceXVII\lib\sub\your_mosfet.lib提示LTspice 对模型文件的路径很敏感路径里不要有中文和空格否则会报unknown schematic syntax或者找不到文件。2.3 电感与电容的寄生参数设置这是分立模型和平均模型拉开差距的地方。真实电感的 DCR 和寄生电容、电容的 ESR 和 ESL都会影响高频段的相位。LTspice 里可以直接在电感上串联一个电阻表示 DCR在电容上串联电阻表示 ESR。比如一个 10uH 电感DCR 大概 20mΩ可以这样设置L1 SW OUT 10u R_DCR OUT OUT2 20m电容同理一个 100uF 的电解电容ESR 可能在 50mΩ 到 200mΩ 之间一个 10uF 的陶瓷电容ESR 可能只有几 mΩ但 ESL 在几 nH。这些参数在平均模型里经常被忽略但在分立模型里必须加上否则高频段的相位会过于乐观。2.4 驱动电路与死区设置驱动部分我一般用两个脉冲电压源分别驱动上管和下管中间留一点死区时间。死区时间太短会导致直通太长会增加体二极管导通损耗。对于低压 BUCK死区一般设在 10ns 到 50ns 之间。Vgate1 G1 SW 0 PULSE(0 5 0 1n 1n 500n 1u) Vgate2 G2 0 0 PULSE(0 5 500n 1n 1n 500n 1u)这里假设开关频率 1MHz占空比 50%死区通过脉冲的延迟和上升时间自然形成。实际调试时可以用.meas测量死区期间的体二极管导通时间确保不会太长。2.5 负载与工作点设置负载先用纯电阻比如 1Ω 到 10Ω根据你的输出电流来定。如果要做轻载到重载的扫描可以用.step命令改变负载电阻值。工作点方面先跑.tran让电路进入稳态一般跑几百个开关周期就够了。.tran 0 1m 0.9m 1n这里0.9m是起始保存时间意思是前 0.9ms 不保存数据只保存最后 0.1ms这样可以避免大量无用的启动数据占用内存。3. 传递函数测量的三种方法AC 扫描、时域注入与网络分析仪模拟3.1 AC 扫描法的前提与局限LTspice 的.ac命令是基于工作点线性化的。对于开关电路如果你直接跑.acLTspice 会先计算一个直流工作点然后在这个工作点上做小信号分析。但开关电路的工作点是周期时变的所以直接.ac得到的结果没有意义。正确的做法是先用.tran跑到稳态然后用Pseudo Transient或者Periodic Steady State分析但 LTspice 原生不支持 PSS。所以大多数人用的是时域注入法或者用平均模型做.ac。如果你非要用.ac可以先把开关管替换成平均模型比如用一个受控电压源或电流源代替开关级然后跑.ac。这就是所谓的“平均模型法”速度快但精度有限。3.2 时域注入法的完整实现时域注入法是我最推荐的方式。思路很简单在反馈环路里注入一个小幅度的正弦扰动然后测量注入点和输出点的幅度比与相位差扫频得到波特图。具体操作在补偿器输出和 PWM 比较器输入之间插入一个注入点。用一个行为电压源B_inj产生正弦扰动频率从 1kHz 扫到 1MHz。然后测量注入点前后的电压用.meas计算增益和相位。B_inj INJ 0 Vsin(2*pi*freq*time)*0.01但 LTspice 的.tran不支持直接扫频所以需要配合.step命令每次改变freq参数跑一次瞬态然后用.meas计算幅度和相位。这个过程比较慢但结果最真实。注意注入幅度不能太大一般取输出电压的 1% 到 5%否则会进入非线性区导致测量结果失真。同时注入频率要避开开关频率及其谐波否则会被开关纹波淹没。3.3 用 FFT 后处理提取频响另一种方法是在时域里注入一个宽带扰动比如一个 PRBS 信号或者一个扫频信号然后对输出做 FFT用输出频谱除以输入频谱得到频响。这种方法速度快但需要后处理LTspice 的 FFT 功能可以做到但精度不如逐点扫描。我一般用逐点扫描虽然慢但每个频点的信噪比高结果可靠。如果时间紧可以先用 FFT 快速看个大概再用逐点扫描确认关键频段。3.4 测量点的选择与探头设置测量传递函数时注入点选在补偿器输出和 PWM 输入之间测量点选在输出电压反馈点。注意要测量注入点前后的电压而不是只测输出。因为注入点的阻抗会影响测量结果所以最好在注入点两侧都放电压探头。LTspice 里可以用.meas语句计算增益和相位.meas AC gain FIND MAG(V(out)/V(inj)) AT 10k .meas AC phase FIND PH(V(out)/V(inj)) AT 10k但这是.ac的写法时域注入需要用.meas的TRIG和TARG功能或者用.four做傅里叶分析。4. 环路补偿器的设计与分立器件实现4.1 补偿器类型的选择Type II 还是 Type IIIBUCK 的功率级在 CCM 下是一个双极点系统低频有一个极点高频有一个 ESR 零点。如果输出电容是电解电容ESR 零点可能在几 kHz 到几十 kHz这时候用 Type II 补偿器就够了。如果输出电容是陶瓷电容ESR 零点在几百 kHz 甚至更高这时候需要 Type III 补偿器来提供足够的相位裕度。我一般先用 Type II 跑一版看相位裕度够不够。如果不够再换成 Type III。Type II 用一个运放加两个电容一个电阻就能搭出来Type III 多一个电容一个电阻。4.2 用理想运放搭 Type II 补偿器LTspice 自带UniversalOpamp2可以设置增益带宽积和压摆率。先用理想运放搭一版确定零极点位置然后再换成真实运放模型。Type II 补偿器的传递函数是Gc(s) - (1 s*R2*C1) / (s*R1*(C1C2)*(1 s*R2*C1*C2/(C1C2)))其中 R1 是输入电阻R2 是反馈电阻C1 和 C2 是反馈电容。零点在1/(2*pi*R2*C1)极点在1/(2*pi*R2*C1*C2/(C1C2))。实际搭的时候先用.ac跑一下补偿器本身的频响确认零极点位置对不对再接入环路。4.3 补偿器与功率级的联合仿真把补偿器输出接到 PWM 比较器的输入PWM 比较器可以用一个行为源实现当补偿器输出大于锯齿波时输出高电平否则低电平。B_pwm PWM 0 Vif(V(comp) V(ramp), 5, 0) V_ramp RAMP 0 PULSE(0 5 0 1u 1u 0 1u)这里锯齿波频率就是开关频率。然后 PWM 信号经过驱动电路去控制上管和下管。联合仿真时先跑.tran看稳态波形确认输出电压稳定电感电流没有饱和。然后再做传递函数测量。4.4 相位裕度与增益裕度的判读测出波特图后找增益交越频率0dB 点看相位裕度。一般要求相位裕度大于 45 度最好在 60 度左右。增益裕度一般要求大于 10dB。如果相位裕度不够可以减小补偿器的零点频率或者增加一个高频极点。如果增益交越频率太低可以增大补偿器的直流增益。提示相位裕度不是越大越好。太大的相位裕度意味着系统响应慢负载跳变时恢复时间长。一般 60 度到 70 度是比较折中的选择。5. 实测中容易踩的坑与排查链路5.1 仿真不收敛的常见原因LTspice 跑开关电路时最常见的问题是不收敛。原因可能有死区时间太短导致直通、电感电流断续、电容初始电压为零导致启动冲击、驱动电压上升时间太短导致数值振荡。解决方法先加.ic设置初始条件比如V(out)3.3V让电路从稳态附近开始跑。或者用.tran的startup选项让电源缓慢上升。.tran 0 1m 0 1n startup如果还是不收敛可以减小最大时间步长比如1n改成0.1n但这样会跑得很慢。5.2 传递函数测量结果异常的排查如果测出来的波特图乱七八糟先检查注入幅度是不是太大再检查注入频率是不是和开关频率重合。如果注入频率正好是开关频率的整数倍测量结果会被开关纹波污染。另一个常见问题是测量点选错了。注入点应该在补偿器输出和 PWM 输入之间测量点应该在输出电压反馈点。如果注入点选在输出端会引入负载效应导致测量结果偏低。5.3 分立模型与平均模型结果差异的分析如果分立模型和平均模型的波特图差很多先看低频段。低频段差异通常是因为平均模型忽略了电感 DCR 和电容 ESR。再看高频段高频段差异通常是因为平均模型忽略了开关延迟和驱动死区。如果差异在 10dB 以内一般可以接受。如果超过 10dB需要检查平均模型的工作点是不是设对了或者分立模型的寄生参数是不是加得太离谱。5.4 从仿真到实测的偏差来源仿真再准和实测也会有偏差。主要来源有PCB 寄生电感、电容的直流偏压效应、MOSFET 的温漂、驱动电路的延迟。这些在仿真里很难完全模拟所以仿真结果只能作为参考最终还是要以实测为准。我一般会在仿真里留 20% 的裕度比如仿真相位裕度 60 度实测可能只有 50 度这时候还能接受。如果仿真只有 45 度实测可能就 35 度了那就危险了。6. 从仿真到落地的几个实用技巧6.1 用.step扫描关键参数LTspice 的.step命令可以扫描电感值、电容值、负载电阻等参数一次跑出多条曲线。比如扫描负载电阻从 1Ω 到 10Ω看不同负载下的相位裕度变化。.step param Rload list 1 2 5 10这样可以快速找到最坏情况下的相位裕度避免在某个负载点振荡。6.2 用.meas自动提取关键指标.meas可以自动计算增益交越频率、相位裕度、增益裕度等指标避免手动读图。比如.meas AC fc WHEN MAG(V(out)/V(inj))1 .meas AC pm FIND PH(V(out)/V(inj)) WHEN MAG(V(out)/V(inj))1这样每次跑完仿真直接在日志里看结果效率高很多。6.3 保存文件时多出文件的处理LTspice 保存原理图时会生成.asc、.raw、.log、.net等文件。如果开了.step还会生成多个.raw文件。这些文件默认和原理图放在同一目录时间长了会很乱。我一般会在原理图目录下建一个sim文件夹把.raw和.log文件都指向那里。方法是在.tran命令后面加-o参数或者在 LTspice 的设置里改默认输出路径。6.4 快捷键与波形查看的个性化设置LTspice 默认的快捷键不太顺手比如CtrlR是旋转CtrlE是镜像。我一般会把F2设成放置元件F3设成连线F4设成放置节点标签。这些在Tools - Control Panel - Drafting Options里可以改。波形查看方面我习惯把多个波形放在不同窗格里用Plot Settings - Add Plot Pane添加窗格然后把电压、电流、功率分别放在不同窗格方便对比。6.5 从 LTspice 导出数据到其他工具LTspice 的.raw文件可以用ltsputil或者 Python 的ltspice库解析导出成 CSV 后可以用 MATLAB 或 Python 画图。我一般用 Python 的ltspice库直接读.raw文件提取时间、电压、电流数据然后用matplotlib画图。import ltspice import matplotlib.pyplot as plt raw ltspice.Ltspice(sim/your_circuit.raw) raw.parse() time raw.get_time() vout raw.get_data(V(out)) plt.plot(time, vout) plt.show()这样可以把仿真结果和实测数据放在同一张图里对比非常直观。6.6 仿真文件的版本管理与复用LTspice 的原理图是文本格式的.asc文件可以用 Git 做版本管理。我一般会把.asc文件和.lib文件放在同一个仓库里每次改完补偿器参数就提交一次方便回溯。复用方面可以把常用的功率级、补偿器、驱动电路做成子电路存成.sub文件下次直接.include进来不用重新搭。.include buck_power_stage.sub X1 SW OUT 0 buck_power_stage这样搭新电路时只需要改补偿器部分功率级直接复用效率高很多。我个人在实际操作中的体会是LTspice 跑分立 BUCK 环路仿真最耗时的不是搭电路而是调收敛和等仿真跑完。所以前期一定要把工作点设好寄生参数加合理注入幅度别太大这样后面测传递函数会顺很多。另外仿真结果和实测有偏差是正常的关键是知道偏差从哪里来能不能在可接受范围内。如果偏差太大那就得回头检查模型和测量方法而不是硬着头皮往下做。
返回列表