1. 项目概述:48V90A移相全桥数字电源开发实录
去年接手了一个工业电源项目,要求将400V直流母线转换为48V/90A输出,效率必须达到93%以上。经过多轮方案对比,最终选择了移相全桥拓扑搭配中心抽头整流的架构。这个选择背后有几个关键考量:首先,移相控制能实现软开关,大幅降低MOS管的开关损耗;其次,中心抽头整流结构简单可靠,特别适合大电流输出场合。
整个项目最核心的挑战在于数字控制算法的实现。我们使用STM32G474RE作为主控芯片,这颗MCU的高分辨率定时器(HRTIM)简直就是为移相控制量身定制的。在PSIM仿真环境中搭建的模型,可以直接将C++20编写的控制算法嵌入到仿真模块中,这种"模型在环"的开发方式极大提高了调试效率。
特别提醒:大功率电源设计必须考虑散热问题,我们实测发现当输出电流超过70A时,整流二极管的温升会明显加快,建议预留至少30%的散热余量。
2. 硬件拓扑设计与关键参数计算
2.1 移相全桥拓扑选择依据
为什么不用普通的全桥或者半桥?这里有个效率账要算:在400V输入、48V/90A输出的场景下,传统硬开关拓扑的损耗主要来自:
- 开关损耗:约占总损耗的40%
- 导通损耗:约35%
- 驱动损耗:约25%
而移相全桥通过谐振实现ZVS(零电压开关),可以将开关损耗降低到5%以内。我们实测的损耗分布对比如下:
| 损耗类型 | 硬开关全桥 | 移相全桥 |
|---|---|---|
| 开关损耗 | 38W | 4.2W |
| 导通损耗 | 33W | 30W |
| 驱动损耗 | 21W | 18W |
| 总损耗 | 92W | 52.2W |
2.2 变压器设计要点
主变压器采用PQ3230磁芯,这是经过多次迭代后的最优选择。关键参数计算过程如下:
-
原边匝数计算:
Np = (Vin_max × Dmax × 10⁸) / (4 × fsw × Bmax × Ae)
= (400 × 0.45 × 10⁸) / (4 × 100kHz × 1800G × 1.61cm²)
≈ 15.5匝 → 取16匝 -
副边匝数计算:
Ns = (Vout + Vf) × Np / (Vin_min × Dmax × η)
= (48 + 0.7) × 16 / (320 × 0.45 × 0.94)
≈ 6.1匝 → 取6匝 -
线径选择:
原边电流有效值Ip_rms = Pout / (η × Vin_min) ≈ 90A×48V / (0.94×320V) ≈ 14.3A
选用4股0.5mm直径的利兹线并联绕制
实测发现:当工作频率超过120kHz时,集肤效应导致的附加损耗会明显增加,建议将频率控制在100kHz左右为最佳平衡点。
3. 数字控制算法实现
3.1 移相控制死区补偿
死区时间是移相全桥最敏感的参数之一,我们开发了动态补偿算法。核心逻辑用C++20实现如下:
cpp复制struct DeadTimeConfig {
int32_t base_ns;
int32_t max_compensation;
float slope_factor;
};
auto adaptive_deadtime(const DeadTimeConfig& cfg, float phase_shift)
{
static float last_phase = 0;
const float delta = phase_shift - last_phase;
last_phase = phase_shift;
const float compensation = std::clamp(
cfg.slope_factor * std::abs(delta),
0.0f, static_cast<float>(cfg.max_compensation));
return (delta > 0) ? cfg.base_ns + static_cast<int32_t>(compensation)
: cfg.base_ns - static_cast<int32_t>(compensation);
}
这个实现有几个关键改进:
- 使用C++20的
std::clamp确保补偿量在安全范围内 - 通过斜率因子(slope_factor)灵活调整补偿强度
- 采用模板化设计方便在不同MCU平台移植
3.2 双闭环控制策略
电压外环采用改进型PID算法,加入了抗积分饱和和微分滤波:
cpp复制class VoltagePID {
public:
VoltagePID(float Kp, float Ki, float Kd, float Ts)
: Kp(Kp), Ki(Ki), Kd(Kd), Ts(Ts) {}
float update(float setpoint, float feedback) {
const float error = setpoint - feedback;
// 抗积分饱和处理
integral += Ki * error * Ts;
integral = std::clamp(integral, -i_limit, i_limit);
// 带滤波的微分项
derivative = (error - last_error) / Ts;
derivative = lpf.update(derivative);
last_error = error;
return Kp * error + integral + Kd * derivative;
}
private:
float Kp, Ki, Kd, Ts;
float integral = 0;
float last_error = 0;
float i_limit = 100.0f; // 积分限幅
LowPassFilter lpf{10000}; // 10kHz截止频率
};
电流内环采用模糊控制,规则表的设计特别关键。我们通过实验确定了最优规则:
| 误差等级 | 误差变化率 | 输出调整 |
|---|---|---|
| 大正 | 正 | 大幅减小 |
| 中正 | 零 | 小幅减小 |
| 小正 | 负 | 微调保持 |
| 零 | 任意 | 保持 |
| 小负 | 正 | 微调保持 |
| 中负 | 零 | 小幅增加 |
| 大负 | 负 | 大幅增加 |
4. PSIM仿真技巧与实测对比
4.1 仿真模型搭建要点
在PSIM中搭建移相全桥模型时,有几个关键设置需要注意:
- 开关器件模型要选择带有导通电阻和结电容的型号
- 变压器参数必须包括漏感和绕组电阻
- 控制环路采样延迟必须与实际硬件一致
我们使用的仿真参数配置如下:
text复制[Power Stage]
Switching Frequency = 100kHz
Dead Time = 150ns
MOSFET Rds(on) = 22mΩ
Diode Vf = 0.7V
[Control]
Voltage Loop Bandwidth = 2kHz
Current Loop Bandwidth = 10kHz
ADC Resolution = 12bit
PWM Resolution = 1ns
4.2 实测与仿真对比
在满载90A输出时,实测数据与仿真结果的对比:
| 参数 | 仿真值 | 实测值 | 偏差 |
|---|---|---|---|
| 效率 | 94.1% | 93.7% | 0.4% |
| 输出电压纹波 | 120mV | 150mV | 25% |
| 动态响应时间 | 280μs | 320μs | 14% |
偏差主要来自:
- PCB布局的寄生参数未在仿真中完全体现
- 实际MOS管的开关速度比模型略慢
- 环境温度对器件参数的影响
5. 工程实践中的坑与经验
5.1 电流采样噪声抑制
在大电流应用中,采样噪声是常见问题。我们总结出三板斧:
- 采用四线制电流传感器,避免地回路干扰
- 在ADC前端加入二阶低通滤波(截止频率设为开关频率的1/10)
- 软件上采用移动平均+中值滤波的组合算法
滤波算法的C++实现示例:
cpp复制template<size_t N>
class CurrentFilter {
public:
float update(float sample) {
buffer[ptr] = sample;
ptr = (ptr + 1) % N;
// 中值滤波
auto temp = buffer;
std::nth_element(temp.begin(), temp.begin() + N/2, temp.end());
float median = temp[N/2];
// 移动平均
float sum = std::accumulate(buffer.begin(), buffer.end(), 0.0f);
return 0.7f * median + 0.3f * (sum / N);
}
private:
std::array<float, N> buffer{};
size_t ptr = 0;
};
5.2 热管理设计
在连续满载测试中,我们发现以下器件温升最明显:
- 整流二极管:最高达到102℃
- 主变压器:88℃
- 功率MOS管:75℃
改进措施:
- 整流管改用并联的SiC肖特基二极管,温降达20℃
- 变压器增加铜散热片
- MOS管散热器涂覆高性能导热硅脂
实测证明,这些改进使系统在40℃环境温度下仍能持续输出90A电流。
6. 数字控制的高级优化
6.1 基于C++20的实时控制优化
利用C++20的新特性,我们重构了控制代码:
cpp复制// 使用concept约束算法类型
template<typename T>
concept Controller = requires(T t, float sp, float fb) {
{ t.update(sp, fb) } -> std::convertible_to<float>;
};
// 通用控制环路实现
template<Controller VoltageCtrl, Controller CurrentCtrl>
class DualLoop {
public:
float update(float v_set, float v_fb, float i_fb) {
const float i_set = voltage_ctrl.update(v_set, v_fb);
return current_ctrl.update(i_set, i_fb);
}
private:
VoltageCtrl voltage_ctrl;
CurrentCtrl current_ctrl;
};
这种设计带来了三个优势:
- 算法实现与硬件平台解耦
- 方便进行单元测试
- 支持热替换控制算法
6.2 在线参数整定
开发了基于串口命令的参数整定接口:
cpp复制struct ParamPacket {
uint16_t crc;
float kp;
float ki;
float kd;
uint32_t timestamp;
};
void handle_parameter_update(const std::span<uint8_t> data) {
if(data.size() != sizeof(ParamPacket)) return;
auto packet = std::bit_cast<ParamPacket>(data);
if(verify_crc(packet)) {
pid.set_parameters(packet.kp, packet.ki, packet.kd);
last_update = packet.timestamp;
}
}
配合Python上位机工具,可以实现不重启电源的情况下实时调整PID参数,大大缩短了调试时间。