首页
/ 基于STM32F103的半桥全桥移相PWM控制代码和主电路

基于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控制系统能够为各种电力电子应用提供稳定可靠的控制解决方案。