做LLC电源的都知道,LLC谐振变换器设计起来门道多,但真正让人手心冒汗的往往不是满载效率,而是第一次上电那个瞬间。谐振电流“刺啦”一下冲上去,开关管、整流管、磁性元件全部跟着高压一把,软启动做得不好,板子连第一秒都撑不过。今天我想分享的,就是用PSoC芯片上CLB-MACO这套硬件逻辑,给LLC软启动“降降温”,把启动谐振电流峰值从“眼看着要炸”压到“稳稳落地”的完整过程。涉及的关键词很聚焦:LLC、软启动、谐振电流、PSoC、CLB-MACO。不管你是刚接触谐振变换器的新手,还是被启动尖峰困扰很久的老工程师,这篇文章都值得你花十分钟看完。
先给结论:LLC软启动的本质问题,不是“输出电压建立慢”,而是“谐振腔在启动瞬间被过度激励”。频率扫得太快、脉冲来得太凶、闭环响应太慢,都会让谐振电流失控。而CLB-MACO这种放在MCU内部的可配置硬件逻辑,因为响应延迟在纳秒到微秒级,天然适合做逐周期的谐振电流限制。下面我把原理、参数计算、实操过程和踩坑记录全部摊开讲。
1. 先弄清楚痛:LLC启动时谐振电流为什么失控
1.1 高Q谐振腔的“充能失控”账怎么算
要理解LLC启动为什么容易出尖峰,得先回到LLC谐振变换器工作原理本身。半桥或全桥LLC通过开关管把方波电压加到谐振网络(Lr+Cr)上,再经过变压器和整流输出。正常稳态工作时,开关频率和负载状态决定了谐振腔的增益。可启动瞬间,输出电容是零电压,等效负载接近开路,这时候整个谐振腔就是一个高Q值的串联谐振回路。
高Q意味着什么?生活化比喻一下,就像敲一口铜钟,你每敲一下,声音不是马上消失而是在腔内来回振荡。LLC启动时如果直接以接近谐振频率的固定频率工作,每个开关周期都在给这个“铜钟”注入能量,而能量又基本没有负载去消耗,谐振电容上的电压和电流就会一个周期比一个周期高,直到某个器件先扛不住。这个现象用示波器看特别直观:谐振电流峰值可能达到满载峰值的2到3倍,甚至更高。我实测过一台12V/300W的半桥LLC样机,满载谐振电流峰值8A,直接按稳态频率硬启,启动瞬间峰值冲到24A,接近满载的3倍。
为什么这么高的电流很危险?首先是开关管和输出整流管的应力问题,电流超标会让管子离开安全工作区;其次是磁芯可能瞬间进入饱和,电流更不可控;最后是高压侧和输出侧电容会承受大电流充电,导致输出电压严重过冲。这些后果都指向同一件事:必须限制启动瞬间注入谐振腔的能量增长速度。
1.2 常规软启动的3个局限:慢、粒度粗、依赖CPU
最常见的LLC软启动方式,是用软件让PWM频率从远高于谐振频率的位置开始,比如2倍fr,然后逐步降低到目标频率。这个思路本身没问题,高频段谐振腔阻抗高,确实能抑制电流。但真在工程里用,我发现有三个让人难受的局限。
第一,慢。PWM频率要从2倍fr降到fr,一般需要软件在几毫秒内做几十上百次寄存器写入。如果控制器主频不高,或者中断任务被其他代码抢占,扫频就变成“一顿一顿”的,每次频率跳变都会在谐振腔里激起一个小鼓包。第二,粒度粗。很多数字控制器的定时器PWM周期寄存器是按整数值设置的,频率步进分得太粗,比如48MHz时钟下,450kHz对应计数值100多,225kHz对应200多,一次步进1个计数值,早期频率变化率接近4.5kHz/步,这个冲击并不算小。第三,依赖CPU。CPU一旦忙别的,保护动作就延迟。几个微秒的延迟听着不长,可LLC在225kHz下开关周期只有4.4微秒左右,延迟一个周期就意味着谐振腔多被打了一锤子。
所以我觉得,要想真正抑制启动谐振电流峰值,不能只追求“扫频速度”,而是要引入一个能在微秒级甚至更短时间内果断行动的机制。这就是我后来转向CLB-MACO这条路的直接原因。
2. 方案选型:为什么用PSoC CLB-MACO做软启动
2.1 CLB和MACO在PSoC里长什么样
PSoC芯片有个特色,就是内部除了CPU和各种模拟/数字外设,还有一块可编程的数字逻辑阵列。在带CLB的型号里,这块逻辑阵列被称作可配置逻辑块(Configurable Logic Block)。CLB内部由多个宏单元和互连矩阵构成,每个宏单元可以完成组合逻辑或时序逻辑功能,把多个宏单元串起来,就能跑一个不占CPU的小状态机。标题里说的CLB-MACO,指的就是这套“可配置逻辑块+宏单元+操作逻辑”的组合,你可以把它理解成封装在MCU里的一块小型PLD/CPLD。
这块“小型PLD”的输入来源非常自由:可以接定时器/PWM模块的输出、内部比较器的结果、GPIO电平、甚至某些外设的总线状态。输出同样可以回到PWM模块的kill/触发输入、DMA的请求端,或者直接引出到引脚。CLB本身由独立时钟驱动,大部分判断和输出在几个时钟周期内完成,不占用CPU周期,也不会被中断卡住。
有了这样一个硬件旁路,LLC软启动就可以做成这样:CPU/DMA负责宏观扫频,CLB-MACO负责微观上每个开关周期的电流限制。一旦谐振电流超阈值,CLB直接给PWM模块一个kill信号,吞掉当前脉冲,让谐振腔“喘口气”。等电流回落到安全区,再自动恢复。整个过程不需要CPU介入。
2.2 三类软启动实现路线横向对比
在确定方案之前,我把常用路线放在一起比了一下,比较结果对最终选型很有参考价值。
| 方案 | 响应速度 | 实现复杂度 | CPU占用 | 灵活性 | 适用场景 |
|---|---|---|---|---|---|
| 纯软件扫频+ADC保护 | 几十微秒以上 | 低 | 高 | 高 | 低频或对电流尖峰不敏感的场合 |
| 硬件比较器+外部逻辑门 | 几十纳秒到几百纳秒 | 中 | 低 | 低 | 专用电路,改逻辑要改板 |
| PSoC CLB-MACO | 纳秒级到微秒级 | 中 | 极低 | 高 | 带CLB的PSoC控制器做LLC数字控制 |
纯软件方案慢的原因前面说过,ADC要等采样、CPU要判断、寄存器要写入,链路太长。外部逻辑门方案响应快,但一大片74系列芯片不但占板子面积,逻辑想要修改就得飞线重焊,实在不够灵活。CLB-MACO则刚好卡在中间:低延迟是硬件特性,可编程是本身能力,编译后烧进芯片就能更新,迭代成本低。
2.3 CLB-MACO方案的工作逻辑长什么样
我在样机上最终实现的逻辑可以概括成四个字:硬限幅软过渡。启动指令发出后,PWM模块按照CPU/DMA预设的频率斜坡工作,从450kHz逐步降到225kHz。与此同时CLB-MACO持续监视谐振电流比较器输出,只要电流超过设定阈值,CLB立刻封锁当前PWM脉冲,并且暂停频率下降。电流回落后,扫频继续往前走,直到进入正常运行状态。
这个方案的特点在于:正常扫频时频率变化是连续平滑的,异常时又有硬件兜底,两个层面互不干扰。启动瞬间即便来一个异常大的电流尖峰,CLB也能在几个时钟周期内把它掐掉,比CPU中断响应快得多。这也是为什么它能真正给LLC软启动“降温”——不是靠慢吞吞的软启动把温度拖下去,而是靠快速限制电流峰值,从根源上减少了发热和应力。
3. 参数先行:软启动的关键数值怎么定
3.1 启动频率和PWM计数值的计算过程
要做参数设计,先把谐振频率定下来。LLC谐振变换器的谐振频率公式是最基本的:fr=1/(2π√(Lr·Cr))。我手里这台样机Lr=50μH,Cr=10nF,把数字代进去:√(50e-6×10e-9)=√(5e-13)=7.07e-7,再乘2π得到4.44e-6,倒数就是225kHz。
启动频率一般取1.5到2倍fr。我习惯先取2倍,也就是450kHz。接下来要看PWM外设的时钟和计数值怎么配。样机里PWM模块时钟是48MHz,采用边沿对齐模式近似计算,频率=48MHz/(周期计数值+1)。450kHz对应计数值约106,225kHz对应计数值约213。也就是说,软启动过程中周期计数值需要从106“爬”到213,总共要走107个步进。这些步进就构成了一张频率扫描表,由DMA逐项写入PWM周期寄存器。
这里有个容易被忽略的点:如果用中心对齐模式,同样的时钟频率下计数值要翻倍,公式就变为频率=时钟/(2×周期计数值)。配置时别拿边沿对齐的计数值直接套,否则实际频率会差一倍。我建议先把PWM模块的工作模式定死,再反算启动频率对应的周期值。
3.2 扫频时长与步进间隔的计算过程
软启动时长的选取,我的经验是3到10ms,太短容易压不住电压过冲和电流尖峰,太长会让带载启动过程拖沓,甚至被认为“没反应”。样机上我取5ms。有了总时长和步进数,就能算DMA步进的节奏。
启动频率450kHz,平均来说扫频过程中频率从450kHz到225kHz,近似取中间337.5kHz作为平均频率,对应周期约2.96μs。5ms里大约能容下1690个开关周期。107个计数值步进要在这1690个开关周期内均匀完成,计算下来就是每16个开关周期推进一步。算式是1690÷107≈15.8,取整为16。
为什么要刻意算这一步?因为DMA触发的节奏如果太快,频率瞬间跳太多,谐振腔还是会兴奋;太慢,软启动拖太长。16个周期推进一步,在5ms附近完成整套扫频,实测下来效果很好。上面这些参数也可以借助在线计算器先大致验算一遍,但一定要自己手算确认,特别是Lr和Cr数值有误差时,在线计算器很容易把人带偏。
3.3 谐振电流阈值与采样通道怎么选
阈值选多少是个关键决策。我一般按满载谐振电流峰值的1.2到1.5倍来取,这台样机满载峰值8A,阈值先按1.5倍定到12A。阈值取得太低会频繁触发保护,软启动过程变成打嗝;取太高又没有保护意义。
采样方式我在样机上用的是检流电阻。谐振回路串入一只10mΩ的低感电阻,12A压降就是0.12V。这个电压太小,直接送芯片比较器容易被噪声淹没,必须先经过仪表放大器放大,我放了4倍,变成0.48V后进入PSoC内部的比较器。比较器产生一个数字电平接到CLB输入,CLB在逻辑里再做一个去抖处理。去抖很重要,因为谐振电流波形本身有高频开关纹波,比较器可能在临界点反复跳动。我让CLB对比较器输出做3个时钟周期的连续确认,确认过流才真正触发限制动作。
注意,检流电阻串在谐振回路会引入额外损耗和电感,一定要选低感型号。如果板上功率再大一些,建议改用电流互感器或罗氏线圈,隔离性和损耗表现都要好不少。
4. 落地实操:PSoC工程和CLB-MACO实现记录
4.1 工程搭建与PWM/比较器配置要点
我用的开发环境是传统的PSoC Creator,对于老用户来说很顺手。带CLB的PSoC型号都可以参考这个流程,新版ModusToolbox下配置逻辑也类似。新建工程后,主要添加三样东西:一个TCPWM模块用来产生半桥驱动PWM,一个比较器用来量化谐振电流,一个CLB模块用来装载保护逻辑。
TCPWM配置里,PWM输出频率先按启动频率450kHz设置,周期计数值设为106,后续DMA会不断更新周期值。驱动半桥时需要两路互补带死区的PWM,这些可以在TCPWM内完成。CLB的输入信号,我从设计图上连了两根:一根是TCPWM的周期同步输出,作为每个开关周期的“时钟沿”;另一根是电流比较器输出,作为过流标志。CLB的输出,一根接到TCPWM的kill输入作为封锁信号,另一根接到DMA请求端作为扫频步进的触发。
工程配置上有个小提醒:CLB的时钟和TCPWM的时钟最好来自同一时钟源,并且保证相位同步。否则CLB判断的“当前周期”和TCPWM输出的“当前周期”可能隔着一个不可控的时钟相位差,保护动作要么提前要么滞后。
4.2 CLB-MACO状态机的Verilog实现
PSoC Creator的CLB可以直接用Verilog写逻辑,这对于做硬件出身的人来说非常友好。下面是我在样机上简化后的代码结构,完整工程里还会包含死区、软复位等细节,但核心思想都在这里。
// clb_llc_softstart.v —— CLB-MACO 软启动保护逻辑示意 module clb_llc_softstart( input wire clk, // CLB时钟 input wire rst_n, // 复位信号 input wire soft_start_en, // 软启动使能,由主控制器给出 input wire pwm_sync, // TCPWM周期同步脉冲 input wire ipeak_hi, // 谐振电流比较器输出,1表示过流 output reg pwm_kill, // 接TCPWM kill输入,封锁当前脉冲 output reg dma_trig // 触发DMA推进一步扫频表 ); reg [1:0] filter_cnt; reg ipeak_ok; // 输入去抖:连续3个时钟周期为高才认为是真实过流 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin filter_cnt <= 2'd0; ipeak_ok <= 1'b0; end else if (ipeak_hi) begin if (filter_cnt < 2'd3) filter_cnt <= filter_cnt + 1'b1; else ipeak_ok <= 1'b1; end else begin filter_cnt <= 2'd0; ipeak_ok <= 1'b0; end end // 每个开关周期同步沿判断:过流则封锁脉冲,否则触发DMA步进 always @(posedge pwm_sync or negedge rst_n) begin if (!rst_n) begin pwm_kill <= 1'b0; dma_trig <= 1'b0; end else if (soft_start_en) begin if (ipeak_ok) begin pwm_kill <= 1'b1; // 吞掉本周期,限制谐振腔注能 dma_trig <= 1'b0; // 暂停降频,保持当前频率 end else begin pwm_kill <= 1'b0; dma_trig <= 1'b1; // 请求下一个周期计数值 end end else begin pwm_kill <= 1'b0; dma_trig <= 1'b0; end end endmodule代码里pwm_kill使用的是电平信号,实际工程中建议在TCPWM里配置kill的触发方式,或把pwm_kill先打一拍成窄脉冲,防止出现封锁时间过长的问题。dma_trig同样需要根据DMA外设的触发沿要求处理,通常要做一次边沿检出,产生单时钟脉冲。这些都属于“编译不过不是问题,跑起来波形不对才是问题”的典型细节。
4.3 联调步骤:低压验证、逐级上电
硬件逻辑写好后,联调不能急。我的顺序是:先只让PWM模块在低压控制电下工作,用示波器观察CLB输出的pwm_kill和dma_trig波形,确认逻辑动作和设计一致。这时候不需要任何高压部分,直接用引脚输出观察即可。
确认CLB逻辑正常后,把主功率级母线电压先降到20V左右,不能第一次就直接上310V或380V。低压下启动,如果谐振电流超阈值,CLB的kill动作能不能把电流压下来,在示波器上看得清清楚楚。万一逻辑判断有误,也不会炸管子,最多是波形不对,可以从容排查。
低压验证通过后,再逐步提高母线电压,同时把示波器电流探头绑在谐振回路里观察峰值。我自己的经验是:每一步电压都记录启动峰值电流和软启动时间,对比是否随母线电压线性变化。如果某一步突然出现电流异常增大,就先停下来查逻辑而非继续加压。
5. 实测对比:CLB-MACO把启动电流压到了多少
5.1 不做处理:直启尖峰有多吓人
为了给方案对比提供基准,我在样机上故意跳过软启动,直接以225kHz固定频率启动。示波器抓到的谐振电流峰值约24A,持续好几个周期,波形顶部基本被“削平”了,哪个元件看都难受。这个状态如果多持续几百个周期,MOS管和整流二极管的温升速度会非常可观,磁性元件也会明显发热。直启实验我只做了两次就收手了,不敢再体验。
5.2 常规软件扫频:有效但存在短板
接下来用纯软件方式做扫频软启动,从450kHz在8ms内线性降到225kHz。效果比直启好很多,启动峰值电流降到12A附近,大概满载的1.5倍,输出电压过冲也明显减小。但我观察到两个不满意的地方:一是扫频过程中电流包络出现好几个小凸起,每次软件更新频率时都像一个“小台阶”在扰动谐振腔;二是CPU在软启动期间几乎全程被占用,中断优先级稍微配置不好,扫频节奏就会乱。
5.3 CLB-MACO方案:阈值封顶+线性过渡结果
换成CLB-MACO方案后,同样从450kHz扫到225kHz,扫频时间缩短到5ms。启动峰值电流被压到8.4A左右,仅比满载峰值8A高了0.4A,几乎贴着满载值走。关键是这座“电流墙”是硬件逐周期盯出来的,不是平均效果,而是每个开关周期都被限制。启动过程波形看起来明显“干净”,没有了软件扫频那种小台阶。
三组数据放在一起,差别很直观:
| 启动方案 | 启动峰值电流 | 软启动时间 | CPU介入程度 | 波形平滑度 |
|---|---|---|---|---|
| 固定频率直启 | 24A | 无 | 无 | 差 |
| 纯软件扫频 | 12A | 8ms | 全程占用 | 一般 |
| CLB-MACO保护+扫频 | 8.4A | 5ms | 几乎不介入 | 好 |
6. 排坑心得:LLC软启动调试中的典型问题
6.1 明明限制在阈值内,启动初段仍有尖峰
我踩的第一个坑,是CLB逻辑动作正常,但启动最开始一两个周期仍然出现了一个超出阈值的小尖峰。原因是比较器链路有延迟,电流采样电阻→放大器→比较器→CLB,链路再快也需要几十到几百纳秒。在第一个pwm_sync到来时刻,CLB根本还没收到过流信号,脉冲就已经出去了。解决办法是:在硬件链路上尽量缩短延迟,同时CLB内设置启动屏蔽窗口,在启动第一个周期不期望保护介入,而是靠提高起始频率来限制初始冲击。初期尖峰只要不超过整流管额定值,落在预期的1.2到1.5倍范围内,可以接受。
6.2 打嗝、抖动与比较器噪声
另一个典型现象是软启动过程出现“打嗝”,电流在阈值附近反复触发,频率下降一会儿停一会儿,启动时间被拖得很长。排查下来是电流比较器输出毛刺引起的。谐振电流纹波频率很高,比较器阈值附近一个毛刺就可能让CLB误判。我的处理方法是把去抖时钟周期从3个加到5个,同时在比较器输入端增加RC滤波,截止频率取开关频率的3到5倍,效果立竿见影。
6.3 与TCPWM时序同步和CPU后续接管
还有一类问题是CLB逻辑运行正常,但和PWM模块的时序差一拍。特别是我给CLB和TCPWM用了不同时钟时,kill信号可能落在脉冲已经过半的位置,封锁效果大打折扣。后来统一时钟源,并在逻辑里做一次同步打拍,问题就消失了。
软启动结束后的接管也要留意。CLB在软启动阶段生效,进入稳态后最好把保护逻辑切换成“只监视不kill”的模式,或者把kill阈值抬高一些,避免正常带载时轻微过流被误封。这个切换我用状态机的ST_RUN状态实现,CPU在软启动结束后只改一下使能位,不需要重新编译逻辑。
最后我自己的一点体会是:LLC软启动做得多了,会越来越觉得它不是一个“次数问题”,而是一个“时机问题”。频率降多快、电流限多高、响应有多果断,这三者必须配合好。而CLB-MACO的优势恰恰在于,你能把最需要时机的部分交给硬件去执行,CPU只负责规划大方向。这种分工在实际调试中省下的心力,远比写几行Verilog多得多。如果你手头正好有带CLB的PSoC芯片,又正在被LLC启动尖峰折磨,我建议直接按文中的思路搭一版硬件保护逻辑试试,低压上电验证很快,也许一次就能让启动波形变得让人放心。