基于 STM32F103C8T6 的同步整流 BUCK 降压电源,输出电压 10V 可调,带电压/电流双采样、增量式 PI 闭环、过压过流保护与继电器切断。这个同学主要拿来验证 BUCK 拓扑和高端电流采样方案,硬件原理图 + 软件源码交付。

一、需求与指标

客户给的设计要求很清晰:

  1. 主控:STM32F103C8T6
  2. 拓扑:BUCK 变换器,同步整流
  3. 闭环:增量式 PI 追踪输出电压,按键步进调节目标电压
  4. 采样:输出电压 + 电感电流双通道采样
  5. 频率:PWM 开关频率 20kHz,电流采样频率 50kHz
  6. 保护:输出过压(13V)、过流(3A)时继电器切断
  7. 交互:OLED 显示、4 个按键、串口输出电流波形

整体原理图

二、硬件方案

2.1 供电与主控

  • 输入采用 DC005-2.5 座子,额定 12V 输入
  • 经 LM2596S-5.0 先降到 5V,给 MOSFET 驱动、继电器、运放等供电
  • 主控板为 STM32F103C8T6(原理图标注为 STM32F401RCT6,实际代码基于 F103 标准库)

2.2 同步整流 BUCK 主电路

功率级采用 IRF3205PBF 大电流 N-MOS,上下管互补驱动,电感 1mH,输出电容 220uF×2 + 100nF。同步整流相比二极管续流,低压大电流时效率更高、发热更低。

驱动芯片选用 IR2104S,半桥驱动器,带自举电容和死区控制。MCU 通过 PA8 输出 PWM 到 IR2104S 的 IN 脚,IR2104S 输出 HO/LO 分别驱动上、下管。

BUCK主电路

2.3 高端电流采样

电感电流采用 INA282AIDR 电流检测放大器做高端采样,采样电阻 10mΩ,差分放大后送 MCU 的 ADC。INA282 固定增益 50V/V,共模范围宽,适合 BUCK 高侧电流检测。

输出电压则通过电阻分压 + 运放缓冲后送 ADC。

采样电路

2.4 控制与保护

  • 按键:ADD / REDUCE / SET / MODE(CHOICE),对应 PB12~PB15
  • 继电器:过压/过流时切断主回路,由 PA 口控制
  • 串口:板载 CH340C,用于输出电流波形,波特率 921600
  • OLED:IIC 接口,用于显示电压、电流、目标值

控制保护

三、软件设计

3.1 定时器与 PWM

TIM1 产生 20kHz PWM,ARR=3599,PSC=0,对应 72MHz / 3600 = 20kHz。PWM 输出到 PA8,带更新中断,每 20 个周期(即 1ms)执行一次 PID 运算。

#define BUCK_ARR 3599
#define BUCK_PSC 0
TIM_TimeBaseInitStruct.TIM_Period = BUCK_ARR;
TIM_TimeBaseInitStruct.TIM_Prescaler = BUCK_PSC;

3.2 ADC 与 DMA

ADC1 双通道循环采样,通道 0(PA0)采集输出电压,通道 1(PA1)采集电感电流,DMA 搬运到数组 ADC_ConvertedValue[2],不占用 CPU。

ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5);

3.3 增量式 PI 闭环

PID 采用位置累加 + 增量输出结构,每 1ms 调节一次 PWM 占空比:

float buck_pid(float NOW, float Target, float SIGNLE_ADD_NUM_LIMIT,
float SUM_OUTPUT_NUM_LIMIT, float kp, float ki)
{
pid1.Pv = NOW;
pid1.Ek = Target - pid1.Pv;
pid1.Pout = kp * (pid1.Ek - pid1.Ek_1);
pid1.Iout = ki * pid1.Ek * pid1.T / pid1.Ti;
pid1.OUT_Single = pid1.Pout + pid1.Iout;
// 限幅
if(pid1.OUT_Single > SIGNLE_ADD_NUM_LIMIT) pid1.OUT_Single = SIGNLE_ADD_NUM_LIMIT;
else if(pid1.OUT_Single < -SIGNLE_ADD_NUM_LIMIT) pid1.OUT_Single = -SIGNLE_ADD_NUM_LIMIT;
OUT += pid1.OUT_Single;
if(OUT > SUM_OUTPUT_NUM_LIMIT) OUT = SUM_OUTPUT_NUM_LIMIT;
else if(OUT < 0) OUT = 0;
pid1.Ek_2 = pid1.Ek_1;
pid1.Ek_1 = pid1.Ek;
return OUT;
}

主循环中,按下启动键后使能 PID,目标电压 Target_V 默认 10V,ADD/REDUCE 键以 0.1V 步进调节。

3.4 保护逻辑

当输出电压超过 13V 或电流超过 3A 时,立即关闭 PWM、断开继电器,并回到待机状态,需重新按键启动。

if((DC_V > V_yuzhi) || (DC_I > I_yuzhi))
{
SW_OFF;
SD_OFF;
protect_status = 1;
sw_status = 0;
pid_mode = 0;
goto loop;
}

四、调试要点

  1. 死区时间:IR2104S 配置死区约 40ns,避免上下管直通
  2. 采样同步:电流采样频率 50kHz 高于 PWM 20kHz,可在 PWM 周期内多次采样取平均
  3. PID 参数:本项目 kp=0.01, ki=1,输出限幅 0~3599,响应平稳无明显超调
  4. 自举电容:IR2104S 的 C49(2.2uF)要给足,否则上管驱动不足

五、交付资料

  • 完整 Keil 工程源码(STM32F103C8T6 标准库)
  • 原理图 PDF
  • 测试视频
  • 元器件 BOM

有类似 BUCK / BOOST / 双向 DCDC 电源定制需求的,可以评论区留言或点侧边栏“资料获取”进群交流。

通过网盘分享的文件:嵌入式-基于STM32的BUCK电路电感电流闭环控制
链接: https://pan.baidu.com/s/1PtGq_FF8J55bXXR6dZ3Nzw?pwd=ujcn 提取码: ujcn