原创博客,转载请注明出处,谢谢!

代码下载地址:https://github.com/XiuzeZhou/NASA

1. 需求

近几年,随着智能手机和电动汽车的广泛应用,锂电池的话题越来越多,研究也越来越丰富,总之一句话:新能源很热。于是,趁最近一个空段,我也加入了新能源的研究大军。

花了几个月时间,看了百来篇与锂电池相关的论文。大部分有关锂电池寿命预测的论文用到两个数据集:NASA 和 CALCE。NASA 是美国宇航局 NASA 埃姆斯研究中心提供的锂电池老化实验数据,CALCE 是马里兰大学高级生命周期工程中心的电池循环测试数据集。今天我分析 NASA 这个数据集,CALCE 数据集下次另开博文来分析。

NASA 这个数据集比较老了,2007年发布,数据格式是 mat。而现在大部分人都用 Python 来做实验,mat 文件没办法直接使用,使用的话需要先读取和解析。既然要写论文,那就自己动手写个程序从这个数据集中来提取必要的内容吧。

2. NASA 数据集

I. 数据集

原始下载地址:https://ti.arc.nasa.gov/tech/dash/groups/pcoe/prognostic-data-repository/#battery

(我的程序中已经包括下载好的数据集:B0005.mat,B0006.mat,B0007.mat,B0018.mat)

II. 测试内容

温度:室温 24 度

充电:以 1.5A 的恒定电流(CC)模式进行充电,直到电池电压达到 4.2V,然后以恒定电压(CV)模式充电,直到充电电流降至 20mA。

放电:以 2A 的恒定电流(CC)模式进行放电,直到电池 5、6、7 和 18的电压降到 2.7V,2.5V,2.2V 和 2.5V。

终止条件:当电池达到寿命终止(End Of Life, EOF)标准——额定容量下降到它的30%,即电池 5、6、7 和 18 的额定容量从 2Ahr 到 1.4Ahr。

III. 数据介绍

提取数据之前,我们需要先了解这个数据集的结构和内容。首先,我们用 matlab 打开其中一个数据集,查看一下数据。


数据集有 4 个列:typeambient_temperaturetimedata

type:数据类型,包括 3 个类,分别为充电、放电和阻抗:chargedischargeimpedance

ambient_temperature:电池的工作温度,常温 24 度

time:充放电的时间,字符串格式

data:实时采集与电池性能相关的 6-7 组数据

a. type 为 'charge',即充电状态下:

  • Voltage_measured:测量的电压
  • Current_measured:测量的电流
  • Temperature_measured:工作温度
  • Current_charge:充电器充电电流
  • Voltage_charge:充电器充电电压
  • Time:工作时间

b. type 为 'discharge',即放电状态下:

  • Voltage_measured:测量的电压
  • Current_measured:测量的电流
  • Temperature_measured:工作温度
  • Current_load:在负载下测量的电流
  • Voltage_load:在负载下测量的电压
  • Time:工作时间
  • Capacity:放电至 2.7V 的电池容量 (Ahr)

c. type 为 'impedance',即阻抗状态下:

  • Sense_current:传感器支路电流
  • Battery_current:电池支路电流
  • Current_ratio:以上电流的比率
  • Battery_impedance:根据原始数据计算的电池阻抗
  • Rectified_impedance:校准和平滑的电池阻抗
  • Re:估计电解液电阻
  • Rct:估计充电转移电阻

3. 数据处理

I. mat 文件读取

scipy.io.loadmat读取 mat 文件,然后将 mat 对应的数据另存为 python 的数据格式。

# 加载 mat 文件
def loadMat(matfile):
    data = scipy.io.loadmat(matfile)
    filename = matfile.split(".")[0]
    col = data[filename]
    col = col[0][0][0][0]
    size = col.shape[0]

    data = []
    for i in range(size):
        k = list(col[i][3][0].dtype.fields.keys())
        d1, d2 = {}, {}
        if str(col[i][0][0]) != 'impedance':
            for j in range(len(k)):
                t = col[i][3][0][0][j][0];
                l = [t[m] for m in range(len(t))]
                d2[k[j]] = l
        d1['type'], d1['temp'] = str(col[i][0][0]), int(col[i][1][0])
        d1['time'], d1['data'] = str(convert_to_time(col[i][2][0])), d2
        data.append(d1)

    return data

II. 数据分析

做锂电池分析,最重要的三个参数是:容量,电流和电压。接下来,我们分别对提取它们的数据,并查看它们的变化趋势。

容量

锂电池寿命预测,最重要的是对放电时的电池容量衰减曲线进行建模和分析。

# 提取锂电池容量
def getBatteryCapacity(Battery):
    cycle, capacity = [], []
    i = 1
    for Bat in Battery:
        if Bat['type'] == 'discharge':
            capacity.append(Bat['data']['Capacity'][0])
            cycle.append(i)
            i += 1
    return [cycle, capacity]

电流和电压

正如前面提到的,锂电池的测试条件如下:

充电:以 1.5A 的恒定电流(CC)模式进行充电,直到电池电压达到 4.2V,然后以恒定电压(CV)模式充电,直到充电电流降至 20mA。

放电:以 2A 的恒定电流(CC)模式进行放电,直到电池 5、6、7 和 18的电压降到 2.7V,2.5V,2.2V 和 2.5V。

# 获取锂电池充电或放电时的测试数据
def getBatteryValues(Battery, Type='charge'):
    data=[]
    for Bat in Battery:
        if Bat['type'] == Type:
            data.append(Bat['data'])
    return data

我们接下来,查看这两个条件下电池的充放电曲线变化。


更多内容

1. NASA 锂电池数据集,基于 python 的 MLP 锂电池寿命预测: https://snailwish.com/427/

2. 马里兰大学锂电池数据集 CALCE,基于 Python 的锂电池寿命预测: https://snailwish.com/437/

3. 马里兰大学锂电池数据集 CALCE,MLP 锂电池寿命预测: https://snailwish.com/464/

4. NASA 和 CALCE 锂电池数据集,基于 Pytorch 的 RNN、LSTM、GRU 寿命预测: https://snailwish.com/497/

5. 基于 Pytorch 的 Transformer 锂电池寿命预测: https://snailwish.com/555/

6. 锂电池研究之七——基于 Pytorch 的高斯函数拟合时间序列数据: https://snailwish.com/576/