3. DC-DC转换器轻载效率提升

DC-DC转换器轻载效率提升 学习卡片

任务定义

本案例针对BMS(电池管理系统)中DC-DC转换器在轻载(待机/休眠)工况下效率显著下降的问题,完成一项最小可复现的轻载效率优化实现。目标是通过引入脉冲频率调制(PFM)控制策略,使转换器在输出电流低于设定阈值时自动从PWM模式切换至PFM模式,从而降低开关损耗与静态功耗,提升轻载效率。案例交付内容包括:PFM/PWM模式切换控制逻辑的C代码实现、关键参数定义、运行验证方法及判定标准。

轻载效率问题与解决思路

BMS在休眠状态下,DC-DC转换器负载通常仅为微控制器待机电流(数十微安至数毫安)。若转换器持续工作于固定频率PWM模式,开关损耗与驱动损耗占主导,实际效率可能降至50%以下。PFM模式在轻载时通过降低开关频率、跳过不必要的开关周期来减少损耗。本案例实现一个滞回比较器逻辑:当输出电流低于I_PFM_THRESHOLD_LOW时进入PFM;当电流恢复至I_PFM_THRESHOLD_HIGH时退回PWM,滞回区间防止模式频繁切换。

核心代码实现

/* dc_dc_light_load.h */
#ifndef DC_DC_LIGHT_LOAD_H
#define DC_DC_LIGHT_LOAD_H

#include <stdint.h>
#include <stdbool.h>

/* 模式定义 */
typedef enum {
    DC_DC_MODE_PWM = 0,
    DC_DC_MODE_PFM = 1
} dc_dc_mode_t;

/* 轻载效率控制参数(根据具体DC-DC芯片数据手册调整) */
#define I_PFM_THRESHOLD_HIGH_MA   50.0f   /* 退出PFM的电流阈值(mA) */
#define I_PFM_THRESHOLD_LOW_MA    20.0f   /* 进入PFM的电流阈值(mA) */
#define PFM_MIN_FREQ_KHZ          25.0f   /* PFM最低开关频率(kHz) */
#define PWM_FREQ_KHZ              500.0f  /* PWM固定频率(kHz) */

/* 控制器状态结构 */
typedef struct {
    dc_dc_mode_t current_mode;
    float output_current_ma;      /* 当前输出电流采样值 */
    float pfm_frequency_khz;      /* 当前PFM频率 */
} dc_dc_light_load_ctrl_t;

/* 初始化控制器 */
void dc_dc_light_load_init(dc_dc_light_load_ctrl_t *ctrl);

/* 周期调用:输入最新电流采样值,更新工作模式与PFM频率 */
void dc_dc_light_load_update(dc_dc_light_load_ctrl_t *ctrl, float current_ma);

/* 获取当前目标开关频率(kHz) */
float dc_dc_light_load_get_sw_freq(const dc_dc_light_load_ctrl_t *ctrl);

#endif /* DC_DC_LIGHT_LOAD_H */
/* dc_dc_light_load.c */
#include "dc_dc_light_load.h"

void dc_dc_light_load_init(dc_dc_light_load_ctrl_t *ctrl)
{
    if (ctrl == NULL) return;
    ctrl->current_mode = DC_DC_MODE_PWM;
    ctrl->output_current_ma = 0.0f;
    ctrl->pfm_frequency_khz = PWM_FREQ_KHZ;
}

void dc_dc_light_load_update(dc_dc_light_load_ctrl_t *ctrl, float current_ma)
{
    if (ctrl == NULL) return;
    ctrl->output_current_ma = current_ma;

    switch (ctrl->current_mode) {
    case DC_DC_MODE_PWM:
        /* 电流低于低阈值 → 进入PFM */
        if (current_ma < I_PFM_THRESHOLD_LOW_MA) {
            ctrl->current_mode = DC_DC_MODE_PFM;
            /* PFM频率随负载线性降低,最低限制为PFM_MIN_FREQ_KHZ */
            float ratio = current_ma / I_PFM_THRESHOLD_LOW_MA;
            if (ratio > 1.0f) ratio = 1.0f;
            if (ratio < 0.1f) ratio = 0.1f;  /* 防止频率过低 */
            ctrl->pfm_frequency_khz = PWM_FREQ_KHZ * ratio;
            if (ctrl->pfm_frequency_khz < PFM_MIN_FREQ_KHZ) {
                ctrl->pfm_frequency_khz = PFM_MIN_FREQ_KHZ;
            }
        }
        break;

    case DC_DC_MODE_PFM:
        /* 电流高于高阈值 → 退回PWM */
        if (current_ma > I_PFM_THRESHOLD_HIGH_MA) {
            ctrl->current_mode = DC_DC_MODE_PWM;
            ctrl->pfm_frequency_khz = PWM_FREQ_KHZ;
        } else {
            /* 在PFM内动态调整频率 */
            float ratio = current_ma / I_PFM_THRESHOLD_LOW_MA;
            if (ratio > 1.0f) ratio = 1.0f;
            if (ratio < 0.1f) ratio = 0.1f;
            ctrl->pfm_frequency_khz = PWM_FREQ_KHZ * ratio;
            if (ctrl->pfm_frequency_khz < PFM_MIN_FREQ_KHZ) {
                ctrl->pfm_frequency_khz = PFM_MIN_FREQ_KHZ;
            }
        }
        break;

    default:
        ctrl->current_mode = DC_DC_MODE_PWM;
        ctrl->pfm_frequency_khz = PWM_FREQ_KHZ;
        break;
    }
}

float dc_dc_light_load_get_sw_freq(const dc_dc_light_load_ctrl_t *ctrl)
{
    if (ctrl == NULL) return PWM_FREQ_KHZ;
    return ctrl->pfm_frequency_khz;
}

测试驱动代码

/* test_light_load.c */
#include <stdio.h>
#include "dc_dc_light_load.h"

int main(void)
{
    dc_dc_light_load_ctrl_t ctrl;
    dc_dc_light_load_init(&ctrl);

    /* 模拟负载变化序列:100mA → 10mA → 30mA → 60mA */
    float test_currents[] = {100.0f, 10.0f, 30.0f, 60.0f};
    int num_tests = sizeof(test_currents) / sizeof(test_currents[0]);

    printf("=== DC-DC Light Load Efficiency Control Test ===\n");
    for (int i = 0; i < num_tests; i++) {
        dc_dc_light_load_update(&ctrl, test_currents[i]);
        printf("Iout=%6.1f mA | Mode=%s | Fsw=%7.1f kHz\n",
               test_currents[i],
               (ctrl.current_mode == DC_DC_MODE_PWM) ? "PWM" : "PFM",
               dc_dc_light_load_get_sw_freq(&ctrl));
    }
    return 0;
}

编译与运行

gcc -Wall -Wextra -o test_light_load test_light_load.c dc_dc_light_load.c
./test_light_load

验证方法与判定标准

运行测试程序后,观察输出序列。判定标准如下:

  • 当Iout=100mA时,模式为PWM,频率为500kHz;
  • 当Iout=10mA(低于20mA低阈值)时,模式切换为PFM,频率降至约50kHz(500×0.1=50,且高于25kHz下限);
  • 当Iout=30mA(介于20~50mA滞回区间内)时,保持PFM模式,频率约为150kHz;
  • 当Iout=60mA(高于50mA高阈值)时,模式退回PWM,频率恢复500kHz。

若输出与上述逻辑一致,则证明PFM/PWM滞回切换控制正确实现。实际BMS系统中,需将dc_dc_light_load_update()以固定周期(如1ms)调用,并将返回的sw_freq写入DC-DC芯片的频率配置寄存器(具体寄存器地址由芯片手册决定),即可完成轻载效率优化闭环。

PFM/PWM 滞回模式切换状态图 PWM 模式 Fsw = 500 kHz PFM 模式 Fsw = 25~500 kHz Iout < 20 mA 进入PFM Iout > 50 mA 退回PWM 滞回区间:20 mA ≤ Iout ≤ 50 mA 保持当前模式,防止频繁切换 PFM频率随负载线性调节:Fsw = 500 × (Iout/20) kHz 输入:ADC电流采样值 → dc_dc_light_load_update() 周期调用