不停地疯

Work as a hacker, hack as a artist.

简述一种电池电量表的取得方法

| Comments

一般来说,常用的电池电量的计算方法有两种:一种是使用叫做库仑计的ADC器件对电池的电流进行时间积分统计,然后除以电池的总毫安时容量,从而得出电池当前的电量;而另一种是使用电压采样ADC获取电池当前的端电压,并通过软件计算出电池的开路电压,然后根据电池的电压-容量表1来对应查找到当前电压下的电池容量。显而易见,从理论上来讲前一种方法更加准确。但在实际上,前一种方式往往受限于库仑计设备的采样精度以及程序员编写驱动程序的水平;同时,在硬件方面也增加了器件成本,应用上并没多少优势。像Marvell的88pm860x PMIC芯片中是有库仑计器件的,实际使用中统计值和实际偏差较大,需要在驱动程序中通过其它办法对所得值进行补偿校准后才有一定的使用价值。而高通的PM8029 PMIC芯片中则没有库仑计功能,驱动中的逻辑也比较单纯,仅仅是简单的获取VBATT值,并通过电流和电池内阻对VBATT进行校正后得到电池开路电压,然后根据电压-容量表查到当前电池的电量。使用对比下来,高通平台所使用的这种方法简单且有效,只需要根据不同电池制作一份电压-容量表即可完成电池的电量计算。

但是,使用电压-容量表也不是没有缺点的,为了说得更清楚点,这里先简单介绍一下电压-容量表。这里所说的电压-容量表中的“电压”指的是电池的开路电压OCV,而不是直接由ADC所采样到的电池端的原生电压VBATT的值。学过中学物理的可以知道,所有电池是有阻抗的,一般我们人为将其抽象为电池内阻,因此一个电池通常可以被抽象为一块原电池和电池内阻的串联体。这样,如果电池有电流流出的话,输出的电流越大,通过欧姆定律可以得出电池内阻的分压也会越大。这意味着在输出电流状态下,外部测得的电池端电压就会比实际开路电压小;相反,如果电池在充电中,电流方向和放电时相反,电流为流入电池。此时测得的端电压就会比开路电压略大。简而言之,从外部所测的的电池端电压很不稳定,它是电池内阻、电流以及温度等因素的函数。因此,开路电压的概念就变得重要了,如果继续基于之前所说的抽象电池来讲,开路电压是在电路中没有电流回路的情况下测得的电池端电压,也即是原电池的端电压。计算开路电压时,一般会估算一个电池内阻值,然后根据欧姆定律使用ADC采样到的电池端电压以及电池电流来计算出开路电压。至于电压-容量对应表,则是基于另外一个假设:电池的不同电量都对应一个唯一的电压值。但是,假设毕竟是假设,事实情况总要复杂一些。先不提容量与电压的非线性关系,不同供应商提供的不同型号的电池,其电压-容量特性都是不一致的,而且有时会出现某一阶段电压特别耐用的情况,这直接导致有时计算得到的电压-容量表中会出现同一电压对应多个容量的情况。如下图中,随着时间的增长,有时电压会保持比较平稳的状态。加上电压-电量表计算时一般都是使用供应商提供的电池充放电数据,这种数据一般使用比较标准的电流对电池进行恒流充放电后统计得到的,和手机实际使用的情况存在一定差异,而且数据采样设备在精度上也有较大的差别。这也造成了如果直接使用供应商数据计算得到的电压-容量表,在实际使用时效果不够好的情况。针对这种情况,人为会对所得结果做一些补偿和修正。但是这种问题一般都要花比较长的时间测试后才有可能发现,而且补偿的效果同样需要花费较长的时间才能验证。那么能不能通过简单的方法有效避免这类问题呢?

./images/blog/./1656aA2.png

考虑到数据采样设备以及环境的差异问题,如果直接使用手机内部的ADC采样电池数据,然后使用这个数据计算电量表会不会好一点?实际验证下来,这种方法确实有一定的效果改进。采样之前,将手机环境至于标准功耗模式(最大亮度常亮,循环播放MP3),然后再进行采样,这样可以最大限度的模拟手机使用过程中电池的实际情况。采样的数据包括放电时长以及电池开路电压。至于电量表的计算,在这种情况下更为简单。因为在采样过程中手机处于标准功耗模式中,可以近似认为电流恒定,所以电量的损耗和时间是函数关系。将采样全程时长分为100份,然后分别得到每份所对应的电压值,电量表就做出来了。这种方法有个很大的优势,那就是思路简单,很适合脚本化操作。采样脚本外加计算电量表脚本,使用bash一会儿就可以搞定。

可是,出于之前所说的一个问题,电池的电量和电压并没有一个绝对的对应关系,极端时甚至会出现得到的电量表中同一个电压值对应了多个电量。为了解决这个问题,我们引入了数学方法,使用样条差值的办法拟合采样的数据点,然后在拟合的曲线上重新进行电压电量对应关系的获取。使用了这个方法之后,电池电量方面的问题少了很多。而且由于使用了时间分割电量,所以在实际使用中,每格电量的使用时间都很接近,符合用户对电量的认知。拟合曲线的效果如图:

./images/blog/./1656N2v.png

改进后的电量表采样及计算脚本在:battery analyzer 。脚本中的样条差值部分使用了octave程序实现,效果蛮不错的。

Footnotes:

1 指开路电压与电池容量的对应关系表。

Android, Qualcomm, 开发

« 搞了个半自动化的Vim windows上的alfred »

Comments