1. 项目概述
最近用STM32F103搞了个数控Buck电源,实测效率干到96%,能通过程序直接调电压。这玩意做出来是真的爽,比市面上那些成品电源灵活多了,关键成本还低,整套系统不到50块钱。咱们不整虚的,直接拆开看门道。
这个数控Buck电源采用同步整流方案,主控是STM32F103,驱动用IR2104芯片,MOS管选了NRF540N,采样电路用LM385运放放大反馈信号。软件部分实现了增量式PI闭环控制,可以实现恒压输出,还能通过程序直接调节输出电压。原理图和PCB用立创EDA绘制,软件用Keil5开发。
2. 硬件设计详解
2.1 主电路设计
主电路采用同步整流Buck拓扑,相比传统二极管方案效率更高。MOS管选用NRF540N,这货的Rds(on)只有44mΩ,实测开关损耗比普通二极管方案低30%不止。
同步整流的关键在于上下管的时序控制,必须确保不会出现直通现象。这里用了互补PWM输出配合死区时间控制,后面软件部分会详细说明。
2.2 驱动电路设计
驱动部分用IR2104搭的半桥驱动,这里有个骚操作——自举电容用了0.1μF陶瓷电容并联10Ω电阻。这个组合能有效抑制高频振荡,实测驱动波形上升沿控制在20ns以内。
IR2104的典型传播延迟是520ns,我们在软件中设置了63个时钟周期(按72MHz算约0.875us)的死区时间,实测上下管没有直通现象。
2.3 采样电路设计
采样电路是重点,电流采样用0.01Ω锰铜丝配合LM385运放搞了100倍放大。电压采样则直接用电阻分压后送入ADC。
这里有个坑要注意:采样电路的布局要尽量靠近MOS管,走线要短,避免引入噪声。特别是电流采样,最好用四线制接法消除引线电阻影响。
3. 软件实现
3.1 PWM生成
PWM生成是关键操作,使用TIM1通道1和2配置互补输出:
c复制void PWM_Init(uint16_t arr, uint16_t psc) {
TIM_OCInitTypeDef oc;
TIM_OCStructInit(&oc);
oc.TIM_OCMode = TIM_OCMode_PWM1;
oc.TIM_OutputState = ENABLE;
oc.TIM_Pulse = arr/2; // 50%占空比初始化
TIM_OC1Init(TIM1, &oc);
TIM_OC2Init(TIM1, &oc);
TIM_BDTRInitTypeDef bdtr;
bdtr.TIM_DeadTime = 0x3F; // 死区时间=1us
TIM_BDTRConfig(TIM1, &bdtr);
}
重点在死区时间设置,必须根据驱动芯片的传播延迟和MOS管的开关特性来调整。
3.2 ADC采样
ADC部分代码如下:
c复制// 电流采样ADC初始化
void ADC1_Init(void) {
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);
ADC_Cmd(ADC1, ENABLE);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
// 实际电流计算
float Get_Current(void) {
uint16_t adc_val = ADC_GetConversionValue(ADC1);
return (adc_val * 3.3 / 4096) * 100; // 运放放大100倍
}
这里有个坑:STM32的ADC采样速率要和开关频率匹配。我们Buck电路用50kHz开关频率,ADC采样周期设成239.5个时钟周期刚好避开PWM干扰。
3.3 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;
}
实测这个算法在1ms中断周期下,电压调整时间<50ms。调参秘诀:先用Ki=0调Kp到临界震荡,然后取Kp的1/2,Ki取Kp的1/10。
4. 调压功能实现
调压功能简单到离谱,主程序里直接改目标电压值就行:
c复制Voltage_Target = 12.0; // 要多少伏直接赋值
当然实际要加个软启动,避免电压突变。通过USART或ADC按键都能实现远程调压,这玩法比传统电位器调节不知道高到哪里去了。
5. 实测性能
最后说下稳压效果:
- 空载到满载(0-5A)电压波动<0.05V
- 纹波控制在30mVpp以内
- 效率最高达到96%
- 整套系统成本不到50块钱
6. 注意事项
- 布局时功率回路要尽量小,减少寄生电感
- 自举电容要选用低ESR的陶瓷电容
- ADC采样时机要避开PWM开关时刻
- 死区时间必须根据实际器件参数调整
- PI参数需要根据实际负载特性调整
7. 常见问题
Q: 为什么我的电源效率达不到这么高?
A: 可能是MOS管选择不当或驱动不足,检查Rds(on)和驱动波形。
Q: 输出电压震荡怎么办?
A: 可能是PI参数不合适,先用Ki=0调Kp到临界震荡,然后取Kp的1/2,Ki取Kp的1/10。
Q: 上下管直通烧MOS管怎么解决?
A: 增加死区时间,确保上下管不会同时导通。
8. 改进方向
- 增加恒流模式
- 加入过温保护
- 实现数字通信接口远程控制
- 加入LCD显示实时参数
- 优化PCB布局进一步提升效率
这个数控Buck电源项目就分享到这里,代码已经扔Github,原理图在立创开源平台,欢迎来抄作业!实际做的时候遇到什么问题,欢迎交流讨论。