☰
STM32G474 HRTIM实战:四开关Buck-Boost+半桥LLC的PWM驱动方案
2026/9/28 19:41:10 网站建设 项目流程

在做数字电源这条路上,如果你和我一样被宽范围输入输出的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四个管子需要两组带死区的互补PWM,LLC半桥又需要一组带死区的互补PWM,而且LLC这组还要能动态变频。总共六路驱动,三组互补输出,这正好是G474 HRTIM最擅长的场景。如果用普通MCU的通用定时器去拼,频率调节范围、死区精度、故障保护响应速度都很难兼顾。

2. 硬件资源规划:引脚、ADC与故障保护链路

2.1 HRTIM通道分配方案

开始写代码之前,先把HRTIM的通道分配想清楚,否则后面引脚冲突或中断优先级不对会很痛苦。我在项目中用HRTIM1作为主输出单元,做如下分配:

功能HRTIM单元输出引脚说明
Buck-Boost Q1/Q2TIMAHRTIM1_CHA1 / CHA2高边PWM + 低边互补PWM
Buck-Boost Q3/Q4TIMBHRTIM1_CHB1 / CHB2高边PWM + 低边互补PWM
LLC Q5/Q6TIMCHRTIM1_CHC1 / CHC2半桥互补PWM,用于PFM变频
备用/保护TIMD预留可做同步整流或第二路LLC

这个分配的核心逻辑是:Buck-Boost和LLC之间需要频率解耦。Buck-Boost工作在固定频率(比如100kHz或200kHz),LLC工作在谐振频率附近的变频区间(比如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 > VOUT):Q1和Q2组成的桥臂做高频PWM,Q3和Q4组成的桥臂下管Q4常通、上管Q3常关。这时的等效电路就是同步Buck,输出电压由Q1的占空比决定,D = VOUT / VIN。
  • Boost模式(VIN < VOUT):Q3和Q4组成的桥臂做高频PWM,Q1和Q2组成的桥臂下管Q2常通、上管Q1常关。等效电路是同步Boost,输出由Q3的占空比决定,D = 1 - VIN / VOUT。
  • Buck-Boost模式(VIN ≈ VOUT):两组桥臂同时高频开关。常见控制方式是让Q1/Q2桥臂工作在大占空比D1,Q3/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-Boost,Q2原本常通,现在要变成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切换瞬间过流模式切换时占空比没有预置用状态机分步切换,先预置占空比再上PWM
LLC在轻载下啸叫Burst频率落入音频范围调整Burst周期至10kHz以上或降低单次Burst时间
MOSFET发热严重ZVS丢失或死区过短用示波器验证VS翻转,对比死区时间和谐振电流能量
ADC采样毛刺大采样与PWM不同步改用HRTIM事件触发ADC,采样点对准PWM中点或谷点
故障保护偶发触发比较器阈值过于接近正常峰值把阈值抬高到1.5倍峰值,并加入消隐时间

7.3 逐周期限流与短路保护的调试顺序

在把代码迁移到实际功率板之前,我强烈建议先用一个低压小功率的电源板做功能验证,比如用24V输入、50W输出的规格把环路和PWM调通,再上高压满载。原因是高压大电流下任何一个软件bug都可能变成硬件事故,而在低压小功率下,即使直通,限流电阻或热敏电阻也能把损坏控制在最小范围。

我个人的调试顺序是:

  1. 只发固定PWM,不带闭环,用示波器确认三组互补输出的频率、死区、相位关系。
  2. 打开HRTIM故障保护,人为拉低故障输入引脚,确认PWM输出立即关断。
  3. 闭环只跑Buck-Boost,先固定后级LLC为开环定频,验证Buck-Boost稳压能力。
  4. LLC闭环投入运行时,把频率变化步长放小,缓慢调节,观察输出是否平滑。
  5. 最后做负载阶跃、输入电压阶跃、短路保护测试。

每一步都对应之前说的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时序这东西,纸上谈兵永远比不过示波器实测。最后再提醒一句,无论是死区、故障保护还是软启动,每一项都要在验证过的条件下逐项测试,不要觉得“差不多就行”——在电源这行,差不多往往意味着炸机。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询