(SKU:SEN0291) Gravity:I2C数字功率计

来自DFRobot Product Wiki
跳转至: 导航搜索

目录

概述

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


接口说明

Gravity:I2C数字功率计 引脚说明
引脚说明
标号 名称 功能描述
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


连线图

SEN0291 connection Arduino(CH).png


校准

  • 实际测量环境中,电流和电压测量误差的来源很多,但电压测量无需校准,而电流测量误差主要来源于采样电阻阻值的误差,其会对电流测量产生较为明显的影响。若不进行校准,电流最大测量相对误差不超过3%,若使用高精度万用表或电子负载进行如下单点线性校准,可有效消除系统线性误差,使模块的最大相对误差<±0.2%。
  • 若手上有稳压电源和直流负载,可如下图将Arduino UNO、数字功率计模块、稳压电源和直流负载相连,将稳压电源输出电压调至12V,电子负载选择恒流模式CC,电流调至1.000A,将下面的样例代码烧录到Arduino UNO中,观察串口打印的电流值Current,根据该值修改代码中变量“float ina219_reading_A = 1.000;”的值,即完成模块的单点线性校准。
SEN0291 cal1 Arduino(CH).png


  • 若手上没有稳压电源和直流负载,可如上图将Arduino UNO、万用表(调节至电流档)和负载(电子模块、电机或屏幕相连,负载功耗尽可能到达100mA以上)。同样,将下面的样例代码烧录到Arduino UNO中,根据串口打印的电流值修改代码中变量“float ina219_reading_A = 1.000;”的值,根据万用表的电流值修改代码中变量“float extMeter_reading_A = 1.000;”的值,即完成模块的单点线性校准。
SEN0291 cal2 Arduino(CH).png


  • 完成校准后的模块配合“float ina219_reading_A”和“float extMeter_reading_A”这两个校准参数,即可用于各种测量中,无需每次测量都重新校准。

样例代码

#include <DFRobot_INA219.h>

#define INA219_I2C_ADDRESS          INA219_I2C_ADDRESS_4                      //I2C Address 0x45, A0=VCC, A1=VCC,default

#define SAMPLE_TIME                 10U
#define PRINT_TIME                  500U
#define MOVING_AVRAGE_BUFF_SIZE     17

DFRobot_INA219 ina219(INA219_I2C_ADDRESS);

float ShuntVoltage, ShuntVoltage_buff[MOVING_AVRAGE_BUFF_SIZE] = {0}, ShuntVoltage_sum;
float Current, Current_buff[MOVING_AVRAGE_BUFF_SIZE] = {0}, Current_sum;
float BusVoltage, BusVoltage_buff[MOVING_AVRAGE_BUFF_SIZE] = {0}, BusVoltage_sum;
float Power, Power_buff[MOVING_AVRAGE_BUFF_SIZE] = {0}, Power_sum;

// Revise the following two paramters according to actula reading of the INA219 and the multimeter
// for linearly calibration
float ina219_reading_A = 1.000;
float extMeter_reading_A = 1.000;

int i = 0;
unsigned long timepoint_sample, timepoint_print;

void setup(void)
{
  Serial.begin(115200);
  while (!Serial) {
    // will pause Zero, Leonardo, etc until serial console opens
    delay(1);
  }

  Serial.println("Digital Wattmeter begin!");
  // Initialize the INA219.
  ina219.begin();
  ina219.linearCal(ina219_reading_A, extMeter_reading_A);

  Serial.println("Measuring voltage, current and power with INA219 ...");
  timepoint_sample = millis();
}

void loop(void)
{
  //Use moving average algorithm to obtain a steady readings
  if ( millis() - timepoint_sample > SAMPLE_TIME) {
    timepoint_sample = millis();
    for (i = 0; i < MOVING_AVRAGE_BUFF_SIZE - 1; i++ ) {
      ShuntVoltage_buff[MOVING_AVRAGE_BUFF_SIZE - 1 - i] = ShuntVoltage_buff[MOVING_AVRAGE_BUFF_SIZE - 2 - i];
      Current_buff[MOVING_AVRAGE_BUFF_SIZE - 1 - i] = Current_buff[MOVING_AVRAGE_BUFF_SIZE - 2 - i];
      BusVoltage_buff[MOVING_AVRAGE_BUFF_SIZE - 1 - i] = BusVoltage_buff[MOVING_AVRAGE_BUFF_SIZE - 2 - i];
      Power_buff[MOVING_AVRAGE_BUFF_SIZE - 1 - i] = Power_buff[MOVING_AVRAGE_BUFF_SIZE - 2 - i];
    }

    ShuntVoltage_buff[0] = ina219.getShuntVoltage_mV();
    Current_buff[0] = ina219.getCurrent_A();
    BusVoltage_buff[0] = ina219.getBusVoltage_V();
    Power_buff[0] = ina219.getPower_W();

    ShuntVoltage_sum  = ShuntVoltage_sum +  ShuntVoltage_buff[0] - ShuntVoltage_buff[MOVING_AVRAGE_BUFF_SIZE - 1];
    Current_sum  = Current_sum +  Current_buff[0] - Current_buff[MOVING_AVRAGE_BUFF_SIZE - 1];
    BusVoltage_sum  = BusVoltage_sum +  BusVoltage_buff[0] - BusVoltage_buff[MOVING_AVRAGE_BUFF_SIZE - 1];
    Power_sum  = Power_sum +  Power_buff[0] - Power_buff[MOVING_AVRAGE_BUFF_SIZE - 1];

    ShuntVoltage  = ShuntVoltage_sum / (MOVING_AVRAGE_BUFF_SIZE - 1);
    Current  = Current_sum / (MOVING_AVRAGE_BUFF_SIZE - 1);
    BusVoltage  = BusVoltage_sum / (MOVING_AVRAGE_BUFF_SIZE - 1);

    //The power register is unsigned 16 bits. For Negative current, this register still returns positive value.
    //use an "if" to fix this problem.
    //For battery application, negative(positive) power indicates a charging process while positive(negative) power indicates a discharging process.
    //However, the positive or the negative always depend on wiring.
    if (Current >= 0) {
      Power  = Power_sum / (MOVING_AVRAGE_BUFF_SIZE - 1);
    }
    else {
      Power  = -Power_sum / (MOVING_AVRAGE_BUFF_SIZE - 1);
    }
  }
  // Print readings every PRINT_TIME
  if (millis() - timepoint_print  > PRINT_TIME) {
    timepoint_print = millis();
    //Print all parameters
    Serial.print("Bus Voltage:   "); Serial.print(BusVoltage, 3); Serial.println(" V");
    Serial.print("Shunt Voltage: "); Serial.print(ShuntVoltage, 2); Serial.println(" mV");
    Serial.print("Current:       "); Serial.print(Current, 3); Serial.println(" A");
    Serial.print("Power:         "); Serial.print(Power, 2); Serial.println(" W");
    Serial.println("");
  }
}

结果

  • 模块每隔0.5s打印当前测量的四个参数:
    • BusVoltage:IN-相对GND电压。
    • ShuntVoltage:IN+相对IN-的两端电压。
    • Current:流经IN+和IN-的电流。若电流从IN+流向IN-,电流值为正,若为电流从IN-流向IN+,电流值为负。
    • Power:“BusVoltage”与“Current”之积,即功率。直接从模块读取到的功率分辨率为20mW(硬件方式),若将读到的“BusVoltage”与“Current”,使用语句“Power = BusVoltage*Current”得到的功率分辨率可提高至4mW(软件方式)。


SEN0291 Arduino result.png


  • 通过模块上的拨码开关,可将模块配置为四个不同I2C地址之一,并相应地修改代码中的宏定义“#define INA219_I2C_ADDRESS INA219_I2C_ADDRESS_4”即可,模块各I2C地址参数及对应拨码开关配置如下:
    • INA219_I2C_ADDRESS_1:0x40, A0=0, A1=0
    • INA219_I2C_ADDRESS_2:0x41, A0=1, A1=0
    • INA219_I2C_ADDRESS_3:0x44, A0=0, A1=1
    • INA219_I2C_ADDRESS_4:0x45, A0=1, A1=1


树莓派教程

准备

  • 硬件
    • 树莓派3代B型(或类似)主控板 x 1
    • Gravity:I2C数字功率计 x 1
    • Gravity 4P传感器连接线(或若干杜邦线) x 1
    • 高精度数字万用表(可选) x 1

接线图

SEN0291 connection RP3.png

安装驱动

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_INA219.git
pi@raspberrypi:~ $ cd ~/DFRobot_INA219/RaspberryPi/python
pi@raspberrypi:~/DFRobot_INA219/RaspberryPi/python $ python DFRobot_INA219.py

运行样例代码

  • 将模块与树莓派按照连线图相连。I2C地址默认为0x45,对应代码中的INA219_ADD4。如果需要修改I2C地址可通过模块上的拨码开关将A0和A1分别配置为0或1,并修改软件中I2C地址的宏定义“#define INA219_I2C_ADDRESS_x”,x可以为1,2,3,4。两者的对应关系如下:
    • INA219_I2C_ADDRESS_1:0x40, A0=0, A1=0
    • INA219_I2C_ADDRESS_2:0x41, A0=1, A1=0
    • INA219_I2C_ADDRESS_3:0x44, A0=0, A1=1
    • INA219_I2C_ADDRESS_4:0x45, A0=1,A1=1
  • 在终端中,依次键入如下指令并回车,运行样例代码:
pi@raspberrypi:~/DFRobot_INA219/RaspberryPi/python $ cd getVAP
pi@raspberrypi:~/DFRobot_INA219/RaspbeeryPi/python/readAndInt $ python getVAP.py

结果



  • 模块每隔0.5s打印当前测量的四个参数:
    • BusVoltage:IN-相对GND电压。
    • ShuntVoltage:IN+相对IN-两端电压。
    • Current:从IN+流向IN-电流,若为电流从IN+流向IN-,电流值为正,若为电流从IN-流向IN+,电流值为负。
    • Power:“BusVoltage”与“Current”之积,即功率。若直接从模块读取到的功率分辨率为20mW(硬件方式),若将读到的“BusVoltage”与“Current”,使用“Power = BusVoltage*Current;”得到的功率分辨率可提高至4mW(软件方式)。


应用实例

测量电子模块功耗
不少电子模块并没有明确标明模块的工作电流,可如下图(以Gravity: 模拟pH计V2为例)将Gravity:I2C数字功率计串入模块的供电端侧VCC来检测模块的功耗,相对于使用万用表测串联电流和并联电压方式测功耗更简单直观。

SEN0291 App1(CH).png


监测太阳能系统中太阳能板、电池与输出的功耗情况
在如下图所示的一个典型太阳能系统中(以太阳能电源管理模块(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,除了实时的电压、电流和功率以外,累计消耗电能也是值得关注的另一电源统计量,其计算方法与太阳能板的累计产生电能类似。 值得注意的是,太阳能板累计产生电能通常比另外三者累计消耗电能之和(假定电池一直在充电,即三者的电能均来源于太阳能板)要大。排除模块的测量误差,两者的差值主要来源于各类线路与转化损耗,如:电源管理板的线路损耗,稳压芯片的转换损耗,模块采样电阻的损耗,还有导线与接线柱的线路损耗等,用户可根据实际应用场景,在电能统计与管理时将这些损耗考虑进去。

SEN0291 App2(CH).png


常见问题

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


更多


DFshopping car1.png [ Link DFRobot商城购买链接]

个人工具
名字空间

变换
操作
导航
工具箱