
3kw开关电源单相PFC移相全桥直流电源原型机及其全套资料
这电源板子刚上电的时候,我盯着示波器上的波形看了足足五分钟——单相PFC和移相全桥这对组合
拳打出来,母线电压稳得像是用水泥浇筑的。3kW的功率密度下,输出纹波硬是压到了50mV以内,这波操作
必须得唠唠里面的门道。
先看PFC部分,数字控制的核心在电压环和电流环的配合。用STM32G4的HRTIM配置PWM时,重点在于
死区补偿和频率抖动:
```c
// HRTIM配置片段
hrtim1.Instance->sTimerxRegs[0].CMP1xR = 175; // 占空比设置
hrtim1.Instance->sTimerxRegs[0].DTxR |= (2 << 16); // 死区时间2*41ns
hrtim1.Instance->sTimerxRegs[0].CR2 |= HRTIM_CR2_DLLEN; // 启用频率抖动
```
这段骚操作把开关频率在95kHz附近±5%范围内抖动,实测EMI传导骚扰直降6dB。注意CMP1xR寄存器
值的动态调整,配合电压环PID输出实时改变占空比,后面ADC采样母线电压的代码里必须做滑动平均滤波
,不然电流过零处会出现蜜汁震荡。
移相全桥的驱动时序是另一个重头戏。用互补PWM配合相位偏移实现ZVS,关键要看准谐振点。调测
时用GPIO抓取的驱动波形必须满足这种相位关系:
```
[PWM1] |**** |**** |****
[PWM2] | ****| ****|
[PWM3] |**** |**** |
[PWM4] | ****| ****|
```
代码里用HRTIM的相位加载寄存器实现微秒级精度的移相:
```c
hrtim1.Instance->sTimerxRegs[2].PERxR = period;
hrtim1.Instance->sTimerxRegs[2].PHxR = phase_shift;
```
调试时发现个坑:当负载突变超过30%时,移相量需要动态调整。后来在中断服务程序里加了负载率
查表法,用线性插值计算相位补偿量才稳住波形。
通讯模块玩的是Modbus RTU over RS485,但加了点私货——用DMA+空闲中断实现的双缓冲机制: