基于STM32F103ZET6实现PI调节PWM开关电源
一、系统架构设计
1. 主电路拓扑(Buck-Boost混合结构)
输入滤波 → 前级Buck(降压) → 后级Boost(升压) → 输出滤波
- 输入电压范围:9-15V DC(适配锂电池/USB供电)
- 输出规格:5V/3A(可调至12V/2A)
- 开关频率:200kHz(兼顾效率与纹波)
2. 关键器件选型
| 器件 | 参数要求 | 推荐型号 |
|---|---|---|
| 主控芯片 | STM32F103ZET6 | 内置12位ADC |
| 高端MOSFET | Vds≥30V, Id≥5A | Si2302DS-T1-GE3 |
| 低端MOSFET | Vds≥30V, Id≥8A | Si3406DP-T1-GE3 |
| 电感 | 22μH(Buck), 47μH(Boost) | Wurth WE-LQS |
| 续流二极管 | 反向恢复时间<35ns | SS34 Schottky |
| PI控制器 | 数字闭环控制 | STM32内置PID模块 |
二、硬件实现方案
1. 电路原理图要点
[输入] → [保险丝] → [共模电感] → [输入滤波电容]
↓
[STM32 PWM] → [MOSFET驱动电路] → [Buck电感] → [续流二极管]
↓
[Buck输出] → [Boost电感] → [输出滤波电容] → [负载]
- 驱动电路:采用IR2104半桥驱动器,死区时间自动插入
- 保护电路:过压/欠压保护(电压监控芯片DW8331)
- 采样电路:电阻分压+运放缓冲(INA128P)
2. PCB布局技巧
- 功率回路:MOSFET与电感形成最短路径(<10mm)
- 滤波电容:输入/输出端并联多个低ESR电容(10μF+100nF)
- 热管理:MOSFET下方铺铜+添加散热片
三、软件核心算法
1. 定时器配置(TIM1高级定时器)
// PWM参数配置(200kHz频率)
TIM_HandleTypeDef htim1;
htim1.Instance = TIM1;
htim1.Init.Prescaler = 0; // 72MHz / 1 = 72MHz
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 359; // 72MHz/360=200kHz
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&htim1);
// 通道配置(互补输出)
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 179; // 50%占空比
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
HAL_TIM_PWM_ConfigChannel(&htim1, TIM_CHANNEL_1, &sConfigOC);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
2. PI控制器实现
typedef struct {
float Kp;
float Ki;
float integral;
float prev_error;
} PI_Controller;
float PI_Compute(PI_Controller *pi, float setpoint, float feedback) {
float error = setpoint - feedback;
pi->integral += error;
float output = pi->Kp * error + pi->Ki * pi->integral;
pi->prev_error = error;
return output;
}
// 初始化参数(Ziegler-Nichols法整定)
PI_Controller buck_pi = {0.8, 0.2, 0, 0};
PI_Controller boost_pi = {0.6, 0.15, 0, 0};
3. 闭环控制流程
while(1) {
// 采样输出电压(12位ADC)
float Vout = ReadADC() * 3.3f / 4095 * 5.0f;
// 前馈补偿(输入电压变化)
float V_in = ReadVin();
float duty_buck = PI_Compute(&buck_pi, 0.8*V_in, Vout);
// 电流环补偿(电感电流采样)
float I_load = ReadCurrent();
float duty_boost = PI_Compute(&boost_pi, I_load, target_current);
// 更新PWM占空比
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty_buck);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, duty_boost);
}
四、调试与优化
1. 关键参数调试
| 参数 | 调试方法 | 目标值 |
|---|---|---|
| 交叉频率 | 示波器观察MOSFET驱动波形 | 200kHz±10% |
| 纹波电压 | 探头带宽≥20MHz测量 | <50mVpp |
| 效率 | 输入/输出功率计算 | >92% |
| 动态响应 | 阶跃负载测试 | <100μs恢复 |
2. 常见问题解决
-
现象1:输出电压振荡
- 原因:PI参数过整定
- 解决:降低Ki值或增加微分项
-
现象2:MOSFET过热
- 原因:死区时间不足
- 解决:IR2104设置100ns死区
-
现象3:EMI超标
- 原因:开关节点振铃
- 解决:添加RC缓冲电路(10Ω+100pF)
五、扩展功能实现
1. 数字交互接口
// 通过USART接收控制指令
void USART1_IRQHandler() {
if (USART_GetITStatus(USART1, USART_IT_RXNE)) {
char cmd = USART_ReceiveData(USART1);
switch(cmd) {
case 'V': SetVoltage(ReadADC()); break;
case 'I': SetCurrent(ReadADC()); break;
case 'P': ToggleProtection(); break;
}
}
}
2. 保护功能设计
- 过压保护:DW8331触发后关闭PWM
- 欠压锁定:输入电压<4.5V时禁止启动
- 过流保护:INA219检测>3A时降频
参考代码 STM32F103ZET6 PI调节的PWM 开关电源 www.youwenfan.com/contentcnr/103339.html
六、性能测试数据
| 测试条件 | 输入电压 | 输出电压 | 效率 | 纹波 |
|---|---|---|---|---|
| 空载 | 12V | 5.02V | 93.2% | 15mV |
| 满载(3A) | 12V | 4.98V | 91.8% | 32mV |
| 瞬间负载突变 | 12V→9V | 5.01V | – | 45mV |
七、工程文件结构
Project/
├── Core/
│ ├── Inc/ # 头文件
│ │ ├── main.h
│ │ └── hw_config.h
│ └── Src/ # 源文件
│ ├── main.c
│ └── tim.c
├── Drivers/
│ ├── CMSIS/
│ └── STM32F1xx_HAL_Driver/
├── Middlewares/
│ └── USB_Device/
└── Utilities/
└── GUI/ # 可选触摸屏驱动
八、参考设计资源
-
参考文献:
- 电火花电源控制设计(主电路拓扑)
- 双向DC-DC变换器设计
- 逆变焊机数字控制方案
-
开发工具:
- STM32CubeMX(硬件初始化)
- Keil MDK(代码开发)
- LTspice(电路仿真)
-
测试仪器:
- Keysight DSOX3014T示波器
- Chroma 63205A电子负载
- Fluke 45万用表