简介
Gravity:I2C数字功率计是一款可测量26V 8A以内各类电子模块、用电设备的电压、电流和功率,最大相对误差不超过±0.2%的高分辨、高精度、大量程测量模块(使用前需进行一次简单的手动校准)。可用于太阳能系统、电池库仑计、电机、主控板或电子模块的功耗测量、电池续航评估与实时电源参数在线监控。 模块采用TI INA219零温漂电流/功率监控芯片和2W大功率低温漂10mΩ合金采样电阻,电压和电流分辨率分别可达4mV与1mA,在满量程测量条件下,电压与电流的最大测量相对误差不超过±0.2%,并提供4个可通过拨码开关配置的I2C地址。模块可对双向高侧电流(流经电源或电池正极的电流)进行准确测量,这在太阳能或库仑计应用,电池既需要充电,也需要放电的场合尤为有用,用户可通过电流的正负读数了解电池的充放电状态,也可以了解电池的冲放电的实时电压、电流与功率。在电机应用场景,可通过实时监控电机电流是否由于堵转或负载过大导致电流过大,从而及时采取保护措施。此外,也可以使用该模块测量各类电子模块或整个项目的实时功耗,从而评估电池的续航时间。
特性
- 高精度、高分辨率、大量程、低温漂
- 双向电流高侧测量
- 兼容3.3V/5V控制器
- 精致小巧,方便项目嵌入
应用场景
- 太阳能系统
- 电池库仑计
- 电子模块功耗评估
技术规格
- 供电电压(VCC):3.3V ~ 5.5V
- 电压量程(IN+或IN-相对GND):0 ~ 26V
- 电压分辨率:4 mV
- 电压相对误差:<±0.2%(典型值)
- 电流量程:0 ~ ±8A(可测双向电流)
- 电流分辨率:1 mA
- 电流相对误差:<±0.2%(典型值,需手动校准)
- 功率量程:0 ~ 206 W
- 功率分辨率:20 mW(硬件)/4mW(软件)
- 静态电流:0.7 mA
- 通信接口:Gravity I2C (逻辑电平0-3.3V)
- I2C地址:4个,0x40,0x41,0x44,0x45(默认)
- 尺寸:30.0mm×22.0mm
- 重量:4g
接口说明
标号 | 名称 | 功能描述 |
---|---|---|
1 | VCC | 电源正极(3.3~5.5V) |
2 | GND | 电源负极 |
3 | SCL | I2C时钟线 |
4 | SDA | I2C数据线 |
5 | ADDR | I2C地址选择拨码开关 |
6 | 3P TERMINAL | 电压与电流测量接线柱3P |
Arduino使用教程
准备
-
硬件
- Arduino UNO控制板 x 1
- Gravity:I2C数字功率计 x 1
- Gravity 4P传感器连接线(或若干杜邦线) x 1
- 高精度数字万用表(可选) x 1
-
软件
- Arduino IDE (1.0.x或1.8.x), 点击下载Arduino IDE
- DFRobot INA219库,点击下载INA219库
连线图
校准
-
实际测量环境中,电流和电压测量误差的来源很多,但电压测量无需校准,而电流测量误差主要来源于采样电阻阻值的误差,其会对电流测量产生较为明显的影响。若不进行校准,电流最大测量相对误差不超过3%,若使用高精度万用表或电子负载进行如下单点线性校准,可有效消除系统线性误差,使模块的最大相对误差<±0.2%。
-
若手上有稳压电源和直流负载,可如下图将Arduino UNO、数字功率计模块、稳压电源和直流负载相连,将稳压电源输出电压调至12V,电子负载选择恒流模式CC,电流调至1.000A,将下面的样例代码烧录到Arduino UNO中,观察串口打印的电流值Current,根据该值修改代码中变量“float ina219Reading_mA = 1000;”的值,即完成模块的单点线性校准。
- 若手上没有稳压电源和直流负载,可如上图将Arduino UNO、万用表(调节至电流档)和负载(电子模块、电机或屏幕相连,负载功耗尽可能到达100mA以上)。同样,将下面的样例代码烧录到Arduino UNO中,根据串口打印的电流值修改代码中变量“float ina219Reading_mA = 1000;”的值,根据万用表的电流值修改代码中变量“float extMeterReading_mA = 1000;”的值,即完成模块的单点线性校准。
- 完成校准后的模块配合“ina219Reading_mA”和“extMeterReading_mA”这两个校准参数,即可用于各种测量中,无需每次测量都重新校准。
样例代码
/*!
file getVoltageCurrentPower.ino
SEN0291 Gravity: I2C Digital Wattmeter
The module is connected in series between the power supply and the load to read the voltage, current and power
The module has four I2C, these addresses are:
INA219_I2C_ADDRESS1 0x40 A0 = 0 A1 = 0
INA219_I2C_ADDRESS2 0x41 A0 = 1 A1 = 0
INA219_I2C_ADDRESS3 0x44 A0 = 0 A1 = 1
INA219_I2C_ADDRESS4 0x45 A0 = 1 A1 = 1
Copyright [DFRobot](https://www.dfrobot.com), 2016
Copyright GNU Lesser General Public License
version V0.1
date 2019-2-27
*/
#include <Wire.h>
#include "DFRobot_INA219.h"
DFRobot_INA219_IIC ina219(&Wire, INA219_I2C_ADDRESS4);
// Revise the following two paramters according to actula reading of the INA219 and the multimeter
// for linearly calibration
float ina219Reading_mA = 1000;
float extMeterReading_mA = 1000;
void setup(void)
{
Serial.begin(115200);
while(!Serial);
Serial.println();
while(ina219.begin() != true) {
Serial.println("INA219 begin faild");
delay(2000);
}
ina219.linearCalibrate(ina219Reading_mA, extMeterReading_mA);
Serial.println();
}
void loop(void)
{
Serial.print("BusVoltage: ");
Serial.print(ina219.getBusVoltage_V(), 2);
Serial.println("V");
Serial.print("ShuntVoltage: ");
Serial.print(ina219.getShuntVoltage_mV(), 3);
Serial.println("mV");
Serial.print("Current: ");
Serial.print(ina219.getCurrent_mA(), 1);
Serial.println("mA");
Serial.print("Power: ");
Serial.print(ina219.getPower_mW(), 1);
Serial.println("mW");
Serial.println("");
delay(1000);
}
结果
-
模块每隔1s打印当前测量的四个参数:
- Shunt Voltage:IN+相对IN-的两端电压,即采样电阻两端电压。
- Bus Voltage:IN-相对GND电压。
- Current:流经IN+和IN-的电流。若电流从IN+流向IN-,电流值为正,若为电流从IN-流向IN+,电流值为负。
- Power:“BusVoltage”与“Current”之积,即功率。直接从模块读取到的功率分辨率为20mW(硬件方式),若使用语句“Power = BusVoltage*Current;”得到功率,其分辨率可提高至4mW(软件方式)。
-
通过模块上的拨码开关,可将模块配置为四个不同I2C地址之一,并相应地修改代码“ina219.setI2cAddr(INA219_I2C_ADDRESS4);”中参数“INA219_I2C_ADDRESSx”即可,x可以为1,2,3,4,两者对应关系如下:
- INA219_I2C_ADDRESS1:0x40, A0=0, A1=0
- INA219_I2C_ADDRESS2:0x41, A0=1, A1=0
- INA219_I2C_ADDRESS3:0x44, A0=0, A1=1
- INA219_I2C_ADDRESS4:0x45, A0=1, A1=1
-
若由于以下原因导致I2C通信异常,程序初始化失败,打印“I2C init fail”。
- I2C通信接线SCL和SDA松动。
- 模块I2C地址(拨码开关配置)与软件不匹配。
-
当正确配置拨码开关后,通信恢复正常,打印“Measuring voltage and current with INA219 ...”与所读取数据。
Mind+ 上传模式编程
- 下载及安装软件。下载地址:https://www.mindplus.cc 详细教程:Mind+基础wiki教程-软件下载安装
- 切换到“上传模式”。 详细教程:Mind+基础wiki教程-上传模式编程流程
- “扩展”中选择“主控板”中的“Arduino Uno”。 "扩展"“传感器”中搜索选择“功率计”。详细教程:Mind+基础wiki教程-加载扩展库流程
- 进行编程,程序如下图:
- 菜单“连接设备”,“上传到设备”
- 程序上传完毕后,打开串口即可看到数据输出。详细教程:Mind+基础wiki教程-串口打印
Mind+ Python模式编程(行空板)
Mind+Python模式为完整Python编程,因此需要能运行完整Python的主控板,此处以行空板为例说明
连接图
操作步骤
1、下载及安装官网最新软件。下载地址:https://www.mindplus.cc 详细教程:Mind+基础wiki教程-软件下载安装
2、切换到“Python模式”。“扩展”中选择“官方库”中的“行空板”和“pinpong库”中的”pinpong初始化“和“I2C数字功率计。切换模式和加载库的详细操作链接
3、进行编程
4、连接行空板,程序点击运行后,可在终端查看数据。行空板官方文档-行空板快速上手教程 (unihiker.com)
代码编程
以pinpong库为例,行空板官方文档-行空板快速上手教程 (unihiker.com)
# -*- coding: UTF-8 -*-
# MindPlus
# Python
from pinpong.libs.dfrobot_ina219 import INA219
from pinpong.board import Board
Board().begin()
ina1 = INA219(i2c_addr=0x45)
ina1.begin()
while True:
print("电压:")
print(ina1.get_bus_voltage_mv())
print("电流:")
print(ina1.get_current_ma())
print("功率:")
print(ina1.get_power_mw())
树莓派教程
准备
-
硬件
- 树莓派3代B型(或类似)主控板 x 1
- Gravity:I2C数字功率计 x 1
- Gravity 4P传感器连接线(或若干杜邦线) x 1
- 高精度数字万用表(可选) x 1
-
软件
- [Gravity:I2C数字功率计驱动]
- RASPBIAN树莓派官方操作系统
接线图
安装驱动
-
启动树莓派的I2C接口。如已开启,可跳过该步骤。
打开终端(Terminal),键入如下指令,并回车:
pi@raspberrypi:~ $ sudo raspi-config
然后用上下键选择“ 5 Interfacing Options ”, 按回车进入,选择 “ P5 I2C ”, 按回车确认“ YES ”即可。重启树莓派主控板。 -
安装Python依赖库与git,树莓派需要联网。如已安装,可跳过该步骤。
在终端中,依次键入如下指令,并回车:
pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get install build-essential python-dev python-smbus git
-
下载驱动库。在终端中,依次键入如下指令,并回车:
pi@raspberrypi:~ $ git clone https://github.com/DFRobot/DFRobot_INA219.git
运行样例代码
-
将模块与树莓派按照连线图相连。I2C地址默认为0x45,对应代码中的“_INA219_I2C_ADDRESS_4”。如果需要修改I2C地址可通过模块上的拨码开关将A0和A1分别配置为0或1,并修改样例代码“getVoltageCurrentPower.py”中“ina=INA219(1,_INA219_I2C_ADDRESS4)”的第二个参数I2C地址“_INA219_I2C_ADDRESS_x”,其中x可以为1,2,3,4。两者的对应关系如下:
- _INA219_I2C_ADDRESS1:0x40, A0=0, A1=0
- _INA219_I2C_ADDRESS2:0x41, A0=1, A1=0
- _INA219_I2C_ADDRESS3:0x44, A0=0, A1=1
- _INA219_I2C_ADDRESS4:0x45, A0=1, A1=1
-
在终端中,键入如下指令并回车,运行样例代码:
pi@raspberrypi: $ cd ~/DFRobot_INA219/RaspberryPi/Python/example
pi@raspberrypi:~/DFRobot_INA219/RaspberryPi/Python/example $ python getVoltageCurrentPower.py
结果
- 模块每隔1s打印当前测量的四个参数:
- Shunt Voltage:IN+相对IN-两端电压,即采样电阻两端电压。
- Bus Voltage:IN-相对GND电压。
- Current:从IN+流向IN-电流,若为电流从IN+流向IN-,电流值为正,若为电流从IN-流向IN+,电流值为负。
- Power:“BusVoltage”与“Current”之积,即功率。若直接从模块读取到的功率分辨率为20mW(硬件方式),若使用“Power = BusVoltage*Current;”得到功率,其分辨率可提高至4mW(软件方式)。
- 若由于以下原因导致I2C通信异常,程序初始化失败,打印“I2C init fail”。
- I2C通信接线SCL和SDA松动。
- 模块I2C地址(拨码开关配置)与软件不匹配。
- 当正确配置拨码开关时,通信恢复正常,打印数据。
应用实例
测量电子模块功耗
不少电子模块并没有明确标明模块的工作电流,可如下图(以Gravity: 模拟pH计V2为例)将Gravity:I2C数字功率计串入模块的供电端侧VCC来检测模块的功耗,相对于使用万用表测串联电流和并联电压方式测功耗更简单直观。
监测太阳能系统中太阳能板、电池与输出的功耗情况
在如下图所示的一个典型太阳能系统中(以太阳能电源管理模块(12V铅酸电池版)为例),可利用四个Gravity:I2C数字功率计分别实时监测太阳能板、电池与两个输出端OUT1和OUT2的电压、电流和功率。每个功率计通过拨码开关配置为一个不同的I2C地址并联在同一块主控板上,主控板负载记录与统计各节点的电能数据。
对于太阳板,除了实时的电压、电流和功率以外,我们比较关心其在一段时间里面累计产生的电能,这个时间可能是一天,也可能是长达数周甚至数个月之久,这个时间的统计可以通过在主控上增加RTC模块实现。累计产生电能可以通过功率对时间的积分得到,例如,每1s将当前的P功率值(W)累加,得到相应的E能量值(J),然后将E/3600转换为另一个(电)能量单位Wh瓦时,或者将E/(3.6×10^6)得到kWh千瓦时(即我们俗称的多少“度”电)。
对于电池,功率计的应用在这里类似于一个库仑计,通过测量充放电电流来估计电池当前电量。注意到图中功率计IN+直接与电池正极相连,IN-与电源管理板BAT IN电池正输入端相连。当电流读数为正时,电流从IN+流向IN-,表明电池正在放电;当电流读数为负时,电流从IN-流向IN+,表明电池正在充电。因此可通过电流的正负值来判断电池的充放电状态。此外,我们比较关心电池的剩余电量(Ah),与记录太阳能板累计产生电能 的方法类似,将电流对时间进行积分,得到电池的剩余电量(Ah)。但由于铅酸电池在正常使用过程中不会完全放干里面的电能,因此可利用电源管理模块和一个功率不低于65W的笔记本电源适配器(额定输出电压19V或20V)通过太阳能端口SOLAR IN将电池充满电,然后在其中一个OUT输出口将电池放电直到输出截止,使用位于电池端的功率计记录累计放电量(Ah),该值即为铅酸电池实际可用的容量。当然电池容量还与放电电流大小、使用温度、已循环充放电使用的次数等多个因素有关,但是使用这种方法得出的容量比直接取电池标称容量要准确得多,可使用该值作为**剩余电量(Ah)**的统计基准。
对于输出端OUT,除了实时的电压、电流和功率以外,累计消耗电能也是值得关注的另一电源统计量,其计算方法与太阳能板的累计产生电能类似。 值得注意的是,太阳能板累计产生电能通常比另外三者累计消耗电能之和(假定电池一直在充电,即三者的电能均来源于太阳能板)要大。排除模块的测量误差,两者的差值主要来源于各类线路与转化损耗,如:电源管理板的线路损耗,稳压芯片的转换损耗,模块采样电阻的损耗,还有导线与接线柱的线路损耗等,用户可根据实际应用场景,在电能统计与管理时将这些损耗考虑进去。
注:由于大多数太阳能管理模块的电池保护都是将GND与BAT-断开。如果您按照上图所示连接BAT-与GND以监测电池电量的话,会导致BAT-无法断开GND,而使太阳能管理模块的电池保护电路失效。
常见问题
更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。