最近一直在搞電源管理相關內容,之前是8610的bms,現在8916的bms,發現兩者還是有點區別的,8916把對last_ocv_uv的估值演算法分裝成執行文件,作為服務一直運行。 電源管理方面,應該是Android驅動開發的一大難點,主要涉及的方面多,如充、放電、休眠喚醒等。這一部分主要講BMS相關 ...
最近一直在搞電源管理相關內容,之前是8610的bms,現在8916的bms,發現兩者還是有點區別的,8916把對last_ocv_uv的估值演算法分裝成執行文件,作為服務一直運行。
電源管理方面,應該是Android驅動開發的一大難點,主要涉及的方面多,如充、放電、休眠喚醒等。這一部分主要講BMS相關的一些基本概念。電池這一塊剛開始入手時,感覺很難,很複雜,完全不知道如何入手,後來搞久了,才發現,是對電池一些基本的知識,在腦海中缺少相關的概念,所以才感覺難,這裡主要是介紹一些相關的術語與知識。
1. 相關的名詞
術語 | 全稱 | 註釋 |
---|---|---|
FCC | Full-Charge Capacity | 滿電荷電量 |
UC | Remaining Capacity | RC 剩餘電量 |
CC | Coulumb Counter | 電量計 |
UUC | Unusable Capacity | 不可用電量 |
RUC | Remaining Usable Capacity | RUC=RC-CC-UUC,剩餘可用電量 |
OCV | Open Circuit Voltage | 開路電壓,電池在開路狀態下的端電壓稱為開路電壓 |
SoC | State of Charge | 電量百分比 |
PC | Percentage Charge | 剩餘電荷占FCC百分比 |
2. 相關的代碼
- kernel\drivers\power\Qpnp-vm-bms.c//電池BMS演算法
- kernel\drivers\power\Qpnp-linear-charger.c//電池充電相關的代碼
- batterydata-XX_3000mah.dtsi//電池相關的參數
- Msm-pm8X16.dtsi//針對PMU晶元,進行的相關設置
其他一些的代碼就不一一列出來,其實高通的代碼還是比較好的,基本大部分的文件都會.txt的介紹文檔,我個人建議在不管調什麼模塊,
看到有與之對應的.txt說明文檔,都應該去看一下,起碼對一些基本的概念有個瞭解。
3. 相關的原理
3.1 BMS 主要任務
- 防止過充
- 避免深放
- 溫度控制
- 電池組件電壓和溫度的均衡
- 預測電池的SOC
- 電池診斷
- 總電壓及單體電壓測量
- 總電流及單體電流測量
- 報警
- 通信SOC
方法:能量積分 + 誤差矯正 (大眾化技術,準確性高。)
傳統的電池電量測試方法有:密度法,開路電壓法,內阻法和安時法等。
新型演算法有:自適應神經模糊推斷模型、模糊邏輯演算法模型、線性模型法、阻抗光譜法和卡爾曼濾波估計模型演算法 。
3.2 開路電壓法
通過實驗方法描述在不同放電電流情況下的電池的端電壓與電池的剩餘能量的關係曲線,並存儲特征關係曲線。
實時採樣電池放電時的端電壓,查表求出電池的剩餘能量,同時考慮電池的使用壽命以及內阻對電池SOC的影響,對求得的電池剩餘能量
進行校正。 優點:簡單易行。 缺點:但是需要電池長時間靜置,不能滿足線上檢測的要求。soc>40%,阻抗變化很小。
3.3 8916的BMS的相關思路:
3.3.1 PMU通過PMIC匯流排讀取電池的AD值,通過一個數據運算轉化為電壓值。
3.3.2 在不同的電池參數文件中,都有相對應的表,
pc-temp-ocv-lut,為溫度、SOC對應得電壓表,PMU8916獲取的電壓值,通過查該表,在溫度和電壓下,可得到當前的SOC。
rbatt-sf-lut,為溫度、soc對應的電池內阻表,這裡主要考慮內阻的影響,對OCV的修正,new_ocv=ocv+rbatt(內阻)*current(當前電流)。
fcc-temp-lut,為溫度對應的fcc表,ibat-acc-luit,為溫度、電流對應的acc表,這兩個是起到修正SOC的作用,相關計算為:
soc_uuc = ((fcc - acc) * 100) / fcc,fcc、acc均為查表所得,
soc_acc = DIV_ROUND_CLOSEST(100 * (soc_ocv - soc_uuc),(100 - soc_uuc)); //最終soc_acc,為上報的SOC
3.3.3 PMU8916的bms演算法和PMU8612的有區別,其中對last_ocv_uv的估值計算的源碼已經不開放,在monitor_soc_work的工作線程,
會上報事件uevent,當HAL層,收到消息,然後調用getprop的方法,獲取相關的參數,如,電阻、電流、fcc、acc等,來估算出last_ocv_uv,然後調用setprop,把該值設下去,並啟動工作線程,根據last_ocv_uv,查表得到soc,並經過修正SOC,並再次上報事件,迴圈下去。這個估值演算法,我猜可能是一套學習演算法,具體的沒有源碼,不清楚,只知道它把演算法變為.bin文件,用了binder機制,作為服務一直運行。