基于 STM32 的数字控制实现双向 DC-DC 电源

双向 DC-DC 电源(Bidirectional DC-DC Converter)是一种能够在两个直流电压等级之间进行能量双向流动的电力电子变换装置。它集升压(Boost)和降压(Buck)功能于一体,广泛应用于新能源储能系统、电动汽车、电池化成设备以及 UPS 系统中。


一、 核心工作原理与分类

双向 DC-DC 的核心思想是:同一电路既能实现 Buck(高压向低压供电),又能实现 Boost(低压向高压回馈能量)
根据输入输出之间是否有电气隔离,主要分为两大类:

1. 非隔离型双向 DC-DC

2. 隔离型双向 DC-DC


二、 主流拓扑详解

1. 双向同步 Buck-Boost(12V/24V 与 48V 系统互转)

这种拓扑相当于把两个同步整流 Buck 电路背靠背连在一起,共用一个电感。

2. 双有源桥 DAB(高压动力电池与低压辅助电源)

DAB 是目前中大功率隔离型双向电源的绝对主力。


三、 核心控制

双向电源的难点不在于硬件拓扑,而在于如何平滑、稳定地在双模式间切换

  1. 电压电流双闭环控制

    • 外环(电压环):维持一侧母线的电压稳定(例如保持低压侧 12V 母线恒定)。
    • 内环(电流环):快速跟踪电流指令,限制电感电流,实现恒流充电或放电。
    • 模式切换:当外环输出的电流参考值为正时,系统工作在 Boost 模式;为负时,工作在 Buck 模式。通过模拟电路或数字算法可以无缝切换。
  2. 移相控制 (Phase-Shift Control)

    • 主要用于 DAB 拓扑。通过调节单移相 (SPS)、扩展移相 (EPS) 或双移相 (DPS) 来控制传输功率。
    • 目标是在全负载范围内实现所有开关管的 ZVS(零电压软开关),最大限度提升效率。

四、 基于 STM32 的数字控制实现

现代双向 DC-DC 几乎全部采用 数字控制(DSP 或 MCU),因为模拟控制难以实现复杂的保护逻辑和灵活的模式切换。结合你之前对 STM32 和电机控制的兴趣,使用 STM32G4 系列(内置高精度定时器 HRTIM 和运放比较器)或 STM32F3/H7 系列 是绝佳选择。

1. 硬件架构设计

2. 核心软件逻辑 (STM32 固件)

// 伪代码:双向 Buck-Boost 数字控制主循环
void main() {
    HAL_Init();
    SystemClock_Config();
    MX_ADC1_Init();       // 初始化 ADC 采样电压电流
    MX_HRTIM1_Init();     // 初始化高精度定时器产生 PWM
    MX_COMP_Init();       // 初始化比较器用于硬件过流保护
    
    // 启用 ADC 注入组中断(用于峰值电流模式控制)
    HAL_ADCEx_InjectedStart_IT(&hadc1); 
    
    while (1) {
        // 1. 读取传感器数据 (通过 DMA 或中断)
        float v_high = Read_High_Voltage();
        float v_low = Read_Low_Voltage();
        float i_indutor = Read_Inductor_Current();
        
        // 2. 模式判定与状态机
        // 例:高压母线电压掉电 -> 切换到 Buck 模式,由低压电池给高压端供电
        if (v_high < V_HIGH_MIN_THRESHOLD) {
            power_mode = BUCK_MODE;
        } 
        // 例:高压母线电压正常且有富余 -> 切换到 Boost 模式,给低压电池充电
        else if (v_high > V_HIGH_MAX_THRESHOLD && v_low < V_LOW_FULL) {
            power_mode = BOOST_MODE;
        }
        
        // 3. 双闭环 PID 计算
        float voltage_error = target_voltage - v_low;
        float current_ref = PI_Voltage_Loop(voltage_error);
        
        float current_error = current_ref - i_indutor;
        float pwm_duty = PI_Current_Loop(current_error);
        
        // 4. 更新 PWM 占空比 (根据模式选择控制 Q1 或 Q2)
        if (power_mode == BUCK_MODE) {
            HRTIM_SlaveSetCompare(BUCK_TIMER, BUCK_CHANNEL, pwm_duty);
        } else {
            HRTIM_SlaveSetCompare(BOOST_TIMER, BOOST_CHANNEL, pwm_duty);
        }
        
        HAL_Delay(1); // 控制环路频率 1kHz - 10kHz
    }
}

// ADC 中断回调:实现峰值电流模式控制或快速保护
void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef *hadc) {
    float current = HAL_ADC_GetValue(hadc);
    if (current > OVER_CURRENT_LIMIT) {
        // 硬件级别的快速关断 PWM
        HRTIM_WaveformOutputStop(&hhrtim1, HRTIM_OUT_MASK_ALL); 
    }
}

参考代码 双向DCDC电源 www.youwenfan.com/contentcsu/70211.html

五、 总结与选型建议

专注于matlab/simulink,电子电路,编程