电池供电的电子产品不计其数,具有便携性好的优点,可以随时随地使用。但是有一个让用户非常焦虑的事情是电池续航问题。我们在使用电池供电的产品时,会关心当前电池还有多少电量、还能用多久。
我最近买了一个蓝牙耳机,选择它的一个重要原因就是它可以直观的显示电池电量,
如果本身没有显示,只能在电池电量低时收到语音提示,或者在电脑、手机上查看电量信息(蓝牙协议里有电池电量的服务,会将电量信息发给主设备),不如直接显示方便。
本文探讨和电池电量相关的2个技术问题:电量采集和电量显示。
一、电量采集
电池电量采集方法主要有两种:
1) 电压采集法:这种方法是基于电池电压与电量的关系来进行采集的。电池电压随着电量消耗而逐渐降低,因此可以通过采集电池电压来估算电量。电压采集法具有成本低、实现简单的优点,但其精度较差,尤其是在电池电量较低时。
电池的种类不同,电压和电量的关系也不同。
图片来源:https://www.powertechsystems.eu/home/tech-corner/lithium-ion-state-of-charge-soc-measurement/
上图可以看出,铅酸电池具有相对线性的曲线,可以很好地估计充电状态:然而,锂离子电池的放电曲线要平坦得多,这意味着在很宽的工作范围内,电池端子的电压变化非常小。
2)库仑计法:这种方法是基于电池电流累积来进行采集的。库仑计是一种电路,它能够累积通过其的电流。通过记录电流累积值,可以计算出电池消耗的电量。库仑计法具有精度高、可靠性好的优点,但其成本也较高,实现也更为复杂。
对于普通应用来说,使用第一种电压采集法即可,以4.2V锂电池为例,电池容量和电压关系大概如下,可根据电压估算出电池容量。
图片来源:https://siliconlightworks.com/li-ion-voltage
二、电量显示
假设电池电量使用如下图标进行显示,满格电量为4格
假设我们可以按照如下电压进行设置:
4.20V~3.90V满格
3.90V~3.80V三格
3.80V~3.72V两格
3.72V~3.65V一格
3.65以下,低电压告警。
代码里你可能会按照如下方式实现:
if(Vol >= 3.9)
Disp(4);
else if(Vol >= 3.8)
Disp(3);
else if(Vol >= 3.72)
Disp(2);
else if(Vol >= 3.65)
Disp(1);
else
Disp(0);
这么写实际会有问题,会出现在临界值时出现电量格数来回跳变的问题。比如ADC测得电压时3.90V时显示满格,当测到3.89V时会就显示3格,下一时刻由于ADC采集误差或者本身电池电压波动就会测到3.90V,这时就又显示了满格,之后会再次出现3格。这样会让用户觉得紊乱,实际中不能这么用,需要改进。
改进的方法是加入回差控制:
if(Vol >= 3.9)
Disp(4);
else if(vbat >= 3.8+0.02 && vbat < 3.9-0.02)
Disp(3);
else if(vbat >= 3.72+0.02 && vbat < 3.8)
Disp(2);
else if(vbat >= 3.65+0.02 && vbat < 3.72)
Disp(1);
else if(Vol < 3.65)
Disp(0);
else
; // 不处理
扫码加入嵌入式交流群: