2. 电池测试与数据采集:充放电测试规程与高精度数据采集

大家好,我是你们的老朋友。今天咱们聊聊电池建模里最基础、也最容易翻车的一环——测试与数据采集。

说实话,我见过太多人模型建得花里胡哨,结果一上实测数据就崩了。为什么?因为数据本身就有问题。你想想看,垃圾数据喂进去,再牛的算法也白搭。所以这一章,咱们把测试规程和数据采集的坑,一个一个填平。

2.1 充放电测试规程:别让测试方案毁了你的模型

电池测试不是随便充放电就完事了。我个人习惯,在开始任何建模项目前,先花半天把测试方案写清楚。这步省了,后面全是泪。

2.1.1 恒流充放电(CC)

这是最基础的测试。说白了,就是用固定电流把电池充满,再放空。但这里有个细节——电流大小怎么选?

  • 标准电流:通常用 0.5C 或 1C。比如 100Ah 的电池,0.5C 就是 50A。
  • 小电流测试:0.05C 或 0.1C,用来测真实容量。我习惯在建模前先跑一遍 0.05C 的完整充放电,拿到基准容量。
  • 大电流测试:2C、3C 甚至更高,主要看电池的倍率特性。

关键点:恒流阶段必须记录电压、电流、温度三个信号。缺一个,后面参数辨识就缺一条腿。

2.1.2 恒压充放电(CV)

恒压充电,就是电压到了截止值后,保持电压不变,电流自然下降。这个阶段对数据采集要求很高。

我曾经在项目里遇到过,恒压阶段电流从几十安降到几十毫安,如果采集精度不够,那段数据基本是废的。所以,我建议恒压阶段至少用 1mA 精度的电流传感器。

2.1.3 脉冲充放电测试

脉冲测试是参数辨识的核心。为什么?因为电池的动态特性,只有通过脉冲才能激出来。

标准脉冲测试规程(我个人常用的):

  1. 先静置 1 小时,让电池达到平衡。
  2. 然后放一个 10 秒的放电脉冲,电流 1C。
  3. 再静置 40 秒,观察电压回弹。
  4. 重复,直到 SOC 从 100% 降到 0%。

我的小技巧:脉冲宽度别太短,10 秒以上才能看到明显的极化效应。太短了,数据里全是噪声。

2.2 高精度数据采集要求:精度不够,模型白做

数据采集,说白了就是给电池「把脉」。脉把不准,后面开药方全是错的。

2.2.1 采样频率

很多人觉得采样率越高越好。其实不是。我见过有人用 1000Hz 采电池数据,结果文件巨大,处理起来慢得要死,而且大部分数据是冗余的。

我的建议:

  • 稳态测试(恒流、恒压):1Hz 就够了。
  • 脉冲测试:10Hz 到 100Hz。因为电压回弹的前几秒变化很快,采样率低了会丢失关键信息。
  • 动态工况测试:10Hz 足够。

2.2.2 精度与分辨率

这里有个常见的坑:分辨率不等于精度。分辨率是 ADC 能分辨的最小变化,精度是实际值与测量值的偏差。

参数 推荐指标 说明
电压精度 ±1mV 低于这个,OCV-SOC 曲线根本辨识不准
电流精度 ±0.1% FS 特别是小电流阶段,精度不够会引入巨大误差
温度精度 ±0.1°C 温度对参数影响很大,别忽视

避坑指南:我曾经用过一个号称 16 位的采集卡,结果实际有效位数只有 12 位。所以,买设备时一定要看有效位数(ENOB),别被位数忽悠了。

2.3 传感器噪声与滤波预处理:数据清洗是门手艺

数据采回来了,但里面全是噪声。怎么办?滤波。

但滤波不是随便套个低通滤波器就完事了。我见过有人把有用的动态信息也滤掉了,结果模型参数全偏了。

2.3.1 噪声来源

  • 传感器自身噪声:热噪声、量化噪声。
  • 电磁干扰:特别是大电流测试时,电缆周围的磁场会耦合到信号线上。
  • 接触电阻变化:接线端子松动,数据就会跳变。

2.3.2 滤波策略

我的习惯是分两步走:

  1. 硬件滤波:在采集前端加一个截止频率 10Hz 的低通滤波器。先把高频噪声干掉。
  2. 软件滤波:数据采集后再做一次数字滤波。

软件滤波,我推荐用 移动平均滤波Savitzky-Golay 滤波。前者简单,后者能保留信号的形状。

下面是我常用的 Python 代码片段:

import numpy as np
from scipy.signal import savgol_filter

def filter_battery_data(voltage, current, window=11, order=3):
    """
    对电池电压和电流进行 Savitzky-Golay 滤波
    window: 窗口长度,必须是奇数
    order: 多项式阶数
    """
    v_filtered = savgol_filter(voltage, window, order)
    i_filtered = savgol_filter(current, window, order)
    return v_filtered, i_filtered

注意:窗口长度别太大。我一般用 11 或 15。太大了,脉冲的尖峰会被抹平,参数辨识就失真了。

2.3.3 异常值处理

数据里偶尔会有跳变点,比如接触不良导致的瞬间电压突变。这种点必须剔除。

我的做法是:用 3σ 准则。计算数据的均值和标准差,超出均值 ±3σ 的点直接扔掉,然后用插值补上。

def remove_outliers(data, threshold=3):
    mean = np.mean(data)
    std = np.std(data)
    z_scores = np.abs((data - mean) / std)
    data_clean = np.where(z_scores > threshold, np.nan, data)
    # 用线性插值填充 NaN
    data_clean = np.interp(np.arange(len(data)), 
                           np.where(~np.isnan(data_clean))[0], 
                           data_clean[~np.isnan(data_clean)])
    return data_clean

2.4 总结:数据是模型的基石

嗯,这一章内容不少。总结下来就三句话:

  • 测试规程要规范,脉冲测试是核心。
  • 采集精度要够,别在源头上省钱。
  • 滤波要适度,别把信号滤没了。

下一章,咱们开始讲参数辨识的具体方法。到时候你会发现,数据质量直接决定了辨识结果的可靠性。所以,这一章的内容,值得你多花点时间。

好了,今天就到这里。有问题随时交流。