1. 项目概述
这个基于STM32F334C8T6的四开关Buck-Boost双向DC-DC电源项目,堪称电源设计领域的"瑞士军刀"。它能根据输入输出电压关系自动切换Buck、Boost和Buck-Boost三种工作模式,实现28-32V输入范围内的稳定输出。作为一名电源工程师,我特别欣赏这个设计将硬件保护机制与软件控制逻辑的完美结合,实测输出电压波动控制在200mV以内,性能堪比商业模块。
项目最亮眼的是其完整的开源性——从PSIM仿真模型到Mathcad参数计算书,从硬件设计报告到三套工作模式源码,甚至连HRTIM高分辨率定时器的配置细节都毫无保留地公开。这种级别的资料完整度,在开源电源项目中实属罕见。
2. 硬件架构解析
2.1 主电路拓扑设计
四开关Buck-Boost拓扑采用H桥结构,由Q1-Q4四个MOS管构成。与传统的二开关Buck-Boost相比,这种拓扑有三个显著优势:
- 能量可以双向流动,适合电池充放电应用
- 所有开关管承受的电压应力仅为输入或输出电压(而非两者之和)
- 通过PWM调制可以实现无缝模式切换
主电路参数设计要点:
- 开关频率:200kHz(由HRTIM的PERxR寄存器设定)
- 电感选择:47μH/20A的屏蔽电感,考虑饱和电流需大于峰值电流的1.3倍
- 输出电容:采用多个1210封装的X7R陶瓷电容并联,总容值220μF
关键提示:布局时陶瓷电容必须紧贴MOS管放置,引线长度不超过5mm,否则高频下的ESR优势将大打折扣。
2.2 关键保护电路
保护电路采用三级联动机制:
- 硬件级:比较器(COMP)直接触发PWM刹车
- 固件级:ADC采样配合软件保护算法
- 物理级:保险丝和TVS二极管
过流保护的具体实现:
c复制// 电流保护阈值计算(基于0.01Ω采样电阻)
#define CURRENT_THRESHOLD (int)(30.0 / (0.01 * 3.3 / 4096))
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
if(hadc->Instance == ADC1) {
uint16_t adc_val = HAL_ADC_GetValue(hadc);
if(adc_val > CURRENT_THRESHOLD) {
HAL_HRTIM_WaveformOutputStop(&hhrtim1, HRTIM_OUTPUT_TA1 | HRTIM_OUTPUT_TB1);
Error_Handler();
}
}
}
实测响应时间仅1.8μs,比常规的中断处理方式快5倍以上。
3. 控制算法实现
3.1 工作模式自动切换
模式切换采用滞回比较算法,关键代码如下:
c复制#define BUCK_THRESHOLD 2.0f // 进入Buck模式的电压差阈值
#define BOOST_THRESHOLD 2.0f // 进入Boost模式的电压差阈值
void DetermineOperationMode(float Vin, float Vout) {
static uint8_t current_mode = MODE_BUCKBOOST;
float delta = Vin - Vout;
if(delta > BUCK_THRESHOLD && current_mode != MODE_BUCK) {
EnterBuckMode();
current_mode = MODE_BUCK;
}
else if(delta < -BOOST_THRESHOLD && current_mode != MODE_BOOST) {
EnterBoostMode();
current_mode = MODE_BOOST;
}
else if(fabs(delta) <= 1.0f && current_mode != MODE_BUCKBOOST) {
EnterBuckBoostMode();
current_mode = MODE_BUCKBOOST;
}
}
2V的滞回区间经过Matlab仿真优化,能有效避免输入电压临界波动导致的模式震荡。
3.2 数字PI控制器设计
电压环PI参数通过Mathcad计算得出:
code复制Kp = 0.15
Ki = 0.02
对应的离散化实现:
c复制typedef struct {
float Kp;
float Ki;
float integral;
float max_output;
} PIController;
float PI_Update(PIController* pi, float error) {
pi->integral += pi->Ki * error;
// 抗积分饱和
if(pi->integral > pi->max_output)
pi->integral = pi->max_output;
else if(pi->integral < -pi->max_output)
pi->integral = -pi->max_output;
return pi->Kp * error + pi->integral;
}
采样周期设置为100μs(10kHz),与PWM周期同步。
4. 关键外设配置
4.1 HRTIM高分辨率定时器
STM32F334的HRTIM是电源控制的利器,主要配置参数:
c复制hhrtim1.Instance = HRTIM1;
hhrtim1.Init.HalfModeEnable = HRTIM_HALFMODE_DISABLED;
hhrtim1.Init.RepetitionCounter = 0;
hhrtim1.Init.InterruptRequests = HRTIM_IT_NONE;
HAL_HRTIM_Init(&hhrtim1);
// Timer A配置
sTimerConfig.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
sTimerConfig.Mode = HRTIM_MODE_CONTINUOUS;
sTimerConfig.Period = 1000; // 对应200kHz开关频率
sTimerConfig.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;
HAL_HRTIM_TimeBaseConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, &sTimerConfig);
// 死区时间配置(100ns)
HAL_HRTIM_DeadTimeConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A,
HRTIM_DEADTIME_RISING_100NS,
HRTIM_DEADTIME_FALLING_100NS,
HRTIM_DEADTIME_RISINGLOCK_NONE,
HRTIM_DEADTIME_FALLINGLOCK_NONE);
4.2 ADC采样优化
电压电流采样采用双重采样技术:
- 硬件滤波:RC低通(截止频率10kHz)
- 软件滤波:移动平均(窗口大小8)
ADC配置关键点:
c复制hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = ENABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIG_HRTIM_TRG1;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 4;
hadc1.Init.DMAContinuousRequests = ENABLE;
HAL_ADC_Init(&hadc1);
采样时间计算考虑了温度漂移:
code复制实际采样时间 = (12.5 + 采样周期) × (1 ± 0.5%) × 时钟周期
5. 实测性能与优化建议
5.1 效率测试数据
| 工作模式 | 输入电压(V) | 负载电流(A) | 效率(%) |
|---|---|---|---|
| Buck | 32 | 5 | 94.2 |
| Boost | 28 | 5 | 92.8 |
| BuckBoost | 30 | 5 | 90.1 |
5.2 常见问题排查
-
模式切换震荡
- 检查滞回比较阈值是否合适
- 确认ADC采样是否同步
- 验证PI参数是否与计算书一致
-
输出电压纹波大
- 测量电容ESR(应<5mΩ)
- 检查电感是否饱和
- 确认PWM死区时间设置
-
保护误触发
- 校准电流采样电阻
- 调整比较器迟滞窗口
- 检查地线布局
5.3 进阶优化方向
- 增加自适应PID算法,根据负载变化自动调整参数
- 实现CAN总线通信进行远程监控
- 添加温度补偿功能,优化高温下的效率
- 开发图形化配置工具,简化参数调整
这个项目最值得借鉴的是其系统工程思维——从Mathcad理论计算到PSIM仿真验证,从硬件参数优化到软件保护策略,每个环节都经过精心设计。特别是将HRTIM与ADC联动的方式,为高动态响应电源设计提供了范本。