便攜式設備由於使用需求而配備了鋰電池,但使用過程中需要掌握電源的狀態才能保證設備正常運行。而且在電池充放電的過程中,監控電池的充放電狀態也是保證設備安全的需要。
1、硬件設計
電池SOC檢測是一個難題,有很多的模型和檢測電路。但對於我們這樣一台很小的便攜式一起來說,使用各類檢測模型和電路無論成本還是周期都不允許,所以只能想別的辦法。
我們使用一個采樣電路采集電壓信號,形成以個0-2.5V的差分信號,如下圖所示:
再將差分信號引入到具有差分信號輸入功能的ADC控制器,就可以采集電池的電壓了。模擬量采集在前面已經試驗過了:
在STM32L476RG開發板中,有SPI3口已經引到端子可以使用。各引腳分別為:
CN7-1 PC10 SPI3-SCK
CN7-2 PC11 SPI3-MISO
CN7-3 PC12 SPI3-MOSI
在開發板上的位置如下紅框標識:
關於硬件配置這里就不再敘述了。
2、軟件設計
前面說過了我們使用采集電池電壓的方式來估算電池的SOC,那么首先我們來看一看電池SOC與電壓的關系。一般的鋰電池電壓與SOC的關系可表示如下圖:
根據上圖我們可以知道在10%到100%的范圍內電壓的變化是比較平緩的,但在10%以下就會計數下降。在我們估算SOC是其實在小於10%的時候就應該認為電池已經不具備工作條件。
首先定義一個數組用於存儲電池電壓值,然后再檢測到電壓值后與存儲的數據對比。獲得相應的區間計算SOC值。
float voltages[2][13];
1 /*查找目標位置*/ 2 static uint16_t FindTargetLocation(float voltage) 3 { 4 uint16_t position=0; 5 while(voltages [1][position]< voltage) 6 { 7 if(position<12) 8 { 9 position++; 10 } 11 else 12 { 13 position++; 14 break; 15 } 16 } 17 return position; 18 } 19 20 static float LookupCalcSoc(float voltage) 21 { 22 float temp; 23 uint16_t index=14; 24 index=FindTargetLocation(voltage); 25 26 if(index<=0) 27 { 28 temp= voltages [0][0]; 29 } 30 else if(index>=13) 31 { 32 temp= voltages [0][12]; 33 } 34 else 35 { 36 float lowV= voltages [0][index-1]; 37 float lowS= voltages [1][index-1]; 38 float highS= voltages [1][index]; 39 40 temp=((resistance-lowS)*0.5)/(highS-lowS)+lowV; 41 } 42 43 return temp; 44 }
以上是我們對電池SOC的估算方式,當然不同的廠家電池也許充放電曲線會有些差異,但方法應該都是一致的。
3、測試結果
我們看一看在屏上顯示出來的效果,有圖標動態顯示,也有數字指示,如下圖所示:
在這一次我們采用了簡單的做法,這種做法叫做電壓估算法。