基于STM32F103ZET6实现PI调节PWM开关电源

基于STM32F103ZET6实现PI调节PWM开关电源

一、系统架构设计

1. 主电路拓扑(Buck-Boost混合结构)

输入滤波 → 前级Buck(降压) → 后级Boost(升压) → 输出滤波

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电感] → [输出滤波电容] → [负载]

2. PCB布局技巧


三、软件核心算法

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. 数字交互接口

// 通过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. 保护功能设计

参考代码 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/               # 可选触摸屏驱动

八、参考设计资源

  1. 参考文献

    • 电火花电源控制设计(主电路拓扑)
    • 双向DC-DC变换器设计
    • 逆变焊机数字控制方案
  2. 开发工具

    • STM32CubeMX(硬件初始化)
    • Keil MDK(代码开发)
    • LTspice(电路仿真)
  3.  

    测试仪器

    • Keysight DSOX3014T示波器
    • Chroma 63205A电子负载
    • Fluke 45万用表

 

专注于matlab/simulink,电子电路,编程