1. 三相PFC控制固件设计概述
这个三相无桥PFC控制固件是我在台达电子参与开发的工业级电源项目核心部分,基于NXP的MC56F84769VLL数字信号控制器实现。这个DSC芯片采用56800EX内核,主频100MHz,专为数字电源控制优化设计。固件实现了从采样、计算到PWM输出的全数字化控制闭环,在20kHz开关频率下达到了96%的峰值效率。
关键性能指标:
- 功率因数PF>0.99(230V输入,50%-100%负载范围)
- 总谐波失真THDi<3%(满足IEC61000-3-12标准)
- 全数字保护功能符合IEC/EN 61800-5-1安规要求
在实际工程中,我们采用了几个创新设计点:
- 双ADC队列同步采样架构,解决了传统单ADC采样带来的相位延迟问题
- αβ坐标系下的PR控制器设计,避免了旋转坐标系解耦的计算开销
- 动态MTPA和谐波注入算法,轻载时自动降低开关频率并优化磁件损耗
2. 硬件抽象层设计详解
2.1 时钟与电源管理
芯片时钟树配置是系统稳定性的基础。我们使用外部8MHz晶振通过PLL倍频到100MHz内核时钟,外设时钟分频到50MHz。这个配置经过多次实测验证:
- 100MHz主频可确保控制算法在100μs周期内完成
- 50MHz外设时钟平衡了eFlexPWM精度和EMI要求
低功耗模式设计也很关键:
c复制void EnterStandbyMode(void) {
CLOCK_SetFreq(kCLOCK_Core, 5MHz); // 降频至5MHz
PWM_DisableOutput(PWM1); // 关闭PWM输出
ADC_DisableInt(ADC12, kADC_Queue0InterruptEnable); // 禁用ADC中断
}
2.2 关键外设配置
2.2.1 ADC采样系统
采用ADC12模块的双队列并行采样:
- 队列0:三相电流信号(ANB1-ANB3)
- 队列1:母线电压和输入电压(ANA0-ANA2)
触发方式特别设计为PWM0_TRG0在占空比50%处触发,这个时点是电流纹波最小的时刻,采样最准确。我们在PCB布局时将电流采样走线控制在<10mm长度,避免引入额外噪声。
2.2.2 PWM输出配置
eFlexPWM模块配置要点:
c复制pwm_config_t pwmConfig = {
.prescale = kPWM_Prescale_Divide_1,
.clockSource = kPWM_BusClock,
.pairOperation = kPWM_Independent,
.deadtimeValue = 250, // 250ns死区时间
.reloadLogic = kPWM_ReloadPwmFullCycle,
.faultFilterCount = 3,
.faultFilterPeriod = kPWM_FaultFilterCount_3Clocks
};
PWM_Init(PWM1, &pwmConfig);
实际调试中发现:死区时间小于200ns会导致桥臂直通,大于300ns则会增加导通损耗。最终250ns是多次实验得出的最优值。
3. 控制算法实现
3.1 锁相环(SRF-PLL)设计
电网锁相采用基于同步参考坐标系(SRF)的PLL算法:
- 三相电压通过Clark变换到αβ坐标系
- 经Park变换到旋转dq坐标系
- PI调节器将Uq分量调节到0,得到精确的电网角度θ
算法实现关键点:
c复制void PLL_Update(float ua, float ub, float uc) {
// Clark变换
float alpha = 0.6667f * (ua - 0.5f*ub - 0.5f*uc);
float beta = 0.5774f * (ub - uc);
// Park变换
float ud = alpha * cos_theta + beta * sin_theta;
float uq = -alpha * sin_theta + beta * cos_theta;
// PI调节
pll_integral += ki_pll * uq;
float delta_theta = kp_pll * uq + pll_integral;
// 更新角度
theta += delta_theta * Ts;
if(theta > 6.283185f) theta -= 6.283185f;
}
3.2 电流环PR控制器
在αβ静止坐标系采用比例+谐振(PR)控制器,相比旋转坐标系的PI控制有几个优势:
- 无需进行dq解耦计算
- 对50Hz基波和150Hz谐波同时提供高增益
- 动态响应更快,计算量更小
谐振环节采用二阶IIR实现:
c复制typedef struct {
float b0, b1, b2;
float a1, a2;
float x1, x2; // 状态变量
} RESONANT_FILTER;
float PR_Update(RESONANT_FILTER *f, float input) {
float output = f->b0*input + f->b1*f->x1 + f->b2*f->x2
- f->a1*f->x1 - f->a2*f->x2;
f->x2 = f->x1;
f->x1 = input;
return output;
}
3.3 MTPA与谐波注入
轻载效率优化方案:
- 当负载<30%时,开关频率从20kHz降至10kHz
- 注入3次谐波电流,幅值为基波的15%
- 采用滞环比较防止频繁切换:
c复制if(load_current < 0.3*rated_current) {
if(!is_low_freq_mode && (++low_load_counter > 5)) {
SetPwmFrequency(10000); // 切换到10kHz
Enable3rdHarmonicInjection();
is_low_freq_mode = true;
}
} else {
if(is_low_freq_mode && (--low_load_counter < 0)) {
SetPwmFrequency(20000); // 恢复20kHz
Disable3rdHarmonicInjection();
is_low_freq_mode = false;
}
}
4. 保护机制实现
4.1 多级过流保护
采用硬件+软件双重保护策略:
- 硬件比较器(CMP):响应时间<50ns
- 比较电流采样信号与硬件阈值
- 直接拉低PWM故障引脚
- 软件RMS检测:每1ms计算一次
- 超过设定值立即封锁PWM
- 记录故障日志
保护阈值设置:
| 保护类型 | 阈值 | 响应时间 | 恢复方式 |
|---|---|---|---|
| 硬件保护 | 120% | <50ns | 手动复位 |
| 软件保护 | 110% | 1ms | 自动恢复 |
4.2 智能浪涌抑制
上电浪涌处理流程:
- 先闭合NTC旁路回路
- 延时3个电网周期后吸合主继电器
- 同时触发可控硅短暂导通,预充电容
- 电压达到300V后切入PWM软启动
c复制void SurgeProtection_Startup(void) {
GPIO_SetRelay(NTC_RELAY, ON); // 闭合NTC回路
Timer_Delay(60ms); // 等待3个周期
// 可控硅预充电
GPIO_SetTrigger(TRIAC_CTRL, ON);
PWM_SoftStart(10ms);
GPIO_SetTrigger(TRIAC_CTRL, OFF);
// 主继电器吸合
if(GetBusVoltage() > 300) {
GPIO_SetRelay(MAIN_RELAY, ON);
}
}
5. 软件架构设计
5.1 实时任务调度
采用三级任务调度机制:
- 高速任务(100μs):
- ADC采样完成中断触发
- 执行电流环计算
- 更新PWM占空比
- 中速任务(1ms):
- 定时器PIT0触发
- 电压环计算
- 保护逻辑处理
- 低速任务(10ms):
- 软件计数器触发
- 温度监测
- 风扇控制
任务优先级处理:
c复制void ADC12_IRQHandler(void) {
if(ADC_GetIntFlag(ADC12, kADC_Queue0CompleteFlag)) {
CurrentLoop_Update(); // 电流环最高优先级
PWM_UpdateDuty();
ADC_ClearIntFlag(ADC12, kADC_Queue0CompleteFlag);
}
}
5.2 状态机设计
系统运行状态机定义:
c复制typedef enum {
PFC_INIT = 0, // 初始化状态
PFC_PRECHARGE, // 预充电状态
PFC_SOFT_START, // 软启动状态
PFC_RUN, // 正常运行
PFC_FAULT, // 故障状态
PFC_STANDBY // 待机状态
} PFC_State_t;
状态转换采用"请求-确认"机制确保安全:
- 任何状态转换必须先发送请求
- 原状态完成清理工作后发送确认
- 新状态收到确认后才正式切换
6. 开发调试技巧
6.1 CodeWarrior优化配置
关键编译选项:
- 优化等级-O2:平衡代码大小和速度
- 启用"Aggressive DSP"选项:充分发挥DSC芯片性能
- 浮点运算使用硬件FPU:在project.prm中添加
code复制FP_OPTIONS = -fpu=vfpv3
6.2 实时调试方法
- JTAG调试配置:
c复制#define DEBUG_VAR __attribute__((section(".debug_var"), used)) volatile DEBUG_VAR float g_debugCurrent[3]; - 关键变量防优化:
c复制__attribute__((aligned(4))) volatile float g_busVoltage; - RAM导出分析:使用Data Capture Unit(DCU)实时记录波形
6.3 测试验证要点
- 稳态测试:
- 输入230Vac/50Hz,满载2.5kW运行
- 测量THDi、PF、效率等参数
- 动态测试:
- 使用电子负载进行0-100%阶跃
- 示波器捕捉母线电压波动
- 安规测试:
- 浪涌测试:±4kV差模,±6kV共模
- 绝缘耐压测试:输入-输出3000Vac/1min
7. 工程经验总结
在实际开发中,有几个特别值得注意的经验点:
-
ADC采样时序问题:
- 最初设计在PWM周期开始时采样,发现电流纹波导致采样误差大
- 改为在PWM占空比50%处采样后,THDi改善约1.5%
-
死区补偿策略:
- 未补偿时轻载效率下降明显
- 采用基于电流极性的死区补偿表后,轻载效率提升2%
-
控制参数整定顺序:
- 先调电流环带宽(目标1kHz左右)
- 再调电压环带宽(20-50Hz)
- 最后优化前馈系数
这个固件框架已经成功应用于多个工业电源项目,最大支持到5kW功率等级。对于想尝试数字电源开发的工程师,建议先从单相PFC入手,掌握基本控制原理后再扩展到三相系统。
