STM32G474 HRTIM在三相LLC+同步整流方案中的PWM配置与调试

发布时间:2026/8/29 3:44:28
STM32G474 HRTIM在三相LLC+同步整流方案中的PWM配置与调试 接手LAT1555这个项目之前我对STM32G474的印象还停留在“带HRTIM的电机控制芯片”上直到把三相LLC谐振变换器加同步整流SR的输出方案理了一遍才发现这颗芯片的外设设计有多对路。三相LLC的PWM不是简简单单输出六路互补波形就完事它需要的是高精度频率调节、ns级死区分辨率、多路定时器之间的相位锁定以及一套能在故障时把管子安全关断的硬件保护链路。G474的HRTIM正是为这些场景准备的。这篇文章就围绕LAT1555方案展开讲讲我是怎么从拓扑需求倒推PWM外设选型、搭HRTIM配置、算死区参数、做故障保护最后又踩了哪些调试坑。1. 三相LLCSR对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级别的开关频率。综合下来三相LLCSR对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的工作点周期寄存器的值只有36072MHz时钟频率每步进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个子定时器如何映射到原边和SR2.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相半桥TIMERATA1/TA2互补输出带死区原边B相半桥TIMERBTB1/TB2互补输出滞后120°原边C相半桥TIMERCTC1/TC2互补输出滞后240°副边SR1TIMERDTD1/TD2跟随原边频率互补SR副边SR2TIMERETE1/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驱动信号到输出开始下降的延时电流下降时间tf15~40ns沟道电流下降到零的时间体二极管反向恢复时间trr40~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源选择比较寄存器1CMP1Reset源选择周期事件PERIOD这样输出就是一个标准的周期翻转PWM。但LLC的SR信号需要更灵活的逻辑我会把Reset源改成比较寄存器2CMP2利用两个比较器之间的差值来产生占空比不对称的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的MSTMaster定时器的更新事件作为触发源触发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周期初始设在100usBurst占空比从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实际死区就少了25ns120ns配置下来可能实际只有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项目三相LLCSR的PWM产出方案能跑通关键不在于某一个寄存器配置得多完美而在于从拓扑需求到外设特性的映射是否清晰。三相LLC要的是可变的频率、稳定的相位、精确的死区SR要的是跟随原边但又被精细控制的关断沿G474的HRTIM正好提供了这些硬件基础。至于后面遇到的死区被驱动延迟吃掉、SR反向恢复尖峰、保护误触发这些问题说到底都是参数和现实的偏差只要掌握了排查思路逐项验证都能解决。