第二章:老化数据采集与预处理

大家好,我是你们的老朋友。今天咱们聊聊老化数据采集与预处理。说实话,这一章是整个SOH估计的基石。数据搞不好,后面模型再花哨也是白搭。我在项目里见过太多人,上来就调参跑模型,结果数据本身就有问题,折腾半天全是无用功。

核心观点:老化数据的质量,直接决定了SOH估计的天花板。数据预处理不是体力活,是技术活。

2.1 充放电循环测试方案

先说说测试方案。很多人觉得,不就是充放电嘛,有什么好设计的?其实不然。我刚开始做BMS时,也这么想,结果第一批数据就废了——因为测试条件没统一,温度、电流都在变,根本没法对比。

一个标准的循环测试方案,至少要包含以下几点:

  • 恒流恒压充电(CC-CV):先以固定电流充到截止电压,再恒压充到电流降到某个阈值。这是最常用的协议。
  • 恒流放电(CC):以固定电流放电到截止电压。注意,放电倍率会影响老化速度,我一般建议用1C或0.5C。
  • 静置时间:充放电之间必须静置,让电池内部电化学反应稳定。通常30分钟到1小时。
  • 温度控制:恒温箱是必须的。25°C是标准,但如果你想研究温度影响,可以设几个梯度。

我的经验:我曾经做过一组对比实验,发现静置时间从10分钟改成1小时,容量增量曲线的形状差异很大。所以,静置时间一定要固定,别偷懒。

下面是一个典型的循环测试参数表示例:

参数 说明
充电电流 1C (2.5A) 恒流阶段
截止电压 4.2V 恒压阶段开始
恒压截止电流 0.05C 充电结束条件
放电电流 1C 恒流放电
放电截止电压 2.5V 放电结束条件
静置时间 30分钟 充放电之间
环境温度 25°C 恒温箱控制

2.2 数据采集系统搭建

数据采集系统,说白了就是怎么把电池的电压、电流、温度这些信号,准确、高频地记录下来。我见过有人用万用表手动记录,嗯,那只能做做实验课,做研究肯定不行。

一个靠谱的数据采集系统,通常包括:

  • 高精度数据采集卡:采样率至少1Hz,我建议10Hz以上。电压精度要优于1mV。
  • 电流传感器:霍尔传感器或分流器。注意量程和精度,别让噪声淹没了信号。
  • 温度传感器:热电偶或NTC。贴在电池表面,最好多点布置。
  • 上位机软件:LabVIEW、Python或MATLAB。实时显示和存储数据。

避坑指南:我曾经遇到过采样率太低,导致容量增量曲线(ICA)的峰值完全丢失。你想想看,ICA的峰值宽度可能只有几毫伏,采样率不够,直接就平滑掉了。所以,采样率至少10Hz,别省这个钱。

2.3 数据清洗:异常值与缺失值

数据采集回来,别急着用。先看看有没有脏数据。我习惯先画个时序图,肉眼扫一遍。如果看到电压突然跳变、电流出现负值,那肯定有问题。

异常值处理:

  • 3σ原则:对于正态分布的数据,超过均值±3倍标准差的值,视为异常。
  • IQR方法:四分位距法,适合非正态分布。超出Q1-1.5IQR或Q3+1.5IQR的,剔除。
  • 物理约束:电压不可能超过4.3V,电流不可能超过设定值。超出物理范围的,直接删。

缺失值处理:

  • 线性插值:如果缺失点不多,用前后数据线性填充。
  • 前向填充:对于缓慢变化的温度信号,用上一个有效值填充。
  • 删除:如果缺失太多(比如连续缺失超过10个点),直接删掉这段数据。

下面是一个简单的Python代码示例,用于清洗电压数据:

import pandas as pd
import numpy as np

# 假设df是DataFrame,包含'voltage'列
def clean_voltage(df, threshold=0.02):
    # 1. 物理约束:电压范围2.5-4.2V
    df = df[(df['voltage'] >= 2.5) & (df['voltage'] <= 4.2)]
    
    # 2. 3σ异常值检测
    mean = df['voltage'].mean()
    std = df['voltage'].std()
    df = df[np.abs(df['voltage'] - mean) <= 3 * std]
    
    # 3. 线性插值填充缺失值
    df = df.interpolate(method='linear', limit=5)
    
    return df

我的习惯:清洗数据时,我一般会保留原始数据副本。万一清洗过头了,还能回退。别问我怎么知道的,都是教训。

2.4 特征工程:电压曲线与容量增量曲线

特征工程,说白了就是从原始数据里提取出对SOH估计有用的信息。我个人最常用的两个特征:电压曲线和容量增量曲线(ICA)。

电压曲线:充放电过程中电压随时间的变化。不同老化程度的电池,电压曲线形状会变化。比如,内阻增大后,放电初期电压降会更明显。

容量增量曲线(ICA):这是我最喜欢的特征。ICA是dQ/dV对V的曲线。它能把电压平台转换成明显的峰值,这些峰值的位置、高度、宽度,都和电池的老化状态密切相关。

ICA的计算方法很简单:

# 计算容量增量曲线
def compute_ica(voltage, capacity, v_bins=100):
    # 对电压进行分箱
    v_min, v_max = voltage.min(), voltage.max()
    v_bin_edges = np.linspace(v_min, v_max, v_bins)
    
    # 计算每个电压区间内的容量增量
    dq = np.zeros(v_bins - 1)
    dv = np.zeros(v_bins - 1)
    
    for i in range(v_bins - 1):
        mask = (voltage >= v_bin_edges[i]) & (voltage < v_bin_edges[i+1])
        if mask.sum() > 0:
            dq[i] = capacity[mask].max() - capacity[mask].min()
            dv[i] = v_bin_edges[i+1] - v_bin_edges[i]
    
    # 避免除零
    dv[dv == 0] = 1e-6
    ica = dq / dv
    
    return v_bin_edges[:-1] + dv/2, ica

关键点:ICA曲线的峰值会随着老化而降低、偏移。比如,正极材料的相变峰(约3.6V)会逐渐消失。通过追踪这些峰值的变化,就能估计SOH。

下面我用一张SVG图,展示本章的知识体系:

老化数据采集与预处理知识体系 数据采集 测试方案设计 数据清洗 高精度采集卡 电流/温度传感器 CC-CV充放电 静置与温度控制 异常值检测 缺失值插值 特征工程 电压曲线特征 容量增量曲线(ICA) 峰值追踪 目标:提取高质量特征,支撑SOH估计模型

嗯,这张图把本章的核心逻辑串起来了。从数据采集到测试方案,再到数据清洗,最后落到特征工程。每一步都环环相扣。

注意:ICA计算对数据质量要求很高。如果电压噪声太大,ICA曲线会全是毛刺,根本看不出峰值。所以,数据清洗这一步千万别马虎。我见过有人直接用原始数据算ICA,结果峰值全被噪声淹没了,白白浪费了实验数据。

好了,这一章的内容就到这里。数据采集和预处理是基础中的基础,花再多时间都值得。下一章我们会正式进入SOH估计的建模环节,到时候这些特征就会派上大用场。

专注资料整理