1. 项目概述:基于STM32F103的数控Buck电源设计
去年在调试一个嵌入式项目时,经常需要不同电压等级的直流电源。市面上的可调电源要么价格昂贵,要么调节精度不够,于是萌生了自己设计一款数控Buck电源的想法。经过两个月的方案验证和参数调优,最终实现的这款电源效率达到96%,支持0-30V连续可调,最大输出电流5A,整套成本控制在50元以内。
这个设计的核心亮点在于:
- 采用同步整流技术,相比传统二极管方案效率提升显著
- 全数字化控制,通过STM32的PWM和ADC实现闭环调节
- 增量式PI算法实现快速动态响应
- 支持软件灵活调节输出电压
2. 硬件设计详解
2.1 功率级设计
主电路采用经典的Buck拓扑,但创新性地使用了同步整流技术。上管选用NRF540N(Vds=100V,Rds(on)=44mΩ),下管同样使用NRF540N而非传统的肖特基二极管。实测对比发现:
- 传统方案在5A输出时效率约89%
- 同步整流方案在同等条件下效率达到96%
关键细节:MOSFET的栅极驱动电压需要高于Vgs(th)至少2V以上,本设计采用10V驱动电压确保完全导通
电感选型计算公式:
code复制L = (Vin - Vout) × Vout / (Vin × ΔI × fsw)
其中:
- Vin=24V(最大输入)
- Vout=12V(典型输出)
- ΔI=0.5A(纹波电流)
- fsw=50kHz(开关频率)
计算得L≈47μH,实际选用50μH/5A的屏蔽电感,实测温升不超过30℃。
2.2 驱动电路设计
采用IR2104半桥驱动芯片,其典型特性:
- 最大驱动电流:210mA
- 传播延迟:520ns
- 工作电压:10-20V
自举电路设计要点:
- 自举电容Cboot=0.1μF陶瓷电容(X7R材质)
- 并联10Ω电阻用于抑制高频振荡
- 二极管选用1N4148(trr=4ns)
实测驱动波形:
- 上升时间:18ns
- 下降时间:15ns
- 死区时间:875ns(TIM1_BDTR配置为0x3F)
2.3 采样电路设计
电压采样:
- 分压电阻比例:100kΩ/10kΩ
- 滤波电容:100nF
- ADC输入阻抗:50kΩ(需考虑分压网络影响)
电流采样:
- 采样电阻:0.01Ω锰铜丝(5W功率)
- 运放电路:LM385构成100倍差分放大
- 带宽限制:RC滤波(1kΩ+100nF)
ADC配置技巧:
c复制void ADC1_Init(void) {
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);
ADC_Cmd(ADC1, ENABLE);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
注意:采样周期设置为239.5个时钟周期(约3.3μs),与PWM周期20μs形成非整数倍关系,可有效避免周期干扰。
3. 软件实现与算法
3.1 PWM生成配置
TIM1配置为中央对齐模式,关键参数:
c复制void PWM_Init(uint16_t arr, uint16_t psc) {
TIM_TimeBaseInitTypeDef tb;
tb.TIM_Period = arr; // 自动重装载值
tb.TIM_Prescaler = psc; // 预分频
tb.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
TIM_TimeBaseInit(TIM1, &tb);
TIM_OCInitTypeDef oc;
oc.TIM_OCMode = TIM_OCMode_PWM1;
oc.TIM_OutputState = ENABLE;
oc.TIM_Pulse = arr/2; // 初始占空比50%
TIM_OC1Init(TIM1, &oc); // 通道1
TIM_OC2Init(TIM1, &oc); // 通道2(互补输出)
TIM_BDTRInitTypeDef bdtr;
bdtr.TIM_DeadTime = 0x3F; // 死区时间=63*1/72MHz≈875ns
TIM_BDTRConfig(TIM1, &bdtr);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
TIM_Cmd(TIM1, ENABLE);
}
3.2 增量式PI算法实现
相比传统位置式PI,增量式算法具有:
- 无积分饱和问题
- 实现简单,计算量小
- 易于加入输出限幅
代码实现:
c复制typedef struct {
float Kp;
float Ki;
float Err[2]; // 保存当前和前一次误差
} PI_Controller;
float PI_Calculate(PI_Controller *pi, float target, float actual) {
float err = target - actual;
float delta = pi->Kp*(err - pi->Err[0]) + pi->Ki*err;
pi->Err[0] = pi->Err[1];
pi->Err[1] = err;
return delta;
}
参数整定步骤:
- 先将Ki设为0,逐渐增大Kp直到系统出现临界振荡
- 记录此时的Kp_critical,取Kp=Kp_critical/2
- 取Ki=Kp/10
- 微调直到响应速度与超调量达到平衡
实测参数:
- 电压环:Kp=0.5,Ki=0.05
- 电流环:Kp=0.8,Ki=0.1
3.3 保护功能实现
关键保护机制:
- 过流保护(硬件+软件):
- 硬件比较器快速关断
- 软件ADC检测做二次保护
- 过温保护:
c复制if(Read_Temp() > 85.0) { PWM_Disable(); LED_Alert(); } - 软启动功能:
c复制void Soft_Start(float target_voltage) { float step = target_voltage / 100; for(int i=0; i<100; i++) { Set_Voltage(i * step); Delay_ms(10); } }
4. 实测性能与优化技巧
4.1 效率测试数据
| 输出电流(A) | 输入功率(W) | 输出功率(W) | 效率(%) |
|---|---|---|---|
| 1.0 | 12.5 | 12.0 | 96.0 |
| 2.0 | 25.1 | 24.0 | 95.6 |
| 3.0 | 37.8 | 36.0 | 95.2 |
| 4.0 | 50.5 | 48.0 | 95.0 |
| 5.0 | 63.3 | 60.0 | 94.8 |
4.2 纹波与动态响应
测试条件:Vin=24V, Vout=12V, Iout=0-5A阶跃变化
- 输出电压波动:<50mV
- 恢复时间:<2ms
- 稳态纹波:<30mVpp
优化技巧:
-
PCB布局要点:
- 功率地(PGND)与信号地(AGND)单点连接
- 开关回路面积最小化
- 驱动走线尽量短(<3cm)
-
软件滤波算法:
c复制#define FILTER_DEPTH 8 float Moving_Average(float new_val) { static float buf[FILTER_DEPTH]; static int index = 0; buf[index] = new_val; index = (index + 1) % FILTER_DEPTH; float sum = 0; for(int i=0; i<FILTER_DEPTH; i++) { sum += buf[i]; } return sum / FILTER_DEPTH; }
5. 常见问题与解决方案
5.1 MOSFET发热严重
可能原因及对策:
- 驱动不足:
- 检查自举电容是否失效
- 测量栅极波形是否达到预期幅度
- 死区时间不当:
- 用示波器观察上下管Vgs波形
- 调整TIM1_BDTR寄存器值
- 同步整流时序:
- 确保下管在体二极管导通前打开
5.2 ADC采样异常
典型现象及处理:
- 采样值跳动大:
- 检查模拟地是否干净
- 添加软件滤波(如上述移动平均)
- 采样值偏移:
- 校准ADC零点和增益
- 检查参考电压稳定性
c复制void ADC_Calibrate(void) { ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); }
5.3 系统振荡问题
调试步骤:
- 先用开环控制验证硬件
- 逐步增加P参数观察响应
- 加入I参数要谨慎
- 必要时加入微分项:
c复制// 简易PID实现 float err = target - actual; float delta = Kp*err + Ki*err_sum + Kd*(err - last_err); last_err = err; err_sum += err;
这套系统从最初构想到现在稳定运行,经历了至少10次PCB改版和无数次的参数调整。最大的收获是认识到电力电子设计中"细节决定成败"的真谛——一个0.1μF的电容摆放位置、一段5mm的走线长度,都可能对最终性能产生显著影响。
