基于STM32F103的半桥全桥移相PWM控制代码和主电路
2025-08-25 02:21:48作者:袁立春Spencer
适用场景
基于STM32F103的半桥全桥移相PWM控制方案适用于多种电力电子应用场景,包括:
高频开关电源设计:适用于AC-DC、DC-DC变换器,特别是需要高效率和高功率密度的场合。移相控制技术能够实现软开关操作,显著降低开关损耗。
逆变器系统:在太阳能逆变器、UPS不间断电源等应用中,移相PWM控制能够提供精确的功率调节和良好的波形质量。
电机驱动控制:适用于无刷直流电机、永磁同步电机等的高性能驱动,通过移相控制实现精确的转矩和速度控制。
感应加热系统:在工业加热、电磁炉等应用中,移相PWM能够实现精确的功率控制和频率调节。
无线充电系统:在谐振式无线能量传输系统中,移相控制是实现高效能量传输的关键技术。
适配系统与环境配置要求
硬件要求
- 主控芯片:STM32F103系列微控制器,推荐使用STM32F103C8T6或更高配置型号
- 时钟系统:外部8MHz晶振,内部PLL倍频至72MHz系统时钟
- 电源要求:3.3V供电,需要稳定的LDO稳压器
- 驱动电路:需要半桥/全桥MOSFET驱动芯片,如IR2110、IR2104等
- 功率器件:根据功率等级选择适当的MOSFET或IGBT
- 保护电路:过流保护、过温保护、欠压锁定等安全保护机制
软件开发环境
- IDE:Keil MDK-ARM、IAR Embedded Workbench或STM32CubeIDE
- 编译工具链:ARM GCC或ARMCC
- 调试工具:ST-LINK/V2调试器,J-Link等
- 库支持:STM32标准外设库或HAL库
软件配置要求
- 定时器配置:使用高级定时器TIM1或TIM8生成PWM信号
- 中断设置:配置适当的NVIC优先级,确保PWM生成的实时性
- ADC配置:用于电流、电压采样和闭环控制
- 通信接口:UART用于调试信息输出,SPI/I2C用于外部设备通信
资源使用教程
1. 硬件连接配置
首先按照电路原理图连接主电路:
- 将STM32的PWM输出引脚连接到驱动芯片的输入
- 配置死区时间防止上下管直通
- 连接电流采样电阻和电压分压网络到ADC输入
- 设置过流保护比较器电路
2. 软件初始化步骤
步骤一:时钟系统配置
// 系统时钟配置为72MHz
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
步骤二:PWM定时器配置
// 配置高级定时器TIM1
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 999; // 10kHz PWM频率
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
步骤三:PWM输出通道配置
// 配置PWM输出通道
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500; // 初始占空比50%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
步骤四:死区时间配置
// 设置死区时间防止直通
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
TIM_BDTRInitStructure.TIM_DeadTime = 72; // 1us死区时间
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
3. 移相控制实现
移相角度计算函数:
void SetPhaseShift(uint16_t phase_angle)
{
// 将相位角度转换为计数值
uint16_t phase_count = (phase_angle * TIM1->ARR) / 360;
// 设置通道2的相位偏移
TIM1->CCR2 = phase_count;
// 更新占空比
TIM1->CCR1 = duty_cycle;
}
4. 闭环控制算法
实现电压或电流的PID闭环控制:
void PWM_Control_Loop(void)
{
// 读取ADC采样值
actual_voltage = ADC_Read(ADC_CHANNEL_0);
actual_current = ADC_Read(ADC_CHANNEL_1);
// PID计算
error = target_voltage - actual_voltage;
integral += error;
derivative = error - prev_error;
// 计算新的占空比
duty_cycle = Kp * error + Ki * integral + Kd * derivative;
// 限制占空比范围
duty_cycle = constrain(duty_cycle, MIN_DUTY, MAX_DUTY);
// 更新PWM输出
TIM1->CCR1 = duty_cycle;
prev_error = error;
}
常见问题及解决办法
1. PWM输出异常问题
问题现象:PWM输出波形失真或无输出 解决方法:
- 检查定时器时钟配置是否正确
- 确认GPIO引脚复用功能已正确配置
- 验证死区时间设置是否合理
- 检查驱动芯片的供电和使能信号
2. 移相控制精度问题
问题现象:相位控制不精确,存在偏差 解决方法:
- 提高定时器计数频率以提高分辨率
- 使用32位定时器或更高精度的时钟源
- 添加软件校准算法补偿相位误差
3. 电磁干扰问题
问题现象:系统工作不稳定,受干扰影响大 解决方法:
- 增加电源滤波电容
- 使用屏蔽电缆连接功率部分和控制部分
- 合理布局PCB,减少环路面积
- 添加RC吸收电路减少开关尖峰
4. 过流保护误触发
问题现象:保护电路频繁误动作 解决方法:
- 调整过流保护阈值
- 增加保护延迟时间
- 使用数字滤波算法处理采样信号
- 检查电流采样电路的抗干扰能力
5. 温度过高问题
问题现象:功率器件温度异常升高 解决方法:
- 优化散热设计,增加散热片
- 降低开关频率或优化死区时间
- 检查驱动波形质量,确保完全开通和关断
- 使用热敏电阻实现温度监控和保护
6. 软件运行稳定性问题
问题现象:程序跑飞或响应不及时 解决方法:
- 优化中断优先级设置
- 减少中断服务程序中的计算量
- 使用DMA传输减轻CPU负担
- 添加看门狗定时器确保系统可靠性
通过合理的硬件设计和软件实现,基于STM32F103的半桥全桥移相PWM控制系统能够为各种电力电子应用提供稳定可靠的控制解决方案。