接手LAT1555这个项目之前,我对STM32G474的印象还停留在“带HRTIM的电机控制芯片”上,直到把三相LLC谐振变换器加同步整流(SR)的输出方案理了一遍,才发现这颗芯片的外设设计有多对路。三相LLC的PWM不是简简单单输出六路互补波形就完事,它需要的是:高精度频率调节、ns级死区分辨率、多路定时器之间的相位锁定,以及一套能在故障时把管子安全关断的硬件保护链路。G474的HRTIM正是为这些场景准备的。这篇文章就围绕LAT1555方案,展开讲讲我是怎么从拓扑需求倒推PWM外设选型、搭HRTIM配置、算死区参数、做故障保护,最后又踩了哪些调试坑。
1. 三相LLC+SR对PWM的硬性要求:从拓扑倒推外设选型
1.1 原边三相LLC和副边SR分别需要什么样的波形
三相LLC谐振变换器,大致可以分为三种形态:三路独立的单相LLC并联、原边三相全桥、以及原边三半桥结构。LAT1555方案采用的是原边三半桥加副边全波整流加SR的结构,也就是原边总共三个半桥,每个半桥输出一组带死区的互补PWM。这三组PWM的开关频率相同,相位上彼此相差120°,用来驱动三个变压器原边绕组。
这个拓扑对PWM外设的要求,比普通BUCK、BOOST要刁钻得多。普通DC-DC的PWM是定频调占空比,死区有个几百ns就很宽裕;LLC则是固定50%占空比(扣除死区后),靠调节开关频率来改变增益。也就是说,PWM外设的核心能力不在占空比精度,而在频率的连续可调性和三路相位的一致性。
再看副边SR。SR管必须和原边驱动保持严格同步:同一个开关周期内,SR的导通区间刚好对应原边变压器传递能量的区间,相位相对原边滞后一个谐振周期的180°。在LLC里,原边开关频率是变化的,SR的死区、超前关断角都得跟着频率变。这要求PWM外设不仅要有互补输出和死区功能,还要能灵活配置SR信号的发生逻辑,不能靠软件在主循环里翻IO引脚——那种响应速度根本跟不上100kHz级别的开关频率。
综合下来,三相LLC+SR对PWM外设的性能要求可以归纳成四条:第一,输出分辨率要到ns量级,因为LLC工作频率通常在80kHz到500kHz,频率一个步进的变化就需要周期寄存器有足够高的时钟分辨率;第二,多路定时器必须能硬件级同步,三相之间120°相差不能靠软件延时硬凑;第三,死区插入要灵活,原边半桥和副边SR的死区参数互相独立,且死区分辨率要足够细;第四,必须有硬件故障保护,一旦过流,PWM输出能在几百ns内全部关断,而不是等CPU中断响应。
1.2 为什么通用定时器和PCA9685这类方案做不了这件事
我见过不少人在早期选型阶段会上一些看起来很省事的方案,比如用STM32F103的通用定时器输出PWM,甚至有人提过用PCA9685来出16路PWM——它们能做电机调速、舵机控制,但拿到LLC这个场景里基本是死路。
先说STM32F103。它的高级定时器TIM1/TIM8确实有互补输出和死区功能,但死区寄存器的最小步进对应的是72MHz或108MHz的定时器时钟,粗算死区分辨率大概在9ns到14ns。表面上够用,可真正的瓶颈在频率调节。LLC变频控制时,频率是控制环的输出量,它需要被转换成周期寄存器的整数值。F103的定时器时钟不够高,意味着同样的频率变化,周期寄存器能表达的步进量太大。举个例子,在200kHz的工作点,周期寄存器的值只有360(72MHz时钟),频率每步进1kHz,周期值的变化还不到一个计数值,根本做不了平滑的变频控制。
PCA9685就更不用说了。它本质是I2C接口的16路PWM驱动板,PWM频率最高约1.5kHz,死区、互补输出、故障保护一个都没有。它适合的是机器人舵机、灯带调光这种场景,和LLC电源控制隔着十万八千里。工程选型的时候,一个外设能不能用,不是看它能不能“输出PWM”,而是看它能否满足你的时序、精度和安全性要求。
1.3 G474在ST数字电源家族里所处的位置
ST在数字电源这条线里,G4系列是承接F334和H7系列之间的一档。F334的高分辨率定时器HRTIM已经有很强的能力,而G474在F334基础上,把内核换成了170MHz Cortex-M4F,并补强了模拟外设——片内比较器、DAC、运放,加上硬件过采样ADC。这意味着过流保护、电流环采样、电压环计算,甚至光耦隔离后的反馈信号处理,都可以在这一颗芯片里闭环完成,不需要再外挂一片比较器和DAC。
LAT1555选G474还有一个现实原因:它引脚多、封装选择多,原边三相全桥加副边SR,至少需要6路到12路PWM输出,如果还要驱动PFC级,对定时器通道数量也有要求。G474的HRTIM可以输出最多10路PWM,配合普通定时器补几路辅助信号,整体资源是比较从容的。
2. HRTIM定时器架构拆解:6个子定时器如何映射到原边和SR
2.1 HRTIM各子模块能力概览
HRTIM(高分辨率定时器)在G474上是一个相当庞大的外设,它内部有6个定时器单元:MASTER定时器、TIMERA到TIMERE五个子定时器。MASTER定时器本身不直接输出PWM,它主要用于产生全局同步基准、触发ADC采样、为其他子定时器提供外部时钟或复位信号。TIMERA到TIMERE这5个子定时器,每个都能输出2路PWM信号,这样最多就是10路PWM输出。
每个子定时器除了周期寄存器、比较寄存器之外,还配有多种信号源控制的Set/Reset输入、外部事件(EEV)、故障输入、死区发生器、斩波电路等。也就是说,每一路PWM的输出电平变化,不只是“周期到了翻转、比较值到了翻转”这种简单模式,而是可以配置成由一组独立事件源综合控制。
对LLC这种需要灵活控制开关时刻的场合,这个能力非常关键。比如SR超前关断,就可以理解为:SR的关断时刻不是简单地等于“原边开关周期的一半减死区”,而是要通过比较寄存器或外部事件精确控制。HRTIM给了你多套比较寄存器,每一套都能独立配置为PWM发生的置位/复位源,再加上DMA,理论上可以在每个开关周期内动态调整开关点。
2.2 LAT1555方案的定时器分配与相位关系
我在LAT1555里是这样分配HRTIM资源的:
| 功能 | 分配定时器 | 输出通道 | 说明 |
|---|---|---|---|
| 原边A相半桥 | TIMERA | TA1/TA2 | 互补输出,带死区 |
| 原边B相半桥 | TIMERB | TB1/TB2 | 互补输出,滞后120° |
| 原边C相半桥 | TIMERC | TC1/TC2 | 互补输出,滞后240° |
| 副边SR1 | TIMERD | TD1/TD2 | 跟随原边频率,互补SR |
| 副边SR2 | TIMERE | TE1/TE2 | 跟随原边频率,互补SR |
这里有个细节:为什么原边三相半桥占用了TIMERA/B/C,而SR只有两路定时器?因为副边SR的同步信号需要与原边保持确定性的相位差,而TIMERD和TIMERE可以作为从定时器,通过跨定时器的复位/触发机制,直接跟随TIMERA/B/C的周期,无需软件干预。
相位120°怎么实现?HRTIM的子定时器之间可以通过“外部时钟模式”或者“从模式复位”实现硬件级同步。具体到代码里,是把TIMERA的周期事件连接到TIMERB/TIMERC的复位输入,各自在复位后再数固定的计数器偏移,这个偏移就是120°相位的量化值。由于所有子定时器共享同一套HRTIM时钟,相位差是稳定的,不受软件执行时间影响。
2.3 双时钟频率与分辨率:要不要走340MHz这一档
G474的HRTIM可以配置为单时钟模式(170MHz)或双时钟模式(340MHz)。双时钟模式下,定时器内部的计数器时钟是340MHz,一个计数步进约2.94ns。这个分辨率直接决定频率调节精度和死区精度。
我算过一笔账:LLC工作频率在100kHz时,如果使用170MHz时钟,周期寄存器是1700;频率如果增加1kHz,周期变成1683,一个步进约0.6kHz。对于只在谐振点附近窄范围工作的LLC来说,0.6kHz的步进通常可以接受。但如果你的应用需要宽范围输出,比如输出电压从12V到48V这样的大跨度,频率变化范围会到100kHz到300kHz,低频端和高频端频率步进的不对称性就很明显。用340MHz双时钟,同样的100kHz工作点周期值变成3400,一个计数的频率变化约0.3kHz,控制精度明显改善。
代价是功耗略微上升,以及周期寄存器和比较寄存器的位数需要更多考虑。不过G474的HRTIM计数器和比较寄存器都是16位,在340MHz时钟下最大周期约192us,对应5.2kHz,对LLC的常规工作范围完全够用。LAT1555我直接启用双时钟模式,省得后期发现分辨率不够再返工。
3. PWM参数计算与配置:频率、死区、SR关断沿的量化过程
3.1 LLC工作频率范围和周期寄存器的量化误差
确定频率范围,需要从LLC谐振参数出发。假设LAT1555的谐振频率设计在250kHz,满载工作点落在谐振点附近,而轻载时频率会升高,短路或启动时频率可能降到接近100kHz。这个范围一出来,周期寄存器要覆盖的范围就定了。
以340MHz双时钟为例计算:
- 最低频率100kHz:周期寄存器 = 340000000 / 100000 = 3400
- 最高频率500kHz:周期寄存器 = 340000000 / 500000 = 680
量化误差在这里有个很有意思的地方:周期寄存器是整数,所以实际输出频率和期望频率之间有量化偏差。在500kHz处,680和681对应的频率分别是500kHz和499.27kHz,偏差约0.15%;而在100kHz处,3400和3401的偏差只有0.03%。所以高频端的频率分辨率天然比低频端差。设计控制环时,增益在不同频率段要适当调整,否则同样的PI参数在低频端奏效、在高频端可能震荡。
3.2 死区时间选择:MOSFET参数、反向恢复与谐振电流
死区设置是LLC设计里最容易踩坑的地方。死区过小,上下管直通,轻则效率下降、发烫,重则炸管;死区过大,死区时间内电流被迫流过体二极管,反向恢复损耗增加,效率同样受损。
死区时间的经验起点是:必须大于功率管的关断延迟、关断下降时间和体二极管反向恢复时间之和。具体到估算,参考手册参数:
| 参数 | 典型值 | 说明 |
|---|---|---|
| MOSFET关断延迟td(off) | 30~60ns | 驱动信号到输出开始下降的延时 |
| 电流下降时间tf | 15~40ns | 沟道电流下降到零的时间 |
| 体二极管反向恢复时间trr | 40~100ns | 死区时间内二极管续流后反向恢复 |
| 驱动芯片传播延迟 | 20~60ns | 驱动IC的输入到输出的传输时间 |
把这些值加起来,一个合理的死区起点通常在150ns到250ns之间。LAT1555实测下来,原边半桥死区设在180ns左右比较合适,这个值下桥臂中点电压波形没有明显的台阶畸变,也没有直通电流尖峰。
HRTIM的死区寄存器是按死区时钟周期配置的。在340MHz双时钟下,死区寄存器每加1对应约2.94ns,所以180ns对应的寄存器值大约是61。注意死区寄存器分成上升沿死区(DTR)和下降沿死区(DTF)两个独立字段,半桥上下管的开通延迟可以分别设置。如果你发现上下管开关特性差异大,可以把开通慢的那一管死区单独调大。
3.3 SR波形:滞后180°但领先原边关断的关键设置
SR信号的设计,核心是一个看似矛盾的要求:SR要跟随原边开关频率和相位,但它的关断时刻又必须比原边信号更早,留出安全裕量。
原理上看,原边半桥导通时,谐振电流通过变压器传递能量,副边SR管导通;原边斩断后,副边电流会继续在SR管的沟道和体二极管之间换流。如果SR管和原边同时关断,副边电感电流还在续流,SR管就会进入体二极管反向恢复,造成很大的尖峰和损耗。所以常规做法是让SR提前关断一段死区时间,把剩余电流交给SR的体二极管或并联的肖特基二极管来续流,等原边死区结束、下一周期重新导通时,续流过程刚好结束。
在HRTIM上实现这个逻辑,我把TIMERD/TIMERE的周期设置为跟随原边定时器(比如TIMERA),同时将SR的比较寄存器设计成比原边周期值提前一个固定偏移量。这个偏移量就是SR超前关断角,实际调试中我一般从100ns开始试,逐步减小,观察SR管漏源电压波形是否出现反向恢复尖峰,如果出现,就加大超前量。
还有一个经验:SR工作在连续电流模式(CCM)时,超前关断角可以小一些;工作在断续电流模式(DCM)时,SR需要提前更多时间关断,甚至要检测副边电流过零点,否则SR管会反向导通把输出电容的能量倒灌回变压器。LAT1555的副边在原边轻载时也会进入DCM,这里我额外用比较器的输出作为SR的关断触发源,当副边电流接近零时硬件关断SR,比纯靠定时器时间更可靠。
4. 从配置到代码:HRTIM的初始化骨架和在线变频更新
4.1 基于STM32CubeMX搭建HRTIM工程时的关键选项
HRTIM的外设过于复杂,纯手写寄存器初始化代码非常痛苦,所以LAT1555的工程一开始就在STM32CubeMX里把HRTIM的骨架搭好,再用手写代码补细节。
CubeMX里配置HRTIM时,最容易被忽略的三个点:
第一,时钟源要勾选双时钟模式(Double clock mode),并把HRTIM时钟设置为340MHz。默认配置只给到170MHz,寄存器值会翻倍,后续手算周期和死区都对不上。
第二,Set/Reset源的配置。CubeMX里每个定时器的输出通道可以配置Set源和Reset源,常见组合是:Set源选择比较寄存器1(CMP1),Reset源选择周期事件(PERIOD),这样输出就是一个标准的周期翻转PWM。但LLC的SR信号需要更灵活的逻辑,我会把Reset源改成比较寄存器2(CMP2),利用两个比较器之间的差值来产生占空比不对称的PWM。
第三,预装载(Preload)选项。周期寄存器、比较寄存器的更新方式建议全部选择“在周期更新事件时更新”而不是“立即更新”。这样在环路运行中修改频率或占空比时,所有通道在同一时刻切换,避免瞬间出现不完整的PWM脉冲。
4.2 初始化代码:时基、比较寄存器、死区、输出极性
CubeMX生成代码后,我会在HRTIM初始化函数里补充关键的配置。以TIMERD/TIMERE作为SR定时器为例,初始化代码骨架大概是这样的。
// 时基配置,周期值由当前目标频率计算得到 static void HRTIM_TimerBase_Init(HRTIM_HandleTypeDef *hrtim) { HRTIM_TIMERx_InitTypeDef timerInit = {0}; timerInit.Prescaler = 0; // 340MHz时钟不分频 timerInit.Period = 3400; // 对应100kHz主开关频率 timerInit.RepetitionCounter = 0; timerInit.UpdateGain = HRTIM_TIMERx_UPDATE_GAIN_1; timerInit.InterruptRequests = HRTIM_TIMERx_IT_REP; timerInit.ResetTrigger = HRTIM_TIMERx_RESETTRIG_NONE; timerInit.SyncResetSource = HRTIM_TIMERx_SYNC_RESET_NONE; HAL_HRTIM_TimerBase_Init(hrtim, HRTIM_TIMERINDEX_TIMERD, &timerInit); }死区配置在HAL库里是通过HAL_HRTIM_DeadTimeConfig设置,这里需要特别指定死区时间寄存器的高8位和低8位。
static void HRTIM_DeadTime_Init(HRTIM_HandleTypeDef *hrtim) { HRTIM_DeadTimeCfgTypeDef deadTimeCfg = {0}; // 死区基于双时钟340MHz,每个计数步进约2.94ns // 上升沿死区和下降沿死区分别配置 deadTimeCfg.DeadTime = (uint32_t)(61 << HRTIM_DTR_DTR_Pos); // 180ns deadTimeCfg.DeadTimeFalling = (uint32_t)(61 << HRTIM_DTF_DTF_Pos); deadTimeCfg.DeadTimeLock = HRTIM_TIMERx_LOCK_DISABLED; deadTimeCfg.DeadTimePrescaler = HRTIM_TIMERx_DEADTIME_PRESCALER_DIV1; HAL_HRTIM_DeadTimeConfig(hrtim, HRTIM_TIMERINDEX_TIMERD, &deadTimeCfg); }输出极性和空闲状态也值得认真处理。原边半桥的PWM在故障、空闲时应该输出到“低电平关断”状态,而SR管的驱动在故障时要输出到“高阻”还是“低电平”,取决于SR拓扑。如果SR是低压侧对地导通,直接拉低即可;如果是半桥结构,需要输出到高阻或一对互补的关断电平,防止副边电流通过SR体二极管反灌。
4.3 环路运行时在线更新频率的正确姿势
LLC是频率调制,所以控制环路计算得出的不是占空比,而是目标开关频率,最终要换算成周期寄存器的值并写入HRTIM。这里最容易出错的是更新时机的把握。
我一开始直接在控制运算完成后调用HAL_HRTIM_TimerBase_SetPeriod写周期寄存器,结果发现三相桥的周期更新不在同一时刻,A相已经开始新周期,B相还在老周期,120°相位关系被瞬间破坏,变压器出现直流偏磁,电流波形明显不对称。
正确做法是:只在定时器更新事件发生时,通过ADC中断或DMA完成触发,把新周期值写入所有子定时器。这里可以利用HRTIM的MST(Master)定时器的更新事件作为触发源,触发ADC采样,同时所有子定时器的周期寄存器预装载。写入新值时,不需要每个定时器单独调用,HAL库也提供了对多个定时器的批量设置接口,但底层逻辑仍然是先设置预装载寄存器,再等周期边界统一生效。
void ControlLoop_Task(void) { uint32_t fsw_hz; uint32_t period_value; // 假设环路已计算出新的开关频率 fsw_hz = ComputeLLCFrequency(); // 将频率转换为HRTIM周期寄存器值(340MHz时钟) period_value = 340000000U / fsw_hz; // 更新所有子定时器的周期预装载值 // 实际生效在下一个HRTIM定时器更新事件 LL_HRTIM_TIMERA_SetPeriod(HRTIM1, LL_HRTIM_TIMERA, period_value); LL_HRTIM_TIMERB_SetPeriod(HRTIM1, LL_HRTIM_TIMERB, period_value); LL_HRTIM_TIMERC_SetPeriod(HRTIM1, LL_HRTIM_TIMERC, period_value); LL_HRTIM_TIMERD_SetPeriod(HRTIM1, LL_HRTIM_TIMERD, period_value); LL_HRTIM_TIMERE_SetPeriod(HRTIM1, LL_HRTIM_TIMERE, period_value); }在泵升压(burst)工作模式时,还需要配置Burst参数。LLC轻载时,频率拉到很高会使控制环很难稳定,通常的做法是让HRTIM进入Burst模式,即定时器运行一段时间、暂停一段时间,以降低有效开关次数。HRTIM的Burst模式由MASTER定时器产生Burst时钟,子定时器按照设定的Burst周期和Burst占空比运行。这部分配置相对复杂,我把Burst周期初始设在100us,Burst占空比从5%开始测试,根据输出纹波和效率调整。
5. 故障保护设计:PWM输出上那几道保命防线
5.1 片内比较器+DAC实现纳秒级过流关断
数字电源的故障保护,最高优先级永远是硬件链路。LAT1555的过流保护,我用G474片内的比较器来做,不经过CPU,也不经过中断。
G474的CMP单元可以配置为:正输入接片内DAC的值,负输入接电流采样信号(比如电流互感器整流后的电压),比较器输出直接连接到HRTIM的故障输入。一旦电流采样电压超过DAC阈值,比较器翻转,HRTIM收到故障信号后,所有已配置的PWM输出会在一个硬件逻辑周期内被强制拉到安全电平。
DAC阈值的设计是个细节活:阈值设置太低,启动瞬间的冲击电流会触发保护;阈值设置太高,保护就形同虚设。LAT1555满载电流对应采样电压约3.2V,我把DAC阈值设在3.6V,留出约12%的余量,同时配合一个小的RC滤波来抑制采样信号上的毛刺。
有了这个片内比较器,就不用再外挂一颗比较器芯片,省了成本也简化了PCB布局。唯一要注意的是G474比较器的输入失调电压,不同芯片之间有1mV到3mV的差异,对24V/10A这个量级的电源来说影响不大,但如果你做的是低压大电流的模块电源,就需要用校准寄存器做补偿。
5.2 HRTIM外部事件与故障输入的区别和取舍
HRTIM里有两个容易混淆的机制,一个是外部事件(EEV),一个是故障输入(FLT)。很多初学者搞不清该用哪个。
外部事件(External Event)的作用是修改PWM状态机的输出,它可以作为PWM的置位或复位源。比如,你可以配置一个比较器输出作为EEV1,当它出发时,把SR的PWM输出强制复位(关断)。EEV的响应非常快,但它不会锁存,事件结束后PWM恢复原来的运行逻辑。
故障输入(Fault)则是专门的安全通道。HRTIM的每个子定时器可以选择多个故障源,故障发生时,PWM输出可以配置成高电平、低电平或高阻状态,并且可以选择故障锁定模式或自动重触发模式。锁定模式下,故障发生后PWM一直保持安全状态,直到软件明确清除故障标志;自动重触发模式下,故障信号消失后PWM自动恢复。
在LAT1555里,原边过流使用FLT1,配置为锁定模式;副边SR过流使用FLT2,也配置为锁定模式;而副边电流过零点检测触发SR提前关断,则用EEV来实现,因为那个场景需要的是正常运行时的事件触发,而不是故障保护。
5.3 故障状态设计:锁存、自动重触发与软件复位
故障锁定和自动重触发的选择,取决于电源系统的恢复策略。LLC启动期间,电流冲击较大,如果使用自动重触发模式,PWM会在故障恢复后立刻重新输出,有可能连续多次触发,造成功率管热积累。所以我将原边过流保护设置为锁定模式,故障发生后等待软件确认,由主程序判断故障原因并决定是否重启。
软件处理故障的标志位和复位逻辑也值得强调。清除HRTIM的锁定状态,需要在软件中清除故障标志,然后重新初始化定时器输出。如果你用的是HAL库,要注意HAL_HRTIM_Fault_Init配置了故障锁定后,清除动作不只是调用一次__HAL_HRTIM_CLEAR_FLAG,还需要重新触发定时器从IDLE状态恢复到运行状态,否则输出可能一直处于安全电平不恢复。
void Fault_Recovery(void) { // 确认故障源已经消失 if (HAL_GPIO_ReadPin(FAULT_FLAG_PORT, FAULT_FLAG_PIN) == GPIO_PIN_SET) { return; } // 清除HRTIM故障锁定标志 __HAL_HRTIM_CLEAR_FLAG(&hrtim1, HRTIM_FLAG_FLT1); __HAL_HRTIM_CLEAR_FLAG(&hrtim1, HRTIM_FLAG_FLT1SET); // 重新启动定时器输出 HAL_HRTIM_WaveformCounterStart(&hrtim1, HRTIM_TIMERINDEX_TIMERD); HAL_HRTIM_WaveformOutputStart(&hrtim1, HRTIM_TIMERINDEX_TIMERD); }6. 实测波形的现场排查:死区直通、SR不同步、保护误触发
6.1 死区不够导致的桥臂直通特征
LAT1555第一次上电做满载测试时,我在示波器上看到原边桥臂中点波形出现了非常奇怪的阶梯状,同时输入电流比预期大了一倍多。一开始怀疑是谐振电容没有预充电,排查半天,最后用差分探头同时测量上管和下管的Vgs,才确定是死区过小导致上下管在切换瞬间同时导通了。
当时的死区设在了120ns,比理论计算的180ns小。导致实际死区小于寄存器配置值的原因在于:G474 HRTIM死区插入的位置在PWM输出引脚之前,而外部驱动芯片还有自己的传播延迟,上下管的驱动芯片传播延迟如果不一致,实际死区会被这个差值吃掉。驱动芯片A的传播延迟是45ns,驱动芯片B是70ns,实际死区就少了25ns,120ns配置下来可能实际只有95ns。
解决思路是:第一,把死区寄存器值加大到180ns;第二,在PCB layout上尽量让驱动芯片的输入走线等长,减少固有延迟差异。
6.2 SR关断点与反向恢复电流的调试记录
SR时序调试是我在LAT1555项目里耗时最长的一环。最初副边SR的关断时刻和原边完全对齐,负载从半载拉到满载时,输出效率只有89%左右,比仿真预期低了快3个百分点。用电流探头测谐振电流波形,发现每个开关周期的关断沿都拖着一个小尖峰——这就是SR体二极管反向恢复的典型特征。
我把SR的超前关断时间从0逐步加到150ns,效率慢慢升到92%,波形上的尖峰也消失了。不过继续加大到200ns后,效率又开始下降,原因是SR提前关断过早,电流流过体二极管的时间变长,二极管的导通压降损耗反而超过了反向恢复损耗。所以SR死区不是越大越好,存在一个最优窗口,需要通过实验扫出来。
在测试中还发现一个规律:不同负载下最优的SR超前关断时间是不同的。满载时150ns最优,半载时则要拉到250ns左右。这就推动了LAT1555把SR关断角做成动态调节的,在控制环路中根据谐振电流或输出功率实时调整。
6.3 故障引脚误触发的抗干扰处理
故障保护链路本身设计出来了,但实际运行后出现了另一类问题:过流保护莫名其妙触发,空载启动就保护,换了电感更大的负载反而正常。
用示波器抓比较器输入引脚,发现电流采样信号上叠加了不少高频振荡毛刺,幅值已经超过DAC阈值。这些毛刺的根源,是原边功率管的开关动作通过寄生电容耦合到采样绕组上,频率在几十MHz量级。如果不处理,保护阈值根本没法设低,否则一开关就误触发,而设高又失去保护意义。
我在比较器输入端加了一个一级RC低通滤波,截止频率大约10MHz,滤掉开关尖峰,保留电流包络信号。同时把DAC阈值在软件上做了斜坡处理:启动阶段阈值从0逐步升到目标值,避开启动冲击电流。这样改完以后,误触发的现象基本消失,过流保护才真正变成了一道可靠的防线。
回过头看整个LAT1555项目,三相LLC+SR的PWM产出方案能跑通,关键不在于某一个寄存器配置得多完美,而在于从拓扑需求到外设特性的映射是否清晰。三相LLC要的是可变的频率、稳定的相位、精确的死区,SR要的是跟随原边但又被精细控制的关断沿,G474的HRTIM正好提供了这些硬件基础。至于后面遇到的死区被驱动延迟吃掉、SR反向恢复尖峰、保护误触发这些问题,说到底都是参数和现实的偏差,只要掌握了排查思路,逐项验证,都能解决。