Fork me on GitHub
0%

电池电量检测

近期在做关于电池电量检测的工作,而硬件电路并没有使用库仑计(在部分嵌入式场景下成本太高),而是使用分压电路ADC采样。基于此对相关学习到的内容做总结和分享

难点

  • 锂电池的放电非线性;
  • 充放电瞬间,电压值是突变的
  • 锂电池随着使用电量减少,需要实现自动校准
  • ……

充电IC基础原理

IC充电阶段

  • 涓流充电(Trickle Charge)

    涓流充电阶段通常只在电池电压低于一个极低水平时采用。

    在这种状态下,电池组的内部保护 IC 可能由于深度放电或发生过流事件已经断开了电池。充电器 IC 提供一个小电流(通常为 50mA)为电池组的电容充电,以触发保护 IC ,合上其 FET重新连接电池。虽然涓流充电通常只持续几秒钟,但充电器 IC 仍然需要集成一个定时器。如果电池组在一定时间内未重新连接,则定时器停止充电,因为这表明电池已损坏。

  • 预充电(PreCharge)

    一旦电池组重新连接或处于放电状态,就进入预充电阶段。

    预充电期间,充电IC开始以一个较低的电流水平为耗尽的电池安全充电,该电流通常为 C / 10(C 为容量,以 mAh 为单位)。预充电使电池电压缓慢上升。其目的是在低电流水平下对电池进行安全的充电,以防止损坏电池,直到其电压达到一个较高的水平。

  • 恒流充电(Constant Current Charge)

    恒流(CC)充电也被称作快速充电阶段,恒流充电在预充电之后开始。

    在恒流充电阶段,电池可以安全地处理 0.5C 至3C 之间的较高充电电流。恒流充电会持续到电池电压达到“满电”或浮动电压水平,然后进入恒压充电阶段。

  • 恒压充电(Constant voltage Charge)

    充电器 IC 会在恒流充电期间监测电池电压。一旦电池达到恒压充电阈值,充电器IC就会从恒流转换至恒压调节阶段。当充电器 IC 监测到外部电池组电压超过了电池组中的实际电池电压,就开始执行恒压充电。这是由于存在内部电池电阻、PCB 电阻和来自保护 FET 和单电池的等效串联电阻 (ESR)。充电器 IC 不应允许电池电压超过其最大浮动电压,以保证安全的运行。

  • 截止阶段

    对于浮充型充电芯片,当达到浮充阈值,输出恒定电压

    对于关断型充电芯片,当充电充满,芯片处于关断待机状态,无充电电流

说明

  1. 对于IC各个充电阶段需要参考IC的手册最终确定有哪些阶段,有些将涓流充电和预充电合成一个阶段处理,所以需要具体分析。
  2. 有些充电IC提供了可编程配置阈值的功能,即通过连接不同的阻值来对其进行设置,如果没有需要参考手册确定每个阶段的阈值分别是多少。配置的阈值能够提供一层额外的安全保护,保护电池免受过压、过热条件以及过载的影响,从而避免电池的永久损坏或容量降级。

流程整理

  1. 配置 ADC

    中断模式、设置重复采样时间、设置采样次数

    • Vadc = adcNumer(ADC采样数据) x Vref(ADC基准电压)/ (2^ADC量化位数)
    • Vbat = k(电阻分压系数比) × Vadc
  2. 配置 Timer

    配置ADC采样的时间即多久进行一次电池电量检测

  3. 启动电池电量检测主线程

  4. 等待USB插拔事件中断或者Timer时间触发电池检测

    • 打开ADC采样通道
    • 获取ADC数据
    • 关闭ADC采样通道
    • 计算最终输出的电池电量

伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/************************************   ADC    *******************************/
static void adc_interrupt_cb(void)
{
// calculate adc voltage
// 校准:采集多次去掉一个最小值、去掉一个最大值,取平均值
}
static void adc_init(void)
{
// config adc interrupt mode and callback
// config adc sampling times
// enable adc channels
}
/************************************ USB *******************************/
static void usb_interrupt_callback(void)
{
// get usb charging / discharging state
// put battery detect time to default
// enable adc sampling(enter adc_interrupt_cb)
}
static void usb_init(void)
{
// request drv_bus gpio
// config drv_bus interrupt and trigger mode
// config interrupt callback
}
/*********************************** TIMER ***************************/
static void timer_interrupt_cb(void)
{
// enable adc sampling(enter adc_interrupt_cb)
}
static void timer_init(void)
{
// config timer
// config default battery detect time to timer
// config timer interrupt callback
}
/*********************************** BATTERY ***************************/
static int get_battery_voltage(void)
{
// enable channels
// get battery voltage
// disable channels
}
static int adjust_battery_voltage(int vbat)
{
// record pre_percent pre_voltage
// record voltage and timestamp, calculate new battery detect time
// other optimize ways
}
static int calculate_battery_percent(int vbat)
{
// 需要厂家提供电池充放电电池容量百分比对应的电压
// 查表===>计算出百分比
// 策略:
// 最终的百分比相较于上一次是否有跳变,+-1;
// 充电百分比减少,放电百分比增加。不被允许,需要对这两种情况处理掉
}
//电池电量检测函数可以进一步优化
void battery_detect_thread(void)
{
adc_init();
usb_init();
timer_init();
while(1) {
// calculate battery percent
int vbat = get_battery_voltage();
vbat = adjust_battery_voltage(vbat);
int percent = calculate_battery_percent(vbat);
}
adc_deinit();
usb_deinit();
timer_deinit();
}

误差来源

  1. ADC量化误差
  2. 分压电阻值不准确,导致分压比不确定带来的误差
  3. OCV表格内记录的是阶段性的电压与容量比,每一格实际上不是线性变化的,但在实际处理过程中按照线性来处理

校准误差及优化策略

  1. ADC采样

    平均值滤波。取十次adc数据,去掉最大值、最小值取平均值

  2. 插入usb / 拔出usb瞬间触发电池检测

  3. 记录最近十次采样的结果及sysTime,计算掉电或上电1%容量所消耗的时间,从而可以计算出下一次检测的时间间隔

  4. 在最终电池电量的显示上,需要逐步递增逼近采集的值不能突变

  5. 校准:根据一个确定状态下,确定的电压值和我们采集到的电压值,计算出偏差,校准

缩写表

  • OCV:Open Circuitt Voltage 开路电压

  • CV:Cyclic Voltammetry 循环伏安法(改变电位以得到氧化还原电流方向之方法)

  • UVLO:Under Voltage Lock Out 欠压锁定(输入电压低于某一值时,电源芯片不工作,处于保护状态)

  • OVP:Over Voltage Protection 过压保护

  • UVP:Under voltage Protection 欠压保护

  • ASOC:Absolute State-Of-Charge 绝对电荷状态 (绝对荷电状态则是一个当电池制造完成时,根据所设计的固定容量值所计算出来的的参考值)

  • RSOC: Relative State-Of-Charge 相对电荷状态(相对荷电状态的范围是 0% - 100%)

一个全新完全充电电池的绝对荷电状态是100%;而老化的电池即便完全充电,在不同充放电情况中也无法到100%。

IC原理图及其它参考资料

  1. DIO58056
  2. SY8602
  3. TI电量计设计指导
  4. ADC电量检测与校准