soc的估算方法大致有五種:電流積分法、開路電壓法、阻抗法、智能估算法、狀態(tài)觀測(cè)器。今天先給大家介紹前兩種方法。
什么是SOC
電池的狀態(tài)(State of Charge,SOC)是電池能夠提供的電荷總量與總電荷容量的比率,通常用百分比表示。在電池管理系統(tǒng)(Battery Management System,BMS)中,精準(zhǔn)地計(jì)算電池的SOC是非常重要的,因?yàn)樗梢詭椭鶥MS判斷電池的剩余能量,從而控制電池的使用和充放電過程,延長(zhǎng)電池的壽命。
目前,常用的計(jì)算電池SOC的方法主要有電流積分法和開路電壓法。這兩種方法各有優(yōu)缺點(diǎn),但都存在一定的誤差。因此,在實(shí)際應(yīng)用中,常常將兩種方法結(jié)合起來使用,以提高SOC的精度。
本文將詳細(xì)介紹如何使用電流積分法和開路電壓法結(jié)合起來計(jì)算電池的SOC。
一、電流積分法
電流積分法是一種通過對(duì)電池的充放電電流進(jìn)行積分,來計(jì)算電池SOC的方法。它的優(yōu)點(diǎn)在于計(jì)算過程簡(jiǎn)單,不需要進(jìn)行標(biāo)定。下面是電流積分法的具體步驟:
步驟1:記錄電池開始充電或放電時(shí)的SOC。
步驟2:記錄電池充放電時(shí)的電流。
步驟3:對(duì)電池的電流進(jìn)行積分,得到電池的電量變化量。
步驟4:根據(jù)電量變化量和開始時(shí)的SOC,計(jì)算出當(dāng)前的SOC。
公式:SOC = 初始SOC + ∫(I*dt)/Q
其中,I表示電流,Q表示電池的電量,dt表示時(shí)間間隔。
需要注意的是,由于電池內(nèi)阻等因素的存在,電流積分法的計(jì)算結(jié)果存在一定的誤差。此外,電流積分法只能對(duì)電池進(jìn)行較長(zhǎng)時(shí)間的充放電測(cè)試,才能得到較為準(zhǔn)確的結(jié)果。
二、開路電壓法
開路電壓法是通過測(cè)量電池的開路電壓(即在沒有負(fù)載情況下的電壓)來計(jì)算電池SOC的方法。開路電壓法的優(yōu)點(diǎn)在于計(jì)算過程簡(jiǎn)單,無需進(jìn)行電流測(cè)量。下面是開路電壓法的具體步驟:
步驟1:根據(jù)電池的型號(hào)和廠家提供的SOC-開路電壓曲線,建立SOC和開路電壓之間的關(guān)系。
步驟2:測(cè)量電池的開路電壓。
步驟3:根據(jù)步驟1中建立的SOC-開路電壓曲線,計(jì)算出當(dāng)前的SOC。
需要注意的是,電池的SOC-開路電壓曲線是隨著電池的使用和壽命的變化而變化的,因此,需要定期進(jìn)行標(biāo)定,以確保計(jì)算結(jié)果的準(zhǔn)確性。
另外,由于電池的內(nèi)阻等因素的影響,開路電壓法也存在一定的誤差。尤其在高放電狀態(tài)下,誤差會(huì)更大。
三、結(jié)合使用電流積分法和開路電壓法
電流積分法和開路電壓法各自有其優(yōu)缺點(diǎn),因此,在實(shí)際應(yīng)用中,常常將兩種方法結(jié)合起來使用,以提高SOC的精度。
結(jié)合使用電流積分法和開路電壓法的具體步驟如下:
步驟1:使用電流積分法記錄電池的充放電情況,并得到當(dāng)前的SOC1。
步驟2:使用開路電壓法測(cè)量電池的開路電壓,并根據(jù)SOC-開路電壓曲線計(jì)算出當(dāng)前的SOC2。
步驟3:根據(jù)SOC1和SOC2,計(jì)算出當(dāng)前的SOC。
公式:SOC = k1SOC1 + k2SOC2
其中,k1和k2是權(quán)重系數(shù),它們的和等于1。權(quán)重系數(shù)的選擇需要考慮到電池的使用情況、測(cè)試時(shí)間和測(cè)試精度等因素。一般來說,如果電池進(jìn)行了較長(zhǎng)時(shí)間的充放電測(cè)試,那么k1的值應(yīng)該更大;如果電池的開路電壓測(cè)量精度較高,那么k2的值應(yīng)該更大。
需要注意的是,在結(jié)合使用電流積分法和開路電壓法時(shí),需要進(jìn)行相應(yīng)的標(biāo)定工作,以保證計(jì)算結(jié)果的準(zhǔn)確性。此外,電池的內(nèi)阻、溫度等因素對(duì)計(jì)算結(jié)果也有一定的影響,需要進(jìn)行相應(yīng)的校正。
四、結(jié)論
綜上所述,電流積分法和開路電壓法是計(jì)算電池SOC的兩種主要方法,它們各自有其優(yōu)缺點(diǎn)。為了提高SOC的精度,在實(shí)際應(yīng)用中,常常將兩種方法結(jié)合起來使用。通過結(jié)合使用電流積分法和開路電壓法,可以克服各自的缺點(diǎn),提高SOC的精度和可靠性。然而,在使用這兩種方法時(shí)需要進(jìn)行相應(yīng)的標(biāo)定和校正,以保證計(jì)算結(jié)果的準(zhǔn)確性。
第一種:電壓法
在 STM32 中,電池電量百分比的計(jì)算需要考慮到電池的電壓曲線和電量曲線。一般來說,電量百分比可以通過下面的公式計(jì)算:
電量百分比 = (當(dāng)前電壓值 - 最低電壓值)/(最高電壓值 - 最低電壓值)* 100%
其中,最低電壓值和最高電壓值需要根據(jù)電池的實(shí)際情況進(jìn)行設(shè)置。在實(shí)際使用中,可以通過 ADC 模塊讀取電池的電壓值,然后將其轉(zhuǎn)換為電量百分比。具體的 C 語(yǔ)言代碼如下:
#define ADC_MAX_VALUE 4096 // ADC 最大值 #define VOLTAGE_DIVIDER_RATIO 2 // 電壓分壓比 #define BATTERY_MAX_VOLTAGE 4.2 // 電池滿電電壓 #define BATTERY_MIN_VOLTAGE 3.0 // 電池極低電壓 float get_battery_voltage(void) { uint16_t adc_value = HAL_ADC_GetValue(&hadc); // 讀取 ADC 值 float voltage = (float)adc_value / ADC_MAX_VALUE * VREF * VOLTAGE_DIVIDER_RATIO; // 轉(zhuǎn)換為電壓值 return voltage; } uint8_t get_battery_percentage(void) { float voltage = get_battery_voltage(); uint8_t percentage = (voltage - BATTERY_MIN_VOLTAGE) / (BATTERY_MAX_VOLTAGE - BATTERY_MIN_VOLTAGE) * 100; return percentage; }
以上代碼假設(shè)使用的 ADC 通道已經(jīng)初始化并啟動(dòng),get_battery_voltage() 函數(shù)用于讀取電池電壓值,get_battery_percentage() 函數(shù)用于計(jì)算電量百分比。需要注意的是,上述代碼僅供參考,實(shí)際使用中需要根據(jù)具體情況進(jìn)行調(diào)整。
第二種:累積電量積分法
對(duì)于電池管理系統(tǒng)(BMS)的電量計(jì)算,一般采用累積電量積分法。要計(jì)算電池的電量百分比,需要知道當(dāng)前電池的電量和額定電量。以下是一種簡(jiǎn)單的實(shí)現(xiàn)方法:
獲取電池實(shí)際電壓值,單位為毫伏(mV)。
獲取電池額定電壓值,單位為毫伏(mV)。
計(jì)算電池當(dāng)前電量,單位為毫安時(shí)(mAh)。
計(jì)算電池額定電量,單位為毫安時(shí)(mAh)。
根據(jù)以下公式計(jì)算電池電量百分比:電量百分比 = 當(dāng)前電量 / 額定電量 * 100%
在BMS中,可以使用ADC模塊來獲取電池實(shí)際電壓值,并使用電流傳感器來獲取電池充放電電流值,從而計(jì)算電池當(dāng)前電量。以下是一種簡(jiǎn)單的代碼實(shí)現(xiàn):
#define VBAT_R1 10000 // 電阻R1的值,單位為歐姆(Ω) #define VBAT_R2 10000 // 電阻R2的值,單位為歐姆(Ω) #define VBAT_ADC_RES 4096 // ADC的分辨率 #define VBAT_R1_R2_RATIO 0.5 // R1和R2的比值 float get_battery_voltage(void) { uint16_t adc_value = 0; float voltage = 0; // 讀取ADC的值 adc_value = HAL_ADC_GetValue(&hadc1); // 根據(jù)ADC的值計(jì)算電壓值 voltage = (float)adc_value * 3.3 / (float)VBAT_ADC_RES * VBAT_R1_R2_RATIO; // 根據(jù)電壓分壓計(jì)算實(shí)際電池電壓值 voltage = voltage / (VBAT_R2 / (VBAT_R1 + VBAT_R2)); return voltage; } float get_battery_current(void) { uint16_t adc_value = 0; float current = 0; // 讀取ADC的值 adc_value = HAL_ADC_GetValue(&hadc2); // 根據(jù)ADC的值計(jì)算電流值 current = ((float)adc_value - 2048) * 3.3 / 4096 / 0.04; return current; } float get_battery_capacity(float current, float time) { float capacity = 0; // 計(jì)算電量 capacity = current * time / 3600; return capacity; // 計(jì)算電池當(dāng)前電量 float current = get_battery_current(); float time = 1; // 積分時(shí)間,單位為秒 float current_capacity = get_battery_capacity(current, time); capacity += current_capacity; // 計(jì)算電池電量百分比 percentage = (int)(capacity / rated_capacity * 100); // 限制百分比在0-100之間 percentage = percentage > 100 ? 100 : percentage; percentage = percentage < 0 ? 0 : percentage; return percentage; }
其中,get_battery_voltage()函數(shù)用于獲取電池實(shí)際電壓值,get_battery_current()函數(shù)用于獲取電池充放電電流值,get_battery_capacity()函數(shù)用于計(jì)算電池當(dāng)前電量,get_battery_percentage()函數(shù)用于計(jì)算電池電量百分比。在使用時(shí),需要提供電池的額定電壓、電量和實(shí)際電壓等參數(shù)。
注意,在計(jì)算電池當(dāng)前電量時(shí),需要進(jìn)行電流積分,積分時(shí)間可以根據(jù)實(shí)際應(yīng)用場(chǎng)景進(jìn)行調(diào)整。
第三種:開路電壓法
開路電壓法是一種基于電池開路電壓與SOC之間的關(guān)系計(jì)算SOC的方法。具體計(jì)算公式如下:
SOC = f(V_oc)
其中,V_oc是電池的開路電壓,f是一種特定的函數(shù),它反映了電池開路電壓與SOC之間的關(guān)系。不同類型的電池有不同的f函數(shù),常見的有線性關(guān)系、二次函數(shù)關(guān)系等。下面是使用C語(yǔ)言實(shí)現(xiàn)線性函數(shù)開路電壓法計(jì)算電池SOC的代碼示例:
#include int main() { // 輸入電池的電壓、最小電壓和最大電壓 float voltage, min_voltage, max_voltage; printf(“請(qǐng)輸入電池的電壓、最小電壓和最大電壓(以空格分隔):”); scanf("%f %f %f", &voltage, &min_voltage, &max_voltage); // 計(jì)算電池的SOC float soc = (voltage - min_voltage) / (max_voltage - min_voltage) * 100; printf(“電池的SOC為:%.2f%%”, soc); return 0; }
第四種:卡爾曼濾波法
卡爾曼濾波法是一種基于電池電流、電壓及其他信息計(jì)算SOC的方法,它采用了狀態(tài)估計(jì)和卡爾曼濾波技術(shù)。具體實(shí)現(xiàn)過程比較復(fù)雜,需要借助數(shù)學(xué)模型和計(jì)算機(jī)算法。下面是使用C語(yǔ)言調(diào)用卡爾曼濾波庫(kù)計(jì)算電池SOC的代碼示例:
#include #include “kalman.h” int main() { // 初始化卡爾曼濾波器 kalman_state state; kalman_init(&state, 1.0, 1.0, 1.0, 0.0); // 輸入電池的電流和電壓 float current, voltage; printf(“請(qǐng)輸入電池的電流和電壓(以空格分隔):”); scanf("%f %f", ¤t, &voltage); // 使用卡爾曼濾波器計(jì)算電池SOC float soc = kalman_update(&state, current, voltage); printf(“電池的SOC為:%.2f%%”, soc); return 0; }
有需要的可以給作者留言
審核編輯 黃宇
-
adc
+關(guān)注
關(guān)注
98文章
6391瀏覽量
543763 -
soc
+關(guān)注
關(guān)注
38文章
4099瀏覽量
217772 -
bms
+關(guān)注
關(guān)注
106文章
966瀏覽量
65631
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論