基于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逆变器主控系统,包含完整的控制算法、保护机制和通信功能。系统采用模块化设计,关键特点包括:
-
支持并网/离网双模式运行
-
实现PQ控制和V/f控制策略
-
集成MPPT算法用于新能源接入
-
完善的保护机制确保系统安全
-
多通信接口支持系统集成
-
热管理和效率优化设计

浙公网安备 33010602011771号