成为订阅者(免费)

加入29,000名其他订阅者以获得用户销售折扣和 其他免费资源。
:
:
大学教师'担心 - 您的邮件地址完全是 安全的。我保证使用它 只要 to send you MicroZine.

INA219


INA219是电流测量芯片,也可以测量电压 - 实际上它只能测量电压,但通过测量电压作弊 穿过已知的抵抗力。


下面的突破板版本可以测量〜3.2a,但芯片可以 使用不同的感测电阻测量10〜15a(参见数据表)。

Ina219突破板

这个芯片的真正有用的特征是它可以测量 当前的 and voltage 在A. 外部系统 独立于5〜3v0那个 芯片使用。您可以直接将其连接到测量输入 电压源从0〜26V,它的力量无关紧要 first.

它还没有哪种方式绕过电流测量输入 它们被保护为±26V,但是,您赢了't get a 读取负面输入(轮次错误)。

它还具有一个内部放大器,这意味着您不会'T需要任何其他opamp电源用于电平转换或 放大 - 只需将其连接即可!

由于它可以测量它可以报告所用功率的电流和电压。它是一个使用a的I2C设备 外部分流感测电阻连接到高端 电压。负模拟输入用于测量负载电压 因此,随着电流测量,电力消散在 load.

INA219规格

  Parameter
INA219
  Voltage Supply (Vs)
 3V0 ~ 5V5
  Abs. Max VDD. (类模拟输入除外)
-0v3〜6v0.
  模拟输入(最大差分)[1][4]
±26V
  模拟输入(共模范围)[4] -0.3〜26V.
  当前分辨率(取决于r分道 这里 0R1)
100uA
  Interface
I2C
  I2C rate
100,400,2560khz.
  Resolution (ADC)[5] 12位(15位)
  静态电流(典型,最大)
0.7mA,1mA
  断电模式电流(典型,最大)
6,15uA
  当前误差%a(典型值,max)b(典型值,max) [2]
(±0.2,±0.5)(±0.2,±0.3)
  全温电流(a,b) [2] 1%,0.5%
  电压误差%a(典型值,max)b(典型,最大) [2] (±0.2,±0.5)(±0.2,±0.5)
  全温电压误差(A,B) [2] 1%,1%
  DNL
0.1LSB
  偏移电压(PGA = 1,2,4,8)[2](典型值)
10,20,30,40uv.
  偏移电压(PGA = 1,2,4,8)[2](最大)[3] 100,125,150,200uv.
  Offset voltage drift
0.1uv /°C
  Gain error
40m%
  转换时间(9位Res。〜12位Res。,典型值)
84〜532US.
  I2C地址(H / W被选中= 16off)
0x40〜0x4f.
  VESD (人体模型)
±4000V
  工作温度
-40°C〜125°C
    [1]之间的总电压 + AIN. and  - 不得超过0.3〜26V。
    [2]该装置采用两个精度标准A,B,B更准确。
    [3] B部分的偏移电压降低 - 参见数据表。
    [4]输入是可逆的
但你只能衡量 + AIN. > -
    通过平均实现15位分辨率 ±320mV范围。

如何ina219

如何连接Ina219:它'SIMPLY只需将VIN +连接到您的供应 电压(这是高侧电压),并将VIN-连接到您的 circuit.

VIN - 还测量出现在附加电路的电压。

INA219精度

目前的准确性

芯片本身的当前测量精度非常好,但也取决于传感的准确性 电阻,通常这将是1%的电阻器。

在25°C时,如果您假设1%电阻器,则总电流精度为1.2%(典型值)为1.5%(最大值)。

在全温度范围内,电流精度为1%,因此总计2%(再次为A) - B部分的1.5%。

电压精度

在25°C时,A和B部件的电压精度规格相同:0.2%(典型值)0.5%(最多)。

在全温范围内,精度为1%。

INA219解决方案

该设备的分辨率与物理ADC有点奇怪 位宽为12位,但在整个数据表中的比特范围内 讨论为15bits。实际上发生了什么是在某些模式中你 可以应用平均(您可以编程平均数量)并获得 better resolution.

非平均分辨率

该分辨率由最小可检测电压设定,这是1 ADC的LSB固定在10uV。这是内部设定值 控制在芯片中。总线电压分辨率设定为4mV。

    因此最小可检测电流= 10uV /分流电阻。

    通常rshunt = 0r1所以...

    最小可检测电流(12位RES)= 10uv / 0.1r = 100ua。

但是,您可以增加比特分辨率(比ADC能够检测到较低的电流值) 平均.

通常,分流电阻为0.1Ohms,因为这些通常是安装的 爆发板。但是,您可以选择任何分流电阻。 2MOHM和当前分辨率将改变I.E。您可以计算它 as above.

这不是设置分辨率的唯一方法 - 您可以使用校准寄存器进行。在A. 例子如下 分辨率设置为50uA。芯片确实倍增并给出了相应的结果。

计算允许您确定最大预期电流 将是,然后设置校准"multiplier" to give a maximum "Full Scale Reading"对于那个电流。所以解决方案是"altered" to 适合FSR(实际上结果寄存器是"altered").

通过平均分辨率

当您平均一组读数时,您可以增加一个分辨率 检测到的信号。例如,如果你平均花费10个样本 而不是解析到一个数字,你可以检测到数字的1/10。这个 当然依赖于系统中的噪音,但平均它会出现 删除其中一些 - 更平均更好,但需要更长时间!

返回的位数 来自ADC可以使用平均增加到15。这就是如下方程式的原因 reference 215.

目前测量有4个增益设置(1,2,4,8),4个范围(40mV,80mV,180mV和320mV)

Ina219数据表

下载Ina219数据表 这里.

Ina219引脚

Ina219引脚
                                            [Source: Datasheet]

默认设置(简单使用)

以下解释不会遵循该过程中概述的过程 数据表(使用数据表中提供的等式可以找到 这里)。 它确实使用该数据表的一个语句:

"也可以选择校准寄存器以提供值 当前寄存器(04h)和电源寄存器(03h) 提供 测量值的直接十进制等同物,或产生一个 每个相应寄存器的圆形LSB值。"

该想法是使用最小(I2C)读写,并获得 可以使用固定点数学处理的输出 - 这将是 save Flash memory.

如果你不'T程序该芯片然后这些是默认值:

    PG可编程增益(8)分流电压±320mV。
    Resolution                           12 bit.
    Bus Range                           32V
    Mode                                   分流和公共汽车连续。

数据表表明无需编程,您可以阅读 分流电压作为电流的指示。所以电压将是 与所用的电流成比例。实际上,分流电压将是 分流寄存器值乘以10UV(数据表:8.5.1编程 校准寄存器)。

由于您知道分流电阻值,那么电流只是:

    I  = V分道 / Resistance

您可以在微控制器中进行此计算并保存 到处乱混。对于您刚刚乘坐总线电压读数的电源 (V公共汽车) 通过计算的当前值。

对于此动作,使用最简单的代码(使用库Ina219_We)来读取寄存器(请参阅代码和说明 to do this 这里 ).

注意:以前的代码链接中的代码也将样本号设置为128,以提高准确性和分辨率。

Ina219.如何工作

在INA219内部有一个ADC,只能测量电压;特别是差分输入v在+ - V在-, 和using internal switches it also measures V在- 参考地面(使用相同的放大器)。

Ina219前端
[来源:数据表]

除非知道,否则INA219无法衡量电流 外部分流电阻的值。这是 用于配置和校准的可编程寄存器(参见表2 the datasheet "寄存器集摘要").
INA219后端框图
[来源:数据表]

这些寄存器及其操作如下图所示:

INA219功能框图

[来源:数据表]

编程电流和功率

要使芯片返回当前和功率值,您必须 在分流阻力的值中的程序(除非您跟随 这个 方法)。你通过编程来这样做 校准寄存器。

INA219方程式

数据表中的以下段落谈论了很多但不是 容易明白。如果你只是应用它们,那么你就会得到它们 建议(他们工作但需要浮点乘法 处理结果)。

由于这可以由微控制器完成 只要阅读寄存器就似乎没有留言 芯片可以完成一半的工作,微控制器除了 它从一些处理中缓解了微控制器的事实。这 其他原因是芯片在背景中运行,所以做一个 获得结果时,最小的计算将很快。

文本(下面)"...提供 测量值的直接十进制等同物" is not easy 弄清楚。该文本意味着您可以直接阅读当前 注册放大器中的测量。这通常不是自从 方程式是复杂的。

数据表段落:

"校准寄存器使用户能够缩放电流 将(04h)和电源寄存器(03h)寄存器(04h)到最有用的值 给予申请。例如,设置校准寄存器,使其 最大的数量在当前寄存器(04h)中产生 或电源寄存器(03h)在预期的全尺度点"

"这种方法使用先前的分辨率产生最高分辨率 计算校准等式中的最小CULLE_LSB Register."

"也可以选择校准寄存器以提供值 当前寄存器(04h)和电源寄存器(03h) 提供 测量值的直接十进制等同物,或产生一个 每个相应寄存器的圆形LSB值。"

然后方程式遵循:

INA219方程式

数据表中文文本中的其他更简单的方程式

    realshuntvoltage = shuntvoltageregister * 10e-6

    Realbusvoltage = Busvoltageregister * 4e-3

来自这些数据表陈述:

"通过乘以分流电压寄存器来计算分流电压 具有10UV的分流电压LSB的内容。"

"总线电压总线电压寄存器(右3位移动)乘以 通过4mV的总线电压LSB计算总线电压。".

因此,您可以使用以下等式计算实际电压:

    vshunt = shunt_register * 10uv
    VBUS =(Bus_Register>>3) * 4mV

使用标准方程式

数据表通过使用方程来提供最佳状态 当您使用最大预期时,ADC的LSB的分辨率 当前的。当您设置此任意限制时,结果的分辨率已得到优化。

这里'■选择16V最大和400mA限制的过程(与Adafruit库代码中的一个示例相同)。

    Rshunt = 0.1
    vshuntmax = 40mv(通过设置PGA增益选择此项)。
    VBUSMAX = 16V(选择电压范围23V或16V)

    maxpossiblecurrent = vshuntmax / rshunt = 0.4a
    maxexpectedcurrent = 400ma.

以下为最大分辨率提供示例电流(平均值 启用)和12位操作。设置12位或平均值 通过编程寄存器来选择。

    FinalumpossiBlecurrentLSB15位= 400E-3 / POW(2,15)=每位12.2uA
    FinalumpossiBlecurrentLSB12bit = 400E-3 / POW(2,12)= 97.6UA每位

您可以选择这些结果之间的任何值(建议选择简单数学)。 adafruit选择了50ua。

    CurrentLSB = 50uA

现在,您可以使用提供的等式弄清楚CAL寄存器内容:

    Calreg = Trunc(0.04096 /(CurrentLSB * Rshunt))
    Calreg = Trunc(0.04096 /(50E-6 * 0.1))= 8192.0

此时,设备将返回您可以读取的值。这 问题是他们需要由微控制器处理 电流和电源的实际值。 (这就是上述过程的原因 似乎有点毫无意义,即为什么构建一个芯片 在后台处理但需要您进行浮点 运营获得"real"价值观。查看固定点操作 如何使用原始值进行。注意你的唯一真实原因是你 获得最佳分辨率 - 所以也许这是一个充分的理由!)。

实际计算

计算实际值输出的寄存器校正因子:

全尺寸电流输出是当前寄存器值 乘以CurrentLSB(选择之前)即乘以50E-6 导致得到安培。

    RealCurrent = CurrentReg * 50E-6

一个更方便的结果是ma如此乘以1000乘1000来获得MA中的当前输出:

    RealCurrent = CurrentReg * 50E-6 * 1000。

但是,更容易将其颠倒(而不是由整数划分的分数除以):

    RealCurrent = CurrentReg /(1000 * 50E-6)= CurrentReg / 20

假设您拥有完整的当前流程和40mV在频道中:

    顺控机构=顺式/ 10E-6 = 40E-3 / 10E-6 = 4000

    Current Reg = Shuntvoltagereg * Calreg / 4096 = 4000 * 8192/4096 = 8000

然后

    RealCurrent = 8000/20 = 400 = 400mA

获得真正的当前你划分的"当前寄存器值"到20(在微控制器中)。 请注意,此值20是选择圆数字的直接结果 for CurrentLSB.

实际功率计算

计算实际值输出的寄存器校正因子:

权力方程是:

    powerlsb = 20 * currentlsb

    PowerRegister = CurrentReg * Busvoltagereg / 5000

假设400mA流量,(功率为0.4 * 10 = 4W)

    RealBusVoltage = 10V

    BusvoltageRegister = Realbusvoltage / 4E-3 = 10 / 4E-3 = 2500
    (由于数据表SEECELECLY PER SECTER SEACE。
    currentreg = 8000(如前所述)

所以

    PowerRegister =(8000 * 2500)/ 5000 = 4000

    PowerLSB = 20 * 50E-6 = 0.001W每LSB

    RealPower = 0.001 * 4000 = 4 = 4W

为了获得乘以0.001(在微控制器中的实际电源 或者您可以忘记0.001乘法,将结果留在MW中。

    RealPower = 4000mW

使用最简单的方程

本节介绍如何使用方程来导出电压和 具有最小编程和不使用浮点的电流。这个 可以节省大量内存 - 例如,如果您使用attiny85保存 memory is paramount.

简单的电流

获得当前读数的最简单方法是直接使用分流电压寄存器。等式是:

   realshuntvoltage = shuntvoltageregister * 10e-6

分流电压寄存器的每个LSB值得10UV。您需要的是当前(当rshunt = 0.1ohm时):

    Current = V / R =(顺控灯具* 10E-6)/频率
    Current =(Shuntvoltageregister * 1E-4)

1E-4值说十进制点是左四个位置(见下文)。

如果分流电压的完整最大值掉落 分流电阻(320mV)然后意味着3.2amps流动 (0.32V / 0.1Ohms = 3.2a)。当前寄存器中的值将为32000 (数据表:表7)。

将此值作为固定点值表示,小数点是左侧的4个位置:

    32000 ≡ 3.2000A

更多例子:

对于100mA的电流,分流寄存器将包含10000

    01000 ≡ 0.1000A

 对于10mA的电流,分流寄存器将包含1000个

    00100 ≡ 0.0100A

对于1MA的电流,分流寄存器将包含100个

    00010 ≡ 0.0010A

警告: 这种技术仅适用于很容易 具有10的功率的分流电阻。 0.1Ohm,10mohm,1.0欧姆等。

可以在不浮点的情况下容易地处理这些寄存器值。 例如,您可以通过检测到300ma进行限制检测 如果值大于3000。

您还可以通过将它们转换为ASCII来显示这些值 表示e.g.使用ITOA,然后显示领先的零 必要的。这里显示了一个示例: Ina219-Compare.ino..

总线电压

总线电压转换具有4mV的LSB值。公共汽车寄存器 左移3位。你可以将它转向3位然后 乘以四。但是,方便地,左边的两个班次是 相当于x4操作,所以所有你需要做的就是换行总线 立即注册1位!

这是因为寄存器值已经左移3位 由于硬件如何工作。大学教师't forget to 'AND'0xfff8的结果 使用前零三位。

获取价值

代码警告:两个库都不允许您读取或写入 直接注册 - 这是C ++中的问题,因为设计师不能 预见到所有代码的用法,因此它被攻击给予必要 使封装的功能分开(即使正常完成 你最终有多个类只是做一个简单的动作制作代码 维护绝对痛苦) - 让我们只需完成代码,测试它 稍后封装它(对于所有100个其他员工)。

图书馆代码警告

警告: 既不能直接读取或写入寄存器。

所以我们'LL必须让读访问有问题的芯片寄存器。

对于Ina219_we它非常容易 - 只是做出读写I2C 常规公众(或者如果感到娇小,则重写两个读/写 c)中的函数,并使用#defines访问寄存器值 - 至少在图书馆中使用一些艰苦的工作!)。

图书馆Ina219_we.h修改

在文件中ina219_we.h,编辑方法writegister和ReadRegister的方法:

public:
	void writeRegister(uint8_t reg, uint16_t val);
	uint16_t readRegister(uint8_t reg);

private:
	INA219_ADC_MODE deviceADCMode;
	INA219_MEASURE_MODE deviceMeasureMode;
	INA219_PGAIN devicePGain;
	INA219_BUS_RANGE deviceBusRange;
	在t i2cAddress;
	uint16_t calVal;
	uint16_t calValCorrected;
	uint16_t confRegCopy;
	float 当前的Divider_mA;
	float pwrMultiplier_mW;
	bool calc_overflow;
//	void writeRegister(uint8_t reg, uint16_t val);
//	uint16_t readRegister(uint8_t reg);

要以固定点形式获取当前测量(见上文)我们只需要:

	ina219.readRegister(INA219_SHUNT_REG);

要输出有用的显示值需要一点格式化(并知道在哪里放置固定点)。看 Ina219-Compare.ino. for how to do this.

此操作的总数(简单)代码是:

#include <Wire.h>
#include <INA219_WE.h>

Ina219_we. Ina219.(0x45);

void setup(void) {
   Wire.begin();
   Serial.begin(119200);

   Ina219..在it();
   Ina219..setADCMode(SAMPLE_MODE_128); // Maximum averaging, ~78ms.
}

void loop(void) {

   在t num = Ina219..readRegister(INA219_SHUNT_REG);

   Serial.print("raw VS "); Serial.println(num);

   delay(1000);
}

    [ ina219.ino ]

代码大小:

    Flash:4182字节(13%),SRAM 431字节(20%)。

为了比较眨眼草图用途

    Flash:930字节(3%),SRAM 9字节(0%)。

电线库将占用很多,但这对于所有INA219代码共同。

比较草图示例

只是为了说明您使用的读数使用的读数 在草图下显示"normal"与图书馆的使用相比,"raw register values", and "fixed point" formatting:

#include <Wire.h>
#include <INA219_WE.h>

Ina219_we. Ina219.(0x45);

void setup(void) {
   Wire.begin();
   Serial.begin(119200);

   Ina219..在it();
   Ina219..setADCMode(SAMPLE_MODE_128);
}

// Print fixed point with dp decimal places to left.
void printFixedPointdp(long v, 在t dp) {

   long dpdiv = 1;
   for(在t i=0;i<dp;i++,dpdiv*=10);

   long left = v / dpdiv;
   long rght = v % dpdiv;
   if (left==0) Serial.print('0');  else Serial.print(left);
   Serial.print('.');
   if (rght==0) Serial.print("000");  else Serial.print(rght);
}

void loop(void) {

   // "Normal usage"
   Serial.println("float--------");
   float f = Ina219..getCurrent_mA();
   Serial.print("I  "); Serial.print(f,4); Serial.println("mA");
   f = Ina219..getShuntVoltage_mV();
   Serial.print("VS "); Serial.print(f,4); Serial.println("mV");
   f = Ina219..getBusVoltage_V();
   Serial.print("VB "); Serial.print(f,4); Serial.println("V");
   f = Ina219..getBusPower();
   Serial.print("P  "); Serial.print(f,4); Serial.println("mW");

   Serial.println("RAW--------");
   在t vshuntreg = Ina219..readRegister(INA219_SHUNT_REG);
   Serial.print("raw VS "); Serial.println(vshuntreg);

   long 当前的 = vshuntreg*10;
   Serial.print("raw  I "); Serial.println(当前的);

   在t busvoltagereg = (Ina219..readRegister(INA219_BUS_REG)&0xfff8)>>1; // BV is shifted left 3 bits.
   Serial.print("    BV "); Serial.println(busvoltagereg);

   long buspower = 当前的 * (long)busvoltagereg;
   Serial.print("     P "); Serial.println(buspower);

   // Print formatted fixed point values.
   Serial.println("Fixed------");
   Serial.print(" I ");  printFixedPointdp(当前的,2);       Serial.println("mA");
   Serial.print("VS ");  printFixedPointdp(vshuntreg,2);     Serial.println("mV");
   Serial.print("BV ");  printFixedPointdp(busvoltagereg,3); Serial.println("V");
   Serial.print(" P ");  printFixedPointdp(buspower,5);      Serial.println("mW");

   delay(1000);
}

    [Ina219-Compare.ino]

这是上面草图的典型输出:

float--------
I  15.5000mA
VS 1.5500mV
VB 4.7880V
P  76.0000mW
RAW--------
raw VS 155
raw  I 1550
    BV 4788
     P 7421400
Fixed------
 I 15.50mA
VS 1.55mV
BV 4.788V
 P 74.21400mW

分辨率比特和采样折扣

通过平均任何ADC读取,您可以增加位数 可用的。这款芯片可以为您做到这一点,您可以平均 up to 128 samples.

您可以选择较低的分辨率结果以提供更快的读取速率 或者您可以允许芯片到过性,这导致更准确 读书 - 但读取速度远慢。下表显示了较低位号的速率:

  Bits/Samples
转换时间(典型值)
转换时间(最大)
  9 bit
84us
93us
  10 bit
148us
163us
  11 bit
276us304us
  12 bit
532us
586us
  2 samples
1.06ms
1.17ms
  128 samples
68.10ms.
75.01ms.

    [来源:数据表表5 ADC设置和主规格。]

您还可以使用样品率4,8,16,32和64.找到 转换时间只是乘以12位选择的采样率 采样时间例如128样品给出128 * 532E-6 = 0.068096。

虽然它在数据表中没有这么说,但是采样的结果是 在12bit分辨率下采样 - 它是由时间的暗示。

获得的位数不直接映射到增加的样本 速率,但您可以使用更高的采样率降低噪声。

位范围和PGA增益

收集的比特总数取决于所选的PGA增益:

PGA获得
ADC位
FSR(MV)
  8
15
320
  4
14
160
  2
1380
  1
12
40

    [来源:数据表8.6.3.1分流电压寄存器]

FSR是全尺度范围,并在分流电阻上测量。

尺寸和速度比较

由于没有功能将采集时间设置为128个样本 在adafruit_ina219库​​中(它使用默认12位,532us 解决时间)通过默认分辨率/采样完成所有测试 setting.

注意:您可以在Adafruit库中选择128个Samling模式但是 您需要在现有成员函数之后创建一个新成员函数 例如遵循setCalibtion_32V_2A()格式;

图书馆Ina219_we for time

#include <Wire.h>
#include <INA219_WE.h>

Ina219_we. Ina219.(0x45);

void setup(void) {
   Wire.begin();
   Serial.begin(115200);

   Ina219..在it();
   Ina219..setADCMode(BIT_MODE_12);
}

// Print fixed point with dp decimal places to left.
void printFixedPointdp(long v, 在t dp) {

   long dpdiv = 1;
   for(在t i=0;i<dp;i++,dpdiv*=10);

   long left = v / dpdiv;
   long rght = v % dpdiv;
   if (left==0) Serial.print('0');  else Serial.print(left);
   Serial.print('.');
   if (rght==0) Serial.print("000");  else Serial.print(rght);
}

void loop(void) {
static uint32_t time_start,time_end;

   Serial.println("--------");
   time_start = micros();
   在t  vshuntreg     = Ina219..readRegister(INA219_SHUNT_REG);
   long 当前的       = vshuntreg*10;
   在t  busvoltagereg = (Ina219..readRegister(INA219_BUS_REG)&0xfff8)>>1; // BV is shifted left 3 bits.
   long buspower      = 当前的 * (long)busvoltagereg;

   // Print formatted fixed point values.

   Serial.print(" I ");  printFixedPointdp(当前的,2);       Serial.println("mA");
   Serial.print("VS ");  printFixedPointdp(vshuntreg,2);     Serial.println("mV");
   Serial.print("BV ");  printFixedPointdp(busvoltagereg,3); Serial.println("V");
   Serial.print(" P ");  printFixedPointdp(buspower,5);      Serial.println("mW");
   time_end=micros();

   Serial.print(" Time "); Serial.print(time_end-time_start); Serial.println("us");

   delay(1000);
}

[代码:Ina219-test-fixed.ino]

修复点结果

--------
I 15.50mA
VS 1.55mV
BV 4.748V
P 73.59400mW
Time 2596us

固定点结果:Flash:4840字节,SRAM 479字节,时间:2596US

图书馆Ina219_we.

#include <Wire.h>
#include <INA219_WE.h>

Ina219_we. Ina219.(0x45);

void setup(void) {
   Wire.begin();
   Serial.begin(115200);

   Ina219..在it();
   Ina219..setADCMode(BIT_MODE_12);
}

void loop(void) {
static uint32_t time_start,time_end;

   Serial.println("WE--------");
   time_start = micros();
   float fi  = Ina219..getCurrent_mA();
   float fv  = Ina219..getShuntVoltage_mV();
   float fbv = Ina219..getBusVoltage_V();
   float fp  = Ina219..getBusPower();
   time_end=micros();

   Serial.print("I  "); Serial.print(fi,4); Serial.println("mA");
   Serial.print("VS "); Serial.print(fv,4); Serial.println("mV");
   Serial.print("VB "); Serial.print(fbv,4); Serial.println("V");
   Serial.print("P  "); Serial.print(fp,4); Serial.println("mW");
   Serial.print(" Time "); Serial.print(time_end-time_start); Serial.println("us");

   delay(1000);
}

[码:Ina219-test-we.ino]

Ina219_we结果

WE--------
I  15.1000mA
VS 1.5100mV
VB 4.7120V
P 76.0000mW
Time 2256us

图书馆Ina219_WE:Flash:6108字节,SRAM 489字节,时间:2256US。

adafruit_ina219库

注意adafruit _ina219库​​要求您还安装它依赖的adafruit_busio库。

即使它可能使这个代码大小更大 使用子库的示例i2c可能最终退还,尽可能多 个人库重新编写公共I2CC读写功能 重复。这个子库adafruit_busio将允许内存 节省更多设备使用它(只要它们使用此公共库)。

注意没有任何功能可以将采集时间设置为128个样本 在adafruit库中,它使用默认的12位和532us 分辨率和采样时间。

#include <Wire.h>
#include <Adafruit_INA219.h>

adafruit_ina219 Ina219.(0x45);

void setup(void) {
   Wire.begin();
   Serial.begin(115200);

   Ina219..begin();
   Ina219..setCalibration_32V_2A();
}

void loop(void) {
static uint32_t time_start,time_end;

   Serial.println("Adafruit--------");
   time_start = micros();
   float fi  = Ina219..getCurrent_mA();
   float fv  = Ina219..getShuntVoltage_mV();
   float fbv = Ina219..getBusVoltage_V();
   float fp  = Ina219..getPower_mW();
   time_end=micros();

   Serial.print("I  ");  Serial.print(fi,4); Serial.println("mA");
   Serial.print("VS ");  Serial.print(fv,4); Serial.println("mV");
   Serial.print("VB ");  Serial.print(fbv,4); Serial.println("V");
   Serial.print("P  ");  Serial.print(fp,4); Serial.println("mW");

   Serial.print(" Time "); Serial.print(time_end-time_start); Serial.println("us");

   delay(1000);
}

[代码:Ina219-test-Adafruit.ino]

Adafruit_ina219结果

Adafruit--------
I  15.9000mA
VS 1.5900mV
VB 4.7040V
P  76.0000mW
 Time 3180us

adafruit_ina219结果:闪光:8304字节,SRAM 496字节。

结果摘要

这些是用于arduino nano / uno。

固定点结果:Flash:4840字节,SRAM 479字节,时间:2596US

图书馆Ina219_WE:Flash:6108字节,SRAM 489字节,时间:2256US。

adafruit_ina219结果:Flash:8304字节,SRAM 496字节,时间:3180US。

你可以看到:

  1. 使用的SRAM量不会变化。
  2. 所花费的时间并不差异,但图书馆ina219_we最快。
  3. 您可以使用固定点C.f节省3464个字节。图书馆adafruit_ina219。
  4. 您可以使用固定点C.f节省1268个字节。图书馆Ina219_we。
  5. Ina219_we.和ADAFRUIT_ANA219之间的差异是2196字节。

提示: 如果要保存闪存,请使用固定点方法。

使用adafruit_ina219和INA219_WE之间的闪光尺寸差异 是由于库代码大小[5](从两种情况下浮点 操作用于计算结果)。

固定点与INA219_WE之间的闪光尺寸差异纯粹是 向下不使用浮点[4](因为它们都使用它 图书馆代码 - INA219_WE)。

硬件

INA219 I2C地址's

地址的较低的两个位由两个数字组成 输入A1,A0,但它们以与ADS1115相同的方式多路复用。 这意味着输入可以设置为GND,VCC,SCL或SDA,并提供 16个值的地址范围(不是您通常期望的4个值 只是a0和a1)。最后一个 bit( LSB ' 'l)被忽略,因为它是读写位(R / WN)。所以 可用的地址是:

        0x40,0x41,0x42,0x43,.... 0x4c,0x4d,0x4e,0x4f。

        请参阅数据表:8.5.5.1串行总线地址。

突发委员会地址

在突破板A0和A1上由电阻拉低,两个焊料BLOB允许连接到V.CC.。因此,电路板的I2C地址,没有斑点,将是0x40。对于此板,您可以设置以下地址:

  Solder blob A1
焊料Blob A0
INA219地址
  not
不是
0x40
  not
焊点
0x41
  soldered
不是
0x44
  soldered
焊点
0x45

连接

用于测试使用Arduino Uno / Nano并将其连接如下:

arduino. INA219
  5V
VDD.
  GND
GND.
  A5
SCL.
  A4
SDA.
  To your circuit
vin-
  到您的电路V +电源 vin +.

您可以将VIN连接到简单的电路。带有320R电阻的LED串联。

软件

使用Arduino IDE版本:1.8.8

arduino.图书馆

安装图书馆的说明是 这里.

隐含的假设

内置库的假设是使用0.1R电阻器 分流电阻。如果您想要不同的价值,您需要 重写库代码。

这不是一个糟糕的假设,因为它是最常用的电阻 但如果你想要更少的电压下降,你可以得到更低的。 10mohms. etc.

adafruit_ina219

此库具有在设置INA219时通过设计过程的有用评论。

安装名为的库 Adafruit_ina219。版本使用1.0.9。
还安装名为的库 adafruit_busio。版本使用1.3.2。

    使用库管理器,搜索"Ina219.", "巴西".

Ina219_we.

安装名为的库 Ina219._we, Version used 1.1.1.

    使用库管理器,搜索"Ina219.".

    (On github //github.com/wollewald/INA219_WE)

Ina219_We Library警告

IDE输出错误消息

Arduino IDE抱怨传感器是错误的类别 - 您可以 忽略此问题或更改文本"Sensor"在文件库中.properties (在INA219_WE目录中)到"Sensors" to fix it.

Ina219_we.库功能

可用INA219_WE功能是:
	INA219_WE(int addr);
	INA219_WE();			//sets default I2C Address 0x40
	void init();
	void reset_INA219();
	void setCorrectionFactor(float corr);
	void setADCMode(INA219_ADC_MODE mode);
	void setMeasureMode(INA219_MEASURE_MODE mode);
	void setPGain(INA219_PGAIN gain);
	void setBusRange(INA219_BUS_RANGE range);
	float getShuntVoltage_mV();
	float getBusVoltage_V();
	float getCurrent_mA();
	float getBusPower();
	bool getOverflow();
	void startSingleMeasurement();
	void powerDown();
	void powerUp();

因此,您可以校准INA219并可以轻松获取电流,分流电压,总线电压和功率的读数。

Adafruit_ina219 Library functions

可用的

  Adafruit_INA219(uint8_t addr = INA219_ADDRESS);
  bool begin(TwoWire *theWire = &Wire);
  void setCalibtion_32V_2A();
  void setCalibtion_32V_1A();
  void setcalibation_16v_400ma();
  float getBusVoltage_V();
  float getShuntVoltage_mV();
  float getCurrent_mA();
  float getPower_mW();
  void powerSave(bool on);

AdaFruit_ina219库​​采用不同的方法 - 预先提供的校准。

它有三种方便的校准已经为您制定了:

  1.     setCalibtion_32V_2A();
  2.     setCalibtion_32V_1A();
  3.     setcalibation_16v_400ma();

如果你不'T想要乱画弄清楚的东西然后这些功能提供了快速且简单的设置:

1.以上,最大预期电流为2A,
        以及32V的范围(实际上是26V最大输入)。

2.上面,最大预期电流为1A,
        以及32V的范围(实际上是26V最大输入)。

对于3.以上,最大预期电流为400mA,
        和16V的范围(这在 实际上是16V最大输入虽然它                 withstands 26V).

预期的电流就是这样 - 它是你的最大电流 期望看到并只改变所产生的阅读的解决方案。

为了快速使用,您可能会看到您要使用的范围设置。

INA219结论

INA219是一种非常容易使用的芯片,它真的插入并进入 - 随着测量电压在26V内。你可以使用 标准图书馆,以容易获得电流,总线电压的读数 and power.

在这里测试的所有图书馆都在工作 - 给予相同的结果吗? : 是的。
所有图书馆都以相同的速度工作吗? :更多或更少(〜1ms内)。
所有图书馆都使用相同的SRAM吗? : 是的。
所有图书馆都使用相同的闪光灯:不。

您可以使用特定库保存重要内存。

你也可以省结 3K字节的闪光灯 if you don't使用浮点操作。而不是使用固定点 这里.

在这里学习的两个图书馆adafruit_ina219提供最简单 使用,为您提供预先计算的校准选项。但是,它 没有给你控制,所以你可以'T设置样品数量等。 Ina219_We确实提供了这个控制。

提示: 使用低分流阻力来测量更高的电流。

如果将分流电阻更换为0.02欧姆,则可以测量10〜15a。 (有关示例,请参阅数据表)。你必须重新计算 校准寄存器的这种电阻设置。

新的! Comments

让你说到你刚刚阅读的东西!留下下面的框中的评论。




隐私政策 | 接触 | 关于我

网站地图 | 使用条款


ezoic.报告此广告

访问我们的Facebook页面:

   点击这里



最近的文章

  1. 如何使用ADS1115

    使用ADS1115精度16位ADC进行教程进行低功耗。

    阅读更多

  2. arduino.模拟输出...易模拟输出生成

    arduino.模拟输出:如何创建最精确的PWM模拟输出以及如何创建模拟PWM正弦波。

    阅读更多

  3. 数号和等效的快速宏。加快代码!

    了解DigitalWrite()的工作原理......现在使用17倍宏宏!

    阅读更多

  4. TCS230颜色传感芯片:如何运作以及如何使用它。

    如何使用TCS230(/ TCS3200)彩色检测器芯片并轻松将其添加到您的任何项目中。

    阅读更多

  5. 如何使用ADXL345进行运动感测等。

    使用ADXL345 Acellerometer,您可以检测到16G!您还可以了解如何使用它来点击检测等。

    阅读更多

  6. HMC5883L 3轴数字MAGENTOMTER如何运作

    HMC5883L - 如何制作数字罗盘,了解HMC5883L和QMC5883L之间的差异以及它们是否兼容。

    阅读更多



读者 Comments

"I wanted to thank
你这么好
对于所有信息
你已经提供了
你的网站's

高超极好的."

- 逃亡Potthath.

"This site really is
最好的和我最喜欢的。
我发现这里有很多很有用
项目和提示。"

- 米兰

Bursach.<at>gmail.com<

"Awesome site,
非常,非常容易和好
导航!"


-
镭_tr.<at>
wolf359.cjb.net.


学习微控制器

"Interested in
微控制器?"

注册
免费7天指南:

自由 GUIDE : CLICK HERE


"I am a newbie to PIC
我想说
 how great your
网站一直在为我。"


- 戴夫

de_scott.<at>bellsouth.net

"Your site is a great
和完美的工作。
恭喜。"


- SURESH.

IntegratedInfosys.<at>
Yahoo.com.

"I couldn't find the correct
要定义的词语
你的网页。

非常有用,揭开,
诚实明确。

非常感谢
你的时间和作品。
问候。"


- Anon.

回到顶部