打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、简介

EG2801是一个锂离子/锂聚合物的电池电量计芯片,提供适用于单节锂离子电池组的电池电量测量。
设备内用嵌入式微控制器,和芯传科技(EPI)为精确电量计的专有算法(专利待批)。
EG2801被设计成适合于电池组或系统主板端内安装。
EG2801提供电池的信息,如剩余电池容量(毫安时),充电状态(%),电池电压(mV),及电池温度(℃)。

二、特征

特征系統端或电池组端为1 串锂离子电池的精确电量估算

  1. 增强库仑计数器预测准确的充电状态
  2. 自动补偿温度,老化,充电速率,和自放电

电量计:
3. 专利电池计量算法
4. 外部温度测量网络·

主动交换式热敏电阻分压器减少电流消耗.。

2 线式(I2C)界面低功耗。

小,无铅,2.5×4.0mm 的 12 引脚 DFN 封装。

符合 RoHS 规范。
在这里插入图片描述

三、示例代码

#include "main.h"
#include "hal_iic.h"
#include "eg2801.h"

EG2801_RAM EG2801_RAM_DATA =
{
    .Flags = 0,
    .StateOfCharge = 100,
};
const IIC_PIN EG2801_GPIO =
{
    .SCL_PORT  = GPIOB,
    .SCL_PIN   = GPIO_Pin_6,

    .SDA_PORT  = GPIOB,
    .SDA_PIN   = GPIO_Pin_7,

    .DelayTick = 2,
    .ADDR      = 0x28
};

/*********************************************
函数名:EG2801_Init
功  能:电池管理器件初始化
形  参:
返回值:
备  注:
作  者:薛建强
时  间:2019/06/28
使  用:
**********************************************/
void EG2801_Init(void)
{
    /*赋初值*/
    EG2801_RAM_DATA.Flags = 0;
    EG2801_RAM_DATA.StateOfCharge = 100;
    IIC_Init(&EG2801_GPIO);//IIC初始化
}

/*********************************************
函数名:EG2801_read_DATA
功  能:利用IIC从EG2801读取2个字节
形  参:ACK--1应答 0不应答
返回值:读取到的2个字节
备  注:
作  者:薛建强
时  间:2019/06/28
使  用:
**********************************************/
uint16_t EG2801_read_DATA(uint8_t ACK)
{
    uint8_t eg2801_buff[2] = {0};
    IIC_ReadByte(&EG2801_GPIO, &eg2801_buff[0]);
    IIC_ACK(&EG2801_GPIO);
    IIC_ReadByte(&EG2801_GPIO, &eg2801_buff[1]);
    if (ACK)
        IIC_ACK(&EG2801_GPIO);
    else
        IIC_NACK(&EG2801_GPIO);
    return ((eg2801_buff[1] << 8) | eg2801_buff[0]);
}


/*********************************************
函数名:EG2801_read_Vcc
功  能:读取EG2801数据
形  参:
返回值:
备  注:EG2801_RAM_DATA.StateOfCharge --电池剩余电量百分比

作  者:薛建强
时  间:2019/06/28
使  用:
**********************************************/
uint8_t temp = 0;
void EG2801_read_Vcc(void)
{

    /*读取剩余电量*/
    IIC_Start(&EG2801_GPIO);
    IIC_WriteByte(&EG2801_GPIO, EG2801_GPIO.ADDR); //写命令
    IIC_Wait_ACK(&EG2801_GPIO);
    IIC_WriteByte(&EG2801_GPIO, 0x55);             //命令码
    IIC_Wait_ACK(&EG2801_GPIO);
    IIC_WriteByte(&EG2801_GPIO, 0x2C);             //寄存器地址--电池剩余电量百分比
    IIC_Wait_ACK(&EG2801_GPIO);

    IIC_Start(&EG2801_GPIO);
    IIC_WriteByte(&EG2801_GPIO, EG2801_GPIO.ADDR | 1); //读命令
    IIC_Wait_ACK(&EG2801_GPIO);
    temp = EG2801_read_DATA(0);
    if (temp <= 100)
    {
        EG2801_RAM_DATA.StateOfCharge =  temp;
    }
    else
    {
        EG2801_RAM_DATA.StateOfCharge = 0;
    }

    IIC_Stop(&EG2801_GPIO);

    /*读取电池状态 EG2801中文资料.pdf--9页*/
    IIC_Start(&EG2801_GPIO);
    IIC_WriteByte(&EG2801_GPIO, EG2801_GPIO.ADDR); //写命令
    IIC_Wait_ACK(&EG2801_GPIO);
    IIC_WriteByte(&EG2801_GPIO, 0x55);             //命令码
    IIC_Wait_ACK(&EG2801_GPIO);
    IIC_WriteByte(&EG2801_GPIO, 0x0A);             //寄存器地址
    IIC_Wait_ACK(&EG2801_GPIO);

    IIC_Start(&EG2801_GPIO);
    IIC_WriteByte(&EG2801_GPIO, EG2801_GPIO.ADDR | 1); //读命令
    IIC_Wait_ACK(&EG2801_GPIO);
    temp = EG2801_read_DATA(0);
    if (temp != 0xff)
    {
        EG2801_RAM_DATA.Flags =  temp;
    }

    IIC_Stop(&EG2801_GPIO);
}




#ifndef __EG2801_
#define __EG2801_
#include "main.h"
#include "eg2801.h"


typedef struct  _EG2801_RAM
{

//    uint16_t    Temperature;
//    uint16_t    Voltage;
    uint16_t    Flags;
//    uint16_t    RemainingCapacity;
//    uint16_t    FullChargeCapacity;
//    uint16_t    AverageCurrent;
//    uint16_t    TimeToEmpty;
//    uint16_t    TimeToFull;
//    uint16_t    StandbyCurrent;
//    uint16_t    StandbyTimeToEmpty;
//    uint16_t    MaxLoadCurrent;
//    uint16_t    MaxLoadTimeToEmpty;
//    uint16_t    AvailableEnerge;
//    uint16_t    AveragePower;
//    uint16_t    TimeToEptyAtCnstPwr;
//    uint16_t    Internal_Temp;
//    uint16_t    CycleCount;
    uint16_t    StateOfCharge;
//    uint16_t    StateOfHealth;

uint8_t ChargeImg;          //0--没有充电  1--开始充电
} EG2801_RAM;

extern EG2801_RAM EG2801_RAM_DATA;

void EG2801_Init(void);
void EG2801_read_Vcc(void);

#endif


posted on 2020-04-13 08:30  xuejianqiang  阅读(23)  评论(0编辑  收藏  举报  来源
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033