LLC谐振变换器的软启动,一直是数字电源工程师绕不开的“油门与刹车”问题。刚合上母线电压的那一刻,谐振电流往往会冲出十几个安培的尖峰,变压器“嗡”的一声甚至接近磁芯饱和,输出电容跟着抖,搞不好管子直接炸。我这次做的是三相LLC谐振变换器的启动控制,主控端选了带PSoC™的平台,重点用它的CLB-MACO功能做了LLC启动谐振电流峰值抑制,算是把软启动的“温度”真正降了下来。整套方案跑完,启动过冲从之前贴满保护阈值的8A以上压到了不到3A,而且全程没怎么占用CPU的中断开销。这篇文章就把这套思路完整拆开,从为什么会有过冲、传统方案卡在哪,到CLB-MACO怎么配置、阈值怎么算,再到我实测过程的坑和波形记录,一次性讲透。
1. 为什么LLC必须做软启动:谐振电流峰值是怎么冲上去的
1.1 拓扑特点与启动工况
LLC谐振变换器本质上是一个通过调节开关频率来改变增益的DC-DC变换器,半桥LLC里有一个谐振电感Lr、一个谐振电容Cr,以及变压器的励磁电感Lm,三者组成谐振网络。为了让开关管实现ZVS,通常把开关频率工作在谐振频率fr附近或者谐振点右侧感性区。三相LLC则是把三个半桥LLC单元错相组合,每相功率降下来,适合大电流、大功率场景。
启动阶段和稳态最大的区别是:输出电压Vo从0开始建立,谐振电容Cr的初始电压为0,变压器励磁电感上也没有磁链积累。这时候如果直接用额定频率、额定占空比发波,相当于把一个完整的母线电压阶跃直接扔到LC串联谐振网络上。因为LLC的增益曲线在远离谐振点时增益很低,理论上启动频率拉高一点就能抑制电压过冲,但你会发现电流过冲并不能完全靠“拉高频率”压住,原因在下面的机理里。
1.2 电流过冲的机理:一个LC阶跃问题
把LLC启动第一拍的等效电路简化一下,就是Lr和Cr串联、初始电流为0、Cr初始电压为0,输入端突然加上半个母线电压(半桥结构下谐振回路接在母线和谐振中点之间)。这个二阶RC串联电路的阶跃响应,电流峰值接近Vstep除以特征阻抗:
[ Z_o = \sqrt{\frac{L_r}{C_r}} ]
我调试的这台三相LLC,输入母线电压400V,单相半桥等效阶跃电压约200V,谐振参数Lr取15μH,Cr取30nF。算下来:
[ Z_o = \sqrt{\frac{15 \times 10^{-6}}{30 \times 10^{-9}}} = \sqrt{500} \approx 22.36 \Omega ]
理论首个谐振电流峰值就是200V/22.36Ω,约8.9A。这个数值很说明问题:如果你选用的功率管额定电流只有15A,稳态电流可能只有6A,但启动瞬间一上来就是8.9A的尖峰,再加上电流互感器采样延迟、控制环路还没建起来,实际波形往往比理论值再高20%到30%。闸极驱动、整流二极管、变压器都会在这个瞬间承受巨大的di/dt应力。
更麻烦的是,输出电容在启动初期相当于短路负载,LLC的输出整流侧会抽出很大的充电电流。谐振回路既要给输出电容充电,又要克服Cr的零初始条件,两者的叠加效应会让峰值电流进一步抬高。很多人习惯只调频率斜波,发现总是差一口气,就是因为没把Cr初始条件和输出电容充电需求分开考虑。
1.3 软启动到底在“软”什么
软启动要解决三件事。第一,把谐振电流峰值限制在功率器件安全范围内,这是最核心的;第二,让输出电压平缓建立,不能出现明显过冲,否则后级负载会被打坏;第三,启动过程中尽量维持一定的ZVS条件,别把软开关变成硬开关。
传统软启动的设计思路,是让系统从“高增益低”的状态慢慢过渡到“低增益高”的状态。具体手段就是频率斜坡、占空比斜坡、或者两者结合。频率越高,LLC增益越低,输出功率越小,电流自然受限;但频率不能无限高,否则驱动损耗、死区影响、磁性元件损耗都会恶化。占空比斜坡则是从很窄的脉宽逐步展宽。LLC在死区设置合理时用50%固定占空比配合频率调制即可,但软启动阶段必须人为限制占空比,否则电流尖峰完全取决于LC特征阻抗,跟软启动频率关系不大。
2. 传统软启动方案的痛点:为什么改用CLB-MACO
2.1 三种常见软启动策略
业界用得最多的策略有三种。
第一种是纯频率斜坡:初始频率设为额定谐振频率的1.5到2倍,然后以固定斜率降到额定频率。这种方式实现简单,只要把PWM周期寄存器里的周期值按时间递减即可。问题是轻载时电流仍然偏大,因为增益虽然低,但没有闭环反馈,输出电容充电电流依然不受控。
第二种是占空比斜坡:从10%到20%的窄占空比开始,逐步增加到50%。这种在移相全桥里很常见,但LLC本身是依靠频率调压的,占空比变化会影响变压器励磁电流和死区时间,窄占空比下ZVS条件很难保证。
第三种是“脉冲串”或者“打嗝式”启动:发几个脉冲,观察电流下降,再继续发脉冲。这种方式最保守,但启动时间长,而且脉冲串的变频分量可能在磁性元件上产生音频噪声,听起来就是“滋滋”的异响。
2.2 软件限流为什么做不到逐周期
我之前在样机上先用纯软件方案做限流:谐振电流互感器信号经过运放调理后送入ADC,CPU在中断里比较ADC值,超限就修改PWM占空比寄存器。实测下来,ADC采样、转换、中断响应、寄存器更新这一条路径至少需要8到12微秒,而开关周期在100kHz下只有10微秒。也就是说,一个周期已经结束,你限流动作才刚执行,电流尖峰早就过去了。
如果要做到“逐周期限流”,就必须在当前PWM周期内对电流信号做出反应。ADC方案做不到,模拟比较器的输出也必须通过硬件逻辑直接连到PWM模块的强制关断端口才行。这就是我后来转向PSoC CLB-MACO方案的最直接原因:不是软件工程师不会写PID,而是物理上的时序瓶颈绕不过去。
2.3 CLB-MACO在项目里扮演的角色
PSoC里面的CLB是一组可编程逻辑块,内部有查找表(LUT)、触发器、计数器,可以看成一颗放在MCU旁边的小型FPGA。它的输入输出信号可以和PWM模块、IO、内部模拟比较器直接互连,修改PWM信号的过程根本不经过CPU总线。
MACO侧我这边理解为一套模拟比较与阈值控制资源,谐振电流互感器的电压信号进入比较器,和DAC给定的阈值比较以后,输出一个数字电平给CLB。CLB根据这个电平,在当前开关周期内直接控制PWM输出脉宽的截断。从电流超过阈值到PWM边沿动作,整个过程延迟只有几十纳秒,真正意义上做到了逐周期限流。
这个架构相当于把“检测-判决-执行”做成了一条纯硬件链路。CPU只负责配置初始参数、监控状态机、在故障时做记录,不再参与实时限流。即使程序卡住,CLB-MACO路径依然能保护功率级,这是软件中断方案无法提供的安全冗余。
3. 整体方案设计:三相LLC启动状态机与谐振电流限流
3.1 硬件架构与信号路由
整台电源的架构是这样的:前级PFC输出400V母线,后级是三相LLC谐振变换器,每个半桥单元输出经过高频变压器隔离,整流后并联成54V/25A输出。主控采用PSoC,输出6路PWM驱动三个半桥。每相谐振回路里串了一个电流互感器,采样得到的电流信号经过整流和调理,变成0到3.3V的单极性电压,分别接到MACO的3个比较器输入通道。
CLB部分占用PSoC的若干可编程逻辑单元,用来实现启动状态机、逐周期限流掩码、脉冲截断逻辑。PWM模块工作在center-aligned模式,死区时间由PWM模块内部插入。我做了一张信号路由提纲,方便后面配置时对照:
- 电流互感器信号 -> 运放调理 -> MACO比较器输入
- 阈值DAC输出 -> MACO比较器参考端
- 比较器输出 -> CLB的LUT输入
- CLB逻辑输出 -> PWM模块的强制关断/脉宽修正端口
- CPU通过寄存器配置阈值、斜坡参数,读取故障标志
因为三相LLC每相参数不可能完全一致,三个比较器通道的阈值我后来做成了独立配置,每个通道单独校准,避免出现一相误动作、其它相没反应的情况。
3.2 启动状态机:五个阶段怎么划分
软启动整体状态机我分成五个阶段,比单纯“频率斜波”要细得多。
第一阶段是母线预充电。LLC驱动不输出,前级PFC通过限流电阻给母线电容充电,PSoC只做母线电压检测,等母线到350V以上才允许进入下一步。
第二阶段是IDLE待机。所有PWM输出关闭,CLB计数器清零,比较器阈值加载到DAC。这里必须确保CLB的默认输出是“不截断”,否则一使能就被误动作打掉。
第三阶段是频率斜坡。PWM频率从150kHz开始,每1ms下降2kHz,占空比固定在25%。这个阶段输出电压开始建立,但会很慢,因为频率远高于谐振点100kHz,增益不足1。
第四阶段是占空比斜坡。频率已经降到100kHz,占空比从25%每10ms增加5%,一直升到50%。此时谐振电流会明显增大,是峰值抑制逻辑最需要发力的时候。
第五阶段切换闭环。检测输出电压达到目标值的95%以上,将控制权交给电压环,频率和占空比由环路自动调节。
每个阶段之间CLB都有一只“退出标志寄存器”,状态满足条件才切过去。电流超限时不会立即强制状态回退,而是先让CLB截断PWM;如果连续超过N个周期都截断,说明软启动参数太激进了,状态机才退回到上一个阶段,重新以更慢的速率爬升。
3.3 峰值抑制逻辑的完整数据路径
峰值抑制逻辑分两级。第一级叫“预警削波”,电流超过第一阈值TH1后,CLB不把PWM完全关断,而是把当前周期的剩余导通时间切成若干个2微秒窗口,每隔一个窗口遮蔽一个PWM上升沿,相当于把平均占空比降低一半。削波之后电流峰值不再继续上升,但输出功率还能维持,输出电压建立过程不会断档。
第二级叫“硬关断”,电流超过第二阈值TH2时,CLB在比较器翻转后立即关断当相PWM的驱动输出,并且至少要等待一个完整的谐振周期才恢复发波。这一级是最后防线,用来应对负载短路、变压器饱和之类的情形。
为什么要做两级而不是一个阈值直接砍?因为我实测发现,单阈值削波在满载启动时会陷入“关断-恢复-再关断”的振荡,输出电压建不起来,还会产生明显的电流断续噪声。两级限流配合状态机回退,启动过程平滑很多。
4. 参数计算与配置实现
4.1 先算清楚谐振电流阈值
阈值设低了会误动作,设高了保护无效,所以值一定要算。以我上面那组参数为例:输入400V,半桥谐振回路等效阶跃电压Vstep≈200V,特征阻抗Zo=22.36Ω,裸奔启动的理论峰值约8.9A。三相LLC稳态每相输出电流约8.3A,谐振电流的峰值还要再乘一个系数,大致在12A到14A之间。启动过程允许的电流比稳态峰值略低,我按功率管的SOA曲线取了一个安全值:TH1设为9A,TH2设为12A。
这里有个细节:变压器匝比对启动电流的影响其实藏在增益曲线里。半桥LLC变压器匝比n通常按最小输入电压和输出电压来初算,公式是n ≈ Vin_min/(2*Vo),但这只是名义变比。LLC实际工作点在启动阶段远离谐振频率,增益小于1,输出电压比值不等于匝比,如果忽视这一点,容易把启动频率选得太低,导致第一拍的增益还是太高。建议用LLC在线计算器先把m=Lm/Lr、Q值、增益曲线算一遍,再结合启动频率点的增益确认一下首波电流。
4.2 频率斜坡与占空比斜坡的设计
频率斜坡的目标是从150kHz平滑降到100kHz,总共50毫秒。步进频率如果太大,电流波形上会出现明显的台阶,每次台阶都是一次新的LC阶跃;步进太小,启动时间又被拉长。我这里取每1ms降2kHz,折算成周期寄存器更新量大约是2%。这样从150kHz到100kHz需要大约12.5ms,后面一段留给占空比斜坡。
占空比斜坡从25%升到50%,周期是100kHz,所以每10ms增加5%,总共50ms。为什么占空比不从更低开始?因为太低的占空比会导致谐振电流断续,磁性元件工作在B-H曲线的局部回线上,启动噪声非常难听,而且对频率斜坡没有实际帮助。25%是我用示波器观察后确认的“最低既有能量输出、又不触发明显尖峰”的起始值。
输出电容充电时间可以粗算一下:输出电容6800μF,输出电压54V,平均充电电流如果按10A算,t=CΔV/I=6800μF54V/10A≈36.7ms。所以频率斜坡加占空比斜坡总时长设在80ms左右是够的,留了接近一倍裕量。
4.3 CLB逻辑单元实现
CLB部分我整理成下面这样的逻辑表达式,看起来更接近Verilog,实际用PSoC的CLB配置工具做LUT映射时思路也一样。千万不要把它当真接的RTL代码,但逻辑关系可以直接照搬:
assign limit_hit = comp_out_th1; // MACO比较器1输出 assign hard_fault = comp_out_th2; // MACO比较器2输出 // 状态机:IDLE -> RAMP_FREQ -> RAMP_DUTY -> NORMAL assign in_soft_start = (state == RAMP_FREQ) || (state == RAMP_DUTY); // 预警削波:每2us窗口,屏蔽一半窗口 assign chop_window = cycle_counter[0]; // 用CLB计数器取最低位 assign pwm_cut = in_soft_start & limit_hit & chop_window; // 硬关断:超TH2后锁存,直到下个周期开始才释放 always @(posedge pwm_clk) begin if (hard_fault) pwm_force_off <= 1; else if (period_start) pwm_force_off <= 0; end实际做CLB映射时,状态机用三个DFF就够了,计数器和窗口发生器用CLB自带的16位计数器搭。CLB输出到PWM模块的连线最好在项目初期就规划好,我当时因为改过一版引脚分配,结果发现CLB到PWM空口的路由被占满了,只能硬凑了一个LUT层级。
4.4 MACO阈值与前沿消隐配置
MACO阈值用DAC设置,DAC分辨率我用了12位,参考电压3.3V。电流互感器采样电阻定了0.25Ω,电流转电压系数是0.25V/A。所以TH1=9A对应2.25V,TH2=12A对应3.0V。DAC寄存器值就是电压除以3.3V乘以4096,这个转换直接用在线计算器核对一遍就行。
采样信号进入比较器前必须加RC滤波,不然PWM开关边沿的共模噪声会让比较器乱翻转。我用的电阻100Ω、电容2.2nF,时间常数0.22微秒,相对100kHz的开关周期足够快,又能把几十纳秒的毛刺滤掉大部分。同时,在比较器输出到CLB之间还要加一个前沿消隐窗口,时间设为200ns,在这200ns内比较器结果被强制置为“未超限”。否则谐振电流在开关管刚刚导通的瞬间本来就有di/dt尖峰,阈值再高也会被误判。
5. 实测结果与调试记录
5.1 启动波形表现
样机调试完成后,用示波器同时抓了母线电压、输出电压、谐振电流三个通道。启动波形基本符合预期:母线电压稳定在400V,输出电压从0开始爬升,大约85ms后稳定在54V,没有明显过冲。谐振电流峰值在启动初段被限制在8A以内,进入占空比斜坡阶段后慢慢爬升到12A,切闭环时有个很小的回落,但没有出现以前那种直接冲到15A甚至更高的尖峰。
我最关心的还是“第一拍”。示波器单次触发抓到的第一拍电流峰值是7.5A,比理论计算的8.9A还低了一点,应该是实际死区时间、线路寄生电阻都在帮忙消耗能量。CLB截断动作发生在电流超过9A阈值后的200ns以内,从波形上看就是电流上升到阈值附近后立刻变平,没有继续上升的趋势。
5.2 调试中踩过的三个坑
第一个坑是前沿消隐不够造成的误限流。最开始消隐时间设得太短,只有80ns,结果每次开关管开通,比较器都会因为di/dt噪声翻转,CLB把脉宽削掉,软启动变成“每周期都削一刀”,输出电压根本建不起来。后来把消隐加到200ns,误动作才消失。这个参数要跟实际gate drive的开关速度和采样电路的噪声特性匹配,不能照抄别人的值。
第二个坑是单级阈值导致满载启动时输出电压建立太慢。开始只设了一个9A阈值,一旦超过就削波,结果满载启动时每个周期都在削波,平均功率被限制得很死,输出电压爬升到54V要180ms,明显太慢。改成两级阈值后,预警削波只是削掉部分脉宽,还允许一定功率通过,硬关断只用来保底,启动时间就恢复正常了。
第三个坑是三相参数差异导致一相单独误动作。三相LLC的三个谐振电容虽然标称都是30nF,实测容差有±2%左右,三相峰值电流天然有差异。同一个阈值设下去,A相可能经常超限,B相和C相从来不超。解决办法是每相独立配置阈值,初始化时做一次小幅开环测试,把每相实际电流值记录下来,然后按比例把阈值标定到同一物理电流值。这个步骤在批量生产时尤其重要。
5.3 软件限流与硬件限流效果对比
我在同一台样机上分别跑了纯软件限流和CLB-MACO硬件限流,对比结果很直观:
| 对比项 | 软件中断限流 | CLB-MACO硬件限流 |
|---|---|---|
| 检测到响应的总延迟 | 8-12微秒 | 约200纳秒 |
| 逐周期限流能力 | 无法实现 | 逐周期执行 |
| 启动谐振电流峰值 | 15.2A | 11.6A |
| 输出电压建立时间 | 120ms | 85ms |
| CPU中断负载 | 高,占核心资源 | 几乎为零 |
| 程序跑飞时的保护能力 | 失效 | 仍有效 |
差距最大的其实是响应延迟。12微秒 vs 0.2微秒,整整差了60倍。LLC的谐振周期在100kHz下是10微秒,软件限流根本追不上电流变化,只能“事后补救”,硬件限流才是真正的“实时干预”。从安全性角度看,CLB-MACO方案把保护功能从代码层面下沉到硬件层面,程序的健壮性要求降低了很多。
6. 常见问题排查与经验速查
6.1 问题速查表
调试过程里遇到的各种现象和原因,我整理成了一张速查表,后面做类似项目可以直接对着找方向:
| 现象 | 可能原因 | 排查与解决 |
|---|---|---|
| 一使能就触发限流 | 比较器阈值过低或噪声干扰 | 校准阈值,检查RC滤波和前沿消隐 |
| 启动电压爬升太慢 | 削波过于频繁,频率斜坡太慢 | 提高启动频率斜率,放宽TH1阈值 |
| 启动时变压器有异响 | 占空比太低导致磁复位不完整 | 提高起始占空比,缩短占空比斜坡时间 |
| 单个桥臂反复限流 | 该相谐振参数偏差大 | 独立阈值标定,检查电流互感器 |
| 切闭环瞬间电流跌落 | 闭环环路的基准电压阶跃太大 | 把环路给定值从软启动状态平滑过渡到额定值 |
| 母线电压跌落 | 前级PFC限流电阻还没退出 | 调整母线预充电完成判断条件 |
6.2 硬件布线与采样的配套建议
谐振电流采样建议优先用电流互感器,不要用采样电阻加隔离放大器。高压侧的共模干扰在LLC这种高频开关电路里非常严重,采样电阻方案需要高性价比的隔离放大器,成本和噪音都不划算。电流互感器要串在谐振回路的原边侧,副边并联采样电阻,注意副边不能开路,否则会感应出很高的尖峰电压把后级电路打坏。
CLB到PWM模块的信号连线要在原理图设计阶段就确认。PSoC内部虽然有可编程路由矩阵,但CLB输出口的数量和位置是固定的,如果板子上已经定了引脚,逻辑再漂亮也没法用。建议在项目开始就画出“CLB引脚分配表”,把所有需要用到的内部信号、PWM端口、比较器输入输出列清楚,再开始写CLB逻辑。
死区时间处理也要特别留意。CLB截断PWM脉宽时,只是把“有效导通时间”缩短,但死区插入仍然要依靠PWM模块完成。我在最早的逻辑里直接把PWM输出置零,结果导致互补半桥同时封锁,死区丢失,功率管直通炸了一对管。后来改成CLB只修改PWM模块的内部占空比寄存器,而不是直接强制IO口,问题才解决。
6.3 这套方法的可迁移性
CLB-MACO这套“硬件级逐周期限流”思路,不只是LLC能用。移相全桥的ZVS软启动同样有电流峰值问题,把比较器阈值接到原边电流信号,CLB逻辑改成限制移相角即可;PFC电路的电感电流逐周期限流也可以复制,只是把谐振电流信号换成电感电流信号,比较器阈值按峰值电流限制值设定;多相交错Buck启动时,各相电感电流均衡也可以用这种思路,每个比较器通道对应一相,阈值加上最小脉宽约束。
只要控制器的PWM模块支持外部硬件强制修正端口,CLB-MACO方案基本都能迁移。核心原则是:实时性要求高的保护动作一定要走硬件路径,状态管理、参数整定、故障记录这些相对慢速的工作才交给CPU。
最后再分享一个我个人的调试体会:CLB-MACO这类硬件路径,调试顺序很有讲究。我建议先把MACO阈值和比较器消隐时间调好,在开环小功率下把峰值抑制逻辑验透,确认没有误动作,再去调频率斜坡和占空比斜坡。如果一上来就把所有环节都打开,波形上根本分不清到底是频点选择错了,还是限流逻辑误触发,只能对着示波器干瞪眼。先小步走通,再逐步加复杂度,这个习惯帮我少烧了不少管子。