1. 项目概述
在电力电子系统设计中,50kW功率级别的两电平三相PFC(功率因数校正)与移相全桥双路输出系统的实现是一个极具挑战性的工程课题。这类系统广泛应用于工业电源、电动汽车充电桩、数据中心供电等场景,其核心目标是在实现高效能量转换的同时,确保电网侧的高功率因数(通常要求>0.99)和低谐波失真(THD<5%)。
我最近完成了一个基于STM32H743微控制器的50kW双路输出系统开发,采用C语言实现了完整的数字控制算法。这个系统在两电平三相PFC阶段将380VAC三相输入转换为800VDC母线电压,随后通过两个独立的移相全桥模块分别输出400VDC和48VDC,每路额定功率25kW。实测整机效率达到96.2%,满载时功率因数0.993。
2. 系统架构设计
2.1 整体拓扑结构
系统采用两级式架构:
-
前级:三相两电平Boost PFC
- 开关频率:20kHz
- 拓扑特点:每相使用两个IGBT模块构成半桥
- 控制目标:维持800V直流母线,单位功率因数
-
后级:双移相全桥DC-DC
- 拓扑1:800V→400V(25kW)
- 开关频率:100kHz
- 采用SiC MOSFET
- 拓扑2:800V→48V(25kW)
- 开关频率:50kHz
- 采用GaN HEMT
- 拓扑1:800V→400V(25kW)
2.2 关键参数计算
2.2.1 PFC电感设计
电感值计算公式:
code复制L ≥ (V_in_max × D_max) / (ΔI_L × f_sw)
其中:
- V_in_max = 311V(220VAC峰值)
- D_max = 0.5
- ΔI_L = 20%额定电流 ≈ 8A
- f_sw = 20kHz
计算得L ≥ 0.97mH,实际选用1mH/50A的纳米晶电感。
2.2.2 直流母线电容选择
根据纹波要求:
code复制C ≥ (P_out) / (2 × π × f_line × V_dc × ΔV_dc)
取:
- P_out = 50kW
- f_line = 50Hz
- V_dc = 800V
- ΔV_dc = 16V(2%纹波)
计算得C ≥ 1244μF,实际采用6×220μF/450V薄膜电容串联。
3. 控制算法实现
3.1 三相PFC控制
3.1.1 电压外环设计
采用PI控制器:
c复制typedef struct {
float Kp;
float Ki;
float integral;
float out_max;
} PI_Controller;
void PI_Update(PI_Controller *pi, float error) {
pi->integral += pi->Ki * error;
if(pi->integral > pi->out_max) pi->integral = pi->out_max;
else if(pi->integral < -pi->out_max) pi->integral = -pi->out_max;
}
float PI_GetOutput(PI_Controller *pi, float error) {
float output = pi->Kp * error + pi->integral;
return (output > pi->out_max) ? pi->out_max :
((output < -pi->out_max) ? -pi->out_max : output);
}
3.1.2 电流内环实现
采用基于坐标变换的DQ控制:
c复制void ClarkeTransform(float a, float b, float c, float *alpha, float *beta) {
*alpha = a;
*beta = (b - c) / sqrt(3.0f);
}
void ParkTransform(float alpha, float beta, float theta, float *d, float *q) {
*d = alpha * cos(theta) + beta * sin(theta);
*q = -alpha * sin(theta) + beta * cos(theta);
}
void InverseParkTransform(float d, float q, float theta, float *alpha, float *beta) {
*alpha = d * cos(theta) - q * sin(theta);
*beta = d * sin(theta) + q * cos(theta);
}
3.2 移相全桥控制
3.2.1 移相PWM生成
c复制void GeneratePSPWM(TIM_HandleTypeDef *htim, float phase_shift) {
uint32_t period = htim->Init.Period;
uint32_t pulse = (uint32_t)(period * 0.45); // 固定占空比45%
// 主桥臂
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, pulse);
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, period - pulse);
// 从桥臂(带移相)
uint32_t shifted_pulse = (uint32_t)(period * phase_shift);
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_3, (pulse + shifted_pulse) % period);
__[HAL](https://taotoken.net/?utm_source=hardware)_TIM_SET_COMPARE(htim, TIM_CHANNEL_4, (period - pulse + shifted_pulse) % period);
}
3.2.2 同步整流控制
c复制void SyncRectControl(MOSFET_State *Q1, MOSFET_State *Q2,
float Vds, float Id, float threshold) {
if(fabs(Id) > threshold) {
if(Id > 0) {
*Q1 = ON;
*Q2 = OFF;
} else {
*Q1 = OFF;
*Q2 = ON;
}
} else {
*Q1 = OFF;
*Q2 = OFF;
}
}
4. 关键实现细节
4.1 中断服务例程设计
采用定时器触发ADC采样,确保严格的时间同步:
c复制void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if(htim == &htim1) { // 20kHz PFC控制
static uint32_t pfc_counter = 0;
// 启动ADC采样
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, 6);
if(++pfc_counter >= 4) { // 5kHz电压环
PFC_VoltageLoop();
pfc_counter = 0;
}
}
else if(htim == &htim8) { // 100kHz移相全桥
PSFB_ControlLoop();
}
}
4.2 保护机制实现
多级保护策略:
-
硬件保护:
- 驱动芯片DESAT检测
- 快速比较器过流保护(响应时间<200ns)
-
软件保护:
c复制typedef struct {
float Vdc_over;
float Vdc_under;
float I_over;
float temp_over;
} ProtectionThresholds;
uint8_t CheckProtections(ProtectionThresholds *th, SystemParams *params) {
if(params->Vdc > th->Vdc_over) return 1;
if(params->Vdc < th->Vdc_under) return 2;
if(params->I_rms > th->I_over) return 3;
if(params->temp > th->temp_over) return 4;
return 0;
}
5. 调试经验与问题解决
5.1 常见问题排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| PFC输入电流畸变 | 电感饱和 ADC采样不同步 |
检查电感电流波形 校准采样时序 |
| 母线电压振荡 | PI参数不当 电容ESR过大 |
调整积分时间常数 并联低ESR电容 |
| 移相全桥效率低 | 死区时间不足 同步整流失效 |
优化死区设置 检查体二极管导通时间 |
5.2 实测波形优化
在调试400V输出全桥时,发现开关节点振铃严重(超调达30%)。通过以下措施改善:
- 增加门极电阻从5Ω到15Ω
- 在DS之间添加330pF/1kV电容
- 优化PCB布局,缩短功率回路
优化前后对比:
- 开关损耗降低23%
- EMI峰值下降15dB
- 振铃幅度从120V降至40V
6. 性能优化技巧
6.1 计算加速方法
- 查表法实现三角函数:
c复制float fast_sin(float x) {
static const float sin_table[256];
uint8_t index = (uint8_t)(x * 40.743665f); // 256/(2π)
return sin_table[index];
}
- 使用ARM CMSIS-DSP库:
c复制#include "arm_math.h"
void MatrixMultiply(void) {
arm_matrix_instance_f32 matA, matB, matC;
float aData[9], bData[9], cData[9];
// 初始化矩阵...
arm_mat_mult_f32(&matA, &matB, &matC);
}
6.2 内存管理策略
关键数据分配在DTCM内存(STM32H7特有):
c复制__attribute__((section(".dtcm"))) float control_variables[20];
使用DMA加速数据传输:
c复制void ADC_Config(void) {
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_adc1.Init.Mode = DMA_CIRCULAR;
HAL_DMA_Init(&hdma_adc1);
}
7. 实际测试数据
在额定负载下的关键指标:
| 参数 | PFC级 | 400V全桥 | 48V全桥 |
|---|---|---|---|
| 效率 | 98.1% | 98.5% | 95.8% |
| THD | 3.2% | - | - |
| 纹波 | 1.8% | 0.8% | 1.2% |
| 温升 | 32K | 28K | 41K |
动态响应测试:
- 负载阶跃(25%-75%):恢复时间<200μs
- 输入电压跌落(380V→300V):母线电压波动<3%
