1. 为什么CLLC值得花时间啃透
双向充电、储能变流器、车载OBC,这几个方向这两年热得发烫,而只要涉及高压侧与低压侧之间的隔离双向能量传输,CLLC谐振变换器几乎是一个绕不开的拓扑。它脱胎于大家更熟悉的LLC——把LLC的副边整流二极管换成可控开关管,再对称地补上一套谐振腔,就得到了可以在两个方向上都实现软开关的CLLC。听起来只是"加了一半",但真正动手做的时候你会发现,参数设计、基波近似、死区时间、谐振腔对称性这些问题会一起涌上来,远比单向LLC难缠。
这篇内容面向的是已经了解LLC基本工作原理、准备把CLLC从公式推到样机、或者正在用MATLAB/Simulink做仿真验证的工程师和研究生。我会把整个设计流程拆成"基波分析—参数计算—仿真验证—优化迭代"四段,重点讲清楚每一步背后的取舍逻辑,而不是只丢一堆公式。文末附上我实际使用的MATLAB仿真文件结构说明,你可以直接照着搭。
需要先说明一点:CLLC的完整时域模型是分段线性的高阶系统,手算几乎不可能,所以工程上普遍采用基波近似法(FHA, First Harmonic Approximation)把谐振腔简化为正弦稳态电路来求解。这套方法有误差,但在谐振点附近精度足够指导参数选型,剩下的偏差交给仿真和实测去修。理解了这一点,你就不会纠结"为什么算出来的增益和仿真对不上"——这是方法本身的边界,不是你的错。
2. 基波分析:把开关网络变成正弦源
2.1 基波近似的核心假设与适用边界
基波近似的思路很朴素:谐振腔的Q值足够高时,腔体内的电流近似为正弦,高次谐波被谐振网络大幅衰减,于是我们可以只保留开关节点电压的基波分量,把整个方波激励等效成一个正弦电压源。这个假设成立的前提是开关频率工作在谐振频率附近,且负载不是极轻载。
具体到CLLC,原边全桥(或半桥)输出的方波电压,其基波有效值为:
- 全桥:$V_{ab1} = \frac{2\sqrt{2}}{\pi} V_{in}$
- 半桥:$V_{ab1} = \frac{\sqrt{2}}{\pi} V_{in}$
副边同理,因为CLLC副边也是可控桥,反向工作时角色互换。这里有个容易踩的坑:很多人直接把LLC的FHA公式搬过来,忘了CLLC副边是同步整流/主动桥,其等效负载电阻的折算方式和二极管整流不同。二极管整流时等效交流电阻是 $\frac{8}{\pi^2}R_L$,而主动桥在同步整流状态下这个系数依然适用,但反向增益计算时要把原副边的角色对调,谐振腔参数也要对称处理。
注意:FHA在增益曲线的峰值附近误差最大,因为那里腔体电流畸变严重。如果你设计的worst case刚好落在峰值增益区,务必用仿真复核,别只信手算。
2.2 双向增益特性与谐振腔对称设计
CLLC最迷人的地方是它的增益曲线在正反两个方向上都应该尽量对称。理想情况下,原边谐振腔($L_{r1}$、$C_{r1}$)和副边谐振腔($L_{r2}$、$C_{r2}$)通过变压器匝比 $n$ 折算后应该满足:
$$L_{r1} = n^2 L_{r2}, \quad C_{r1} = C_{r2}/n^2$$
这样正反向的谐振频率一致,增益曲线镜像对称,控制策略可以复用。但实际做的时候,副边谐振电容往往要承受更大的电流应力,选型时ESR和温升会逼着你偏离理想对称值,这时候就要在"对称性"和"器件可行性"之间做权衡。
我一般的做法是:先按对称原则算出理论值,然后根据实际能买到的电容容值系列(比如E12、E24)做微调,微调后重新扫一遍增益曲线,确认反向增益仍然能满足最低要求。这个"算—选—回扫"的循环,是CLLC参数设计里最耗时间但也最不能省的一步。
2.3 用MATLAB快速画出增益曲线族
与其手算一堆点,不如直接写几行MATLAB把增益曲线族画出来。核心就是FHA的增益公式:
$$M(f_n) = \frac{1}{\sqrt{\left(1 + \frac{1}{k}\left(1 - \frac{1}{f_n^2}\right)\right)^2 + Q^2\left(f_n - \frac{1}{f_n}\right)^2 \left(\frac{1}{k f_n} + \ldots\right)^2}}$$
(完整表达式因拓扑细节略有差异,仿真文件里我封装成了一个函数,输入$k$、$Q$、$f_n$直接返回增益。)
实际操作时,我会固定电感比 $k = L_m / L_r$,然后扫一组Q值(对应不同负载),把曲线画在同一张图上。看什么呢?看三个点:峰值增益够不够、峰值对应的频率离谐振点有多远、轻载时曲线会不会翘得太高导致失控。这三个点决定了你的频率调节范围和控制带宽。
% 增益曲线族快速绘制(FHA) fn = linspace(0.5, 2, 500); k = 5; % 电感比 Q_list = [0.2 0.5 1 2 5]; figure; hold on; for Q = Q_list M = cllc_gain(fn, k, Q); % 自定义函数 plot(fn, M, 'LineWidth', 1.5); end xlabel('归一化频率 f_n'); ylabel('电压增益 M'); legend(arrayfun(@(q) sprintf('Q=%.1f', q), Q_list, 'UniformOutput', false)); grid on;这段代码跑出来的图,就是你后续所有参数决策的"地图"。我建议把它打印出来贴在工位上,调参的时候随时对照。
3. 参数优化:从需求反推谐振腔
3.1 先定需求,再定参数——不要反过来
新手最容易犯的错是先拍一个谐振频率,然后硬凑参数,最后发现增益范围不够。正确的顺序是:
- 确定输入输出电压范围(比如400V母线对800V电池,或者反过来)
- 确定满载和轻载的功率点
- 确定需要的最大增益和最小增益
- 由增益范围反推 $k$ 和 $Q$ 的可行域
- 在可行域里选一组让谐振电流最小、效率最高的参数
这个顺序不能乱。因为增益范围是硬约束,$k$ 和 $Q$ 是软约束,先满足硬的再优化软的。
3.2 电感比k和品质因数Q的联合寻优
$k$ 越大,励磁电感越大,环流损耗越小,但峰值增益越低;$Q$ 越大(负载越重),峰值增益也越低。所以重载+大$k$是最恶劣的组合,你的参数必须保证在这个组合下峰值增益仍然够用。
我通常用MATLAB做一个二维扫描:$k$ 从3到10,$Q$ 从0.1到1,计算每个组合下的峰值增益和对应的谐振电流有效值,然后画成等高线图。峰值增益满足要求的区域里,挑谐振电流最小的那个点。这个过程用MATLAB的meshgrid加循环就能搞定,不需要什么高级工具箱。
k_vec = 3:0.5:10; Q_vec = 0.1:0.05:1; [K, Q] = meshgrid(k_vec, Q_vec); Mpk = zeros(size(K)); for i = 1:numel(K) Mpk(i) = max(cllc_gain(linspace(0.5,2,1000), K(i), Q(i))); end contourf(K, Q, Mpk, 20); colorbar; xlabel('k'); ylabel('Q'); title('峰值增益等高线');看这张图,找到你需要的峰值增益那条等高线,线上或线以上的区域就是可行域。然后在可行域里往左下角(小$k$小$Q$)靠,因为那里谐振电流小、效率高。但$k$太小会导致励磁电流大、关断损耗高,所以一般$k$不低于3,常见取值在4到7之间。
3.3 谐振频率与死区时间的匹配
谐振频率 $f_r$ 的选择要考虑磁元件体积和开关损耗的平衡。频率高,磁芯和电容小,但开关损耗和驱动要求高。对于几十千瓦级的CLLC,我一般把 $f_r$ 定在80kHz到150kHz之间,具体看器件和磁材。
死区时间必须大于开关管输出电容的充放电时间,否则会失去ZVS。粗略估算:
$$t_{dead} > \frac{2 C_{oss} V_{in}}{I_{Lm,peak}}$$
其中 $I_{Lm,peak}$ 是励磁电流峰值。这个公式告诉你:励磁电感越小($k$越小),励磁电流越大,死区时间可以越短。但死区太长又会增加体二极管导通损耗。我实测下来,100kHz、400V输入的场景,死区设在150ns到250ns之间比较稳,具体值要在样机上用示波器看ZVS波形微调。
实操心得:死区时间不要一次定死,留一个可调电阻或改代码的余地。不同批次的MOSFET输出电容有离散性,同一批不同温度下也不一样,死区需要留裕量。
4. Simulink仿真:把纸面参数跑成波形
4.1 仿真模型的分层搭建思路
我不建议一上来就搭一个完整的闭环模型,那样出了问题根本不知道是哪一层的事。我的习惯是分三层:
- 第一层:开环理想模型。用理想开关、理想变压器,只验证谐振腔参数和增益曲线是否和FHA一致。这一层跑通了,说明你的参数计算没错。
- 第二层:开环非理想模型。加入开关管导通电阻、二极管压降、电容ESR、变压器漏感和励磁电感的实际值。这一层看效率趋势和波形畸变。
- 第三层:闭环控制模型。加入频率调节环(或移相环),验证动态响应和软启动。
每一层都单独存档,出问题可以快速定位。这个分层习惯帮我省了无数调试时间。
4.2 关键模块的参数设置与常见报错
Simulink里搭CLLC,几个容易出问题的地方:
谐振电容的初始电压。如果电容初始电压设为零,第一个周期会有很大的冲击电流,仿真容易报错或者收敛困难。我一般给谐振电容设一个接近稳态的初始值,或者加一个软启动斜坡。
求解器选择。CLLC是刚性系统(stiff system),用ode23tb或ode15s比ode45稳得多。步长设成开关周期的1/100到1/200,太小会跑得极慢,太大波形失真。
变压器模块。用理想变压器加漏感的方式比用耦合电感模块更可控,因为漏感值你可以直接指定,不用去凑耦合系数。
死区实现。Simulink自带的死区模块有时候和实际驱动逻辑不一致,我习惯用逻辑门自己搭,确保上下管的死区严格互补。
% 仿真前先跑一遍参数自检 assert(k > 2, 'k太小,励磁电流会过大'); assert(fs > fr, '开关频率应高于谐振频率以留调节裕量'); assert(tdead > 100e-9, '死区时间过短,ZVS可能丢失');这几行自检代码看着简单,但能帮你挡掉一大半低级错误。
4.3 从波形反推设计是否合格
仿真跑完,不要只看输出电压对不对。我重点看四个波形:
- 原边开关管电流:在开通前是否已经为负(说明实现了ZVS)
- 谐振腔电流:是否接近正弦,畸变太严重说明FHA假设不成立
- 副边同步整流管的驱动时序:是否和电流过零点对齐
- 输出电压纹波:是否在可接受范围内
如果ZVS没实现,先查死区时间,再查励磁电感是否太大。如果谐振电流畸变严重,说明工作点偏离谐振区太远,回去调$k$和$Q$。这个"看波形—定位—回改参数"的循环,就是仿真的真正价值所在。
5. 常见问题与排查速查
5.1 增益不够、ZVS丢失、效率偏低怎么破
| 现象 | 可能原因 | 排查方向 | 解决手段 |
|---|---|---|---|
| 峰值增益不足 | k太大或Q太大 | 扫增益曲线确认 | 减小k或降低满载Q |
| 轻载失控 | 轻载Q太小,曲线翘太高 | 看轻载增益曲线 | 加假负载或限制最低频率 |
| ZVS丢失 | 死区太短或励磁电流不足 | 看开通前电流方向 | 增大死区或减小k |
| 效率偏低 | 环流大或同步整流时序错 | 看谐振电流有效值 | 优化k、校准SR时序 |
| 仿真不收敛 | 求解器或初始条件问题 | 换ode15s、设初值 | 加软启动、减小步长 |
这张表是我自己调试时总结的,基本覆盖了八成以上的常见问题。遇到新问题,先往这张表上靠,靠不上再深挖。
5.2 实测与仿真对不上的三个典型原因
第一个原因是寄生参数。仿真里漏感是你填的值,实际变压器的漏感可能差20%以上,谐振频率就偏了。解决办法是实测漏感和励磁电感,回填到仿真里。
第二个原因是死区期间的体二极管导通。仿真里如果没建体二极管模型,死区期间的电流路径就是错的,ZVS判断也会错。记得给MOSFET加体二极管。
第三个原因是驱动延时和寄生电容。实际驱动有几十纳秒的传输延时,开关节点有寄生电容,这些在高频下影响很大。仿真里可以加一个传输延时模块近似。
避坑技巧:每次改完参数,先跑开环理想模型确认增益,再跑非理想模型看效率,最后跑闭环看动态。跳步会让你在错误的地方浪费时间。
5.3 参数微调时的优先级排序
当你发现多个指标都不达标时,不要同时改所有参数。我的优先级是:
- 先保证增益范围够(改k和匝比)
- 再保证ZVS(改死区和励磁电感)
- 最后优化效率(改谐振频率和器件选型)
因为增益是功能性的,ZVS是可靠性的,效率是经济性的。功能不达标,其他都白搭。这个排序能让你在调试时保持清醒,不会东改一下西改一下。
6. MATLAB仿真文件结构与使用说明
6.1 文件目录组织
我习惯把仿真相关文件按功能分目录:
CLLC_Design/ ├── params/ % 参数计算脚本 │ ├── calc_gain.m │ ├── sweep_kQ.m │ └── check_zvs.m ├── models/ % Simulink模型 │ ├── cllc_openloop_ideal.slx │ ├── cllc_openloop_real.slx │ └── cllc_closeloop.slx ├── results/ % 仿真结果 │ ├── waveforms/ │ └── efficiency/ └── README.md这样组织的好处是,参数改了只动params,模型不用动;模型改了只动models,参数脚本不受影响。团队协作时也不会互相覆盖。
6.2 参数脚本的调用顺序
正确的调用顺序是:先跑calc_gain.m确认增益曲线,再跑sweep_kQ.m找可行域,选定参数后跑check_zvs.m验证死区,最后把参数填进Simulink模型。这个顺序不能反,因为后面的步骤依赖前面的结果。
calc_gain.m里我把FHA增益公式封装成了函数,输入归一化频率、k、Q,输出增益。sweep_kQ.m做二维扫描并画等高线。check_zvs.m根据励磁电流峰值和输出电容算最小死区。三个脚本都是独立的,可以单独运行,也可以串起来跑。
6.3 仿真加速的几个实用设置
Simulink跑CLLC仿真有时候慢得让人抓狂。几个加速技巧:
- 用
Accelerator或Rapid Accelerator模式,比Normal快好几倍 - 把不关心的测量模块去掉,示波器数据记录会拖慢仿真
- 步长用
Variable-step配合ode15s,稳态段自动放大步长 - 把长时间仿真拆成"启动段"和"稳态段"分别跑
我实测下来,一个100ms的闭环仿真,优化设置后能从十几分钟压到两三分钟。对于需要反复迭代的参数优化,这个提速非常关键。
7. 从仿真到样机的最后一公里
仿真跑通不代表样机能工作,中间还隔着器件选型、PCB布局、磁元件绕制这几道坎。谐振电容要选高频低ESR的薄膜电容或C0G陶瓷,电解电容绝对不能用。谐振电感如果做在变压器里,漏感控制是难点,我一般宁愿外置一个独立电感,虽然体积大一点但参数可控。PCB布局上,谐振腔的环路面积要尽可能小,否则寄生电感会改变谐振频率。
还有一个容易被忽略的点:CLLC的软启动。如果直接全压启动,谐振腔的冲击电流可能是稳态的好几倍,器件很容易炸。我的做法是让开关频率从很高(比如2倍谐振频率)慢慢降到工作点,同时用占空比或移相做辅助调节。这个软启动曲线要在仿真里先验证,再烧进控制器。
我个人在实际操作中的体会是,CLLC的设计难点不在某一个公式,而在于"基波分析给方向、仿真验证给细节、实测微调给最终值"这个三层迭代的节奏。任何一层想跳过,最后都会在样机上还回来。把MATLAB仿真文件当成你的"数字样机",在它上面多花的时间,都会在实验室里省回来。