3. 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芯片的频率配置寄存器(具体寄存器地址由芯片手册决定),即可完成轻载效率优化闭环。