基于STM32的正弦波逆变器设计

一、系统概述

正弦波逆变器是将直流电源(如12V/24V电池) 转换为交流正弦波(如220V/50Hz) 的核心设备,广泛应用于太阳能发电、车载电源、应急供电等场景。本设计以STM32F407ZGT6为主控,采用全桥逆变电路+SPWM(正弦脉宽调制) 技术,实现高效率、低失真、高可靠性的正弦波输出,支持电压/电流实时监测、过流/过压保护、远程通信功能,输出功率300W,效率>90%。

二、系统架构与硬件设计

1. 系统架构

graph TD A[直流输入 12V/24V电池] -->|防反接| B[DC-AC全桥逆变电路] B -->|SPWM信号| C[STM32F407主控] C -->|驱动信号| D[IR2110驱动电路] D -->|控制| B[全桥MOSFET] B -->|滤波| E[LC低通滤波器] E -->|交流输出 220V/50Hz | F[负载] C -->|ADC采样| G[电压/电流检测电路] C -->|保护控制| H[过流/过压/过温保护] C -->|通信| I[UART/ESP8266 Wi-Fi] I -->|JSON| J[手机APP/Web监控] K[电源管理 5V/3.3V] -->|供电| C K -->|供电| D K -->|供电| G

2. 核心硬件选型

模块 型号/参数 功能
主控 STM32F407ZGT6(Cortex-M4,168MHz,1MB Flash,192KB RAM) 生成SPWM、控制逻辑、保护、通信
逆变桥 全桥(4×IRF3205 MOSFET,Vds=55V,Id=110A) 直流转交流(12V→220V)
驱动电路 IR2110(半桥驱动,耐压500V,输出电流2A) 驱动全桥MOSFET,带死区控制
滤波电路 LC低通(L=1mH,C=2.2μF,截止频率50Hz) 滤除SPWM谐波,输出正弦波
检测电路 电压分压(0-5V对应0-300V)+ ACS712(电流检测,±20A) 实时监测输出电压/电流
保护电路 保险丝(20A)+TVS管(15V)+NTC热敏电阻(10kΩ) 过流/过压/过温保护
通信 ESP8266-01S(Wi-Fi,UART) 远程监控(输出参数、故障报警)
电源 LM2596(12V→5V,3A)+ AMS1117-3.3V 系统供电(5V/3.3V)

3. 关键电路设计

(1)全桥逆变电路

  • 拓扑:4个IRF3205 MOSFET组成H桥,Q1/Q4为一组,Q2/Q3为另一组,交替导通生成交流方波;

  • 死区时间:通过IR2110设置1-2μs死区,防止上下桥臂直通短路;

  • 续流二极管:每个MOSFET并联快恢复二极管(如FR107),释放感性负载能量。

(2)SPWM生成与驱动电路

  • SPWM信号:STM32的TIM1高级定时器生成两路互补PWM(CH1/CH1N、CH2/CH2N),分别控制Q1/Q2、Q3/Q4;

  • IR2110驱动:STM32的PWM信号经IR2110放大后驱动MOSFET栅极,VCC=12V,HO/LO输出驱动电压。

(3)电压/电流检测电路

  • 电压检测:输出220V经1:100分压电阻(1MΩ+10kΩ)降压至0-2.2V,接入STM32的PA0(ADC1_IN0)

  • 电流检测:ACS712(20A量程)输出0-5V模拟信号,接入PA1(ADC1_IN1),通过公式I=(Vout−2.5V)/0.1V/A计算电流。

三、软件设计(C语言实现,基于STM32 HAL库)

1. 开发环境

  • IDE:STM32CubeIDE(V1.13.0)

  • :STM32 HAL库(V1.11.0)、FreeRTOS(多任务调度,可选)

  • 关键外设:TIM1(SPWM生成)、ADC1(电压/电流采样)、UART1(ESP8266通信)

2. 主程序流程

#include "stm32f4xx_hal.h"
#include "spwm.h"
#include "adc.h"
#include "protection.h"
#include "wifi.h"

// 系统状态
typedef struct {
  float output_voltage;  // 输出电压(V)
  float output_current;  // 输出电流(A)
  float output_power;    // 输出功率(W)
  uint8_t fault_flag;     // 故障标志(0:正常,1:过流,2:过压,3:过温)
} SystemState;

int main(void) {
  HAL_Init();
  SystemClock_Config();  // 168MHz主频
  MX_GPIO_Init();        // GPIO初始化(保护电路、LED)
  MX_TIM1_Init();        // TIM1初始化(SPWM,50Hz,载波20kHz)
  MX_ADC1_Init();        // ADC1初始化(电压/电流采样)
  MX_USART1_Init();      // USART1初始化(ESP8266,115200bps)
  
  SystemState sys_state = {0};
  SPWM_Start();  // 启动SPWM输出
  
  while (1) {
    // 1. 采样电压/电流
    sys_state.output_voltage = ADC_GetVoltage();
    sys_state.output_current = ADC_GetCurrent();
    sys_state.output_power = sys_state.output_voltage * sys_state.output_current;
    
    // 2. 保护检测
    if (sys_state.output_current > 15.0f) {  // 过流保护(15A)
      sys_state.fault_flag = 1;
      SPWM_Stop();
    } else if (sys_state.output_voltage > 250.0f) {  // 过压保护(250V)
      sys_state.fault_flag = 2;
      SPWM_Stop();
    } else {
      sys_state.fault_flag = 0;
    }
    
    // 3. 远程通信(上传状态)
    WIFI_SendStatus(&sys_state);
    
    // 4. 低功耗管理(无故障时进入Idle模式)
    if (sys_state.fault_flag == 0) {
      HAL_PWR_EnterIDLEMode();
    }
    HAL_Delay(100);  // 100ms周期
  }
}

3. 关键模块实现

(1)SPWM生成(TIM1高级定时器,查表法)

原理:通过正弦波表生成PWM占空比,载波频率20kHz(周期50μs),调制比0.8-0.9,输出50Hz正弦波。

// 正弦波表(256点,0-90°对称,50Hz)
const uint16_t sine_table[256] = {
  0, 16, 32, 48, 64, 80, 96, 111, 127, 142, 156, 171, 185, 199, 212, 225,
  // ... 完整256点正弦表(略)
};

// TIM1初始化(SPWM,20kHz载波,50Hz输出)
void MX_TIM1_Init(void) {
  TIM_OC_InitTypeDef sConfigOC = {0};
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
  
  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 0;  // 不分频(168MHz)
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 8399;  // 周期= (168MHz)/(20kHz) -1= 8400-1=8399
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  HAL_TIM_PWM_Init(&htim1);
  
  // 配置CH1/CH1N(Q1/Q2驱动)
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 0;  // 初始占空比0
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
  
  // 配置CH2/CH2N(Q3/Q4驱动)
  HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2);
  
  // 死区时间设置(1μs)
  sBreakDeadTimeConfig.DeadTime = 168;  // 168MHz下1μs=168个周期
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig);
  
  // 启动PWM
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);  // CH1N
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
  HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);  // CH2N
}

// 更新SPWM占空比(查表法,50Hz正弦波)
void SPWM_Update(void) {
  static uint8_t index = 0;
  uint16_t pulse = sine_table[index] * 8399 / 4095;  // 正弦表值(0-4095)映射到周期(0-8399)
  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pulse);  // CH1
  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 8399 - pulse);  // CH2(互补)
  index = (index + 1) % 256;  // 256点循环
}

(2)电压/电流采样(ADC1+DMA)

功能:通过ADC1的2个通道(PA0=电压,PA1=电流)采样,DMA传输至缓冲区,减少CPU干预。

// ADC1初始化(DMA传输)
void MX_ADC1_Init(void) {
  ADC_ChannelConfTypeDef sConfig = {0};
  
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;  // 42MHz
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.ScanConvMode = ENABLE;  // 扫描模式(2通道)
  hadc1.Init.ContinuousConvMode = ENABLE;  // 连续转换
  hadc1.Init.DMAContinuousRequests = ENABLE;  // DMA连续请求
  hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  HAL_ADC_Init(&hadc1);
  
  // 配置通道0(PA0,电压)
  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_15CYCLES;
  HAL_ADC_ConfigChannel(&hadc1, &sConfig);
  
  // 配置通道1(PA1,电流)
  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = 2;
  HAL_ADC_ConfigChannel(&hadc1, &sConfig);
  
  // 启动DMA传输(2通道,16位缓冲区)
  uint16_t adc_buffer[2];
  HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, 2);
}

// 获取电压值(0-5V对应0-300V)
float ADC_GetVoltage(void) {
  uint16_t adc_val = adc_buffer[0];  // 从DMA缓冲区读取
  return (adc_val * 3.3f / 4095.0f) * 100.0f;  // 分压比1:100(3.3V→330V,实际用1:100→330V/10=33V?修正:1:100分压后0-2.2V对应0-220V,故220V/2.2V=100,所以V=adc_val*3.3/4095 * 100)
}

// 获取电流值(ACS712输出0-5V对应-20A-+20A)
float ADC_GetCurrent(void) {
  uint16_t adc_val = adc_buffer[1];
  float v_out = adc_val * 3.3f / 4095.0f;
  return (v_out - 2.5f) / 0.1f;  // 0.1V/A,2.5V=0A
}

(3)保护功能(过流/过压/过温)

功能:实时监测电流/电压/温度,异常时停止SPWM输出,触发报警。

// 保护检测
void Protection_Check(SystemState* state) {
  // 1. 过流保护(>15A)
  if (state->output_current > 15.0f) {
    state->fault_flag = 1;
    SPWM_Stop();
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);  // 红灯亮
  }
  // 2. 过压保护(>250V)
  else if (state->output_voltage > 250.0f) {
    state->fault_flag = 2;
    SPWM_Stop();
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
  }
  // 3. 过温保护(NTC热敏电阻>80℃)
  else if (Get_Temperature() > 80.0f) {
    state->fault_flag = 3;
    SPWM_Stop();
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
  } else {
    state->fault_flag = 0;
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);  // 红灯灭
  }
}

参考代码 基于STM32正弦波逆变器设计 www.youwenfan.com/contentcns/161019.html

四、系统测试与优化

1. 测试指标

参数 指标 测试方法
输出波形 正弦波,THD<5% 示波器测量输出波形,FFT分析谐波
输出电压精度 220V±5% 用万用表测量空载/带载电压
效率 >90%(300W负载) 输入功率(电压×电流)/输出功率(220V×电流)
保护响应时间 <10ms(过流/过压) 突加负载/过压,示波器测量关断时间
通信距离 ≥10米(Wi-Fi,空旷) 手机APP与设备距离测试

2. 优化方向

  • 效率提升:采用同步整流技术(用MOSFET替代续流二极管),减少导通损耗;

  • 波形优化:增加PID闭环控制,通过反馈调节SPWM调制比,稳定输出电压;

  • 低功耗:无负载时STM32进入Stop模式,仅保留RTC唤醒;

  • EMI抑制:在输入/输出端加共模电感+安规电容,减少电磁干扰。

五、总结

本设计基于STM32F407实现了300W正弦波逆变器,通过全桥逆变+SPWM调制生成50Hz正弦波,结合电压/电流检测、保护电路、Wi-Fi通信,具备高可靠性、易监控特点。系统可扩展为多电压输出(110V/220V) 或并网逆变器(增加MPPT功能),适用于太阳能发电、车载电源等场景。

posted @ 2026-04-03 16:59  hczyydqq  阅读(9)  评论(0)    收藏  举报