LLC软启动阶段的谐振电流峰值抑制,是个做过数字电源的人都会皱眉的话题。前阵子在实验室给一台半桥LLC样机做首次上电,母线加压的瞬间,采样电阻上看过去的电流尖峰直接逼近30A,而设计额定电流只有10A。那一发没炸管,但把新板子打回原形,也逼我重新把“LLC软启动”这几个字拆开揉碎想了一遍。当时采取的第一版软启动其实就是最常规的“高频启动+扫频降频”,偏偏上电过冲依旧居高不下。后来把方案切到PSoC的CLB-MACO上,用可配置逻辑块在硬件层面做了启动谐振电流峰值抑制,才把尖峰真正压住了。这篇我把原理、设计思路、参数标定和实测踩坑都写出来,给正在调LLC数字电源、或者想在MCU里找“快逻辑”的工程师做参考。
1. 上电瞬间的“浪涌黑手”:谐振腔初始条件与Q值真相
1.1 只看增益曲线,容易忽略启动时的特殊点
LLC变换器设计阶段,大家最熟悉的是那张增益曲线族:以归一化频率为横轴,以品质因数Q为参数,增益从谐振频率附近的高点向两端下降。稳态分析都围绕输出建立好之后的情况去做,但启动瞬间的电路状态完全不是那回事。
启动前输出电容电压为零,负载等效电阻反射到原边的阻值非常低。反映到参数上,就是Q值远高于稳态设计值。半桥LLC的等效品质因数Q等于Z0除以反射电阻R_ac,启动时R_ac被拉得很低,Q值自然冲得很高。这时候如果你按稳态的工作频率去发波,实际工作点落在曲线上Q值极大、增益也极高的区域,原边谐振电流自然按“谐振腔阻抗Z0”来发展,完全不是额定工况下那种被负载阻尼压住的电流。
这也是为什么很多人在仿真里看到启动电流峰值“只有十几安”,实际板子一上电却冲得比仿真漂亮得多。仿真模型里负载电阻给的往往是额定等效电阻,而真实启动瞬间负载是接近短路的。
1.2 阶跃响应的“半周期回路”:电流峰值能涨多大
把启动瞬间看成一次阶跃激励:半桥中点的方波电压直接加到Lr和Cr串联的谐振支路上。忽略阻尼、忽略励磁电感分流的理想情况下,谐振电流峰值大约是方波幅值除以特征阻抗Z0:
I_peak ≈ (Vbus / 2) / Z0,其中 Z0 = √(Lr / Cr)。
举个例子,若Vbus=400V,Lr=20μH,Cr=33nF,算一下:
- fr = 1 / (2π√(Lr·Cr)) = 1 / (2π√(20e-6 × 33e-9)) ≈ 196kHz
- Z0 = √(20e-6 / 33e-9) = √606 ≈ 24.6Ω
- 理想阶跃电流峰值 ≈ 200V / 24.6Ω ≈ 8.1A
看着不高?注意这是理想状态。真实情况下输出二极管尚未导通或导通窗口极短,Lm也参与谐振,加上母线电容、PCB寄生电感引入的更高频振荡,实际尖端可以比这个估算高出两三倍。配合满载额定电流10A来看,启动尖峰到了28A甚至更高就不奇怪了。
这类参数算起来很绕,很多同行习惯用在线LLC计算器先跑一遍增益和Z0,再把结果摆到Mathcad里复核。关键是把Z0算清楚,很多启动问题其实在原理图阶段就已经埋下了。
1.3 为什么“最低频率起步”是最危险的策略
有些初版固件为了快速建立输出,软启动直接从接近谐振频率的低频开始发波,甚至直接命中fr。在最恶劣的初始条件下,这就等于把谐振腔直接推到增益峰值,输出电容却没建立电压来消耗能量,结果不用多说。
还有一个容易被忽略的细节:LLC在启动瞬间往往处于硬开关或准硬开关状态。稳态时靠谐振电流完成ZVS,启动时电流相位、幅值都没建立好,死区时间内原边电流可能根本不足以给结电容完全充放电,于是硬开关带来的振荡又叠加在谐振电流上,让峰值更难控制。所以软启动要解决的不仅是一个“静态过流点”,而是一整个动态过程。
2. 常规软启动为什么总在“事后补救”
2.1 扫频曲线标定好之后,环境一变就失效
最常用的传统软启动办法,是让开关频率从比较高的起点(比如2倍fr)按一条事先标定的曲线逐步下降到目标稳态频率。思路本身没问题:离谐振频率远,阻抗大、增益低,电流小;越靠近谐振频率,增益爬升,输出建立得越快。
但这条曲线是“开环”的。负载轻重、母线电压高低、谐振电容容差、温度对磁性元件参数的影响,都会让实际最佳扫频曲线偏移。你在一台板子上调好的曲线,换到另一台PCB或者换一批电容,启动电流就变了。更尴尬的是,如果标定时把起点频率设得不够高,第一次上电就直接致敬满血浪涌。
2.2 逐周期电流限制的检测链路,往往慢半拍
都说要加逐周期限流,但真正做起来,问题在于“多快才算逐周期”。LLC的工作频率即使只有200kHz,周期也就是5μs。谐振电流的建立在前半个周期内就完成大半,峰值出现在几百纳秒到一微秒量级。MCU中断方式在这里基本顶不住:ADC采样加上比较判断加上响应,少说也要几百ns到数μs,等软件反应过来,峰值早就过去了。
就算用片上比较器直接拦截PWM,也存在“拦截之后怎么办”的问题。LLC的电流波形接近正弦,不能像反激那样简单粗暴地关断一整个周期。如果关断时机不对,半桥两个开关管的导通时间就不对称,变压器会因此偏磁,下一拍反而可能更危险。
2.3 闭环PID介入的时机错位
另一种常见做法是启动时直接把PID环路打开,让输出电压慢慢建立。问题是启动初始阶段误差极大,PID输出会在上限饱和,实际上等于开环输出最高频率或最大占空比。等输出电压慢慢追上来、误差进入线性区,PID才开始有这个“温柔”的控制动作,但此时浪涌往往已经发生过了。
也就是说,传统方案本质上是“先用开环跑完最危险的一段,再交给闭环修正”。这违背了启动控制的核心诉求——在最危险的初期把电流按在一个可控范围内。
3. 把判断放进硬件:PSoC CLB-MACO的工作方式
3.1 CLB不只是“可编程IO”,它是外设与PWM之间的“接线员”
PSoC里的CLB(可配置逻辑块)本质是一小片可编程数字逻辑资源,由查找表、触发器和数据选择器组成。它和FPGA的规模没法比,但好处是直接生长在MCU外设总线旁边,能与TCPWM、比较器、ADC触发信号直接相连。
CLB对LLC控制的价值在于:它可以在和PWM外设同步的时钟域里运行,每个开关周期都被重新评估一次。判断结果可以立刻作用于TCPWM的周期更新、强制输出、甚至Kill信号。这种路径的时延是纳秒到亚微秒级的,可以真正跟得上逐周期的节奏,而不是靠中断去抢时间。
把CLB理解成一个“懂外设时序的小助手”:主CPU负责写目标参数、管启动流程,CLB则在每个PWM周期内盯着关键信号,一旦发现异常,它不需要等任何指令就能做出动作。
3.2 MACO数据通路:从“门逻辑”到“算术判断”的扩展
单靠查找表和触发器做简单的继电器逻辑没问题,但要实时算一个目标频率、比较一个累计值、做滞回判断,逻辑资源就有点不够用。PSoC的CLB-MACO正是为此出现的:部分型号的CLB支持切换为MACO模式,把宏单元重构成数据通路,可以执行加、比较、移位、累加这类简单算术,相当于在硬件逻辑旁边配了一个微型“算术引擎”。
用在LLC启动场景里,MACO很适合做这些事:
- 每周期累加一次频率步进值,得到当前目标开关周期;
- 对过流比较器输出做窗口积分,过滤尖峰噪声;
- 比较当前电流峰值估计与上限值,输出滞回状态。
我在样机上用的就是这几种能力组合。CPU只负责在启动前配置阈值、在启动完成后切入PID闭环,启动中段的“盯电流、调频率”动作完全由CLB-MACO承担。
3.3 为什么这组合比“模拟比较器+MCU”更适合干活
关于逐周期处理,简单对比一下三种方案的特性:
| 方案 | 响应速度 | 状态逻辑 | 误动作控制 | 可维护性 |
|---|---|---|---|---|
| MCU中断 | 数百ns到μs级 | 强,但受软件调度影响 | 可做滤波但干扰CPU实时性 | 代码灵活 |
| 模拟比较器+RS触发器 | ns级 | 基本没有,只能锁存或复位 | 容易受毛刺干扰 | 需改硬件 |
| CLB-MACO | 数十ns,PWM周期同步 | 可用有限状态机表达 | 可在硬件内做窗口滤波、滞回 | 配置化修改 |
从表里能看出,模拟比较器输在“没有状态”,MCU输在“不够快”,CLB-MACO正好卡在中间:够快,又有状态逻辑。对于LLC这种波形有明确相位关系、电流接近正弦、需要“判断后再决定下一拍动作”的拓扑,这层状态逻辑是省不掉的。
4. 让限流走在“浪涌前头”:峰值抑制逻辑设计与参数标定
4.1 信号链路与状态机设计
整个抑制方案我把它拆成四段信号链路:
- 原边电流通过电流互感器或者采样电阻,进入PSoC内部的比较器,阈值由DAC或参考电压设定。比较器输出一个“过流标志”接到CLB输入。
- TCPWM的周期更新事件同时反馈给CLB,作为每周期边沿同步信号。CLB在每个开关周期结束时刻,读入该周期内是否出现过流标志。
- MACO数据通路根据“过流标志产生时刻的相位”和“连续过流的时钟数”,估算电流尖峰的趋势,而不是只看单次电平平移。
- CLB状态机输出频率调节使能信号,控制TCPWM周期寄存器的更新方向。必要时输出同步的Guard信号保护半桥对称性。
关键状态设计为四态:
- RAMP_FAST:启动初期,电流未触及限制,按大步进降频,快速建立输出。
- LIMIT_HOLD:电流超过上限,停止降频,保持当前频率。如果电流继续上升,允许小幅抬高频率。
- RAMP_SLOW:电流回落到滞回点以下,改为小步进降频,缓慢逼近稳态频率。
- PASS_THROUGH:电流已完全受控,输出接近目标,释放控制权给PID闭环。
这个状态机的核心思想是“让限流走在浪涌前头”:它不是等电流失控后才去砍,而是在电流逼近阈值的那几个周期里,就已经阻止频率继续下降,甚至主动把频率往回拉。
4.2 用类Verilog描述了时序行为,实际配置时照着搭
CLB配置不是像写MCU代码那样逐行C语言,而是在PSoC Creator里搭组件、连信号。为了方便说明,下面用类Verilog把这个时序行为描述出来,实际配置时按这个逻辑去连LUT和触发器即可。
// 行为示意:CLB内部状态判断 always @(posedge pwm_period_end) begin if (over_current_flag) begin state <= LIMIT_HOLD; // 过流,保持频率 freq_step <= FREQ_STEP_UP; end else if (state == LIMIT_HOLD && current_below_recover) begin state <= RAMP_SLOW; // 回落到恢复阈值,进慢速区 freq_step <= FREQ_STEP_SLOW; end else if (state == PASS_THROUGH) begin // 交给CPU/PID,CLB只做监视 end end // 周期更新:LIMIT_HOLD时禁止降频,RAMP阶段按步进调整 assign period_update = (state == LIMIT_HOLD) ? period_hold : period_target;信号之间的具体接法,需要在PSoC Creator里把CLB组件的输入口接到比较器输出,把输出口接到TCPWM的周期更新和强制信号上。硬件上的连线比写代码更像“接电线”,但这套环境的好处是改逻辑不需要动PCB,重新编译一次就能换一种策略,特别适合反复调软启动曲线。
4.3 参数标定:先定限流值,再定起始频率,最后碰恢复斜率
这套方案里最重要的不是代码,而是三个参数的标定顺序。我建议按下面这个顺序来:
- 先定Ilimit(限流阈值)。参考磁性元件的饱和电流和开关管峰值电流,取饱和电流的70%到80%作为上限比较器阈值。这个值不能说越大越好,因为限流值就是给启动过程画的一条“保险丝”。
- 再定f_start(起始频率)。一般取1.6到2倍fr。太高会让启动时间拉长,太低则第一拍就可能触发限流。起始频率标定完成后,看第一次上电是否一上来就触发LIMIT_HOLD。如果第一拍就触发,说明起点太低,把起点往上提。
- 最后调恢复斜率。恢复斜率和启动时间直接相关:从f_start到f_steady,分多少步走完。步子大,启动快,但接近稳态时如果限流还在频繁触发,说明步进太大;步子小,启动慢但平滑。
实际样机参数(半桥LLC,Vbus=400V,输出48V/10A)我最终标定如下:
| 参数 | 取值 | 说明 |
|---|---|---|
| fr | 196kHz | Lr=20μH,Cr=33nF |
| f_start | 310kHz | 约1.58倍fr |
| Ilimit | 13A | 额定10A的1.3倍 |
| Irecover | 8A | 滞回区间下沿 |
| 大步进降频 | 4kHz/周期 | RAMP_FAST阶段 |
| 小步进降频 | 500Hz/周期 | RAMP_SLOW阶段 |
启动时间实测约3ms,其中快速降频段约1.8ms,慢速逼近段约1.2ms。这个分配让输出建立又稳又不拖沓。
5. 实测结果与调试中的三个坎
5.1 实测数据:抑制前后对比
为了对比效果,我在同一块板子上分别跑了三种启动策略:
| 启动方式 | 谐振电流峰值 | 启动时间 | 现象 |
|---|---|---|---|
| 无限制,直接低频发波 | 约28A | 约1.2ms | 电流严重过冲,有异响 |
| 传统扫频(2fr线性下降到fr) | 约19A | 约3.5ms | 中段仍有一个明显鼓包 |
| CLB-MACO状态机限流 | 约12.5A | 约3.0ms | 电流被压平,无明显鼓包 |
最终把Ilimit定在13A,实测峰值最高冲到12.8A,没有触发硬件保护。对比最初的28A,算是把启动浪涌砍掉了一半还多。而且这种限流方式对负载不敏感,换不同负载跑了几轮,状态机都能自己适应。
5.2 第一个坎:峰值毛刺导致限流误触发
刚接上CLB逻辑时,限流阈值设到10A,结果启动过程中限流频繁触发,频率被压住不动,启动时间被拖到接近10ms。用示波器看比较器输出,发现触发信号里混着一堆窄毛刺,这些毛刺来自谐振电流高频振荡,并非真正的平均电流过流。
解决方法是给过流判断加一个时间窗口:只有连续超过比较器阈值达到一定时钟数才确认“真过流”。这个窗口不能太长,否则就失去逐周期意义,我压到大约200ns,既滤掉开关噪声,又能拦住真正的浪涌前沿。
5.3 第二个坎:恢复阈值太低造成“喘振”
另一个问题是Irecover设得太低,电流回落后状态机从LIMIT_HOLD切回RAMP_FAST,降频几步又触限流,形成高频喘振,不仅机械噪声明显,频率波动还会耦合进输出电压。这实际上是典型的“滞回不足”。
处理办法是加宽滞回区间:Ilimit设13A,Irecover设8A。电流要回落到比限流值低一大截,才允许状态机解除限流。代价是启动时间略有延长,但换来的是系统不再来回抖动。
5.4 第三个坎:Kill信号引发的偏磁问题
早期版本图省事,CLB检测到过流直接给TCPWM发Kill信号,把正在进行的半周期强行终止。结果过流确实被压住了,但上下管导通时间不再对称,变压器偏磁又带来了新的原边电流不对称问题。
后来改成“不在当前周期下手,而是在周期边界调整下一步频率”:过流时不砍当前周期,而是封锁下一次的降频动作,必要时小幅抬频。虽然延时了不到一个周期,但对LLC这种需要保持波形对称性的拓扑来说,完整性比瞬时关断重要得多。
5.5 强电调试的安全习惯
多说一句调试安全。上电实验不要直接满母线电压试,先用可调限流电源把母线拉到36V或50V,确认限流逻辑响应正常之后,再逐级加压到额定值。这样即使参数标定错误,板子顶多出一声异响,不至于炸管。谐振电流波形不要只看平均值,用示波器的峰值保持功能记录启动阶段每一个周期的最大电流,这是判断限流策略有效性的唯一可靠依据。
我个人在这轮调完之后最大的体会是:LLC软启动的难点不在没有限流机制,而是把限流机制放到正确的时间尺度上去执行。把这种和时间强相关的判断交给CLB-MACO硬件去做,CPU只在启动前后管宏观流程,整个系统的实时性和稳定性都会上一个大台阶。这个思路不只用于启动,后续做输入电压瞬态跌落保护、跳闸后自动重启,我都打算沿用这套硬件状态机方案。