1. 项目概述
最近完成了一个基于ARM的双向DC-DC电源项目,采用同步BUCK和BOOST电路级联结构,实现了自动升降压功能。这个设计最大的特点是能够根据输入输出电压关系自动切换工作模式,同时通过OLED屏幕实时显示关键参数。作为电力电子领域的老兵,我想分享下这个项目中积累的实战经验。
核心架构上,这个电源本质上是由两个同步整流电路背靠背连接而成。BUCK部分的MOS管Q1/Q2负责降压,BOOST部分的Q3/Q4负责升压。这种拓扑结构的优势在于可以实现双向能量流动,特别适合电池充放电、新能源发电等应用场景。
2. 硬件设计要点
2.1 功率级设计
功率电路采用经典的同步整流架构,关键器件选型如下:
- 功率MOS管:选用Infineon的IPP60R125P7,60V/55A规格,Rds(on)仅12.5mΩ
- 储能电感:使用铁硅铝磁环(型号Kool Mu 77439)手工绕制,电感量22μH
- 输出电容:采用4颗1206封装的100μF/50V X7R陶瓷电容并联
重要提示:两个电路的驱动相位必须严格错开,否则会出现上下管直通现象。实测死区时间需要控制在50ns以上。
2.2 PCB布局技巧
经过多次迭代验证,总结出以下布局经验:
- 功率回路面积最小化:采用Kelvin连接方式,将电流检测电阻直接放在MOS管源极
- 地平面分割:功率地和数字地单点连接,连接点选择在ADC采样点附近
- 驱动走线:使用双绞线处理栅极驱动信号,长度控制在5cm以内
- 散热设计:在MOS管底部放置2oz铜厚的散热焊盘,配合散热器使用
3. 控制算法实现
3.1 模式切换逻辑
采用状态机+滞环比较的切换策略:
c复制typedef enum {
BUCK_MODE,
BOOST_MODE,
BUCK_BOOST_MODE
} ConverterMode;
ConverterMode mode_selection(float vin, float vout) {
static float hysteresis = 0.5f; // 滞环宽度
if(vin > vout + hysteresis) {
return BUCK_MODE;
} else if(vin < vout - hysteresis) {
return BOOST_MODE;
} else {
return BUCK_BOOST_MODE; // 过渡状态
}
}
3.2 改进型PID算法
针对开关电源特性优化的PID控制器:
c复制typedef struct {
float Kp, Ki, Kd;
float Kff2; // 二阶前馈系数
float integral;
float last_measured;
float prev_d_input;
float out_max, out_min;
} PID_TypeDef;
float pid_update(PID_TypeDef *pid, float setpoint, float measured) {
float error = setpoint - measured;
float d_input = measured - pid->last_measured;
// 计算微分项时用测量值变化代替误差变化
float d_term = pid->Kd * (d_input - pid->prev_d_input);
pid->prev_d_input = d_input;
// 前馈项加入二阶导数
float feedforward = pid->Kff2 * (d_input * d_input);
float output = pid->Kp * error + pid->Ki * pid->integral + d_term + feedforward;
// 抗积分饱和
if(output < pid->out_max && output > pid->out_min){
pid->integral += error * pid->Ki;
}
return output;
}
4. 关键外设配置
4.1 HRTIM定时器配置
STM32G474的HRTIM高级定时器配置代码:
c复制void hrtim_config(void) {
// 主定时器配置
hrtim1.Instance->sTimerxRegs[0].CMP1xR = 150; // 占空比初始值
hrtim1.Instance->sTimerxRegs[0].SETx1R = HRTIM_SET1R_SST;
hrtim1.Instance->sTimerxRegs[0].RSTx1R = HRTIM_RST1R_SRT1;
// 互补通道配置
hrtim1.Instance->sTimerxRegs[1].CMP1xR = 150;
hrtim1.Instance->sTimerxRegs[1].SETx1R = HRTIM_SET1R_SST;
hrtim1.Instance->sTimerxRegs[1].RSTx1R = HRTIM_RST1R_SRT1;
// 死区时间配置(单位:ns)
hrtim1.Instance->sTimerxRegs[0].DTxR = (50 << HRTIM_DTR_DTR_Pos);
}
4.2 ADC采样优化
采用64次过采样提高精度:
c复制#define SAMPLES 64
uint32_t adc_oversample(void) {
uint32_t sum = 0;
for(uint8_t i=0; i<SAMPLES; i++){
sum += HAL_ADC_GetValue(&hadc1);
// 插入延时确保采样间隔大于RC时间常数
DWT_Delay(10);
}
return sum >> 4; // 64次平均等效提高2位分辨率
}
5. 常见问题与解决方案
5.1 EMI干扰问题
现象:OLED显示出现乱码
解决方案:
- 改用软件SPI驱动
- 在时钟线上串联33Ω电阻
- 增加数据线滤波电容(22pF)
优化后的SPI写函数:
c复制void SPI_Write(uint8_t data) {
for(int i=0; i<8; i++){
HAL_GPIO_WritePin(SPI_CLK_GPIO_Port, SPI_CLK_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(SPI_MOSI_GPIO_Port, SPI_MOSI_Pin, (data & 0x80) ? GPIO_PIN_SET : GPIO_PIN_RESET);
DWT_Delay(1); // 插入硬件延时
HAL_GPIO_WritePin(SPI_CLK_GPIO_Port, SPI_CLK_Pin, GPIO_PIN_SET);
data <<= 1;
DWT_Delay(1);
}
}
5.2 模式切换振荡
现象:在临界电压点频繁切换模式
解决方法:
- 增加滞环宽度(0.5V)
- 加入切换延时(10ms)
- 在过渡区域采用BUCK-BOOST混合模式
6. 性能测试结果
经过优化后的电源性能指标:
| 参数 | 测试条件 | 结果 |
|---|---|---|
| 效率 | 24V输入,12V/5A输出 | 93.2% |
| 纹波 | 满负载 | <50mVpp |
| 模式切换时间 | 24V↔12V | <100μs |
| 温度上升 | 环境25℃,满载1小时 | ΔT=32℃ |
7. 调试经验分享
- 栅极驱动电阻选型:51Ω时开关波形最干净,过大导致开关损耗增加,过小易引起振荡
- 环路补偿调试:先用波特图仪测量开环特性,再结合实际负载调整补偿参数
- 热设计验证:建议用红外热像仪观察温度分布,重点监控MOS管和电感温升
- 保护电路测试:故意制造短路情况,验证过流保护响应时间(应<2μs)
这个项目前后调了两个月,烧了五六个MOS管才最终稳定。现在系统可以在24V/5A条件下连续工作,模式切换时的电压波动能控制在0.8%以内。对于想尝试数字电源开发的同行,建议先从单相BUCK电路入手,逐步扩展到更复杂的拓扑结构。
