DFCC动态FCC自适应补偿算法(一):算法原理与电池阻抗追踪

1. 问题背景:为什么需要 DFCC?

1.1 传统电量算法的局限

传统库仑计电量算法存在一个根本性矛盾:

  • FCC (Full Charge Capacity) 是电芯的”真实”满电容量
  • 实际使用中,FCC 会随着温度、老化、放电电流而变化
  • 固定的 FCC 参数无法适应这些变化

1.2 三大因素导致电量误差

因素 影响 传统方法
温度 低温下电芯可用容量显著降低 静态温度补偿表
电流大小 大电流放电时,实际可用容量更少(极化效应) 固定倍率补偿
老化 循环次数增加,容量衰减 固定 SOH 估算

1.3 DFCC 的核心思想

DFCC (Dynamic Full Charge Capacity) = 动态 FCC 自适应补偿

不依赖固定参数表,而是实时估算当前工况下的真实可用容量,自动调整 FCC


2. DFCC 三维查表表结构

2.1 为什么需要三维表?

电量精度受 温度电流SOC 三个因素共同影响:

1
DFCC = f(温度, 电流, SOC)
  • 温度 (Z轴):不同温度下电芯内阻不同
  • 电流 (Y轴):放电倍率影响极化效应
  • SOC (X轴):不同电量区间特性不同(满充段、平台段、放电末端)

2.2 表结构定义

1
2
3
4
5
6
7
// table.h
#define DFCC_X 80 // SOC 区间数 (X轴)
#define DFCC_Y 4 // 电流区间数 (Y轴)
#define DFCC_Z 4 // 温度区间数 (Z轴)

// DFCC 表
short DFCC_table[DFCC_Z][DFCC_Y][DFCC_X];

根据不同电芯类型(DATA_TYPE),表格维度可能不同:

DATA_TYPE XAxis DFCC_Y DFCC_Z 说明
0 (小米) 73 4 4 单节锂电
1028 (道格ZN139) 80 4 4 5000mAh×6=30000mAh
1026 (科立讯双节) 80 2 3 双节配置

2.3 查表边界

1
2
3
4
// 查表边界数组
short DFCC_XDATA[DFCC_X]; // SOC 边界,如 {0, 1, 2, ..., 99}
short DFCC_YDATA[DFCC_Y]; // 电流边界,如 {1000, 2000, 3000, 5000} mA
short DFCC_ZDATA[DFCC_Z]; // 温度边界,如 {-10, 0, 25, 40} ℃

3. DFCC 算法核心流程

3.1 触发条件

DFCC 更新不是随时进行的,需要满足特定条件:

1
2
3
4
5
6
7
8
9
10
11
12
// 触发条件
#define FG_DFCC_UPDATE_THMRANGE 20 // 最大温度变化,单位°C
#define FG_DFCC_UPDATE_MAXSOC 60 // 最大SOC阈值,单位%
#define FG_DFCC_UPDATE_SOCRANGE 50 // 最小SOC放电量,单位%

// 更新条件:温度变化 > 20°C 或 SOC 变化 > 60% 或 放电量 > 50%
if (温度变化 > FG_DFCC_UPDATE_THMRANGE
|| SOC变化 > FG_DFCC_UPDATE_MAXSOC
|| 累计放电量 > FG_DFCC_UPDATE_SOCRANGE)
{
// 触发 DFCC 更新
}

3.2 查表获取目标 DFCC

1
2
3
4
5
6
// 根据当前温度、电流、SOC 查表
int soc_idx = find_soc_index(current_soc); // SOC 区间
int curr_idx = find_current_index(current_ma); // 电流区间
int temp_idx = find_temp_index(current_temp); // 温度区间

int target_dfcc = DFCC_table[temp_idx][curr_idx][soc_idx];

3.3 平滑更新(防止跳变)

查表得到的 DFCC 不能直接使用,否则会导致电量”跳变”。需要渐进式更新

1
2
3
4
5
6
7
8
9
10
11
// 学习速率控制
#define FG_DFCC_LEARNRATIO 100 // 更新速率,单位100

// 计算更新量 = (目标DFCC - 当前DFCC) × 学习速率
int delta = (target_dfcc - current_dfcc) * FG_DFCC_LEARNRATIO / 100;

// 限制单次最大变化
if (delta > FG_DFCC_MAXRANGE) delta = FG_DFCC_MAXRANGE;
if (delta < -FG_DFCC_MAXRANGE) delta = -FG_DFCC_MAXRANGE;

current_dfcc += delta;

4. DFCC 与 SOC 的关系

4.1 SOC 计算公式

1
2
3
4
// 核心 SOC 计算
SOC = RC / DFCC × 100%

// 其中 RC (Remaining Capacity) = 上次充满时的FCC - 累计放电量

4.2 DFCC 更新对 SOC 的影响

当 DFCC 增大(充电后容量恢复):

1
2
旧: DFCC = 2800mAh, RC = 1400mAh → SOC = 50%
新: DFCC = 3000mAh, RC = 1500mAh → SOC = 50%

关键:RC 也需要同步更新,否则 SOC 会跳变。

4.3 防止 SOC 跳变

1
2
3
4
5
6
7
8
9
10
// 当 DFCC 更新时,同步更新 RC
if (dfcc_changed) {
// 保持当前 SOC 不变,反推新的 RC
RC = current_soc * new_dfcc / 100;

// 限制最大变化幅度
if (RC变化 > 安全阈值) {
RC变化 = 安全阈值;
}
}

5. 工程实现要点

5.1 参数配置结构体

1
2
3
4
5
6
7
8
9
10
typedef struct {
int l_fg_dfcc_learnratio; // 更新速率
int l_fg_dfcc_auto_maxthm; // 自动开启温度阈值
int l_fg_dfcc_auto_mincurrent; // 自动开启电流阈值
int l_fg_dfcc_minstep_th; // 最小步进值
int l_fg_dfcc_update_maxsoc; // 最大SOC变化
int l_fg_dfcc_update_socrange; // 最小放电量
int l_fg_dfcc_update_thmrange; // 最大温度变化
int l_fg_dfcc_maxrange; // 单次最大补偿范围
} LIB_FG_PARAM_T;

5.2 启用控制

1
2
3
4
5
6
typedef struct {
int l_fg_dfcc_auto_enable; // 自动切换使能
int l_fg_dfcc_enable; // DFCC使能
int l_fg_dfcc_discharge_enable; // 放电阶段DFCC使能
int l_fg_dfcc_charge_enable; // 充电阶段DFCC使能
} LIB_ENABLE_CFG_TYPE_T;

5.3 调试输出

1
2
3
4
5
6
7
8
9
// dfcc_debug.c
void print_dfcc_table(void) {
printf("\n=== DFCC Table Debug Output ===\n");
printf("\nSOC区间 (DFCC_XDATA):\n");
for (int i = 0; i < DFCC_X; i++) {
printf("%d ", DFCC_XDATA[i]);
}
// ... 打印完整表格
}

6. DFCC vs 传统方法对比

维度 传统固定参数 DFCC 自适应
温度补偿 静态温度表 实时查表 + 平滑更新
电流补偿 固定倍率 三维查表(温度×电流×SOC)
老化补偿 固定 SOH 动态学习
极端工况 误差大 自适应调整
参数依赖 需要精确标定 可基于一次循环自动学习

7. 小结

DFCC 算法的核心价值:

  1. 三维查表:综合考虑温度、电流、SOC 三个维度
  2. 渐进式更新:防止电量跳变,提高用户体验
  3. 自适应学习:不依赖精确的出厂标定参数
  4. 工程化设计:完善的触发条件、边界保护、调试接口

下一篇文章将介绍 DFCC 参数的实验室调校方法仿真验证流程


系列目录
01. DFCC算法原理与电池阻抗追踪(本文)
02. DFCC参数实验室调校与仿真验证
03. 库仑计SOC算法工程实现