The INA219 is a high-side current shunt and power monitor with an I2C interface. The INA219 monitors both shunt drop and supply voltage, with programmable conversion times and filtering. A programmable calibration value, combined with an internal multiplier, enables direct readouts in amperes. An additional multiplying register calculates power in watts. The I2C interface features 16 programmable addresses.

Dependents:   INA219TEST

Fork of INA219 by Michael Ammann

Committer:
x893
Date:
Mon Jun 30 08:27:27 2014 +0000
Revision:
3:c4a937ab46bf
Parent:
1:2816fc874abc
Fix errors

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mazgch 0:81c08f01f0fe 1 #include "INA219.h"
mazgch 0:81c08f01f0fe 2
x893 3:c4a937ab46bf 3 INA219::INA219(PinName sda, PinName scl, unsigned char adr, int hz) :
mazgch 0:81c08f01f0fe 4 _i2c(sda, scl)
mazgch 0:81c08f01f0fe 5 {
x893 3:c4a937ab46bf 6 _i2c.frequency(hz);
x893 3:c4a937ab46bf 7 Address = adr;
x893 3:c4a937ab46bf 8 }
x893 3:c4a937ab46bf 9
x893 3:c4a937ab46bf 10 I2C INA219::getI2C(void)
x893 3:c4a937ab46bf 11 {
x893 3:c4a937ab46bf 12 return _i2c;
mazgch 0:81c08f01f0fe 13 }
mazgch 0:81c08f01f0fe 14
mazgch 0:81c08f01f0fe 15 bool INA219::detect(void)
mazgch 0:81c08f01f0fe 16 {
mazgch 0:81c08f01f0fe 17 _i2c.start();
x893 3:c4a937ab46bf 18 bool det = (0 == _i2c.write(Address | 1 /*write address for reading*/));
mazgch 0:81c08f01f0fe 19 _i2c.stop();
mazgch 1:2816fc874abc 20 return det;
mazgch 0:81c08f01f0fe 21 }
mazgch 0:81c08f01f0fe 22
x893 3:c4a937ab46bf 23 bool INA219::getRegister(unsigned char reg, unsigned short *data)
x893 3:c4a937ab46bf 24 {
x893 3:c4a937ab46bf 25 unsigned char v[2];
x893 3:c4a937ab46bf 26 v[0] = reg;
x893 3:c4a937ab46bf 27 if (0 == _i2c.write(Address, (char *)&v, 1, true))
x893 3:c4a937ab46bf 28 {
x893 3:c4a937ab46bf 29 if (0 == _i2c.read(Address, (char *)&v, 2))
x893 3:c4a937ab46bf 30 {
x893 3:c4a937ab46bf 31 *data = (v[0] << 8) | v[1];
x893 3:c4a937ab46bf 32 return true;
x893 3:c4a937ab46bf 33 }
x893 3:c4a937ab46bf 34 }
x893 3:c4a937ab46bf 35 else
x893 3:c4a937ab46bf 36 {
x893 3:c4a937ab46bf 37 _i2c.stop();
x893 3:c4a937ab46bf 38 }
x893 3:c4a937ab46bf 39 return false;
x893 3:c4a937ab46bf 40 }
x893 3:c4a937ab46bf 41
x893 3:c4a937ab46bf 42 unsigned short INA219::getRegister(unsigned char reg)
x893 3:c4a937ab46bf 43 {
x893 3:c4a937ab46bf 44 unsigned short data = 0;
x893 3:c4a937ab46bf 45 getRegister(0x00, &data);
x893 3:c4a937ab46bf 46 return data;
x893 3:c4a937ab46bf 47 }
x893 3:c4a937ab46bf 48
mazgch 0:81c08f01f0fe 49 double INA219::getCurrent(void)
mazgch 0:81c08f01f0fe 50 {
mazgch 0:81c08f01f0fe 51 double d = 0.0;
x893 3:c4a937ab46bf 52 unsigned short data;
x893 3:c4a937ab46bf 53 if (getRegister(0x01, &data))
mazgch 0:81c08f01f0fe 54 {
x893 3:c4a937ab46bf 55 d = 1e-6 * ((int)data * 100); // uV * 0.1 ohm = A
mazgch 0:81c08f01f0fe 56 }
mazgch 0:81c08f01f0fe 57 return d;
mazgch 0:81c08f01f0fe 58 }
mazgch 0:81c08f01f0fe 59
mazgch 0:81c08f01f0fe 60 double INA219::getVoltage(void)
mazgch 0:81c08f01f0fe 61 {
mazgch 0:81c08f01f0fe 62 double d = 0.0;
x893 3:c4a937ab46bf 63 unsigned short data;
x893 3:c4a937ab46bf 64 if (getRegister(0x02, &data))
mazgch 0:81c08f01f0fe 65 {
x893 3:c4a937ab46bf 66 d = 1e-3 * (int)(data >> 1); // V
mazgch 0:81c08f01f0fe 67 }
mazgch 0:81c08f01f0fe 68 return d;
mazgch 0:81c08f01f0fe 69 }