0
点赞
收藏
分享

微信扫一扫

[单片机框架][drivers层][ADC] fuelgauge 软件电量计(二)


接上一篇:​​[单片机框架][device层] fuelgauge 电量计​​[单片机框架][drivers层][cw2015] fuelgauge 硬件电量计(一)

本章是软件件电量计的使用方法,采用ADC采集。利用opt的方式操作函数读写。包含电池模型。

通过开路电压oam_v_ocv_1,查ZCV表得到当前的电量值 -> 开路电压需要通过闭路电压v_bat 和 闭路电流,
oam_i_2 去回溯电池内阻逐次逼近 –> oam_i_2 ,通过另一种方式 电量积分更新的电压oam_v_ocv_2.

电池模型表:具有温度和电流区分。

需要采集ADC和电流,才能得到较为准确的电池电流。

fuelgauge.c

#include "log.h"
#include "errorno.h"
#include "modules.h"

#include "gauge_adc.h"

void gauge_adc_init(void) {
}

int32_t gauge_adc_get_volt(void) {
return 4100;
}

gauge_temp_t gauge_adc_get_temp(void) {
uint8_t temp = GAUGE_TEMP_DEGREE_25;
return temp;
}

fuelgauge.h

#ifndef __GAUGE_ADC_H__
#define __GAUGE_ADC_H__

#include "typedefs.h"

typedef enum {
GAUGE_TEMP_DEGREE_NEG_10,
GAUGE_TEMP_DEGREE_0,
GAUGE_TEMP_DEGREE_25,
GAUGE_TEMP_DEGREE_QTY,
} gauge_temp_t;

void gauge_adc_init(void);
int32_t gauge_adc_get_volt(void);
gauge_temp_t gauge_adc_get_temp(void);

#endif // __GAUGE_ADC_H__

电池模型

#ifndef __BATT_MODEL_H__
#define __BATT_MODEL_H__

#define GAUGE_CCV_VOLT_LVL_MAX 12
#define SIZE_BATINFO 64

typedef struct {
uint16_t ccv;
int16_t diff;
} gauge_ccv_diff_t;

/* 580mAh */
static const gauge_ccv_diff_t gauge_ccv_diff_discharge[2][3][GAUGE_CCV_VOLT_LVL_MAX] =
{
/* 0.01C */
{
/* -20 degree */
{
{4500, 100}, {3700, 100}, {3800, 100}, {3700, 100}, {3650, 100}, {3600, 100},
{3550, 100}, {3500, 100}, {3450, 100}, {3400, 100}, {3350, 100}, {3300, 100},
},
/* 0 degree */
{
{4500, 100}, {4000, 100}, {3800, 100}, {3700, 100}, {3650, 100}, {3600, 100},
{3550, 100}, {3500, 100}, {3450, 100}, {3400, 100}, {3350, 100}, {3300, 100},
},
/* 25 degree */
{
{4500, 100}, {4000, 100}, {3800, 100}, {3700, 100}, {3650, 100}, {3600, 100},
{3550, 100}, {3500, 100}, {3450, 100}, {3400, 100}, {3350, 100}, {3300, 100},
},
},
/* 0.1C */
{
/* -20 degree */
{
{4500, 100}, {4000, 100}, {3800, 100}, {3700, 100}, {3650, 100}, {3600, 100},
{3550, 100}, {3500, 100}, {3450, 100}, {3400, 100}, {3350, 100}, {3300, 100},
},
/* 0 degree */
{
{4500, 100}, {4000, 100}, {3800, 100}, {3700, 100}, {3650, 100}, {3600, 100},
{3550, 100}, {3500, 100}, {3450, 100}, {3400, 100}, {3350, 100}, {3300, 100},
},
/* 20 degree */
{
{4500, 100}, {4000, 100}, {3800, 100}, {3700, 100}, {3650, 100}, {3600, 100},
{3550, 100}, {3500, 100}, {3450, 100}, {3400, 100}, {3350, 100}, {3300, 100},
},
},
};

static const gauge_ccv_diff_t gauge_ccv_ocv_charge[2][3][GAUGE_CCV_VOLT_LVL_MAX] =
{
/* 0.01C */
{
/* -20 degree */
{
{4500, 100}, {3700, 100}, {3800, 100}, {3700, 100}, {3650, 100}, {3600, 100},
{3550, 100}, {3500, 100}, {3450, 100}, {3400, 100}, {3350, 100}, {3300, 100},
},
/* 0 degree */
{
{4500, 100}, {4000, 100}, {3800, 100}, {3700, 100}, {3650, 100}, {3600, 100},
{3550, 100}, {3500, 100}, {3450, 100}, {3400, 100}, {3350, 100}, {3300, 100},
},
/* 25 degree */
{
{4500, 100}, {4000, 100}, {3800, 100}, {3700, 100}, {3650, 100}, {3600, 100},
{3550, 100}, {3500, 100}, {3450, 100}, {3400, 100}, {3350, 100}, {3300, 100},
},
},
/* 0.1C */
{
/* -20 degree */
{
{4500, 100}, {4000, 100}, {3800, 100}, {3700, 100}, {3650, 100}, {3600, 100},
{3550, 100}, {3500, 100}, {3450, 100}, {3400, 100}, {3350, 100}, {3300, 100},
},
/* 0 degree */
{
{4500, 100}, {4000, 100}, {3800, 100}, {3700, 100}, {3650, 100}, {3600, 100},
{3550, 100}, {3500, 100}, {3450, 100}, {3400, 100}, {3350, 100}, {3300, 100},
},
/* 20 degree */
{
{4500, 100}, {4000, 100}, {3800, 100}, {3700, 100}, {3650, 100}, {3600, 100},
{3550, 100}, {3500, 100}, {3450, 100}, {3400, 100}, {3350, 100}, {3300, 100},
},
},
};

#endif // __BATT_MODEL_H__

为避免电量跳变的问题可采取以下措施:

  1. 检测在盒充电状态,在盒充电状态,电量只能升不能降,盒外状态只能降不 能升;
  2. 在上述措施的基础上,如果算法给出的电量连续3个周期都要变化,则以最小的变 化区间变化;
  3. 防止系统重启导致电量跳变,则需要在关机重启之前将电池电量存入Flash,下次 开机电量计计算出来的电量只能比这个电量小,不能大,如果大的话,以Flash中存 的电量为准;
    盒子软件电量计风险:

放电场景较为复杂—单耳入盒充电、双耳入盒充电、只有盒子充电、边充(单耳双耳)边放等等;
适配器兼容,盒子充电电流可达到1.2A,如果使用500mA适配器,1A适配器等,可能会影响软件电量计的算法;

一 、 电压查表法来计算剩余电量

自从手持及便携式设备被开发出来, 电池技术就被广泛使用在这些装置上。在实际运用的角度来看, 电池剩余电量的精度, 一直是使用者要求的重点之一, 任何人都不希望看到剩余电料显示还有30%, 可是下一秒钟或是接一个电话, 或是打开相机准备照相, 结果却是断电收场。当然这种状况在早期feature phone时代是经常发生, 主要是因为当时设备的功能单纯, 能耗相对的也较少, 一颗满电的电池芯用个3~5天都不是问题。

所以当时的电量计的式设计很简单, 就是用量测电压, 透过查表、或是简单的计算来决定剩余电量。
相对于智能手机的时代, 一颗满电的电池只能用个一天的状况, 如果电量指示还有30%, 下一个动作却让设备直接断电, 恐怕消费者都没法接受。

电压查表法的优点是成本低最低, 能耗也很低。缺点是精度也最相对较低, 且SOC会随着负载的变化而上下跳动, 当电池老化之后, 这种跳变的现象会更加明显。

二、库仑计

库仑计, 顾名思义, 就是电池电荷的累计。通过检流电阻检测充放电电流, 冲进去的电量就是电池的容量。总容量减去放出的容量就是电池剩余容量。

此方法实现相对简单, 且原理容易理解, 是目前使用比较多的一种计算方法, 但是, 并无法作为真正的电池电量计算使用。方案最大的问题在于两点, 一是累计误差, 随着时间的推进, 误差会越来越大;二是电池的充入电量和放出电量是不相等的, 在不同的负载、温度等条件下, 容量差别更大, 最典型的就是常温满电的电池在低温下只能放出很少的电量。

所以, 库仑计一般只是作为电量计算的辅助工具, 需要配合其他设备或采样数据进行修正使用。

三、透过检测电压, 电流及温度, 加上算法来计算剩余电量

这是比较典型的电量计算方案, 正常使用条件下通过库仑计计算电量, 在特定条件下通过电压或温度进行补偿。

对新电池来说可以比较精确的计算出剩余电量, 可是当电池老化之后精度就逐步降低, 这主要是因为库仑计的计算基础事先要了解目前电池的总容量, 再依据量测到的当前的电压、电流以及温度, 来计算用掉的容量之后, 估算出剩余电量。

可是当电池老化之后, 随之而来的就是总容量变少, 这个时候如果还是用新电池的总容量当成计算的基础, 剩余电量的计算误差就会越来越大。

这个方式的优点是期初精度很高, 缺点有:
(a) 元器件成本相对较高, 同时需要额外的制程及设备来进行检流电阻的校正, 以及对电池的全充放电来估算初期电池总容量。
(b) 随着电池老化, 误差会随之增加。
© 方案本身的能耗比较于电压检测方案要高很多。

四、针对电压检测方案的优化

(a)这个方案主要是针对长期精度进行优化, 最主要的步骤就是在电量计芯片内, 针对现在使用的电池芯建模, 由于理论上电池无论是新的还是老化之后, 其OCV(开路电压)曲线都是相同。因此建立了电池模型就有实际剩余电量的参考依据, 同时还把因为大电流放电温升的因素考虑进来, 以提升长期电量计算精度。可是这个方案是在大部分应用中, 精度都可以维持在正常范围内。

(b)除此以外, 也有厂商针对上述缺点, 在电量计内加上自我学习校准的演算功能, 来应对老化的影响, 以保持长期剩余电量的精度。

五、针对普通电流检测方案的优化

由于普通电流检测方案的长期精度误差很大, 因此有厂家建立了“内阻追踪(Impedance Track)”的技术, 根据内阻的变化决定电池老化的程度, 来修正剩余电量计算的精度。

电量计技术

代表厂家

方案成本

短/长期精度

电压查表法

所有未使用电量计的厂家


低/非常低

库仑计 (主要放在PMIC/PMU内)

Qualcomm,Broadcom, MTK, X-power(芯智汇) ,O2(凹凸),EPI(芯传)


中(由开发的软件方案决定)

电压检测+温度检测+电池建模

Maxim(美信)


低/中

电压检测+温度检测+电池建模+自学习演算

CellWise(赛微)


高/高

库仑计+内阻追踪

TI(德州仪器)


高/高


举报

相关推荐

0 条评论