锂离子电池健康状态估计简介(一):基于Python的数据处理计算SOH,RUL,CCCT,CVCT
鋰離子電池無論是在軍用還是民用領域都得到了廣泛的應用,在鋰離子電池健康評估中主要關注的參數有SOH和RUL。準確對其進行健康狀態(Stateof Health, SOH)評估及剩余使用壽命(Remaning Useful Life, RUL)預測對于提高電池安全性與使用壽命具有重要意義
電池SOH
鋰離子電池健康狀態基本定義為:選擇適當的放電條件下,對其進行充電,直到鋰電池充滿結束。然后再選擇一定倍率對其進行放電,直到滿足放電截止電壓結束,此時電池的容量與其標稱容量的比值。即為鋰離子電池的健康狀態,通常運用SOH表示電池的健康狀態。鋰離子電池的存儲能力與快速充放電能力均會隨著老化而不斷下降,而SOH正是用于評價鋰電池老化程度的量化指標,鋰離子電池健康狀態是表征鋰電池存儲電能的能力,和電池老化評價指標。鋰電池的健康狀態定義方式有多種,分別為基于容量定義的SOH、基于內阻定義的SOH、基于功率定義的SOH、基于自放電定義的SOH。
電池RUL
鋰離子電池壽命是個廣義的概念,它還可以具體分為很多種,如儲存壽命,使用壽命和剩余循環壽命。鋰離子電池的存儲壽命表示鋰離子電池在靜態或非運行條件下退化到一定程度所需的時間。鋰離子電池的RUL是指在某種充放電條件下,鋰離子電池的當前可用容量衰減退化到某一規定的失效閾值所需要經歷的循環周期數量。RUL預測是一個基于鋰離子電池歷史數據運用一定的數學手段對其殘值壽命進行預測計算的過程。隨著鋰離子電池在各領域上的廣泛應用,鋰離子電池RUL預測技術得到了廣泛的關注和研究。
常用鋰離子電池壽命經驗模型的數學表達式
鋰離子電池結構
鋰離子電池主要由以下幾個部分組成:
(1)正極活性材料
正極活性材料是鋰離子電池的核心組成部分,其決定了鋰電池工作時鋰離子的空間和擴散路徑,由此決定了鋰離子電池的基本性能。目前業內常見的正極材料有磷酸鐵鋰、錳酸鋰、鈷酸鋰、以及由多種材料構成的三元鋰,如鎳鈷錳、鎳鈷鋁。
(2)負極活性材料
負極活性材料是以薄層狀附著在銅基上的糊狀物質,通常由碳材料、黏合材料以及有機溶劑混合制成。
(3)隔膜
隔膜是一種經過特殊工藝處理的高分子薄膜,通常使用聚丙烯或聚乙烯材料的微多孔膜制成,用于在正極和負極之間作為鋰離子的移動通道,同時能夠防止電子通過。
(4)電解液
電解液主要負責在充放電過程中鋰離子的傳送,通常為混有有機溶劑和添加劑的鋰鹽電解液。電解液需要能夠在電池工作過程時的氧化還原反應中保持化學性能穩定。
基本性能參數
(1)電池電壓
電動勢:電池正極與負極之間的電位差。
工作電壓(端電壓):在電池兩端接上負載后,在放電過程中顯示的電壓。開路電壓:指電池處于開路狀態,即電池不放電時電池正負極的電位差。
額定電壓:指電池廠家規定的電池電壓,是電池出廠的重要性能參數,電池正常工作時,電池工作電壓應該長時間在電池額定電壓附近變化。
終止電壓:電池在一定標準所規定的充放電條件下對電池進行充放電,當電池不宜再繼續充放電時,此時的工作電壓稱為終止電壓。當電池的電壓下降到終止電壓后,再繼續使用,因受到化學“活性物質”性能的限制,“活性物質”會遭到破壞。
(2)電池容量
理論容量:是假設活性物質全部參加電池的反應所給出的電量。它是根據活性物質的量按照法拉第定律計算求得的。實際電池放出的容量只是理論容量的一部分。
實際容量:是指在一定條件下,電池實際放出的電量,等于放電電流與放電時間的乘積。
剩余容量:指電池經過一段時間的放電之后電池還剩余多少電量,數值上等于電池在當前狀態下以標準環境溫度和標準放電電流放電至最小截止電壓時釋放的電量。
額定容量:是指設計和制造電池時,規定或保證電池在一定的放電條件下應該放出的最低限度的電量。
(3)電池自放電率
電池自放電率衡量了電池在靜置狀態時,對其自身電量的保持能力。通常電池自放電率越小越好,其大小與環境溫度、電池材料和加工方式密切相關。一般而言,在電池適宜的溫度范圍內,環境溫度越低,自放電率也越低,同時也應注意,溫度過低或過高均有可能造成電池損壞而無法正常投入使用。
(4)放電深度:
放電深度是放電程度的一種度量,常用 DOD(depth of discharge)表示,它體現參與反應的活性材料所占的比例。
(5)電池內阻:
該指標是指電流通過電池內部時受到的阻力,包括歐姆內阻和極化內阻兩部分。由于電池的內阻作用,使得電池在放電時端電壓低于電動勢和開路電壓,在充電時端電高于電動勢和開路電壓。
鋰離子電池的充電特征
電池經過長時間的放電后,需要對電池再次充電才能投入使用。電池過充電對電池性能影響很大,過度充電會對電池造成損壞,縮短使用壽命,因此,選擇安全高效的電池充電方式對保護電池至關重要。目前,常用的電池充電方式有恒流充電法、恒壓充電法、恒流恒壓充電法(Constant Current-Constant Voltage ,CC-CV)以及脈沖式充電法。
恒流充電法是指在整個充電過程中,保持電池充電回路中電流保持不變的充電方法。通??梢岳谜{整電源輸出電壓或改變充電回路阻值的方式使得充電電流不變。該方法較為容易實施,充電時間短,但電池到了充電后期,對電流的接受能力逐漸下降,會造成了能量的浪費。
恒壓充電法是在整個充電過程中,讓電源輸出電壓保持不變的充電方法。使用該方法對電池進行充電時,充電回路中的電流會逐漸減小,從而減少能量浪費及防止電池過充電,但在充電初期,充電回路中的電流太大,會減少電池工作時間,電流過大時還有可能導致電池報廢。
恒流恒壓充電法是指電池先以恒流方式充電,使得電池電壓逐步升高,當電池電壓達到充電截止電壓時,再將恒流充電方式轉換為恒壓充電方式。恒流恒壓充電模式是普通鋰離子電池最常用的充電方式,該方法能夠快速充電,有效防止電池過充電,合理利用能量,延長電池的使用壽命。
上面圖里的數據是從馬里蘭大學公開電池數據集得到的CS2電池組數據。馬里蘭大學壽命實驗室
鋰離子SOH定義
1)基于容量定義的健康狀態
采用當前鋰電池的額定容量比上初始是鋰電池的容量,再乘上100%,即為鋰離子電池的容量健康度。
式中,〖SOH〗_c為電池容量健康度,C_t為電池在t時刻的額定容量,C_0為電池的初始額定容量。
2)基于內阻定義的健康狀態
式中,〖SOH〗_R為電池內阻(通常指電池的歐姆內阻)健康度,R_end為電池壽命終止時刻的內阻,R(t)為電池在t時刻的內阻,R_0為電池的初始內阻。
3)基于功率定義的健康狀態
式中,〖SOH〗_P為電池功率健康度,P(0)鋰離子電池的最開始的功率或銘牌功率(W),P(t)第t次充電后可供給的方均根(有效)功率(W)。
4)基于自放電定義的健康狀態
式中,〖SOH〗_Rd為電池自放電健康度,R_d (end)為電池壽命終止時刻的自放電電阻,R_d (t)為采樣t時刻的電池自放電電阻,R_d (0)代表電池在初始時刻的自放電電阻。
數據預處理代碼
首先要明白馬里蘭大學數據集的結構:
數據是以xlsx表格的格式存儲的
包含的數據主要有這幾個類別,其中有用得比較多的就是電流電壓和時間這幾項。
這里要特別注意:充電和放電的數據是連續記錄在表里的,要注意區分。NASA的數據則是充電和放電分開的。
===================================
廢話不多說,我們上干貨,具體代碼作用看注釋,寫的比較清楚了。編程細節參考浙大的大佬python的數據處理,感謝大佬,讓我們減輕了很多工作量。代碼里SOH是用上面SOH定義的第一種計算方法得到的。
# 程序功能: 讀取一種電池的數據解析計算 # SOH,CCCT,CVCT,resistance,capacity數據并存儲為npy文件 # From: SWUST IPC14 Daiimport numpy as np import matplotlib.pyplot as plt import pandas as pd import globBattery_name = 'CS2_36' # 加載數據 dir_path = 'dataset/'# 除去數據異常的較大值和較小值點 def drop_outlier(array, count, bins):index = []range_ = np.arange(1, count, bins) # 返回一個有終點和起點的固定步長的排列,起始為1,終值為count,步長為binsfor i in range_[:-1]:array_lim = array[i:i+bins] # 從array中截取一個從i到i+bins的數組段sigma = np.std(array_lim) # 計算該數組段的全局標準差mean = np.mean(array_lim) # 計算數組段的平均值th_max,th_min = mean + sigma*2, mean - sigma*2 # 以方差和平均值作為上下限取值idx = np.where((array_lim < th_max) & (array_lim > th_min))idx = idx[0] + i # 將當前的idx值+i后賦值到實際數組的角標index.extend(list(idx)) # 在列尾增加一個listreturn np.array(index)Battery = {}print('Load the data directory structure ' + Battery_name + ' ...') path = glob.glob(dir_path + Battery_name + '/*.xlsx') dates = [] for p in path:df = pd.read_excel(p, sheet_name=1)print('Load file sequence ' + str(p) + ' ...')dates.append(df['Date_Time'][0]) idx = np.argsort(dates) path_sorted = np.array(path)[idx] print("The file structure was read successfully. There are {} files in total".format(len(path_sorted)))count = 0 discharge_capacities = [] health_indicator = [] internal_resistance = [] CCCT = [] CVCT = []for p in path_sorted:df = pd.read_excel(p, sheet_name=1)print('Load and Analytical data' + str(p) + ' ...')cycles = list(set(df['Cycle_Index'])) # 按照每個循環次數讀取# 在單個表中按照Cycle_Index(實驗次數)逐次取出每次的數據進行處理for c in cycles:df_lim = df[df['Cycle_Index'] == c]# Chargingdf_c = df_lim[(df_lim['Step_Index'] == 2) | (df_lim['Step_Index'] == 4)] # 第2步和第4步充電c_v = df_c['Voltage(V)'] # 電壓c_c = df_c['Current(A)'] # 實時電流值c_t = df_c['Test_Time(s)'] # 記錄的測試時間# CC or CVdf_cc = df_lim[df_lim['Step_Index'] == 2] # 第2步恒流充電df_cv = df_lim[df_lim['Step_Index'] == 4] # 第4步恒壓充電CCCT.append(np.max(df_cc['Test_Time(s)']) - np.min(df_cc['Test_Time(s)'])) # 恒定電流充電時間CVCT.append(np.max(df_cv['Test_Time(s)']) - np.min(df_cv['Test_Time(s)'])) # 恒定電壓充電時間# Dischargingdf_d = df_lim[df_lim['Step_Index'] == 7] # 第7步時放電d_v = df_d['Voltage(V)']d_c = df_d['Current(A)']d_t = df_d['Test_Time(s)'] # 步長時間d_im = df_d['Internal_Resistance(Ohm)'] # 內阻if len(list(d_c)) != 0:time_diff = np.diff(list(d_t)) # 求時間差,np.diff:計算數組中n[a]-n[a-1]d_c = np.array(list(d_c))[1:] # 讀出電流值discharge_capacity = time_diff * d_c / 3600 # 計算安培時(Ah)Q = A*h# print("discharge_capacity shape[0] is:{}".format(discharge_capacity.shape[0]))# 將所有第7步中的電池放電容量求和并正定# discharge_capacity_sum = np.sum(discharge_capacity)# discharge_capacities.append(-1 * discharge_capacity_sum)discharge_capacity = [np.sum(discharge_capacity[:n]) for n in range(discharge_capacity.shape[0])]discharge_capacities.append(-1 * discharge_capacity[-1])dec = np.abs(np.array(d_v) - 3.8)[1:] # np.abs:求絕對值# np.argmin:將數組展平返回最小值的下標start = np.array(discharge_capacity)[np.argmin(dec)] # 取出當電壓最接近3.8V時電池的放電量dec = np.abs(np.array(d_v) - 3.4)[1:]end = np.array(discharge_capacity)[np.argmin(dec)] # 取出電壓最接近3.4V時的電池放電量health_indicator.append((-1 * (end - start))) # 這里定義的SOH是電池從3.8V放電到3.4V的電池容量internal_resistance.append(np.mean(np.array(d_im))) # 求放電階段電池的的內阻平均值count += 1 health_indicator = health_indicator/np.max(health_indicator) # 計算SOHdischarge_capacities = np.array(discharge_capacities) SOC = discharge_capacities/1.1 # CS2電池的標準容量為1.1Ah health_indicator = np.array(health_indicator) internal_resistance = np.array(internal_resistance) CCCT = np.array(CCCT) CVCT = np.array(CVCT)idx = drop_outlier(discharge_capacities, count, 40) # 以所有輪次中放電步驟的放電容量值為原始數據,以40為步長,對數據進行清洗處理 df_result = pd.DataFrame({'cycle': np.linspace(1, idx.shape[0], idx.shape[0]), # 步數'capacity': SOC[idx], # 容量'SoH': health_indicator[idx], # SOH'resistance': internal_resistance[idx], # 電池內阻'CCCT': CCCT[idx],'CVCT': CVCT[idx]}) Battery[Battery_name] = df_result np.save(dir_path + Battery_name, Battery) print("Data parsing succeeded. The .npy file was saved to {}".format(dir_path + Battery_name + '.npy'))總結
以上是生活随笔為你收集整理的锂离子电池健康状态估计简介(一):基于Python的数据处理计算SOH,RUL,CCCT,CVCT的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 收集的资源整理
- 下一篇: 特斯拉model3中控屏怎么关_玩转特斯