1. STM32同步Buck降压电源设计概述
用STM32做数字电源控制器这事,我前前后后折腾了得有三年时间。从最早的STM32F103到现在的STM32F334,最大的感受就是:用好HRTIM这个外设,才能真正发挥出Cortex-M4在电源控制领域的威力。这次要分享的是一个输入12-32V、输出5-28V可调、最大5.5A电流的同步Buck方案,实测效率最高能到96%,纹波控制在180mVpp以内。
这个方案有几个硬核亮点:首先是采用STM32F334内置的高分辨率定时器(HRTIM),轻松实现200kHz开关频率的精准控制;其次是创新的三环控制结构——电压环用PID,电流环用滑模控制,再配合2零3极点的补偿器设计;最后是保护电路的设计,过流响应时间能做到5微秒级,比传统模拟方案快两个数量级。
2. 硬件设计关键点解析
2.1 功率级器件选型
MOSFET选型是同步Buck的核心,上管我用的CSD18540Q5B,这个NexFET的Qg只有18nC,Rds(on) 8.2mΩ。下管用同型号器件做同步整流,实测续流时的Vds尖峰能压在1.2V以内。驱动芯片选的IR2104S,这个半桥驱动有个很实用的特性——自举电容的充电机制在100%占空比时依然可靠工作。
重要提示:PCB布局时,开关节点(SW)的铜箔面积要尽量小,我的设计是控制在15mm×8mm以内,这样可以有效降低EMI辐射。
电感选用Würth的7443631000,100μH的屏蔽电感,饱和电流10A。这里有个计算公式:
code复制L = (V_in_max - V_out) × D_min / (ΔI_L × f_sw)
其中D_min是最小占空比,ΔI_L一般取输出电流的20%-30%。实际调试时发现,电感温升主要来自磁芯损耗而非铜损,所以磁芯材料的选择比电感量更重要。
2.2 采样电路设计
电流采样用的50mΩ/1%的精密电阻配合INA240电流检测放大器。这个放大器的共模抑制比(CMRR)在200kHz时还能保持80dB,特别适合Buck电路。电压采样用电阻分压后进运放缓冲,注意要在分压电阻上并联100pF电容滤除开关噪声。
ADC配置有个技巧:利用TIM8的TRGO信号触发ADC注入组采样,采样时刻设置在PWM周期的中点。这样既能避开MOSFET开关瞬间的噪声,又能准确捕获电感电流的平均值。相关寄存器配置如下:
c复制hadc1.Init.ExternalTrigInjecConv = ADC_EXTERNALTRIGINJEC_T8_TRGO;
HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected, ADC_INJECTED_RANK_1);
3. 控制算法实现细节
3.1 三环控制架构
这个方案最复杂也最精彩的部分就是控制算法。外层电压环用增量式PID,中间电流环采用滑模控制,内层是PWM生成。PID参数整定有个经验公式:
code复制Kp = (1.2 × L × C) / (T × V_out)
Ki = Kp / (2 × T)
Kd = Kp × 0.5 × T
其中T是控制周期(这里取100μs)。实际调试时发现,负载瞬态响应要重点关注积分项的抗饱和处理。
3.2 2零3极点补偿器
针对LC滤波器的-40dB/dec衰减特性,专门设计了2零3极点补偿器。代码实现上做了Q15格式的定点优化,比浮点运算快3倍:
c复制void Compensator_Update(Compensator* comp, float error) {
comp->state[2] = comp->state[1];
comp->state[1] = comp->state[0];
comp->state[0] = error * comp->b0
+ comp->state[1] * comp->b1
- comp->state[2] * comp->a1;
comp->output = comp->state[0]
+ comp->prev_output * comp->a2;
comp->prev_output = comp->output;
}
这个结构在200kHz开关频率下,实测相位裕度能达到55度以上,比传统Type III补偿器有更好的高频抑制特性。
4. 保护机制与安全设计
4.1 智能过流保护
不同于简单的阈值触发,这个方案实现了带预测的过流保护:
c复制if(IL_avg > IL_MAX && (V_in - V_out) * duty > V_out * 0.3) {
FaultHandler(OCP_FAULT);
}
这个条件同时考虑了平均电流和功率应力,有效避免了误触发。保护响应链路的延迟经过精心优化:
- 比较器硬件检测(<500ns)
- HRTIM的故障输入自动关闭PWM(<1μs)
- 软件中断处理(<3μs)
4.2 输入欠压保护
输入电压监测用到了STM32的COMP1比较器,配合DAC动态调整阈值。当输入电压低于设定值时,会先进入降额模式(线性降低输出电流),如果电压继续跌落则完全关断。这个设计有效避免了电池供电时的深度放电问题。
5. 调试技巧与实测数据
5.1 死区时间优化
HRTIM的死区时间设置是个精细活,我的经验是从80ns开始调试:
code复制DBR = (死区时间 × f_HRTIM) / 2
太小会导致上下管直通,太大又会影响效率。实测在200kHz下,最佳死区时间是120ns,此时效率损失约0.8%。
5.2 纹波抑制技巧
输出纹波主要来自两个方面:开关频率纹波和负载瞬态纹波。对于前者,我在输出电容上并联了100μF的陶瓷电容和10μF的聚合物电容;对于后者,通过调整补偿器的零点频率来优化。实测数据:
- 空载纹波:85mVpp
- 满载纹波:178mVpp
- 负载阶跃响应(1A→5A):恢复时间<200μs
6. 工程文件使用指南
完整的工程包包含:
- 原理图(Altium Designer格式)
- BOM清单(含替代型号)
- 嵌入式代码(IAR工程,含详细注释)
- PSIM仿真模型
- 磁芯损耗计算表
代码架构采用HAL库+裸机调度器,主要模块包括:
- HRTIM配置(200kHz PWM)
- ADC采样(注入组同步触发)
- 补偿器算法(定点Q15优化)
- 状态机管理(运行/保护/校准模式)
在移植到其他STM32型号时,特别注意HRTIM的寄存器配置差异。比如在STM32G474上,死区时间的计算方式就完全不同。
