接上一篇:[单片机框架][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            64typedef 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(德州仪器) 高/高

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

  1. [单片机框架][drivers层][cw2015] fuelgauge 硬件电量计(二)

    接上一篇:[单片机框架][device层] fuelgauge 电量计 [单片机框架][drivers层][cw2015] fuelgauge 硬件电量计(一) 本章是硬件电量计的使用方法,采用IIC ...

  2. [单片机框架][drivers层][cw2015/ADC] fuelgauge 硬件电量计和软件电量计(一)

    接上一篇:[单片机框架][device层] fuelgauge 电量计 CW2015 是一款超紧凑.低成本.主机侧/电池组侧.无传感电阻器的电量计量系统 IC,适用于手持和便携式设备中的锂离子 (Li ...

  3. [单片机框架][drivers层][extend_16ch] 16位恒流驱动芯片 MBI5020 JXI5020GP

    文章目录 一.简介 二.特性 三. 示例代码 一.简介 4pin控制16ping,IO扩展器件 二.特性 16 个等电流输出通道 等电流输出值不受输出端负载电压影响等电流范围值, 3-30mA@VDp ...

  4. [单片机框架][device层] fuelgauge 电量计

    通过 DEVICE_INITCALL("dev-gauge", fuelgauge_dev_init); 注册驱动,自动在main初始化中运行. 优点:耦合少,可移植性强,适用大团 ...

  5. [单片机框架][bsp层][cx32l003][bsp_adc] ADC配置和使用

    ADC是模数转换器转换器 的供应商的英文简称,是一种能将模拟信号转变为数字信号的电子元件.通常是将信号采样并保持以后,再进行量化和编码,这两个过程是在转化的同时实现的. 分辨率-说明AD对输入信号的分 ...

  6. [单片机框架] [drivers] [hc4051] 8路模拟分流器

    文章目录 一.概述 二.器件使用 三.器件代码 四.同款差别 CD4051和 HC4051 1. CD4051 2. HC4051 一.概述 74HC4051是- -款八选一模拟开关电路,内置3个地址 ...

  7. [单片机框架][bsp层][N32G4FR][bsp_uart] UART配置和使用

    USART 简介 通用同步异步收发器(USART)是一种全双工或半双工,同步或异步的一个串行数据交换接口.USART 提 供了可编程的波特率发生器,能对系统时钟进行分频产生 USART 发送和接收所需 ...

  8. [单片机框架][bsp层][nrf52832][nrf52840][nrf52810][nrf52820][ESB(2.4G)] ESB(2.4G)使用说明

    这个指南描述了什么是ESB(Enhanced ShockBurst)以及如何在nRF5系列中使用ESB. ESB支持双向数据包通信,包括数据包缓冲,数据包确认和丢失数据包的自动重传的基本协议.ESB提 ...

  9. 基于单片机的八层电梯设计

    设计简介: 本设计是基于单片机的八层电梯设计,主要实现以下功能: ①可实现通过内机按键和外机按键控制电梯到达楼层 ②可实现通过一个四相步进电机控制电梯升降,另一个四相步进电机控制电梯开关门 ③可实现通 ...

  10. 【单片机毕业设计】【mcuclub-jj-003】基于单片机的八层电梯的设计

    最近设计了一个项目基于单片机的八层电梯系统,与大家分享一下: 一.基本介绍 项目名:八层电梯 项目编号:mcuclub-jj-003 单片机类型:STC89C52.STM32F103C8T6 功能简介 ...

最新文章

  1. AI 白皮书:赢家、输家
  2. linux 初始化工作环境
  3. moveit!功能包安装问题
  4. 类型两个数相减_小学数学简便计算12种分类+5种易错类型,打印出来给孩子练习!(可打印!)...
  5. Linux之文件查找命令
  6. 从技术角度聊聊,短视频为何让人停不下来?
  7. 前端学习(680):switch注意事项
  8. Mybatis(19)注解实现多表查询
  9. java 试题 历届试题 单词分析 题解
  10. 《刺激战场》正式停服!换了个马甲又来了 开启收费变现模式?
  11. html5网页制作代码_推荐十个好用的HTML5小工具,前端程序员居家必备良品
  12. 工作总结:将电脑中的ARP缓存清空黑屏命令
  13. HTML5写的简单小游戏-绵羊快跑
  14. 计算机专业电子技术基础教学,计算机专业“电子技术基础”教学上的难题及对策.doc...
  15. easyUI设置行高
  16. 简单的一个百度注册界面
  17. 图对比学习的应用(NCL,SimGRACE,ClusterSCL)
  18. 防火门建筑材料英国UKCA认证—EN 16034
  19. 查看字符的所占字节数
  20. 宝藏下载神器,python一键下载B站视频

热门文章

  1. SQL语句优化常见方法
  2. 数据库系统概论第五版课后习题答案王珊
  3. 一本通————1244 和为给定数
  4. 光纤跳线接口_小白过来看,图解光缆、终端盒、尾纤、跳线的作用和接法
  5. MathorCup数模竞赛,为你的保研之路添砖加瓦~
  6. 离散数学 习题篇 —— 等价关系的计数
  7. web系统服务器登录不上去,宝塔面板严重错误登录不上怎么办
  8. 推荐几本数据库基础书
  9. 数学建模的13种常用的方法
  10. Linux 下安装 yum