1. 项目概述与核心设计思路
最近用STM32F103搞的这个数控Buck电源,实测效率干到了96%,完全通过程序调节输出电压,这玩意的实用性和可玩性远超传统电源方案。作为一个经常折腾电源的硬件工程师,这次的设计让我深刻体会到数字控制的魅力——不用再折腾电位器,一个赋值语句就能精确控制输出电压。
这个项目的核心是一个同步整流的Buck电路,主控采用STM32F103C8T6,驱动部分用IR2104搭建半桥,MOS管选用NRF540N这对低导通电阻的管子。整个系统最精彩的部分在于软件实现的增量式PI闭环控制,使得电压调整响应时间小于50ms,空载到满载的电压波动控制在0.05V以内。
2. 硬件设计详解
2.1 功率级设计
功率部分采用经典的Buck拓扑,但与传统方案不同,我们使用了同步整流技术。上管和下管都采用NRF540N MOSFET,这货的Rds(on)只有44mΩ,比普通肖特基二极管(正向压降约0.3V)的导通损耗低得多。在5A输出时,同步整流的导通损耗仅为:
code复制P_loss = I² × Rds(on) = 5² × 0.044 = 1.1W
而二极管方案在同等电流下的损耗为:
code复制P_loss = I × Vf = 5 × 0.3 = 1.5W
实测效率提升约3%,这在电源设计中已经是非常可观的进步。
2.2 驱动电路设计
驱动芯片选用IR2104,这是一款经典的高低压侧驱动器。设计中有一个关键细节:自举电容采用0.1μF陶瓷电容并联10Ω电阻。这个组合的作用是:
- 陶瓷电容提供快速充放电路径,确保高频开关时的驱动电压稳定
- 并联电阻用于释放自举电容的残余电荷,防止电荷积累导致驱动异常
实测驱动波形上升沿控制在20ns以内,下图为实测波形:
code复制[图示:驱动波形测量图]
上升时间:18.7ns
下降时间:22.3ns
2.3 采样电路设计
电流采样使用0.01Ω锰铜丝,配合LM385运放构成100倍放大电路。这个设计有几个要点:
- 锰铜丝的位置要放在低侧,避免共模电压问题
- 运放供电要干净,最好单独用LDO供电
- PCB布局时,采样走线要尽量短,避免引入噪声
电压采样则直接通过电阻分压,分压比根据ADC量程计算。例如需要测量0-24V输出:
code复制V_adc = V_out × (R2/(R1+R2)) ≤ 3.3V
取R1=100k, R2=15k, 则满量程时:
V_adc = 24 × (15/(100+15)) ≈ 3.13V
3. 软件实现与闭环控制
3.1 PWM生成配置
TIM1配置为中央对齐模式PWM,关键参数计算:
- 开关频率:50kHz
- 时钟频率:72MHz
- 预分频值(PSC):0(不分频)
- 自动重载值(ARR) = 时钟频率/(开关频率×2) - 1 = 719
死区时间设置至关重要,IR2104的典型传播延迟是520ns,我们设置为63个时钟周期:
code复制死区时间 = 63 × (1/72MHz) ≈ 0.875us
这个值既能防止上下管直通,又不会过多增加开关损耗。
3.2 ADC采样策略
ADC配置有几个关键点:
- 采样周期设置为239.5个时钟周期,这样总转换时间约为:
code复制T_conv = (239.5 + 12.5) × (1/12MHz) ≈ 21us
- 采样时机要避开PWM切换时刻,通常设置在PWM周期中间
- 使用DMA传输采样结果,减少CPU开销
电流采样值的计算:
c复制float Get_Current(void) {
uint16_t adc_val = ADC_GetConversionValue(ADC1);
return (adc_val * 3.3 / 4096) / 0.01 / 100;
// 0.01Ω采样电阻,100倍放大
}
3.3 增量式PI算法实现
增量式PI相比位置式的优势:
- 不会产生积分饱和
- 更易实现无扰动切换
- 代码实现简单,适合单片机
算法结构体定义:
c复制typedef struct {
float Kp;
float Ki;
float Err[2]; // 保存当前和前一次误差
} PI_Controller;
算法实现:
c复制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
- 微调直到获得理想响应
4. 实测性能与优化技巧
4.1 效率测试数据
在不同负载条件下的效率测试结果:
| 输出电流(A) | 输入电压(V) | 输出电压(V) | 效率(%) |
|---|---|---|---|
| 0.5 | 24 | 12 | 94.2 |
| 1.0 | 24 | 12 | 95.1 |
| 2.0 | 24 | 12 | 95.8 |
| 3.0 | 24 | 12 | 96.0 |
| 4.0 | 24 | 12 | 95.7 |
| 5.0 | 24 | 12 | 95.3 |
4.2 动态响应测试
负载阶跃变化时的输出电压响应:
- 从1A突加到5A,电压跌落约0.04V
- 恢复时间约30ms
- 纹波电压<30mVpp
4.3 常见问题与解决
-
ADC采样值跳动大
- 检查运放供电是否干净
- 在采样点加0.1μF陶瓷电容
- 软件上采用多次采样取平均
-
MOS管发热严重
- 检查驱动波形是否完整
- 确认死区时间设置合理
- 检查PCB布局,功率回路是否尽量短
-
闭环振荡
- 降低P增益
- 检查采样延迟是否过大
- 确认PWM频率与采样频率的配合
5. 进阶改进方向
-
加入恒流模式
- 在PI控制器中增加电流环
- 设置电流限制功能
-
实现数字通信接口
- 添加USB或蓝牙模块
- 开发上位机控制软件
-
多级滤波优化
- 增加LC滤波级数
- 尝试有源滤波方案
-
温度保护功能
- 添加NTC测温
- 实现过热降额功能
这个项目的魅力在于它的可扩展性,你可以基于这个框架不断添加新功能。我已经把完整代码和原理图开源,建议先从基本功能入手,等跑通后再逐步添加高级功能。电源设计最忌讳的就是一开始就想把所有功能都做进去,结果哪个都没调好。
