STM32L476應用開發之六:電池SOC檢測


便攜式設備由於使用需求而配備了鋰電池,但使用過程中需要掌握電源的狀態才能保證設備正常運行。而且在電池充放電的過程中,監控電池的充放電狀態也是保證設備安全的需要。

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、測試結果

我們看一看在屏上顯示出來的效果,有圖標動態顯示,也有數字指示,如下圖所示:

 

在這一次我們采用了簡單的做法,這種做法叫做電壓估算法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM