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 小时,让电池达到平衡。
- 然后放一个 10 秒的放电脉冲,电流 1C。
- 再静置 40 秒,观察电压回弹。
- 重复,直到 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 滤波策略
我的习惯是分两步走:
- 硬件滤波:在采集前端加一个截止频率 10Hz 的低通滤波器。先把高频噪声干掉。
- 软件滤波:数据采集后再做一次数字滤波。
软件滤波,我推荐用 移动平均滤波 或 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 总结:数据是模型的基石
嗯,这一章内容不少。总结下来就三句话:
- 测试规程要规范,脉冲测试是核心。
- 采集精度要够,别在源头上省钱。
- 滤波要适度,别把信号滤没了。
下一章,咱们开始讲参数辨识的具体方法。到时候你会发现,数据质量直接决定了辨识结果的可靠性。所以,这一章的内容,值得你多花点时间。
好了,今天就到这里。有问题随时交流。