4. 电流采样与安时积分工程实现

安时积分法的数学形式极其简单:SOC(t) = SOC₀ − (1/Cₙ)∫η·I(t)dt。但在工程上,这条公式的精度几乎完全由电流采样链路决定。电流通道的零点漂移、量程误差、采样时刻与电压/温度采样的错位,都会以“积分累积”的方式被放大——一个 50 mA 的恒定偏置,在 100 Ah 电池上持续 24 小时就会带来约 1.2% 的 SOC 误差。因此本节的重点不是公式本身,而是把公式落到分流器/霍尔传感器选型、采样同步、离散积分和漂移抑制这条完整链路上。

一、传感器选型:分流器与霍尔的分工

分流器是毫欧级精密电阻,电流在其上产生压降,经隔离或非隔离放大器送入 ADC。它的优点是零漂小、线性度好、成本低、不受外部磁场干扰;缺点是高压侧需要隔离或高共模抑制的放大电路,且大电流下自身发热会引起阻值漂移。霍尔传感器分闭环(磁平衡)与开环两类,闭环霍尔零漂和线性度接近分流器,且天然隔离、无插入损耗,但成本高、对安装位置和外部磁场敏感,长期存在零点温漂。

选型时先确定三个参数:量程、精度、带宽。以 100 Ah 储能簇为例,若持续电流 50 A、峰值 150 A,分流器可选 0.5 mΩ/200 A 规格,满量程压降 100 mV,配合 ±50 mV 或 ±100 mV 输入的 16 位 ADC,1 LSB 对应约 200 A/65536 ≈ 3 mA,分辨率足够。若采用闭环霍尔,选 ±200 A 量程、输出 ±4 V、零点 2.5 V 的型号,同样 16 位 ADC 下 1 LSB 约 6 mA。两者都能满足 1% 以内的积分精度,差别在于隔离需求、成本与温漂特性。

选型判断:低压小容量、成本敏感、需要高精度零漂 → 分流器;高压大电流、需要电气隔离、安装空间受限 → 闭环霍尔。开环霍尔仅适合精度要求不高的辅助监测。

二、采样同步:让电流与电压落在同一时刻

安时积分只对电流积分,但 SOC 修正、内阻计算、功率限值判断都依赖电流与电压的同步。若电流采样比电压晚 1 ms,在 100 A/ms 的脉冲工况下,功率计算误差可达 10%。工程上常用两种同步方式:一是用同一颗 ADC 的多通道扫描,由硬件触发保证通道间固定延迟;二是用定时器触发 ADC 转换,电流与电压通道在同一触发沿启动,软件按固定顺序读取。

更关键的是积分周期与采样周期的关系。若采样周期 Tₛ = 10 ms,积分周期也取 10 ms,则每个采样点直接累加;若积分周期为 100 ms,则应对 10 个采样点做平均后再累加,避免单点噪声被直接积分。推荐做法是:ADC 以 1 kHz 采样电流,每 10 个点求平均得到 100 Hz 的积分输入,既抑制工频干扰,又保留足够的动态响应。

电流采样与安时积分信号链 分流器/霍尔 I → V 转换 放大 + 抗混叠 RC 低通 / 隔离 同步 ADC 定时器触发采样 数字滤波 10 点滑动平均 安时积分 Σ I·Δt / Cₙ SOC 输出 + 漂移抑制 静置/小电流时零点校准反馈 R=0.5 mΩ 增益=50 16 bit / 1 kHz Tₛ=10 ms 关键约束:电流与电压同触发采样 · 积分周期与滤波窗口对齐 · 零点漂移需周期性校准

三、离散积分算法与代码框架

连续积分在 MCU 中必须离散化。设采样周期 Tₛ,第 k 个采样点的电流为 Iₖ,则安时积分的递推形式为:

SOC[k] = SOC[k-1] - (η · I[k] · Ts) / (Cn · 3600)

其中 I 以 A 为单位,Tₛ 以 s 为单位,Cₙ 以 Ah 为单位,除以 3600 是把秒换算成小时。充电时 I 取正、放电取负,或反之,必须在全工程中统一约定。下面给出一个可直接嵌入 BMS 主循环的 C 语言框架,包含零点校准、滑动平均和积分限幅。

#define TS_SEC        0.01f      // 10 ms 积分周期
#define CN_AH         100.0f     // 额定容量 100 Ah
#define SOC_INIT      0.50f      // 上电初始 SOC
#define I_ZERO_LIMIT  0.05f      // 静置判定阈值 50 mA
#define I_ZERO_TIME   300         // 持续 3 s 判定静置

static float soc = SOC_INIT;
static float i_offset = 0.0f;    // 电流零点偏置
static float i_buf[10];
static int   buf_idx = 0;
static int   zero_cnt = 0;

float current_sample(void);      // 由 ADC 驱动提供,单位 A

void soc_integrate_step(void)
{
    float i_raw = current_sample();
    float i_cal = i_raw - i_offset;

    /* 10 点滑动平均,抑制工频与随机噪声 */
    i_buf[buf_idx] = i_cal;
    buf_idx = (buf_idx + 1) % 10;
    float i_avg = 0.0f;
    for (int n = 0; n < 10; n++) i_avg += i_buf[n];
    i_avg /= 10.0f;

    /* 静置零点校准:小电流持续 3 s 则更新偏置 */
    if (i_avg < I_ZERO_LIMIT && i_avg > -I_ZERO_LIMIT) {
        if (++zero_cnt >= I_ZERO_TIME) {
            i_offset = 0.7f * i_offset + 0.3f * i_raw;
            zero_cnt = 0;
        }
    } else {
        zero_cnt = 0;
    }

    /* 安时积分,充电为正、放电为负 */
    soc -= (i_avg * TS_SEC) / (CN_AH * 3600.0f);

    /* 限幅,防止积分溢出 */
    if (soc > 1.0f) soc = 1.0f;
    if (soc < 0.0f) soc = 0.0f;
}

这段代码的关键点有三处:一是滑动平均窗口与积分周期一致,避免重复积分;二是零点校准只在静置或小电流时进行,且采用一阶低通更新,防止把真实小电流误判为偏置;三是 SOC 限幅,避免长时间无修正导致数值越界。

四、漂移抑制与工程判断

漂移抑制不能只靠软件零点校准,还要从硬件和策略两层入手。硬件上,分流器应选用低温漂合金(如锰铜),霍尔应选闭环型并远离母排和接触器;软件上,除了静置校准,还可以利用充电末端和放电末端的电压平台做 SOC 回拉。例如,当单体电压达到 3.55 V 且充电电流小于 0.02C 时,可判定接近满充,将 SOC 缓慢拉向 100%;当放电至 2.8 V 且电流小于 0.02C 时,拉向 0%。回拉速率建议不超过 0.1%/min,避免 SOC 跳变影响功率策略。

判断积分是否正常,可以观察三个量:静置时 SOC 变化率应接近 0;恒流放电时 SOC 下降速率应等于 I/Cₙ;满充静置后 SOC 应稳定在 100% 附近。若静置时 SOC 持续缓慢下降,说明零点偏置未校准或校准阈值过严;若恒流放电时 SOC 下降偏快,应检查电流采样增益和 Tₛ 是否准确。把这些观察点纳入调试流程,才能让安时积分从公式变成可交付的工程实现。