STM32G474 HRTIM实战:四开关Buck-Boost+半桥LLC的PWM驱动方案

发布时间:2026/9/28 19:41:18
STM32G474 HRTIM实战:四开关Buck-Boost+半桥LLC的PWM驱动方案 在做数字电源这条路上如果你和我一样被宽范围输入输出的Buck-Boost折腾过又被后级隔离LLC的软开关时序折磨过那你大概率能理解一块真正懂电源的MCU有多重要。ST的STM32G474就是为此而生的——它内置的HRTIM高分辨率定时器能把死区、互补PWM、故障保护这些电源控制最核心的资源全部硬件化不再需要外部CPLD或者一堆逻辑门来兜底。这篇文章就是我在STM32G474上从零搭建“四开关Buck-Boost 半桥LLC”混合拓扑PWM驱动的一份完整记录包括为什么这么选、定时器怎么配、代码怎么写、以及我在调试中踩过的坑。整个方案做下来最大的感受是G474的HRTIM比想象中好用但配置复杂度也比普通定时器高一个量级。如果你正在做数字电源、充电模块、车载DC-DC这类项目或者正准备从STM32F103的传统PWM方案迁移到G4平台这篇内容可以帮你少走不少弯路。我会把HRTIM通道分配、死区计算、变频PWM的实现思路包括Buck-Boost模式切换的细节全部摊开来讲尽量做到看完就能上手。1. 为什么是STM32G474数字电源控制的核心选型逻辑1.1 HRTIM才是真正的主角很多人一看到STM32G474第一反应是“主频170MHz的Cortex-M4”但做电源的人更该关注的是它的HRTIM高分辨率定时器。这个外设才是G4系列和普通MCU拉开差距的地方。HRTIM由多个子定时器单元组成G474上通常有TIMA到TIMF共6个单元每个单元都能产生一对互补的PWM输出并且支持170ps级别的分辨率。170ps是什么概念以2MHz的开关频率为例一个开关周期是500ns普通定时器用170MHz主频去分频能做到大约5.88ns的步进听起来还行但对死区谐振腔的控制来说远远不够。G474的HRTIM通过内部PLL倍频把时基精度提到了皮秒级这样在调节LLC的开关频率或死区时间时每次调节的粒度能做到非常平滑不会出现频率跳变导致的电流尖峰。除了分辨率HRTIM真正省心的是它的硬件死区插入。在LLC拓扑中死区时间是硬约束短了会直通炸管长了会丢失ZVS零电压开通。如果靠软件延时来凑死区一旦中断响应抖动桥臂就可能在临界区附近发抖。HRTIM允许你给上升沿和下降沿分别设置死区延时并且支持死区自动补偿一旦配置好PWM输出的时序就完全由硬件保证和CPU跑不跑中断无关。1.2 混合拓扑的工程价值选“Buck-Boost LLC”混合拓扑核心原因是输入电压范围太宽。比如车载电源的输入可能从9V到36V甚至更宽直接用LLC去覆盖整个范围谐振槽参数会非常难折中增益曲线根本拉不开。先把前端用四开关Buck-Boost稳定到一个中间母线电压比如12V或24V后级LLC只做定比变压和隔离这样两级各司其职。四开关Buck-Boost由两个半桥组成Q1/Q2和Q3/Q4中间一个电感。它的优势在于输入低于输出时工作在Boost模式输入高于输出时工作在Buck模式输入输出接近时工作在Buck-Boost模式。全程开关管承压不会超过输入输出电压的较大值不像传统Boost那样在宽范围输出时开关管应力过高。而后级LLC半桥负责隔离和电压变换它工作在谐振频率附近时效率最高EMI也比较好控制。这两级放在一起PWM的挑战就来了Buck-Boost四个管子需要两组带死区的互补PWMLLC半桥又需要一组带死区的互补PWM而且LLC这组还要能动态变频。总共六路驱动三组互补输出这正好是G474 HRTIM最擅长的场景。如果用普通MCU的通用定时器去拼频率调节范围、死区精度、故障保护响应速度都很难兼顾。2. 硬件资源规划引脚、ADC与故障保护链路2.1 HRTIM通道分配方案开始写代码之前先把HRTIM的通道分配想清楚否则后面引脚冲突或中断优先级不对会很痛苦。我在项目中用HRTIM1作为主输出单元做如下分配功能HRTIM单元输出引脚说明Buck-Boost Q1/Q2TIMAHRTIM1_CHA1 / CHA2高边PWM 低边互补PWMBuck-Boost Q3/Q4TIMBHRTIM1_CHB1 / CHB2高边PWM 低边互补PWMLLC Q5/Q6TIMCHRTIM1_CHC1 / CHC2半桥互补PWM用于PFM变频备用/保护TIMD预留可做同步整流或第二路LLC这个分配的核心逻辑是Buck-Boost和LLC之间需要频率解耦。Buck-Boost工作在固定频率比如100kHz或200kHzLLC工作在谐振频率附近的变频区间比如80kHz~250kHz。如果两组PWM共用同一个子定时器频率调整会互相牵连所以一定要分配在不同的HRTIM子单元上。引脚分配完后记得在Cubemx的HRTIM配置页面里给每个输出使能“Dead-Time Insertion”并将“Fault Enable”打开。G474每个HRTIM输出支持多个故障源可以配置成低电平有效或高电平有效推荐低电平有效因为大多数驱动芯片的SD关断脚都是低电平生效这样故障触发时PWM会被硬件立即拉低驱动芯片关断和软件完全无关。2.2 ADC与DMA采样链路设计数字电源闭环控制离不开采样。Buck-Boost级需要采集输入电压、输出电压和电感电流LLC级需要采集母线电压和输出电流。G474的ADC支持12位分辨率最高采样率能做到3.5Msps以上对电源控制来说足够用但要注意采样时机。最合理的做法是用HRTIM产生触发事件在PWM周期的特定时刻比如定时器计数到零时触发ADC注入组转换。这样每次采样点都位于开关纹波的波峰或波谷能避免采样到开关噪声尖峰。采样完成后由DMA自动搬运到内存数组ADC转换完成中断里只做数据读取和控制计算CPU占用率能压得很低。一个需要特别注意的点是ADC的采样保持时间要留够。如果采样保持时间太短在开关噪声大的场合会采到明显跳变的毛刺。G474的ADC支持可编程采样时间我习惯将电源相关的采样通道设置到最长采样时间如47.5个ADC时钟周期然后通过DMA连续转换来弥补速度损失。这样做的代价是采样序列时间变长但对环路带宽来说完全够用。2.3 故障保护不能全交给软件我在早期调试时吃过软件的亏靠ADC检测过流再关PWM反应时间通常在微秒级看似很快但功率管的短路耐受时间只有几百纳秒到几微秒。一旦真的发生直通软件根本来不及救场。G474的方案是用比较器DAC HRTIM故障输入来做硬件级保护。比较器的负端接采样电阻或电流互感器的信号正端用DAC设置阈值比较器输出接到HRTIM的FLT输入。当电流超过阈值HRTIM立即将对应PWM输出置为安全状态不需要CPU参与。这个安全状态可配置比如Buck-Boost桥臂全部输出低电平LLC桥臂也输出低电平整个功率级被硬件切断。配置时注意故障触发后HRTIM不会自动恢复需要软件清除故障标志才能重新启动PWM。我的习惯是过流保护触发后记录故障标志并让系统进入闩锁状态除非重新上电或检测到复位指令否则不允许自动重启。对于电源产品来说故障后的行为必须可预期偶发自行恢复反而容易造成二次损坏。3. PWM核心配置从Cubemx到寄存器实操3.1 HRTIM初始化要点在Cubemx里配置HRTIM时有几个地方特别容易漏我先列一下最关键的几项时钟源HRTIM需要独立的PLL2时钟输入最高可以跑到344MHz。这个时钟决定了HRTIM的计数步进分辨率。一定要先在Clock Configuration里把PLL2使能并分配合适的频率否则HRTIM的时基会不对。计数模式Buck-Boost通常用连续上/下计数模式也就是三角波这样PWM在周期中间位置更新比较值适合峰值电流控制。LLC变频模式下也建议用连续计数模式方便改变周期值。周期寄存器HRTIM的周期值PER决定了PWM频率。比如HRTIM时钟是344MHz、计数模式是连续上/下计数、期望频率是100kHz那么PER 344MHz / (2 × 100kHz) - 1 1719。这里除以2是因为上/下计数一个完整周期会经过两个计数方向。比较寄存器比较值CMP对应PWM翻转点。以中心对齐模式为例当计数器从0向上计数到CMP时输出变为有效计数器向下计数到CMP时输出恢复无效。这样产生的是对称PWM比边沿对齐更适合电源控制。Cubemx生成的初始化代码里HRTIM的寄存器操作都在HAL_HRTIM_xxx函数里。如果你追求极致性能可以直接操作寄存器更新周期和比较值我在后面的代码示例里会给出直接寄存器操作的写法因为HAL封装对每个寄存器更新都做了一堆检查在控制环路里频繁调用会拖慢速度。3.2 死区时间设置与计算死区时间的计算基于驱动芯片的传播延时和功率管的关断延时。更精确的公式是死区 高边驱动关断延时 - 低边驱动开通延时 安全裕量举例来说如果高边MOS管的关断延时是45ns低边开通延时是20ns驱动芯片的传播延时差是30ns那么死区至少要大于55ns。考虑到温度漂移和器件离散性我通常会再乘1.5倍的保护系数选择80~100ns作为初始死区。在HRTIM里死区寄存器DTR和DTF分别控制上升沿死区和下降沿死区单位是HRTIM时钟周期。假设HRTIM时钟344MHz一个周期约2.9ns要设置87ns死区寄存器值约为30。需要说明的是上升沿死区表示从低边关断到高边开通之间的延时下降沿死区则相反两侧可以设置不一样这对于不对称驱动电路比如高边用自举驱动、低边直接驱动很有用。调试时不要在满载条件下反复修改死区容易炸管。我习惯先在低压小电流下用示波器观察桥臂中点电压的塌陷情况逐步缩短死区直到开关波形刚好不出现直通尖峰为止。测量时直接看VS开关节点波形在死区期间的平台电压如果有明显谐振或负压钳位说明死区时间与谐振参数不匹配。3.3 调制方式选择PWM与PFM的配合逻辑Buck-Boost级用固定频率PWM这个不用多说。真正需要设计的是LLC级它要工作在变频模式PFM也就是通过改变周期寄存器来改变开关频率。在HRTIM中周期寄存器PER可以在计数器计数过程中被重新加载但加载时机不同会影响行为。HRTIM提供两种更新方式立即更新写入后的下一个时钟周期就生效好处是响应快但会导致当前PWM周期被压缩或拉长产生不对称的波形。周期结束更新等当前计数周期走完后下一个周期开始生效好处是波形始终对称坏处是有一个周期的响应延迟。LLC控制中我强烈建议用周期结束更新。因为LLC的开环增益曲线比较陡峭频率突变会让谐振腔电流出现很大的冲击。即便需要快速调整频率也应该让当前周期正常结束下一个周期再切换频率。HRTIM里这个功能可以通过配置定时器的更新触发条件实现具体寄存器是HRTIM_TIMxCR中的UDM位。4. 四开关Buck-Boost的PWM生成与控制4.1 三种工作模式与开关时序四开关Buck-Boost的三种模式本质上是两组半桥的不同配合。以输入VIN、输出VOUT、电感L为例Buck模式VIN VOUTQ1和Q2组成的桥臂做高频PWMQ3和Q4组成的桥臂下管Q4常通、上管Q3常关。这时的等效电路就是同步Buck输出电压由Q1的占空比决定D VOUT / VIN。Boost模式VIN VOUTQ3和Q4组成的桥臂做高频PWMQ1和Q2组成的桥臂下管Q2常通、上管Q1常关。等效电路是同步Boost输出由Q3的占空比决定D 1 - VIN / VOUT。Buck-Boost模式VIN ≈ VOUT两组桥臂同时高频开关。常见控制方式是让Q1/Q2桥臂工作在大占空比D1Q3/Q4桥臂工作在占空比D2两者配合使得输出满足VOUT VIN × D1 / (1 - D2)。实际工程中模式切换不能只看VIN和VOUT的简单比较还要加迟滞。如果不加迟滞输入电压在临界点附近抖动时系统会在Buck和Boost之间反复横跳电感电流出现瞬态冲击输出纹波会明显变大。我给代码里加了5%~8%的迟滞窗口比如进入Buck模式的条件是VIN VOUT × 1.05退出Buck模式的条件是VIN VOUT × 0.98中间区域保留在Buck-Boost模式。4.2 占空比计算与寄存器更新电压环PID输出的是一个0~100%的占空比数值需要换算成HRTIM的比较寄存器值。以中心对齐Mode为例CMP PER × DutyCycle比如PER是1719目标是55%占空比那么CMP ≈ 945。注意HRTIM里的比较值不是直接在输出端生效的它还要经过调制器处理。对于互补输出占空比和死区是叠加计算的最终的有效占空比会小于CMP设定的值因为死区占掉了一部分周期。做精确稳压时这个误差要在环路里自动消除不需要手动补偿。更新动作在控制中断里完成推荐用直接寄存器写// 更新Buck-Boost第一组桥臂占空比 HRTIM1-sTimA.CMP1R cmp_value_Q1; HRTIM1-sTimA.CMP2R cmp_value_Q2; // 更新第二组桥臂占空比 HRTIM1-sTimB.CMP1R cmp_value_Q3; HRTIM1-sTimB.CMP2R cmp_value_Q4;注意CMP1R控制的是高边PWM的比较值CMP2R控制的是低边PWM的比较值。如果开启了硬件死区插入低边的有效输出边沿会自动向后延时不需要软件计算。为了确保更新生效需要在Cubemx中将更新源设为“计数器归零时更新”或周期结束。这样写入寄存器的新值不会打断当前周期而是从下个周期开始生效。4.3 软启动与模式切换的毛刺抑制电源上电一瞬间输出电容相当于短路如果直接按闭环占空比启动电感电流会冲得很高。我的方案是软启动斜率控制用数字方式生成一个斜坡参考电压从0慢慢升到目标电压同时限制最大占空比变化率。比如每个控制周期10kHz占空比最多增加0.5%这样上电过程大约几十毫秒输出电容充电电流被限制在安全范围。模式切换时的毛刺是另一个高频问题。比如从Boost切换到Buck-BoostQ2原本常通现在要变成PWM开关直接切换会导致电感两端电压突变。我的做法是在模式切换前强制进入一个中间状态先把两组桥臂的占空比调整成Buck-Boost模式的对应值但其中一组桥臂暂时不放PWM而是保持纯直流状态等电感电流平稳后再让那组桥臂开始高频开关。这个切换过程用状态机实现分为“等待电流稳定”“当前占空比预置”“PWM使能”“回闭环”四个步骤。每步间隔1~2个开关周期从实际波形看切换瞬间的电感电流尖峰能控制在额定电流的1.2倍以内。5. LLC变频控制与死区管理5.1 LLC为什么要变频以及ZVS的工程意义LLC谐振变换器通过改变开关频率来调节输出电压本质上是利用谐振腔的阻抗随频率变化来实现增益调整。在谐振频率附近LLC的增益约为1低于谐振频率时增益增大高于谐振频率时增益降低。这样一来同样的变压器匝比就可以应对一定范围的输入电压变化。但LLC并不是随便变频就能高效工作。要让初级开关管实现ZVS零电压开通必须保证开关动作时流过开关管的电流方向是“反灌”的也就是体二极管先导通把开关管漏源电压钳位到接近0V然后再给栅极开通信号。这样开通损耗几乎为零开关频率即使提高到几十万赫兹管子也不会明显发热。实现ZVS的工程条件包括死区时间必须大于开关管结电容的充放电时间同时谐振电感中储存的能量要足够在死区内完成电压换向。能量不足时开关节点电压摆不到目标轨ZVS就丢了表现为MOS管外壳温度异常升高。我的做法是在样机上用电流探头观察原边电流波形和VS波形确认死区结束时VS已经完成翻转再决定是否调整死区。5.2 HRTIM实现PFM的寄存器策略LLC级的HRTIM子单元我用TIMC工作在连续计数模式但频率不再固定。在控制中断里我根据环路输出得到目标频率再换算成周期寄存器值// 假设HRTIM时钟为344MHz中心对齐模式 // 频率f对应的周期寄存器值PER 344000000 / (2 × f) - 1 uint32_t period (uint32_t)(344000000.0f / (2.0f * target_freq)) - 1; // 半桥固定50%的占空比比较值设为周期一半 uint32_t cmp period / 2; HRTIM1-sTimC.PERxR period; HRTIM1-sTimC.CMP1R cmp; HRTIM1-sTimC.CMP2R cmp;这里重点在于PER寄存器的更新时机。LLC的ZVS条件对周期一致性很敏感如果正在工作的周期被突然缩短谐振电流的峰值会发生突变。前面已经说过选择周期结束更新模式可以在硬件层面保证当前周期走完后再切换频率。如果你用Cubemx生成代码建议在初始化时检查一下HRTIM_TIMCR_UPDGATE的设置。UPDGATE控制更新事件由谁触发是计数器周期结束还是外部事件还是软件直接更新。LLC用计数器周期结束作为更新源能让新的PER和CMP同时生效避免出现“周期已经变了但占空比还是旧值”的错位。5.3 轻载下的Burst模式LLC在轻载时如果继续按谐振频率附近运行原边依然有较大的励磁电流损耗效率会很难看。常见的做法是进入Burst打嗝模式当输出功率低于某一阈值时停止发波一段时间让输出电容为负载供电输出电压跌到下限后再重新发波一段时间补充能量。G474实现Burst很简单在控制中断里判断输出功率功率低时禁止TIMC子单元的输出功率低到下限时再使能。需要注意Burst的周期不能落在音频范围内20Hz~20kHz否则变压器会发出可闻的啸叫。我一般把Burst周期设置在5~10kHz之间单次Burst持续时间则根据输出电容的大小和负载变化率调整。Burst模式下的故障保护要单独测试因为在停止发波期间输出电流的纹波和瞬态响应都变了比较器阈值可能需要适当放宽否则容易误触发过流保护。6. 完整代码骨架初始化、控制循环与调试接口6.1 主程序框架整体代码分四层HAL初始化时钟/GPIO/HRTIM/ADC/DAC、控制变量初始化、主循环任务状态机、通信、保护逻辑、控制中断ADC到PWM的闭环计算。主程序大概长这样int main(void) { HAL_Init(); SystemClock_Config(); // 包含PLL2给HRTIM提供高精度时钟 MX_GPIO_Init(); MX_DMA_Init(); MX_HRTIM1_Init(); // 初始化HRTIM通道、死区、故障输入 MX_ADC1_Init(); MX_ADC2_Init(); MX_DAC_Init(); // 可选用于示波器观察环路内部变量 Power_Control_Init(); // 软启动状态机、PWM输出标志等 HAL_HRTIM_WaveformCounterStart(hhrtim1, HRTIM_TIMERINDEX_TIM_A); HAL_HRTIM_WaveformCounterStart(hhrtim1, HRTIM_TIMERINDEX_TIM_B); HAL_HRTIM_WaveformCounterStart(hhrtim1, HRTIM_TIMERINDEX_TIM_C); HAL_HRTIM_OutputStart(hhrtim1, HRTIM_OUTPUT_TIMB | HRTIM_OUTPUT_TIMC); HAL_ADC_Start_DMA(hadc1, (uint32_t *)adc_buf, ADC_BUF_SIZE); HAL_ADC_Start_IT(hadc2, (uint32_t *)adc_buf2, ADC_BUF_SIZE2); Dashboard_Init(); // 显示或通信接口按需选择 while (1) { Power_StateMachine(); // 软启动、模式切换、故障处理 Comm_Update(); // 非关键任务优先级低 } }HRTIM启动顺序是有讲究的先启动计数器让定时器先跑起来再使能输出。如果顺序反了输出端可能在计数器和输出使能没有对齐的情况下出现一两个毛刺这个毛刺对功率级来说可能就是致命的。我遇到过在样机上启动瞬间偶尔出现一次窄脉冲后来确认就是计数器还没跑起来就使能了输出。6.2 控制中断与ADC序列处理控制环路我放在ADC转换完成中断里执行而不是用定时器中断。原因是这样能保证控制频率和采样时刻严格同步。每个PWM周期触发一次ADC注入组转换转换完成后进一次中断中断里读到的电压电流就是当前周期的实际值。void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) { if (hadc-Instance ADC1) { v_in adc_to_voltage(adc_buf[0]); v_out adc_to_voltage(adc_buf[1]); i_l adc_to_current(adc_buf[2]); pid_out PID_Update(buckboost_pid, v_ref, v_out); // 根据VIN/VOUT判断当前模式选择占空比更新公式 Mode_Select(mode_ctrl, v_in, v_out); Update_BuckBoost_Duty(mode_ctrl, pid_out); // LLC环路以输出为反馈得到目标频率 llc_freq PID_Update(llc_pid, llc_vref, llc_vout); Update_LLC_Freq(llc_freq); // 保护逻辑逐周期过流限制 if (i_l oc_limit) Duty_Ramp_Down(); } }控制中断的“保质期”很短中断里不宜做串口打印、OLED刷新这类耗时操作。我前期调试时遇到过中断里加了一行printf导致PWM周期抖动的情况后来把调试变量全部通过DAC引脚输出用示波器观察DAC波形来调试环路。G474自带DAC这个功能比串口输出好用太多。6.3 用DAC和示波器观察内部变量调试数字电源环路最痛苦的一件事是你眼睛看不到PID输出、参考电压、电流纹波这些内部变量。G474的DAC正好解决这个问题。在控制中断里把PID输出写到一个DAC通道示波器探头直接接DAC引脚就能看到环路的实时响应。我通常会接两个DAC通道一个输出PID输出也就是占空比给定一个输出软启动斜坡或者参考电压。这样上电过程和负载跳变时CAN能看到三路信号输出电压ADC监视、PID输出DAC1、参考电压DAC2判断环路稳定性非常直观。如果PID输出在负载跳变后出现衰减振荡说明环路相位裕度不够需要减小PID的积分或者适当增加微分。DAC在Cubemx里配置也很简单需要注意的是DAC输出要选内部缓冲模式否则外部负载会让DAC电压偏低。此外DAC的更新时机并不严格在控制中断里直接写入DAC数据寄存器即可不用等DMA。7. 实测踩坑记录与常见问题速查7.1 上电吱吱响输出电压纹波巨大这个问题我遇到过好几次最后定位到都是死区时间设置过大的锅。死区太大Buck-Boost的同步整流体二极管导通时间变长体二极管反向恢复造成的电压塌陷会让输出纹波显著增大变压器或电感也会发出高频吱吱声。排查思路先减小死区逐次降低10ns左右观察电感电流波形上的负向尖峰是否变小。这里要强调减少死区的前提是桥臂不直通一定要用电流探头盯着母线电流一旦出现电流突变就要立刻停下来。7.2 LLC频率调整后MOS管发热异常频率突变导致ZVS丢失是最常见的原因。如果频率跳变幅度太大谐振腔电流在瞬态过程中可能没有足够能量完成开关管的结电容充放电ZVS条件破坏开关损耗飙升。对策是限制每步频率调整的步长。比如PID输出的目标频率变化是1kHz我把它分成10步每次只调100Hz并且插入几个开关周期的稳定时间。虽然环路响应变慢了但ZVS始终能保住效率优先于带宽。现象可能原因排查与对策PWM输出完全无波形PLL2未配置或HRTIM时钟源错误检查Clock Configuration中PLL2是否使能频率是否正确Buck-Boost切换瞬间过流模式切换时占空比没有预置用状态机分步切换先预置占空比再上PWMLLC在轻载下啸叫Burst频率落入音频范围调整Burst周期至10kHz以上或降低单次Burst时间MOSFET发热严重ZVS丢失或死区过短用示波器验证VS翻转对比死区时间和谐振电流能量ADC采样毛刺大采样与PWM不同步改用HRTIM事件触发ADC采样点对准PWM中点或谷点故障保护偶发触发比较器阈值过于接近正常峰值把阈值抬高到1.5倍峰值并加入消隐时间7.3 逐周期限流与短路保护的调试顺序在把代码迁移到实际功率板之前我强烈建议先用一个低压小功率的电源板做功能验证比如用24V输入、50W输出的规格把环路和PWM调通再上高压满载。原因是高压大电流下任何一个软件bug都可能变成硬件事故而在低压小功率下即使直通限流电阻或热敏电阻也能把损坏控制在最小范围。我个人的调试顺序是只发固定PWM不带闭环用示波器确认三组互补输出的频率、死区、相位关系。打开HRTIM故障保护人为拉低故障输入引脚确认PWM输出立即关断。闭环只跑Buck-Boost先固定后级LLC为开环定频验证Buck-Boost稳压能力。LLC闭环投入运行时把频率变化步长放小缓慢调节观察输出是否平滑。最后做负载阶跃、输入电压阶跃、短路保护测试。每一步都对应之前说的HRTIM和ADC配置不要跳过。尤其是在第1步里没有确认死区就跑到第5步基本等于赌命。7.4 关于死区更新动态死区你有没有必要做有些高端电源会根据负载电流动态调整死区轻载用稍大的死区保证ZVS重载用较小的死区降低体二极管损耗。G474的HRTIM支持在每个周期更新死区寄存器这在理论上是可行的。但我实际做下来发现如果负载变化不剧烈固定死区配合调整谐振频率已经能把效率做到可观的水平。动态死区适合追求极限效率的场景比如想做效率超过96%的高端电源。这时可以在控制中断里根据采样电流查表得到对应的死区时间然后写入DT寄存器。注意死区变化同样需要平滑过渡直接跳变可能会让脉宽瞬间改变影响输出电压。8. 给想抄作业的人一份可复用的配置速查最后把我踩完坑后沉淀的配置参数整理成一张表方便想快速试跑的人直接参考。这个配置适用于3.3V~12V输出、24V母线、前级四开关Buck-Boost加后级半桥LLC的样机验证。配置项数值说明HRTIM时钟344MHzPLL2输出直接作为HRTIM计数时钟Buck-Boost开关频率100kHz两组桥臂统一固定频率LLC初始开关频率150kHz谐振频率设为100kHz附近可调范围80kHz~250kHz死区时间80ns~100nsBuck-Boost与LLC分别独立设置按驱动延时实测调整ADC采样频率100kHz由HRTIM事件触发每个PWM周期采样一次控制频率100kHz与ADC同步控制中断里完成双环计算过流保护响应硬件级100ns比较器输出直接触发HRTIM FLT输入PWM启动顺序计数器先启动再输出使能防止启动毛刺这份速查表不能替代你自己的器件选型和驱动验证但能帮你减少大半的前期摸索时间。尤其是HRTIM时钟这一项一旦配错所有频率计算全是白费功夫我刚开始就在这上面浪费过两天。对我自己来说STM32G474这套方案的成熟度已经很高从原理图设计到代码调试都有清晰的路径唯一需要耐心的是对HRTIM每一个配置项的理解。它对习惯用普通定时器的人说不上友好但一旦跨过这个门槛你会发现数字电源的逻辑变得非常顺采样、环路、PWM、保护每一条链路都有专门的硬件外设在为你服务。如果你正打算用G474做数字电源我建议从最小系统板加一块低压Buck-Boost开始先把HRTIM的输出波形调到让你满意的程度再谈别的。PWM时序这东西纸上谈兵永远比不过示波器实测。最后再提醒一句无论是死区、故障保护还是软启动每一项都要在验证过的条件下逐项测试不要觉得“差不多就行”——在电源这行差不多往往意味着炸机。