ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

STM32G474数字电源同步整流实战:从方案到效率优化

STM32G474数字电源同步整流实战:从方案到效率优化 做数字电源这些年“同步整流SR”这个词越来越绕不开。以前整流靠肖特基二极管简单粗暴但低压大电流场景下损耗高得让人肉疼。后来我拿到STM32G474这颗芯片发现它内部的HRTIM、比较器和运放组合起来非常适合做数字控制的同步整流。前前后后折腾了一段时间从“只是能转”到“效率终于能看了”中间踩了不少坑。这篇东西适合正在评估用G474做SR控制、或者被LLC/反激效率卡住的朋友我会把方案选型、外设分配、代码配置和实测问题一次性讲透。1. 同步整流到底是什么为什么要在STM32G474上做1.1 从二极管损耗到同步整流的收益先聊原理。反激、正激、LLC这类隔离电源的副边传统做法是加一个肖特基二极管做整流。肖特基正向压降虽然比普通PN结低但低压大电流输出时依然有可观的损耗。比如输出5V/10A二极管压降算0.4V损耗就是4W相当于白扔了8%的效率。如果把二极管换成一颗低导通电阻的MOSFET在合适的时间让它导通导通损耗就是I²×Rds(on)。现在一颗低压MOSFET做到几毫欧很常见10A电流下损耗可能只有0.5W不到——省下来的功率就是实打实的效率提升。问题也随之而来二极管是“自导通”的电流自然流过它MOSFET必须由控制电路在“恰好对的时间”打开和关断。开早了原副边串通炸管开晚了体二极管先扛损耗优势就没了关晚了电流反向轻载下效率崩掉甚至引起振荡。这就是同步整流的核心矛盾——时机。1.2 STM32G474为什么适合干这个活STM32G474是ST主推的“数字电源”系列MCU主频170MHz但真正值钱的是模拟外设和高级定时器的组合。HRTIM高分辨率定时器提供10路PWM输出内部DLL能把分辨率做到184ps左右。很多电源控制芯片还在用几百ns死区抖动时G474已经能把死区调到非常精细这对SR控制太关键了。更关键的是它内置了7个比较器、6个DAC和5个运放。同步整流实现最常用的思路就是检测SR管漏源电压Vds或者流过电感的电流过零点然后用硬件比较器快速关断PWM。G474把比较器和HRTIM通过内部事件直接相连从比较器翻转触发到PWM电平变化只走硬件连线延迟是纳秒级而不是软件中断的微秒级。这个特性决定了它天生适合做需要快速响应的SR控制。而且这颗芯片价格在主流32位MCU里不算贵开发环境HAL库齐全做小批量电源产品可以省掉一颗专门的SR控制IC。综合下来用G474做同步整流不是“炫技”而是工程上拍脑袋想一下就觉得划算的方案。2. 方案选型拿到项目后我首先想的三件事2.1 先确认拓扑与工作模式做技术方案的第一步不是打开CubeMX而是坐下来想清楚自己的电源拓扑是什么、工作在什么模式。同步整流在不同拓扑里的控制策略完全不一样。反激电源的SR最简单原边MOSFET导通时副边SR管必须保证关断原边MOSFET关断后变压器续流副边SR管应该立即导通。这种“原边开、副边关原边关、副边开”的互补逻辑用两个定时器就能做。但问题是副边电感的续流时间不是固定的它取决于负载和输入电压所以SR的导通脉宽不能死板地跟原边做死区必须根据电流状态调整。LLC谐振变换器的SR更复杂谐振电流会自然过零如果SR管关断不及时负向电流会通过源极到漏极的反向路径导致效率下降甚至直通。这种场景需要实时监测谐振电流方向或SR管的Vds来动态决定关断点。所以我在动手前会先问自己三个问题第一当前拓扑是哪种第二目标负载范围覆盖CCM连续导通模式还是DCM断续导通模式第三有没有通信协议要求比如PMBus或者CAN。第三个问题看似和SR无关但G474的资源配置和定时器引脚分配会被通信外设占用早定早安心。2.2 用外设做实时控制而不是硬扛软件中断很多人一上来就想着用ADC采样电流在ADC中断里判断过零再关PWM。这个思路在低频电源里勉强跑得动但实际做下来你会被延迟折磨疯。G474的ADC最快5Msps两个通道交替采样可以做到更快但从“电流过零发生”到“ADC采样完成”再到“中断响应里翻转GPIO”经过总线延迟和中断压栈几个微秒没了。在几百kHz开关频率的电源里1us延迟就意味着几个百分点的占空比偏移SR时机早就偏了。所以我强烈建议走“硬件事件链”电流信号或者Vds信号进比较器比较器输出直接通过内部事件连接到HRTIM的输入由HRTIM硬件逻辑完成置位、复位、死区插入。整个过程没有软件参与反应速度是纳秒级。软件只负责在慢速环路里做阈值微调和保护判断。这样设计SR控制才能够在高频下稳定工作。2.3 硬件方案与引脚规划G474的HRTIM有A、B、C、D、E和F六组定时器实际取决于封装每组定时器输出可以独立设置死区。我习惯用Timer A做主开关管PWMTimer B做SR管PWM两者配置为同步模式主定时器输出事件触发从定时器启动。引脚分配时要特别注意HRTIM的输出引脚通常和普通GPIO复用比如PA8/PA9等但LBGA100和LQFP100引脚下HRTIM输出有限必须查数据手册的复用表。配套驱动也要选好。SR管通常是低边或者浮地驱动最好用带死区控制的栅极驱动芯片比如UCC27524之类。MCU的PWM引脚输出能力不足直接推MOSFET会拖垮上升沿。栅极驱动芯片选型时注意传播延迟一致性因为原边和SR的驱动延迟如果不匹配软件上就得额外补偿。3. 核心细节解析与实操要点3.1 HRTIM实现SR的两种典型路径我在G474上实现SR用过两种路径各有适用场景。第一种是“定时同步死区”方式。主定时器输出占空比固定的方波从定时器输出反向信号并插入死区这是最朴素的方案。优点是代码量小启动稳缺点是它不感知负载变化电流进入DCM后SR管还在全周期导通必然出现反向电流。只能用于负载变化不大且始终工作在CCM的场合。如果产品手册里写了“轻载待机功耗0.5W”那这条路就堵死了。第二种是“事件触发自适应”方式。副边SR导通后实时监测电感电流或者SR管的Vds当电流接近零时向HRTIM发送事件HRTIM立即关断SR输出。这种方式下SR管的导通时间跟随负载变化轻载时自动缩短基本没有反向电流问题。我最终量产用的就是方案二。有个细节很多人会忽略HRTIM的“外部事件”可以配置为“复位定时器”或“触发输出变化”。做SR关断时通常用事件去触发SR输出立即变为无效电平而不是复位整个定时器。如果配置错误复位了定时器那么原边副边的相位关系全乱了电源直接进入保护甚至炸管状态。3.2 电流过零检测与比较器阈值设计检测电流过零有两种常见做法。一是采样电阻法。在SR管回路串一颗毫欧级采样电阻电流信号经过运放放大后进比较器。优点是信号波形直观方便软件标定缺点是采样电阻本身有功耗且共模电压高需要差分放大和精心布线。二是Vds检测法。SR管导通时Vds -I×Rds(on)管压降和电流成正比电流一旦反向Vds符号变化。用比较器检测Vds过零也是一种经典方式。它不额外耗功率但信号幅度很小几个毫欧乘以几安培可能只有几十毫伏对比较器失调电压很挑剔。G474的比较器本身带DAC参考输入可以设置阈值电压。我这里强烈推荐使用DAC作为比较器的参考因为阈值可以在运行中动态调整。比如启动阶段电流冲击大可以把阈值调高一些避免误关断稳态后再调低进一步压榨效率。DAC更新速率很快足以支持轻载重载切换时的动态阈值。比较器输出还可以经过内部滤波器做消抖一般设几千纳秒就够否则容易受开关噪声干扰。3.3 死区时间计算与插入死区时间是SR设计里最容易出事的地方。死区太大SR管导通前体二极管先导通效率下降死区太小原边和副边直通电流飙升。计算死区要分两部分原边关断到副边开通的死区Tdead_sr_on以及副边关断到原边开通的死区Tdead_sr_off。前者主要覆盖驱动芯片的关断延迟和SR管本身的关断延迟后者要覆盖SR关断延迟和原边管开通延迟。公式可以简化成Tdead Tdrive_propagation Trise_gate Tfall_gate 安全余量安全余量我会留20%到30%因为温度变化会让驱动芯片延迟漂移。G474的HRTIM里上升沿死区DTR和下降沿死区DTF是单独配置的。配置时注意HRTIM的死区寄存器单位是定时器时钟周期约5.88ns 170MHz如果开启了DLL高分辨率模式单位变成更细的步长约184ps。实际调试时不要一步到位先用示波器观察原副边驱动波形把死区从大往小慢慢压。刚开始我为了追求效率把死区压到50ns结果一次过压保护测试就炸了一颗MOSFET后来把余量放宽到150ns效率只损失了0.3%但可靠性明显提升。3.4 轻载与断续模式处理轻载是SR设计最容易出问题的地方。负载变小电感电流在每个开关周期里可能变成不连续DCMSR管如果还照常导通电感电流会反向电池放电给地白白浪费能量。反激电源在轻载下还会出现频率抖动甚至跳周期SR逻辑必须跟着调整。G474在轻载处理上可以这么做用比较器持续监测SR电流过零事件如果在一个开关周期内发生“提前过零”说明进入DCM或者轻载状态。此时可以逐步缩短SR导通时间甚至让SR管完全关闭退回二极管整流模式。掉过头来当检测到负载变大、电流不再提前过零时再逐步恢复SR工作。这里我建议用“滞后比较”的方式做切换从SR切换到二极管整流的阈值比从二极管恢复到SR的阈值低一些。否则负载在临界点波动时系统会频繁切换效率抖动不说还可能引发音频噪声。4. 实操过程与核心环节实现4.1 初始化流程与关键代码下面是我的初始化思路基于STM32CubeMX生成基础工程再在业务代码里做精细配置。整体流程分为五步初始化时钟树初始化HRTIM初始化比较器与DAC配置故障保护最后写主循环和欠压过压保护。时钟树部分我建议先打开HRTIM的DLL功能让它输出高分辨率时钟。不要一上来就开最高分辨率先用基础时钟跑通逻辑再切高分辨率精调死区这样排查问题更容易。4.2 HRTIM与PWM输出配置示例下面给一段简化但可参考的HRTIM初始化代码。我以Timer A为主管Timer B为SR管两路输出反相且插入死区。// 使用HAL库 寄存器直写混合方式 void HRTIM_Init_SR(void) { // 1. 使能HRTIM时钟 __HAL_RCC_HRTIM1_CLK_ENABLE(); // 2. 配置Timer A为主模式输出PWM HRTIM_TimeBaseCfgTypeDef sTimeBaseCfg {0}; sTimeBaseCfg.Period 1000 - 1; // 周期值配合时钟算出开关频率 sTimeBaseCfg.RepetitionCounter 0; sTimeBaseCfg.PrescalerRatio HRTIM_PRESCALERRATIO_DIV1; sTimeBaseCfg.Mode HRTIM_MODE_CONTINUOUS; HAL_HRTIM_TimeBaseConfig(hhrtim1, HRTIM_TIMERINDEX_A, sTimeBaseCfg); // 3. Timer B同样配置并设置为主模式同步起动 sTimeBaseCfg.Period 1000 - 1; HAL_HRTIM_TimeBaseConfig(hhrtim1, HRTIM_TIMERINDEX_B, sTimeBaseCfg); // 4. 配置Timer A比较值决定主管占空比 HRTIM_CompareCfgTypeDef sCompareCfg {0}; sCompareCfg.CompareValue 400; // 40%左右视电源实际需求 HAL_HRTIM_CompareConfig(hhrtim1, HRTIM_TIMERINDEX_A, sCompareCfg); // 5. 配置Timer B比较值SR管占空比 sCompareCfg.CompareValue 600; // 反向后约60%由死区调整 HAL_HRTIM_CompareConfig(hhrtim1, HRTIM_TIMERINDEX_B, sCompareCfg); // 6. 配置输出比较启用死区发生器 HRTIM_OutputCfgTypeDef sOutputCfg {0}; sOutputCfg.Polarity HRTIM_OUTPUTPOLARITY_HIGH; sOutputCfg.IdleLevel HRTIM_OUTPUTIDLELEVEL_INACTIVE; sOutputCfg.SetSource HRTIM_OUTPUTSET_TIMCMP1; sOutputCfg.ResetSource HRTIM_OUTPUTRESET_TIMPER; sOutputCfg.IsDeadTimeEnabled HRTIM_OUTPUT_DEADTIME_ENABLE; HAL_HRTIM_OutputConfig(hhrtim1, HRTIM_TIMERINDEX_A, HRTIM_OUTPUT_T1, sOutputCfg); sOutputCfg.Polarity HRTIM_OUTPUTPOLARITY_LOW; // 副边反相 HAL_HRTIM_OutputConfig(hhrtim1, HRTIM_TIMERINDEX_B, HRTIM_OUTPUT_T1, sOutputCfg); // 7. 死区时间寄存器示例值 // DTR30, DTF30具体换算成时间需要看时钟配置 HRTIM_DeadTimeCfgTypeDef sDeadTimeCfg {0}; sDeadTimeCfg.DeadTime 30; sDeadTimeCfg.DeadTimeFalling 30; HAL_HRTIM_DeadTimeConfig(hhrtim1, HRTIM_TIMERINDEX_A, sDeadTimeCfg); HAL_HRTIM_DeadTimeConfig(hhrtim1, HRTIM_TIMERINDEX_B, sDeadTimeCfg); // 8. 使能主定时器和输出 HAL_HRTIM_WaveformCountStart(hhrtim1, HRTIM_TIMERINDEX_A | HRTIM_TIMERINDEX_B); HAL_HRTIM_OutputStart(hhrtim1, HRTIM_TIMERINDEX_A | HRTIM_TIMERINDEX_B); }这段代码的主干逻辑是Timer A和Timer B各自产生PWM副边反相通过比较值控制占空比通过死区寄存器保证安全。实际生产代码里我会把Period、CompareValue做成由控制环计算得到而不是写死。4.3 比较器与外部事件映射仅仅输出互补PWM还不够我们要让“过零关断”这件事由硬件完成。这里我用COMP3监视SR管的Vds输出通过内部事件链接到HRTIM的Timer B外部复位输入。void COMP_SR_Init(void) { // 1. 配置COMP3输入为SR管Vds采样点阈值由DAC提供 COMP_HandleTypeDef hcomp3 {0}; hcomp3.Instance COMP3; hcomp3.Init.InputPlus COMP_INPUT_PLUS_IO1; hcomp3.Init.InputMinus COMP_INPUT_MINUS_DAC; hcomp3.Init.TriggerEdge COMP_TRIGGERMODE_RISING_FALLING; hcomp3.Init.BlankingSrce COMP_BLANKINGSRCE_OUT; HAL_COMP_Init(hcomp3); HAL_COMP_Start(hcomp3); // 2. 配置DAC2输出阈值零点稳态时为0V附近 DAC_ChannelConfTypeDef sConfig {0}; sConfig.DAC_SampleAndHold DAC_SAMPLEANDHOLD_DISABLE; sConfig.DAC_Trigger DAC_TRIGGER_NONE; sConfig.DAC_OutputBuffer DAC_OUTPUTBUFFER_ENABLE; HAL_DAC_ConfigChannel(hdac2, sConfig, DAC_CHANNEL_2); HAL_DAC_SetValue(hdac2, DAC_CHANNEL_2, DAC_ALIGN_12B_R, 2048); // 中点 HAL_DAC_Start(hdac2, DAC_CHANNEL_2); // 3. 使能比较器输出连接到HRTIM事件 HAL_HRTIM_EventInputConfig(hhrtim1, HRTIM_EVENTINPUT_COMP3, HRTIM_EVENTINPUT_MODE_ACTIVE_HIGH); }这段代码的核心点在于“BlankingSource”和事件映射。BlankingSource的作用是设定一个屏蔽窗口当原边驱动刚关断时SR管Vds上会有很陡的电压振铃比较器在这个窗口内不响应避免误触发。窗口时间一般设100~200ns太短没效果太长会延迟SR的开启时机只能实测。4.4 闭环调试与参数整定硬件链路通了以后就要进入“调参和看波形”阶段。我调试时用的仪器主要是差分探头、电流探头和一台至少200MHz带宽的示波器。观察位置优先选SR管的Vds波形和电感电流波形。先说电流波形。用电流探头卡在SR管的漏极回路上观察电流是否出现负向凹陷。如果出现负向凹陷说明SR关断晚了要提前比较器阈值或缩短SR最大导通时间。如果电流波形在关断时出现剧烈振铃多半是关断时机太早电流硬切要延后一点。这个“零附近”的判断需要慢慢磨我通常把阈值每次调整5mV到10mV观察效率变化。再看Vds波形。SR管导通时Vds应该是一个非常小的负压约等于I×Rds(on)如果看到Vds在导通中段突然变成零说明此时电流已经反向SR管已经不需要再导通了。这个波形是最直观的判断依据。最后说效率测试。我会用电子负载从10%负载到100%负载逐点记录输入功率和输出功率画一条效率曲线。SR调试成功的标志是轻载效率比纯二极管整流提升明显满载效率提升3个点以上。如果你的效率提升不明显先别怀疑原理检查一下栅极驱动波形是否有振铃、死区是否偏大、SR管选型Rds(on)是否过大。5. 常见问题与排查技巧实录5.1 示波器实测常见波形异常的排查实际调试中我最常遇到的问题是“原边关断瞬间SR管误导通”。现象是Vds波形在死区时间内出现一个尖峰SR管已经导通但副边电流还没建立。原因通常是比较器阈值太接近零而原边关断瞬间的dV/dt通过寄生电容耦合进了比较器输入引发误触发。解决办法是先提高比较器的消隐时间其次检查PCB布局让比较器输入线远离开关节点。另一个高频问题是“SR关断不一致”。同一个驱动信号测出来每次关断点都有几十ns的抖动。我排查后发现是SR管的Vds信号叠加了较大的开关噪声导致比较器触发边沿抖动。解决措施是在比较器前端加一个RC低通滤波截止频率放到20MHz到50MHz之间既能滤掉一部分噪声又不至于延迟太多。5.2 直通、反向电流、噪声三大坑直通的危害最大轻则发热重则炸管。我在调试过程中炸过一次MOSFET起因是死区寄存器配置好后代码里某次更新占空比时不小心改了Timer B的周期导致原副边相位错位。这件事之后我给自己定了规矩所有HRTIM的寄存器更新必须用一个专门的调试函数包起来里面先关闭输出再更新参数最后再使能。关键参数在运行中要加保护超过阈值直接禁止更新。反向电流在轻载下特别容易踩坑。我遇到过轻载效率开倒车的情况从1A负载降档到0.2A时效率突然下降用电流探头一看SR管导通期间已经出现明显负向电流。排查发现是SR最大导通时间设得太长轻载电流在半个周期内就过零了但SR一直保持导通直到周期结束才关断。修正方法就是前面讲的用比较器过零事件提前关闭SR同时软件限制最大导通时间。噪声问题在采样电路上尤其明显。如果采样电阻离MOSFET太近或者地平面切割不当比较器的翻转点会非常不稳。我的经验是采样信号线尽量短并且用1kΩ串联电阻加100pF电容做滤波同时比较器负端接DAC出来的阈值线也要加同样的滤波。两侧滤波保持一致可以有效抑制共模噪声。5.3 常见问题速查表现象可能原因排查方向轻载效率明显下降SR反向电流缩短SR最大导通时间启用过零关闭原边关断瞬间SR误导通比较器噪声/消隐不足增大Blanking时间加RC滤波满载效率提升不明显死区太大或SR管Rds(on)偏大缩小死区换更低压降MOSFET空载/轻载振荡SR与二极管整流切换频繁使用滞后比较阈值避免临界抖动炸管或过流保护死区太小或寄存器更新错位检查死区寄存器更新参数时先关输出高频振铃PCB寄生电感、驱动回路过长缩短栅极驱动回路增加栅极电阻输出纹波变大SR关断时电流硬切调整比较器阈值让关断点更靠近过零动态加载时SR误动作比较器阈值固定负载冲击用DAC动态调整阈值负载变化时放宽阈值5.4 实测中的一项独门技巧额外分享一个调节方法网上少有人提。我在调试反激SR时会刻意在输出端加一个很小的偏置电流大概50mA左右让电路始终处于CCM边缘。这样电流波形始终不过零也便于观察比较器触发点是否稳定。等所有参数调好之后再把偏置去掉验证DCM情况。这个小技巧能让你在调参时少很多反复尤其是比较器阈值和死区涉及多个参数交互的时候固定边界条件能大幅提高调试效率。6. 一点个人补充关于扩展与量产同步整流做到“能工作”只是第一步真正量产还有很多事要做。我建议在软硬件里留出“强制二极管整流模式”的开关方便产线在不同场景下对比效率。G474的Flash里可以存多套配置参数我在量产固件里预留了几个参数块分别对应CCM反激、DCM反激和待机模式通过简单的模式切换就能适配不同负载条件。这个做法让我在后续维护中少改了很多代码。还有一点关于芯片温度。HRTIM在高分辨率模式下内部DLL对温度和电压有一定敏感度。如果产品工作环境温度跨度很大建议在高低温下分别做一次死区校准。G474有内部温度传感器我习惯在初始化时读取温度根据预先测好的温度-延迟曲线做死区补偿。这一项对追求极致效率的电源产品很有价值。如果你后续想把SR功能做进LLC或者全桥控制复杂度会再上一个台阶但底层的事件驱动思想完全一样先把模拟信号变成事件让HRTIM硬件处理快速动作软件专注缓慢环路和监控。这套方法论在数字电源里可以反复使用值得多花时间把它研究透。根据我个人的经验SR调试最忌讳“一上来就追求极致效率”。先把系统稳定跑起来再一步一坑地压损耗效率曲线会给你最真实的反馈。多准备几个示波器探头多测几组波形效率数字自己会说话。
返回列表