Gravity:I2C 3.7V锂电池电量计

简介

在很多项目中我们都会用到3.7V锂电池,但是锂电池的剩余电量与电压呈现高度非线性,我们往往只能根据电池电压粗略判断电池是否充满或电量不足。Gravity 3.7V锂电池电量计使用Gravity I2C接口,超低工作电流,通过Maxim专利算法,实时跟踪锂电池的相对充电状态(SOC,State-Of-Charge),无需充放电学习过程,无积累误差,即插即用,准确测量锂电池的当前电压和剩余电量。模块预留低电量报警中断引脚,当电池电量低于指定阈值时,该引脚产生一个下跳脉冲,触发主控的外部中断。

使用该模块可实时了解或记录系统的耗电状态,估算电池的续航时间,或是在太阳能项目中了解电池电量在一日甚至数月的变化状态,准确掌握太阳能系统充放电的“收支状况”,甚至可以做成一个智能电源管理系统。

特性

  • Maxim专利算法,准确测量锂电池当前电压和剩余电量
  • 无需充放电学习过程,无积累误差,即插即用
  • 兼容3.3V/5V控制器
  • 可编程低电量报警中断
  • 电池反接保护,误接不烧电路

技术规格

  • 输入电压(VCC):3.3V~6V
  • 电池输入电压(BAT IN):2.5V~4.5V
  • 电池类型(BAT IN):3.7V单节锂聚合物/锂离子电池(充满电压4.2V)
  • 工作电流:50 uA
  • 通信接口:Gravity I2C (逻辑电平0-3.3V)
  • 产品尺寸:30.0mm*22.0mm

应用场景

  • 太阳能气象站、路灯
  • 锂电池充电器
  • 智能小车、机器人

接口说明

Gravity 3.7V锂电池电量计 引脚说明

标号 名称 功能描述
+ VCC 电源正极(3.3~5.0V)
- GND 电源负极
C SCL I2C时钟线
D SDA I2C数据线
ALR ALRT* 低电量报警中断(低电平有效)
BAT IN 电池接口 3.7V锂电池连接端口
REV BAT 电池反接指示灯 电池接反时,反接保护电路激活,指示灯点亮。

引脚说明

Arduino使用教程

准备

  • 硬件
    • Arduino UNO控制板(或类似控制板) x 1
    • Gravity:3.7V锂电池电量计 x 1
    • Gravity 4P传感器连接线(或若干杜邦线) x 1

连线图

读取锂电池电压、剩余电量与设定低电量中断报警

  • 将模块与Arduino按照连线图相连,电池既可连在接线柱上也可连在PH2.0 2P横卧母座上,两个插座内部直接并联。I2C地址为固定的0x36,无需修改。
  • 安装DFRobot MAX17043库。如何安装库?
  • 打开Arduino IDE,将下面的代码上传到Arduino UNO。
  • 打开Arduino IDE的串口监控视器,把波特率调至115200,即可观察到模块通过串口打印电池电压、剩余电量百分比和中断报警提示信息。
    /*
     * file DFRobot_MAX17043.ino
     *
     * connect gauge I2C interface with your board (please reference board compatibility)
     *
     * Voltage, percentage will be printed via serial.
     * Use API to config alaram and sleep (please reference to the readme in lib)
     *
     * Copyright   [DFRobot](https://www.dfrobot.com), 2016
     * Copyright   GNU Lesser General Public License
     *
     * version  V1.0
     * date  2018-3-26
     */

    #include "DFRobot_MAX17043.h"
    #include "Wire.h"

    #ifdef __AVR__
      #define ALR_PIN       2
    #else
      #define ALR_PIN       D2
    #endif

    #define PRINT_INTERVAL        2000
    #define BAT_PERCENTAGE        32

    DFRobot_MAX17043        gauge;
    uint8_t       intFlag = 0;

    void interruptCallBack()
    {
      intFlag = 1;
    }

    void setup()
    {
      Serial.begin(115200);
      while(!Serial);
      Serial.println();
      Serial.println();
      pinMode(ALR_PIN, INPUT_PULLUP);
      attachInterrupt(digitalPinToInterrupt(ALR_PIN), interruptCallBack, FALLING);  //default alert is 32%

      while(gauge.begin() != 0) {
        Serial.println("gauge begin faild!");
        delay(2000);
      }
      delay(2);
      Serial.println("gauge begin successful!");
      //gauge.setInterrupt(BAT_PERCENTAGE);  //use this to modify alert threshold as 1% - 32% (integer)
    }

    void loop()
    {
      static unsigned long lastMillis = 0;
      if((millis() - lastMillis) > PRINT_INTERVAL) {
        lastMillis = millis();
        Serial.println();

        Serial.print("voltage: ");
        Serial.print(gauge.readVoltage());
        Serial.println(" mV");

        Serial.print("precentage: ");
        Serial.print(gauge.readPercentage());
        Serial.println(" %");
      }

      if(intFlag == 1) {
        intFlag = 0;
        gauge.clearInterrupt();
        Serial.println("Low power alert interrupt!");
        //put your battery low power alert interrupt service routine here
      }
    }

结果

  • Arduino每隔2s向串口打印电池的当前电压voltage、剩余电量百分比percentage和中断报警提示信息。
  • 电池低电量中断报警ALR使用说明:
    • 低电量中断报警阈值默认为32%,即电池剩余电量低于32%时在ALR产生一个下跳变中断,该阈值BAT_PERCENTAGE可设置为1-32之间的任意整数(分别对应1%-32%),并通过函数setInterrupt()进行设定。
    • 当电池初始剩余电量高于BAT_PERCENTAGE时,ALR管脚为高电平,若通过一段时间放电,低于BAT_PERCENTAGE的瞬间触发相应的中断报警,ALR管脚被拉至低电平,程序串口打印“Low power alert interrupt!”,并通过clearInterrupt()清中断报警,使ALR又立刻被拉至高电平。
    • 当电池初始剩余电量低于BAT_PERCENTAGE时,程序一开始就会产生低电量中断报警。
    • 电池剩余电量(由于充电)高于BAT_PERCENTAGE后,再次(由于放电)低于BAT_PERCENTAGE才会触发另一次中断。若中断触发后不调用clearInterrupt()清中断,无论电池电量如何变化,ALR管脚会一直保持低电平。

**注意:**

受内部滤波电容的影响,在测量的过程中如果突然拔出电池,显示的电压和剩余电量会缓慢下降到零,但不会立刻变为零。

受芯片固有算法和工作原理的影响,若在程序运行后,再插入电池,剩余电量可能会一直显示为0.00%。此时,需要复位主控(重新运行程序),读数才能恢复正常。

Mind+(基于Scratch3.0)图形化编程

1、下载及安装软件。下载地址:https://www.mindplus.cc 详细教程:Mind+基础wiki教程-软件下载安装
2、切换到“上传模式”。 详细教程:Mind+基础wiki教程-上传模式编程流程
3、“扩展”中选择“主控板”中的“Arduino Uno”。 "扩展"“传感器”中搜索选择“锂电池电量计”。详细教程:Mind+基础wiki教程-加载扩展库流程
4、进行编程,程序如下图:
5、菜单“连接设备”,“上传到设备”
6、程序上传完毕后,打开串口即可看到数据输出。详细教程:Mind+基础wiki教程-串口打印

树莓派教程

准备

  • 硬件
    • 树莓派3代B型(或类似)主控板 x 1
    • Gravity:3.7V锂电池电量计 x 1
    • Gravity 4pin传感器连接线(或若干杜邦线) x 1

接线图

安装驱动

1.启动树莓派的I2C接口。如已开启,可跳过该步骤。
打开终端(Terminal),键入如下指令,并回车:

pi@raspberrypi:~ $ sudo raspi-config

然后用上下键选择“ 5 Interfacing Options ”, 按回车进入,选择 “ P5 I2C ”, 按回车确认“ YES ”即可。重启树莓派主控板。

2.安装Python依赖库与git,树莓派需要联网。如已安装,可跳过该步骤。
在终端中,依次键入如下指令,并回车:

pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get install build-essential python-dev python-smbus git

3.下载驱动库,并运行。 在终端中,依次键入如下指令,并回车:

pi@raspberrypi:~ $ git clone https://github.com/DFRobot/DFRobot_MAX17043.git
pi@raspberrypi:~ $ cd ~/DFRobot_MAX17043/RaspberryPi/python
pi@raspberrypi:~/DFRobot_MAX17043/RaspberryPi/python $ python DFRobot_MAX17043.py

读取锂电池电压、剩余电量与设定低电量中断报警

  • 将模块与树莓派按照连线图相连,电池既可连在接线柱上也可连在PH2.0 2P横卧母座上,两个插座内部直接并联。I2C地址为固定的0x36,无需修改。
  • 在终端中,依次键入如下指令并回车,运行样例代码:

pi@raspberrypi:~/DFRobot_MAX17043/RaspberryPi/python $ cd readAndInt
pi@raspberrypi:~/DFRobot_MAX17043/RaspbeeryPi/python/readAndInt $ python readAndInt.py

结果

  • 程序每隔2s测量并打印一次电池当前电压、剩余电量。
  • 电池低电量中断报警ALR使用说明:
    • 低电量中断报警阈值默认为32%,即电池剩余电量低于32%时在ALR产生一个下跳变中断,用户可打开样例代码readAndInt.py,通过修改函数setInterrupt()的参数,将中断报警阈值设置为1-32之间的任意整数(分别对应1%-32%)。
    • 当电池初始剩余电量高于中断报警阈值时,ALR管脚为高电平,若通过一段时间放电,低于中断报警阈值的瞬间触发相应的中断报警,ALR管脚被拉至低电平,程序串口打印“Low power alert interrupt!”,并通过clearInterrupt()清中断报警,使ALR又立刻被拉至高电平。
    • 当电池初始剩余电量低于中断报警阈值时,程序一开始就会产生低电量中断报警。
    • 电池剩余电量(由于充电)高于中断报警阈值后,再次(由于放电)低于中断报警阈值才会触发另一次中断。若中断触发后不调用clearInterrupt(),无论电池电量如何变化,ALR管脚会一直保持低电平。

**注意:**

受内部滤波电容的影响,在测量的过程中如果突然拔出电池,显示的电压和剩余电量会缓慢下降到零,但不会立刻变为零。

受芯片固有算法和工作原理的影响,若在程序运行后,再插入电池,剩余电量可能会一直显示为0.00%。此时,需要重新运行样例代码readAndInt.py,读数才能恢复正常。

  • DFR0563_RP3_result.png

应用实例

搭建一个太阳能电源管理系统

如下图,将Gravity:3.7V锂电池电量计用于Sunflower:5V太阳能电源管理模块,即可搭建一个太阳电源管理系统。在白天,可利用电池电量计实时监控太阳能电池板对锂电池的充电情况,到了晚上,可了解系统的耗电情况。用户可自行编写代码将锂电池电压与剩余电量数据记录或打印出来,评估并分析太阳能板及锂电池在一整天,甚至几个月里面充放电的"收支状况",从而决定太阳能板额定功率和锂电池容量是否够大,能否完全支持整个系统白天或黑夜的用电量。此外,利用电量计的低电量中断报警功能和5V太阳能电源管理模块的可控5V输出,可在电池电量低于指定阈值时,利用ALR引脚向主控板发出中断信号,触发主控板控制I/O管脚关闭太阳能电源管理模块上的5V输出,从而关闭部分外接模块的供电,节约耗电。

常见问题

Q1.剩余电量检测的基本原理是什么?

  • A. 模块使用Maxim的MAX17043专用3.7V锂电池电量检测芯片,采用ModelGauge专利算法,基本原理的介绍可参考Maxim官网。

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。

更多

DFshopping_car1.png Link DFRobot商城购买链接