高通8X16电池BMS算法(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yanleizhouqing/article/details/51592243

最近一直在搞电源管理相关内容,之前是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_3000 mah.dtsi //电池相关的参数
Msm-pm8X 16.dtsi //针对PMU芯片,进行的相关设置
其他一些的代码就不一一列出来,其实高通的代码还是比较好的,基本大部分的文件都会.txt的介绍文档,我个人建议在不管调什么模块,
看到有与之对应的.txt说明文档,都应该去看一下,起码对一些基本的概念有个了解。


3. 相关的原理
3.1 BMS 主要任务
1. 防止过充 2. 避免深放 3. 温度控制 4. 电池组件电压和温度的均衡 5. 预测电池的SOC 6. 电池诊断 7. 总电压及单体电压测量
8. 总电流及单体电流测量 9. 报警1 0. 通信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机制,作为服务一直运行。


下一部分,主要分析相关的代码以及一些调试经验。

猜你喜欢

转载自blog.csdn.net/yanleizhouqing/article/details/51592243