基于STM32F103的5KW PCS逆变器主控代码设计

一、系统概述

5KW PCS(Power Conversion System)逆变器是储能系统的核心设备,实现DC/AC双向转换。本设计基于STM32F103ZET6主控芯片,实现高效、可靠的电力转换控制,支持并网/离网模式切换、MPPT控制、多种保护机制等功能。

二、系统架构

+-----------------------+
|     5KW PCS逆变器      |
| +-------------------+ |
| |   STM32F103主控    | |
| | +---------------+ | |
| | | 控制算法      | | |
| | +---------------+ | |
| | +---------------+ | |
| | | 保护机制      | | |
| | +---------------+ | |
| +-------------------+ |
|           |            |
| +-------------------+ |
| |  功率电路         | |
| | (IGBT/MOSFET)     | |
| +-------------------+ |
|           |            |
| +-------------------+ |
| |  采样电路         | |
| | (电压/电流)       | |
| +-------------------+ |
|           |            |
| +-------------------+ |
| |  通信接口         | |
| | (CAN/RS485/ETH)   | |
| +-------------------+ |
+-----------------------+

三、主控代码架构

/* 主控制循环 */
int main(void) {
    HAL_Init();
    SystemClock_Config();
    Peripherals_Init();
    Safety_Check();
    
    while(1) {
        // 1. 数据采集
        Collect_Sensor_Data();
        
        // 2. 系统状态判断
        System_State_Machine();
        
        // 3. 控制算法执行
        if(system_state == GRID_TIED) {
            Grid_Tied_Control();
        } else if(system_state == OFF_GRID) {
            Off_Grid_Control();
        } else if(system_state == FAULT) {
            Fault_Handling();
        }
        
        // 4. 保护机制检查
        Protection_Check();
        
        // 5. 通信处理
        Communication_Handler();
        
        // 6. 状态更新
        Update_Status_Indicators();
        
        // 7. 低优先级任务
        Low_Priority_Tasks();
        
        HAL_Delay(1); // 1ms主循环周期
    }
}

四、核心功能实现

1. 系统初始化

void SystemClock_Config(void) {
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    
    // 配置72MHz系统时钟
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
    HAL_RCC_OscConfig(&RCC_OscInitStruct);
    
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
}

void Peripherals_Init(void) {
    // GPIO初始化
    MX_GPIO_Init();
    
    // ADC初始化(电压/电流采样)
    MX_ADC1_Init();
    MX_ADC2_Init();
    
    // PWM初始化(TIM1高级定时器)
    MX_TIM1_Init();
    
    // 通信接口初始化
    MX_CAN_Init();
    MX_USART3_Init(); // RS485
    MX_ETH_Init();     // 以太网
    
    // 看门狗初始化
    IWDG_Init();
    
    // 系统状态初始化
    system_state = STARTUP;
    fault_code = NO_FAULT;
}

2. 数据采集模块

typedef struct {
    float dc_voltage;     // 直流母线电压
    float dc_current;     // 直流母线电流
    float ac_voltage[3];  // 三相交流电压
    float ac_current[3];  // 三相交流电流
    float grid_freq;      // 电网频率
    float temperature;    // 散热器温度
    float soc;            // 电池SOC(若连接BMS)
} SensorData;

void Collect_Sensor_Data(void) {
    // ADC采样
    adc_values[0] = HAL_ADC_GetValue(&hadc1); // DC电压
    adc_values[1] = HAL_ADC_GetValue(&hadc1); // DC电流
    adc_values[2] = HAL_ADC_GetValue(&hadc2); // AC电压A相
    adc_values[3] = HAL_ADC_GetValue(&hadc2); // AC电流A相
    // ...其他通道
    
    // 转换为实际值
    sensor_data.dc_voltage = adc_to_voltage(adc_values[0]);
    sensor_data.dc_current = adc_to_current(adc_values[1]);
    sensor_data.ac_voltage[0] = adc_to_voltage(adc_values[2]);
    sensor_data.ac_current[0] = adc_to_current(adc_values[3]);
    // ...其他相
    
    // 温度采样
    sensor_data.temperature = read_temperature_sensor();
    
    // 从BMS获取SOC(通过CAN)
    if(can_bms_data_updated) {
        sensor_data.soc = can_bms_data.soc;
    }
}

3. 系统状态机

typedef enum {
    STARTUP,        // 启动状态
    STANDBY,        // 待机状态
    GRID_TIED,      // 并网模式
    OFF_GRID,       // 离网模式
    FAULT,          // 故障状态
    SHUTDOWN        // 关机状态
} SystemState;

void System_State_Machine(void) {
    static uint32_t state_entry_time = 0;
    
    switch(system_state) {
        case STARTUP:
            // 自检和初始化
            if(self_test_passed) {
                system_state = STANDBY;
                state_entry_time = HAL_GetTick();
            }
            break;
            
        case STANDBY:
            // 等待启动命令
            if(start_command_received) {
                if(grid_available) {
                    system_state = GRID_TIED;
                } else {
                    system_state = OFF_GRID;
                }
            }
            break;
            
        case GRID_TIED:
            // 并网模式运行
            if(!grid_available || fault_detected) {
                system_state = FAULT;
            } else if(mode_switch_command == OFF_GRID_MODE) {
                system_state = OFF_GRID;
            }
            break;
            
        case OFF_GRID:
            // 离网模式运行
            if(fault_detected) {
                system_state = FAULT;
            } else if(mode_switch_command == GRID_TIED_MODE) {
                system_state = GRID_TIED;
            }
            break;
            
        case FAULT:
            // 故障处理
            Handle_Fault();
            if(fault_cleared && (HAL_GetTick() - state_entry_time > FAULT_LATCH_TIME)) {
                system_state = STANDBY;
            }
            break;
            
        case SHUTDOWN:
            // 安全关机
            Shutdown_Sequence();
            break;
    }
}

4. 控制算法实现

4.1 并网控制(PQ控制)

void Grid_Tied_Control(void) {
    // 1. 锁相环(PLL)获取电网角度
    pll_angle = Calculate_PLL(sensor_data.ac_voltage[0]);
    
    // 2. 计算有功/无功指令
    float p_ref = Get_Active_Power_Reference();
    float q_ref = Get_Reactive_Power_Reference();
    
    // 3. 电流环控制
    float id_ref = p_ref / (1.5 * vd_grid); // d轴电流参考
    float iq_ref = q_ref / (1.5 * vd_grid); // q轴电流参考
    
    // 4. PI控制器
    float vd_ref = pi_id_control(id_ref, id_actual);
    float vq_ref = pi_iq_control(iq_ref, iq_actual);
    
    // 5. 反Park变换
    float v_alpha, v_beta;
    inv_park_transform(vd_ref, vq_ref, pll_angle, &v_alpha, &v_beta);
    
    // 6. SVPWM生成
    svpwm_generate(v_alpha, v_beta);
    
    // 7. 更新PWM占空比
    Update_PWM_Duty_Cycles();
}

4.2 离网控制(V/f控制)

void Off_Grid_Control(void) {
    // 1. 计算电压幅值和频率
    float v_ref = Get_Voltage_Reference();
    float f_ref = Get_Frequency_Reference();
    
    // 2. 生成正弦波参考
    static float angle = 0;
    angle += 2 * PI * f_ref * control_period;
    if(angle > 2 * PI) angle -= 2 * PI;
    
    float v_alpha = v_ref * cos(angle);
    float v_beta = v_ref * sin(angle);
    
    // 3. SVPWM生成
    svpwm_generate(v_alpha, v_beta);
    
    // 4. 更新PWM占空比
    Update_PWM_Duty_Cycles();
}

4.3 MPPT控制

void MPPT_Control(void) {
    static float prev_power = 0;
    static float prev_voltage = 0;
    
    // 读取当前功率和电压
    float current_power = sensor_data.dc_voltage * sensor_data.dc_current;
    float current_voltage = sensor_data.dc_voltage;
    
    // 扰动观察法
    float delta_power = current_power - prev_power;
    float delta_voltage = current_voltage - prev_voltage;
    
    if(delta_power > 0) {
        // 功率增加,保持扰动方向
        if(delta_voltage > 0) {
            dc_voltage_ref += voltage_step;
        } else {
            dc_voltage_ref -= voltage_step;
        }
    } else {
        // 功率减小,改变扰动方向
        if(delta_voltage > 0) {
            dc_voltage_ref -= voltage_step;
        } else {
            dc_voltage_ref += voltage_step;
        }
    }
    
    // 更新参考值
    Set_DCV_Reference(dc_voltage_ref);
    
    // 保存历史值
    prev_power = current_power;
    prev_voltage = current_voltage;
}

5. 保护机制

void Protection_Check(void) {
    // 过压保护
    if(sensor_data.dc_voltage > DC_OVERVOLTAGE_THRESHOLD || 
       max_phase_voltage > AC_OVERVOLTAGE_THRESHOLD) {
        Trigger_Protection(OVERVOLTAGE_FAULT);
    }
    
    // 欠压保护
    if(sensor_data.dc_voltage < DC_UNDERVOLTAGE_THRESHOLD || 
       min_phase_voltage < AC_UNDERVOLTAGE_THRESHOLD) {
        Trigger_Protection(UNDERVOLTAGE_FAULT);
    }
    
    // 过流保护
    if(max_phase_current > AC_OVERCURRENT_THRESHOLD || 
       abs(sensor_data.dc_current) > DC_OVERCURRENT_THRESHOLD) {
        Trigger_Protection(OVERCURRENT_FAULT);
    }
    
    // 过温保护
    if(sensor_data.temperature > TEMPERATURE_LIMIT) {
        Trigger_Protection(OVERTEMPERATURE_FAULT);
    }
    
    // 孤岛保护
    if(system_state == GRID_TIED && !grid_detected) {
        Trigger_Protection(ISLANDING_FAULT);
    }
}

void Trigger_Protection(FaultCode code) {
    fault_code = code;
    system_state = FAULT;
    
    // 立即关闭PWM输出
    HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
    HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);
    HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3);
    
    // 记录故障信息
    log_fault_event(code, sensor_data);
    
    // 通知监控系统
    Send_Fault_Notification(code);
}

6. 通信处理

void Communication_Handler(void) {
    // CAN通信(BMS/EMS)
    Process_CAN_Messages();
    
    // RS485通信(本地监控)
    Process_RS485_Messages();
    
    // 以太网通信(远程监控)
    Process_Ethernet_Messages();
}

void Process_CAN_Messages(void) {
    CanRxMsgTypeDef rx_msg;
    if(HAL_CAN_Receive(&hcan, CAN_FIFO0, &rx_msg, 10) == HAL_OK) {
        switch(rx_msg.StdId) {
            case BMS_VOLTAGE_ID:
                can_bms_data.voltage = parse_float(rx_msg.Data);
                break;
            case BMS_CURRENT_ID:
                can_bms_data.current = parse_float(rx_msg.Data);
                break;
            case BMS_SOC_ID:
                can_bms_data.soc = parse_float(rx_msg.Data);
                can_bms_data_updated = true;
                break;
            case EMS_POWER_CMD_ID:
                ems_power_command = parse_power_cmd(rx_msg.Data);
                break;
        }
    }
}

五、关键算法实现

1. SVPWM生成

void svpwm_generate(float alpha, float beta) {
    // 扇区判断
    uint8_t sector = 0;
    float v_ref1, v_ref2, v_ref3;
    float T1, T2, T0;
    
    // 计算中间变量
    float v1 = beta;
    float v2 = (sqrt(3)*alpha - beta)/2;
    float v3 = (-sqrt(3)*alpha - beta)/2;
    
    // 确定扇区
    if(v1 > 0) sector |= 1;
    if(v2 > 0) sector |= 2;
    if(v3 > 0) sector |= 4;
    
    // 计算各矢量作用时间
    switch(sector) {
        case 1:
            T1 = v2;
            T2 = v1;
            break;
        case 2:
            T1 = v3;
            T2 = v2;
            break;
        // ...其他扇区
    }
    
    // 计算占空比
    float period = PWM_PERIOD;
    float t1 = T1 * period / vdc;
    float t2 = T2 * period / vdc;
    float t0 = (period - t1 - t2) / 2;
    
    // 设置比较寄存器值
    Set_PWM_Compare(sector, t1, t2, t0);
}

2. 锁相环(PLL)实现

float Calculate_PLL(float v_a) {
    static float angle = 0;
    static float integrator = 0;
    static float kp = 0.1, ki = 0.01;
    
    // 克拉克变换
    float v_alpha = v_a;
    float v_beta = 0; // 单相系统
    
    // Park变换
    float v_d = v_alpha * cos(angle) + v_beta * sin(angle);
    float v_q = -v_alpha * sin(angle) + v_beta * cos(angle);
    
    // PI控制器
    float error = v_q; // 目标vq=0
    integrator += error * ki;
    float omega = nominal_freq + kp * error + integrator;
    
    // 更新角度
    angle += omega * control_period;
    if(angle > 2*PI) angle -= 2*PI;
    
    return angle;
}

六、系统优化与保护

1. 效率优化

// 根据负载调整开关频率
void Adjust_Switching_Frequency(float load_ratio) {
    if(load_ratio < 0.2) {
        // 轻载时降低频率
        TIM1->ARR = HIGH_FREQ_PERIOD;
    } else {
        // 额定负载
        TIM1->ARR = NOMINAL_FREQ_PERIOD;
    }
}

// 死区时间补偿
void Deadtime_Compensation(void) {
    // 根据电流方向调整死区时间
    if(iq_actual > 0) {
        comp_factor = 0.95; // 正向电流补偿
    } else {
        comp_factor = 1.05; // 负向电流补偿
    }
    
    // 应用补偿
    pwm_duty_a *= comp_factor;
    pwm_duty_b *= comp_factor;
    pwm_duty_c *= comp_factor;
}

2. 热管理

void Thermal_Management(void) {
    // 计算IGBT结温估算
    float rth_ja = 0.5; // 热阻(℃/W)
    float p_loss = calculate_igbt_losses();
    float estimated_temp = ambient_temp + p_loss * rth_ja;
    
    // 过温预警
    if(estimated_temp > WARNING_TEMP) {
        // 降低输出功率
        derate_power();
    }
    
    // 风扇控制
    if(estimated_temp > FAN_ON_TEMP) {
        FAN_ON();
    } else if(estimated_temp < FAN_OFF_TEMP) {
        FAN_OFF();
    }
}

参考代码 基于STM32F103为主控的5KW PCS逆变器:主控代码 www.youwenfan.com/contentcns/182635.html

七、调试与测试

1. 测试模式

void Test_Mode(void) {
    // 1. 开环测试
    Open_Loop_Test();
    
    // 2. 闭环测试
    Closed_Loop_Test();
    
    // 3. 保护功能测试
    Protection_Test();
    
    // 4. 效率测试
    Efficiency_Test();
}

void Open_Loop_Test(void) {
    // 固定PWM占空比输出
    Set_PWM_Duty_Cycles(0.5, 0.5, 0.5);
    HAL_Delay(1000);
    
    // 阶梯变化测试
    for(int i=0; i<=10; i++) {
        float duty = i * 0.1;
        Set_PWM_Duty_Cycles(duty, duty, duty);
        HAL_Delay(500);
    }
}

2. 数据记录

void Data_Logger(void) {
    // 记录关键运行数据
    log_entry.timestamp = HAL_GetTick();
    log_entry.dc_voltage = sensor_data.dc_voltage;
    log_entry.dc_current = sensor_data.dc_current;
    log_entry.ac_voltage = average_phase_voltage();
    log_entry.ac_current = average_phase_current();
    log_entry.temperature = sensor_data.temperature;
    log_entry.power = sensor_data.dc_voltage * sensor_data.dc_current;
    
    // 存储到EEPROM或SD卡
    save_log_entry(&log_entry);
    
    // 定期上传到监控系统
    if(log_counter++ > UPLOAD_INTERVAL) {
        upload_log_data();
        log_counter = 0;
    }
}

八、项目资源

1. 硬件资源

模块 型号/规格 数量 功能
主控芯片 STM32F103ZET6 1 系统控制
功率器件 IGBT模块 (1200V/100A) 6 三相逆变
驱动电路 IR2110S 6 IGBT驱动
电流采样 ACS712 (±30A) 3 相电流检测
电压采样 分压电阻+运放 4 直流/交流电压检测
通信接口 CAN收发器 (TJA1050) 1 CAN通信
MAX485 1 RS485通信
温度传感器 PT100 + 变送器 2 关键点温度监测

2. 开发环境

  • IDE: Keil MDK-ARM 5.37

  • 编译器: ARMCC V6.16

  • 调试器: J-Link V9

  • RTOS: FreeRTOS 10.4.3

  • 版本控制: Git

3. 关键参数

参数
额定功率 5KW
直流电压范围 200-750VDC
交流输出电压 220VAC/380VAC
交流频率 50/60Hz
开关频率 10kHz
效率 >95% (额定负载)
保护功能 过压/欠压/过流/过温/孤岛

九、总结

本设计实现了基于STM32F103的5KW PCS逆变器主控系统,包含完整的控制算法、保护机制和通信功能。系统采用模块化设计,关键特点包括:

  1. 支持并网/离网双模式运行

  2. 实现PQ控制和V/f控制策略

  3. 集成MPPT算法用于新能源接入

  4. 完善的保护机制确保系统安全

  5. 多通信接口支持系统集成

  6. 热管理和效率优化设计

posted @ 2026-03-23 17:32  hczyydqq  阅读(28)  评论(0)    收藏  举报