电量计 -- 卡尔曼滤波在电池内部短路漏电流检测中的应用

卡尔曼滤波在电池漏电流检测中的应用

概述

本文档描述了在SD77428电池管理系统中使用卡尔曼滤波器来优化漏电流和短路电阻检测的实现方案。卡尔曼滤波器是一种递归式滤波算法,能够在噪声环境下对系统状态进行最优估计,特别适合处理电池参数这类动态变化且受测量噪声影响的数据。

原有滤波方案分析

原有的漏电流检测系统使用了以下滤波方法:

  1. 电压平均滤波:使用简单的移动平均滤波器处理电池电压
  2. 电阻中值滤波:使用排序后的中值滤波处理短路电阻
  3. 漏电流加权平均:基于偏差大小动态调整权重的加权平均算法

这些方法在一定程度上可以抑制噪声,但存在以下局限性:

  • 不考虑系统动态特性
  • 对异常值处理机制简单
  • 没有综合考虑测量噪声和系统噪声
  • 参数调整不够灵活

卡尔曼滤波器原理

卡尔曼滤波器基于以下模型:

  1. 状态方程:$x_k = Ax_{k-1} + Bu_k + w_k$
  2. 观测方程:$z_k = Hx_k + v_k$

其中:

  • $x_k$ 是系统状态
  • $z_k$ 是测量值
  • $w_k$ 是系统噪声
  • $v_k$ 是测量噪声

在我们的应用中,使用了简化的一维卡尔曼滤波器:

  • 状态变量:漏电流或短路电阻
  • 状态转移矩阵 A = 1(假设状态在短时间内保持不变)
  • 观测矩阵 H = 1(直接观测状态)
  • 系统噪声协方差 Q(表示状态变化速度)
  • 测量噪声协方差 R(表示测量精度)

卡尔曼滤波器实现

数据结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef struct {
/* 状态变量 */
float x; /* 当前状态估计 */
float p; /* 当前状态不确定性/协方差 */

/* 滤波器参数 */
float q; /* 过程噪声协方差 */
float r; /* 测量噪声协方差 */

/* 滤波器限制 */
float min_value; /* 最小允许值 */
float max_value; /* 最大允许值 */

/* 自适应参数 */
float adapt_rate; /* 滤波器适应变化的速率 (0-1) */
uint8_t init; /* 初始化标志 */
} KalmanFilter;

滤波器算法

卡尔曼滤波器的核心算法包括预测和更新两个步骤:

  1. 预测步骤

    1
    filter->p = filter->p + filter->q;
  2. 更新步骤

    1
    2
    3
    float k = filter->p / (filter->p + filter->r);
    filter->x = filter->x + k * (measurement - filter->x);
    filter->p = (1 - k) * filter->p;
  3. 自适应机制

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void kalman_adapt(KalmanFilter* filter, float measurement)
    {
    float deviation = fabsf(measurement - filter->x);
    float normalized_deviation = deviation / (filter->max_value - filter->min_value);

    if (normalized_deviation > 0.2f) {
    /* 高偏差 - 增加测量噪声(减少对测量的信任) */
    filter->r = filter->r * (1.0f + filter->adapt_rate);
    } else if (normalized_deviation < 0.05f) {
    /* 低偏差 - 减少测量噪声(增加对测量的信任) */
    filter->r = filter->r * (1.0f - filter->adapt_rate * 0.5f);
    }
    }

集成到漏电流检测系统

卡尔曼滤波器被集成到fd_isrw1_update函数中,用于处理漏电流和短路电阻:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 应用卡尔曼滤波 */
if (s_kalman_filter_enabled) {
/* 对漏电流应用卡尔曼滤波 */
filtered_leak_current = (int16_t)kalman_update(&s_leak_current_filter, (float)final_leak_current);

/* 基于测量质量调整滤波器参数 */
kalman_adapt(&s_leak_current_filter, (float)final_leak_current);

/* 使用滤波后的电流重新计算电阻 */
if (filtered_leak_current > 0) {
filtered_resistance = params.voltage / filtered_leak_current;
}

/* 对电阻应用卡尔曼滤波 */
filtered_resistance = (uint16_t)kalman_update(&s_resistance_filter, (float)filtered_resistance);

/* 基于测量质量调整滤波器参数 */
kalman_adapt(&s_resistance_filter, (float)filtered_resistance);
}

卡尔曼滤波器参数配置

为了获得最佳性能,可以根据实际应用场景调整卡尔曼滤波器参数:

  1. 漏电流滤波器

    • 过程噪声 Q = 0.5(漏电流可能会缓慢变化)
    • 测量噪声 R = 5.0(测量值有一定噪声)
    • 取值范围:-1000 ~ 1000 mA
  2. 短路电阻滤波器

    • 过程噪声 Q = 0.1(电阻变化较慢)
    • 测量噪声 R = 10.0(电阻计算受多个因素影响,噪声较大)
    • 取值范围:20 ~ 1000 ohm

性能对比

卡尔曼滤波器相比原有滤波方法的优势:

  1. 更平滑的输出:减少了数据跳变,提供更稳定的估计值
  2. 更好的噪声抑制:综合考虑系统噪声和测量噪声
  3. 自适应能力:能够根据测量质量动态调整滤波参数
  4. 快速响应:在保持稳定的同时能够快速响应真实变化
  5. 参数可调:提供了灵活的参数调整接口,适应不同应用场景

使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 初始化ISRW1和卡尔曼滤波器 */
fd_isrw1_init();

/* 配置漏电流滤波器 */
fd_isrw1_configure_leak_current_filter(0.5f, 5.0f, -1000.0f, 1000.0f);

/* 配置短路电阻滤波器 */
fd_isrw1_configure_resistance_filter(0.1f, 10.0f, 20.0f, 1000.0f);

/* 启用卡尔曼滤波 */
fd_isrw1_enable_kalman_filter(true);

/* 更新检测 */
fd_isrw1_update();

/* 获取滤波后的值 */
int16_t filtered_current = fd_isrw1_get_filtered_leak_current();
uint16_t filtered_resistance = fd_isrw1_get_filtered_resistance();

结论

卡尔曼滤波器在电池漏电流和短路电阻检测中的应用,显著提高了测量的稳定性和可靠性。通过合理配置滤波器参数,可以在保持快速响应的同时有效抑制噪声,提高电池短路检测的准确性。

该方案易于集成到现有系统中,并提供了灵活的配置接口,可根据实际应用场景进行优化调整。