1. 项目背景与核心需求
在工业电源设计领域,高效率、高功率密度的AC/DC转换系统一直是研发重点。这个50kW双路输出系统方案,本质上是要解决大功率场合下电能高效转换与多路独立控制的难题。两电平三相PFC(功率因数校正)前端搭配移相全桥拓扑的后级架构,是目前工业电源中兼顾性能与成本的经典组合。
我最早接触这类系统是在某半导体设备公司的电源模块开发中。当时客户需要一套能为等离子体发生器和真空泵同时供电的电源,要求两路输出独立可调且总功率不低于50kW。传统方案采用多个独立电源并联,不仅体积庞大,效率也难以突破92%。而这个拓扑通过单级PFC+双路移相全桥的架构,在实验室样机上实现了96.2%的峰值效率。
2. 系统架构设计解析
2.1 前端PFC拓扑选择
两电平三相PFC相比三电平方案,虽然THD(总谐波失真)略高(约5% vs 3%),但在50kW功率等级下具有显著优势:
- 开关器件数量减少50%(6个 vs 12个)
- 驱动电路复杂度大幅降低
- 成本节约约30%
关键设计参数计算:
c复制// 以400V三相输入为例
#define INPUT_VOLTAGE 400 // 线电压有效值
#define MAX_POWER 50000 // 50kW
// 计算输入电流有效值
float I_in = MAX_POWER / (INPUT_VOLTAGE * sqrt(3) * 0.95); // 假设PF=0.95
// 得到约76A,故需选择100A等级的IGBT模块
2.2 移相全桥设计要点
后级采用双路移相全桥实现:
- 主路输出:通常设为较高电压(如800V),供大功率负载
- 辅路输出:设为低压大电流(如48V/500A),供控制电路
移相控制的关键时间参数:
c复制// 开关频率设为50kHz时
#define T_sw 20 // 开关周期(us)
#define T_dead 1.2 // 死区时间(us)
#define T_phase_shift_max 8 // 最大移相时间(us)
// 占空比计算
float D = (T_phase_shift + T_dead) / T_sw;
// 实际应用中需加入电压前馈补偿
3. 核心算法实现
3.1 PFC控制环路
采用基于dq变换的三相锁相环(PLL)实现:
c复制typedef struct {
float id_ref; // d轴电流参考值
float iq_ref; // q轴电流参考值(通常为0)
float vd, vq; // 电压分量
float id, iq; // 电流分量
float theta; // 相位角
} PFC_Controller;
void PFC_Update(PFC_Controller *ctrl, float ia, ib, ic, float va, vb, vc) {
// Clarke变换
float i_alpha = ia;
float i_beta = (ia + 2*ib)/sqrt(3);
// Park变换
ctrl->id = i_alpha * cos(ctrl->theta) + i_beta * sin(ctrl->theta);
ctrl->iq = -i_alpha * sin(ctrl->theta) + i_beta * cos(ctrl->theta);
// PI调节器实现
float vd_out = PI_Update(&pid_d, ctrl->id_ref - ctrl->id);
float vq_out = PI_Update(&pid_q, ctrl->iq_ref - ctrl->iq);
// 反Park变换生成调制波
// ...后续PWM生成代码
}
3.2 移相全桥数字控制
采用时间戳方式的移相控制算法:
c复制typedef struct {
uint32_t period_cnt; // 开关周期计数器
uint16_t phase_shift; // 移相量(0-1000对应0-100%)
uint8_t bridge_num; // 桥臂编号
} PhaseShift_Controller;
void PSFB_Update(PhaseShift_Controller *ps) {
uint32_t trig_point = (ps->period_cnt * ps->phase_shift) / 1000;
// 生成PWM时间标记
PWM_SetCompare(ps->bridge_num * 2, trig_point);
PWM_SetCompare(ps->bridge_num * 2 + 1, trig_point + FIXED_DELAY);
// 周期计数器循环
ps->period_cnt = (ps->period_cnt + 1) % PWM_PERIOD;
}
4. 关键外设驱动实现
4.1 ADC采样策略
针对三相PFC需要同步采样6路信号(3电压+3电流),推荐配置:
- 使用STM32H7系列的HRTIM配合ADC3
- 采用注入通道+常规通道组合
- 采样时刻精确对齐PWM中点
配置示例:
c复制void ADC_Config(void) {
// 触发源选择HRTIM_TRG1
ADC_REGULAR_TRIGGER = HRTIM_TRG1;
// 配置采样序列
ADC_SEQ_CONFIG(0, CH_Va, SMPL_TIME_NS(200));
ADC_SEQ_CONFIG(1, CH_Ia, SMPL_TIME_NS(200));
// ...其他通道
// 注入通道用于保护
ADC_INJ_CONFIG(0, CH_DCLINK, SMPL_TIME_NS(100));
}
4.2 保护电路设计
必须实现的硬件保护功能:
- 过流保护(响应时间<2μs)
- 直流母线过压保护
- 散热器超温保护
保护逻辑实现示例:
c复制#define FAULT_MASK 0x1F
volatile uint32_t fault_status = 0;
void HAL_GPIO_EXTI_Callback(uint16_t pin) {
if(pin == OC_PIN) {
fault_status |= 0x01;
PWM_DisableAll();
}
// 其他故障处理...
}
void Fault_Handler(void) {
if(fault_status & FAULT_MASK) {
System_Shutdown();
LED_Alert(ALARM_RED);
}
}
5. 系统调试经验
5.1 PFC启动策略
实测有效的软启动流程:
- 预充电阶段:控制接触器对DC-link电容充电
- 零电流启动:先使能PWM但不给电流参考
- 斜坡上升:以10A/ms斜率增加id_ref
- 闭环切换:当DC-link电压达到350V时切入闭环
重要提示:直接大电流启动会导致整流桥应力过大,我们曾因此损坏过多个IGBT模块
5.2 移相全桥调试技巧
- 先开环测试:
- 固定50%占空比观察波形
- 逐步增加移相量
- 变压器偏磁检测:
c复制// 检测原边电流直流分量 float I_dc = MovingAverage_Update(&avg_filter, I_primary); if(fabs(I_dc) > MAX_BIAS_CURRENT) { Adjust_PhaseBalance(); } - 次级同步整流时序:
- 用示波器观察体二极管导通时间
- 优化同步整流MOSFET的开启延迟
6. 电磁兼容(EMC)处理方案
6.1 PCB布局要点
- 功率回路最小化:
- 每个开关管配置独立退耦电容
- 采用叠层母排设计
- 地平面分割:
- 数字地、模拟地、功率地单点连接
- 光耦隔离电源跨接100nF电容
- 关键信号走线:
- 驱动信号采用双绞线
- 电流采样走差分对
6.2 滤波器设计
输入EMI滤波器参数计算示例:
c复制// 已知开关频率50kHz,需要衰减到150kHz以下
float fc = 150000; // 截止频率
float L = 50e-6; // 假设电感值
float C = 1/(4*PI*PI*fc*fc*L); // 计算得约2.2uF
实际采用两级共模电感(2×50μH)搭配X电容(1μF+0.47μF)的方案,在测试中满足CISPR 11 Class A要求。
7. 热管理设计
7.1 损耗估算
IGBT模块损耗组成:
- 导通损耗:P_cond = I_rms² × Rce
- 开关损耗:P_sw = (E_on + E_off) × f_sw
- 二极管损耗:P_d = Vf × If_avg
对于50kW系统:
c复制// 以Infineon FF450R12ME4为例
float P_cond = 75*75 * 0.012; // 约67.5W
float P_sw = (15e-3 + 10e-3) * 50000; // 1250W
float total_loss = (P_cond + P_sw) * 6; // 约7.9kW
这意味着需要至少5℃/W以下的热阻设计。
7.2 散热器选型
实测数据对比:
| 散热器类型 | 热阻(℃/W) | 重量(kg) | 适用风速(m/s) |
|---|---|---|---|
| 铝挤型 | 0.8 | 12 | 6 |
| 铲齿铜 | 0.5 | 18 | 4 |
| 热管阵列 | 0.3 | 15 | 3 |
最终选择热管阵列方案,配合双风扇冗余设计,实测温升控制在40K以内。
8. 代码架构设计建议
8.1 实时任务划分
推荐采用以下任务优先级:
- 保护中断(最高优先级)
- PWM更新(10kHz)
- PFC控制(5kHz)
- 移相控制(2kHz)
- 状态监控(1kHz)
FreeRTOS配置示例:
c复制xTaskCreate(PFC_Task, "PFC", 512, NULL, 4, NULL);
xTaskCreate(PSFB_Task, "PSFB", 512, NULL, 3, NULL);
xTaskCreate(Monitor_Task, "MON", 256, NULL, 2, NULL);
8.2 状态机设计
主控制状态机实现:
c复制typedef enum {
STATE_INIT,
STATE_STANDBY,
STATE_PRECHARGE,
STATE_RUN,
STATE_FAULT
} SysState;
void StateMachine_Update(void) {
static SysState state = STATE_INIT;
switch(state) {
case STATE_INIT:
if(HW_CheckOK()) state = STATE_STANDBY;
break;
case STATE_STANDBY:
if(Start_Cmd) state = STATE_PRECHARGE;
break;
// 其他状态转换...
}
}
在调试这套系统时,最深刻的体会是数字控制带来的灵活性优势。相比早期的模拟控制方案,我们可以通过修改软件参数快速优化系统响应。比如通过调整PFC电流环的带宽,轻松应对不同电网阻抗条件。但同时也对代码的实时性提出了严苛要求——一个未经优化的浮点运算都可能导致控制周期超时。
