2、电池测试与数据采集:充放电测试方案、数据采集系统搭建、采样频率与精度选择、数据预处理(滤波、去噪)

大家好,我是你们的老朋友。今天咱们聊聊电池建模里最“接地气”的一环——测试与数据采集。

说实话,很多工程师喜欢一上来就调算法、跑模型。但我个人的习惯是,先花80%的精力把测试方案和数据搞扎实。为什么?因为模型再漂亮,喂进去的是垃圾数据,出来的只能是垃圾结果。你想想看,是不是这个理?

2.1 充放电测试方案设计

测试方案不是随便充放电就完事了。它得服务于你的建模目标。比如你要建一个一阶RC模型,那测试工况和建一个电化学模型是完全不同的。

核心测试类型,我一般分这么几类:

  • 容量标定测试: 这是最基础的。以C/20或C/25的小电流恒流恒压充放电,测出电池的真实可用容量。注意,新电池和老化后的电池容量差很多,别偷懒只用出厂标称值。
  • 开路电压(OCV)测试: 测OCV-SOC曲线。关键是要“静置充分”。我记得有一次项目,为了赶进度,静置时间只给了1小时,结果OCV曲线全是毛刺,模型参数辨识出来根本没法用。后来我强制要求:低电流区间静置至少2小时,高电流区间至少1小时。
  • 混合脉冲功率特性(HPPC)测试: 这是参数辨识的“主食”。通过一系列充放电脉冲,激发出电池的欧姆内阻和极化效应。脉冲时长通常10秒,静置40秒。电流倍率建议从0.5C到2C,覆盖你实际应用的工况范围。
  • 动态工况测试: 比如UDDS、DST、FUDS等。这些用于验证你建好的模型在真实动态工况下的表现。说白了,就是“考试卷”。
我的小技巧: 做HPPC测试时,SOC点建议从100%到5%,每隔10%取一个点。但在低SOC区(20%以下),极化效应特别明显,我建议加密到每5%一个点。这样参数辨识出来的精度会高很多。

2.2 数据采集系统搭建

数据采集系统,说白了就是你的“眼睛”和“耳朵”。眼睛看电压、电流,耳朵听温度。但很多新手容易忽略一个事:采集系统本身也是有误差的。

硬件选型上,我踩过不少坑:

  • 电压采集: 必须用差分采样,别用单端。单端采样在共模干扰下,误差能到几十毫伏,这对OCV曲线来说是致命的。我建议用24位ADC的采集模块,比如NI的PXIe系列或者高精度数据记录仪。
  • 电流采集: 霍尔传感器和分流器我都用过。霍尔传感器方便,但温漂大;分流器精度高,但会发热。我的建议是:实验室测试用分流器(比如0.1%精度的),车载或现场测试用闭环霍尔传感器。
  • 温度采集: 热电偶响应快,但精度一般;PT100/PT1000精度高,但响应慢。我个人的习惯是:电芯表面贴PT1000测稳态温度,内部或极耳处用热电偶测瞬态温度。
注意: 我曾经在一个项目中,因为用了劣质的屏蔽线,导致采集到的电压信号上叠加了50Hz的工频干扰。后来排查了整整两天才发现是线材的问题。所以,线缆屏蔽、接地、走线远离大功率设备,这些细节千万别省。

2.3 采样频率与精度选择

采样频率选多少?精度选多高?这是每个工程师都会纠结的问题。

先说采样频率:

根据奈奎斯特定理,采样频率至少是信号最高频率的两倍。但电池信号是低频信号,主要能量集中在0.1Hz到10Hz之间。所以,理论上20Hz就够了。但实际中,我建议至少100Hz。为什么?

因为你要捕捉脉冲响应的瞬态过程。比如HPPC测试中,电流从0跳变到1C,电压会有一个瞬间的压降。这个压降持续只有几毫秒到几十毫秒。如果采样频率太低,这个压降就被“平滑”掉了,你辨识出来的欧姆内阻就会偏小。

精度选择:

电压精度:至少0.1mV级别。电流精度:至少1mA级别。温度精度:0.1℃级别。

我整理了一个参考表,大家可以保存一下:

参数 最低要求 推荐配置 高精度配置
电压采样频率 10 Hz 100 Hz 1 kHz
电流采样频率 10 Hz 100 Hz 1 kHz
电压精度 1 mV 0.1 mV 0.01 mV
电流精度 10 mA 1 mA 0.1 mA
温度采样频率 1 Hz 10 Hz 100 Hz
核心观点: 采样频率和精度不是越高越好。频率太高,数据量爆炸,处理起来慢;精度太高,成本翻倍。我的原则是:够用就行,留20%的余量。

2.4 数据预处理(滤波、去噪)

数据采回来了,但别急着用。原始数据里全是“脏东西”。噪声、毛刺、异常值,这些都会让你的参数辨识结果“跑偏”。

第一步:异常值剔除

我常用的方法是3σ准则。计算数据的均值和标准差,把超出均值±3倍标准差的数据点直接扔掉。但注意,这个方法只适用于正态分布的数据。对于电池数据,电压和电流在稳态时基本符合正态分布,但在动态工况下就不一定了。所以,我一般只在静置段或恒流段用这个方法。

第二步:滤波去噪

滤波方法很多,我挑几个常用的说说:

  • 移动平均滤波: 简单粗暴,适合去除高频噪声。但缺点是会引入相位延迟。窗口大小选多少?我一般选采样频率的1/10。比如100Hz采样,窗口就选10个点。
  • 中值滤波: 对脉冲噪声(比如突然的尖峰)特别有效。我曾在一次测试中,因为接触不良,电压信号上时不时出现一个巨大的毛刺。用中值滤波,窗口选5个点,毛刺全没了。
  • 低通滤波: 比如巴特沃斯滤波器。适合保留低频信号,滤除高频噪声。截止频率怎么选?我一般选信号主要频率的3-5倍。比如电池动态信号主要频率在1Hz以下,截止频率就选3-5Hz。

第三步:时间对齐

这个很多人会忽略。电压、电流、温度是三个不同的传感器采集的,它们的时间戳可能不同步。比如电流传感器响应快,电压传感器响应慢。如果不做时间对齐,你算出来的内阻就是错的。

我的做法是:以电流信号为基准,把电压和温度信号通过插值的方式对齐到电流的时间轴上。线性插值就够用了,别用太复杂的。

避坑指南: 我曾经在做一个项目的参数辨识时,发现辨识出来的欧姆内阻总是偏大。排查了很久,最后发现是电压和电流的时间戳差了20毫秒。就这20毫秒,导致欧姆内阻误差达到了15%。所以,时间对齐这一步,千万别省。

代码示例:一个简单的数据预处理流程

import numpy as np
from scipy import signal

def preprocess_data(voltage, current, temperature, fs=100):
    """
    数据预处理函数
    :param voltage: 原始电压数据 (V)
    :param current: 原始电流数据 (A)
    :param temperature: 原始温度数据 (℃)
    :param fs: 采样频率 (Hz)
    :return: 预处理后的数据
    """
    # 1. 异常值剔除 (3σ准则)
    def remove_outliers(data):
        mean = np.mean(data)
        std = np.std(data)
        return np.where(np.abs(data - mean) < 3 * std, data, np.nan)

    voltage = remove_outliers(voltage)
    current = remove_outliers(current)

    # 2. 低通滤波 (巴特沃斯, 截止频率5Hz)
    b, a = signal.butter(4, 5 / (fs / 2), 'low')
    voltage = signal.filtfilt(b, a, voltage)  # 零相位滤波,消除延迟
    current = signal.filtfilt(b, a, current)

    # 3. 线性插值填补NaN
    voltage = np.interp(np.arange(len(voltage)), 
                        np.where(~np.isnan(voltage))[0], 
                        voltage[~np.isnan(voltage)])
    current = np.interp(np.arange(len(current)), 
                        np.where(~np.isnan(current))[0], 
                        current[~np.isnan(current)])

    return voltage, current, temperature

嗯,这里要注意一点:我用的是filtfilt而不是lfilter。为什么?因为filtfilt是零相位滤波,不会引入相位延迟。对于电池参数辨识这种对时序敏感的应用,这一点特别重要。

好了,关于电池测试与数据采集,今天就聊这么多。下一章咱们进入正题——电池建模。到时候见。