FOR 32V 3.2A

Fork of INA219 by Components

Committer:
andcor02
Date:
Thu Apr 12 14:21:51 2018 +0000
Revision:
1:69f47d90848a
Parent:
0:eee9c8ba72ff
FOR 32V 3.2A

Who changed what in which revision?

UserRevisionLine numberNew contents of line
melse 0:eee9c8ba72ff 1 #include "INA219.hpp"
melse 0:eee9c8ba72ff 2
melse 0:eee9c8ba72ff 3 INA219::INA219 (PinName sda, PinName scl, int addr, int freq, resolution_t res) : I2C(sda, scl), resolution(res), i2c_addr(addr << 1)
melse 0:eee9c8ba72ff 4 {
melse 0:eee9c8ba72ff 5 I2C::frequency(freq);
melse 0:eee9c8ba72ff 6
melse 0:eee9c8ba72ff 7 // by default, calibrate to this level.
melse 0:eee9c8ba72ff 8 calibrate_16v_400mA();
melse 0:eee9c8ba72ff 9 }
melse 0:eee9c8ba72ff 10
melse 0:eee9c8ba72ff 11 // Private Methods
melse 0:eee9c8ba72ff 12
melse 0:eee9c8ba72ff 13 void INA219::write_register (uint8_t reg, uint8_t* data, int length)
melse 0:eee9c8ba72ff 14 {
melse 0:eee9c8ba72ff 15 char* transmission = (char*)malloc(length + 1);
melse 0:eee9c8ba72ff 16 memcpy(transmission + 1, data, length);
melse 0:eee9c8ba72ff 17
melse 0:eee9c8ba72ff 18 transmission[0] = reg;
melse 0:eee9c8ba72ff 19 I2C::write(i2c_addr, transmission, length + 1);
melse 0:eee9c8ba72ff 20
melse 0:eee9c8ba72ff 21 free(transmission);
melse 0:eee9c8ba72ff 22 }
melse 0:eee9c8ba72ff 23
melse 0:eee9c8ba72ff 24 void INA219::write_register_u16 (uint8_t reg, uint16_t data)
melse 0:eee9c8ba72ff 25 {
melse 0:eee9c8ba72ff 26 char transmission[3];
melse 0:eee9c8ba72ff 27 transmission[0] = reg;
melse 0:eee9c8ba72ff 28 transmission[1] = (data >> 8) & 0xff;
melse 0:eee9c8ba72ff 29 transmission[2] = data & 0xff;
melse 0:eee9c8ba72ff 30
melse 0:eee9c8ba72ff 31 I2C::write(i2c_addr, transmission, 3);
melse 0:eee9c8ba72ff 32 }
melse 0:eee9c8ba72ff 33
melse 0:eee9c8ba72ff 34 void INA219::write_null(uint8_t reg) {
melse 0:eee9c8ba72ff 35 I2C::write(i2c_addr, (char*)&reg, 1);
melse 0:eee9c8ba72ff 36 }
melse 0:eee9c8ba72ff 37
melse 0:eee9c8ba72ff 38 uint16_t INA219::read_register_u16 (uint8_t reg)
melse 0:eee9c8ba72ff 39 {
melse 0:eee9c8ba72ff 40 write_null(reg);
melse 0:eee9c8ba72ff 41
melse 0:eee9c8ba72ff 42 char data[2];
melse 0:eee9c8ba72ff 43 I2C::read(i2c_addr, data, 2);
melse 0:eee9c8ba72ff 44
melse 0:eee9c8ba72ff 45 uint16_t ret_val = data[0] << 8 | data[1];
melse 0:eee9c8ba72ff 46 return ret_val;
melse 0:eee9c8ba72ff 47 }
melse 0:eee9c8ba72ff 48
melse 0:eee9c8ba72ff 49 // Public Methods
melse 0:eee9c8ba72ff 50
melse 0:eee9c8ba72ff 51 void INA219::calibrate_16v_400mA()
andcor02 1:69f47d90848a 52
melse 0:eee9c8ba72ff 53 {
andcor02 1:69f47d90848a 54 //THIS IS FOR 32V 3.2A, SEE HERE FOR CONFIG:
andcor02 1:69f47d90848a 55 //https://github.com/adafruit/Adafruit_INA219/blob/master/Adafruit_INA219.cpp
melse 0:eee9c8ba72ff 56 // ASSUMING A 0.1 OHM RESISTOR!
andcor02 1:69f47d90848a 57 write_register_u16(INA219_REG_CALIBRATION, 4096);
melse 0:eee9c8ba72ff 58
melse 0:eee9c8ba72ff 59 // Write to config register
melse 0:eee9c8ba72ff 60
melse 0:eee9c8ba72ff 61 uint16_t resolution_mask = 0x0000;
melse 0:eee9c8ba72ff 62
andcor02 1:69f47d90848a 63
melse 0:eee9c8ba72ff 64 resolution_mask = INA219_CONFIG_BADCRES_12BIT | INA219_CONFIG_SADCRES_12BIT_1S_532US;
melse 0:eee9c8ba72ff 65
andcor02 1:69f47d90848a 66 write_register_u16(INA219_REG_CONFIG, INA219_CONFIG_BVOLTAGERANGE_32V |
andcor02 1:69f47d90848a 67 INA219_CONFIG_GAIN_8_320MV |
melse 0:eee9c8ba72ff 68 resolution_mask |
melse 0:eee9c8ba72ff 69 INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS);
melse 0:eee9c8ba72ff 70
melse 0:eee9c8ba72ff 71 // Set current divider
andcor02 1:69f47d90848a 72 current_divider = 10;
andcor02 1:69f47d90848a 73 power_divider = 2;
melse 0:eee9c8ba72ff 74 }
melse 0:eee9c8ba72ff 75
melse 0:eee9c8ba72ff 76 int16_t INA219::read_current_raw()
melse 0:eee9c8ba72ff 77 {
melse 0:eee9c8ba72ff 78 return (int16_t)read_register_u16(INA219_REG_CURRENT);
melse 0:eee9c8ba72ff 79 }
melse 0:eee9c8ba72ff 80
melse 0:eee9c8ba72ff 81 float INA219::read_current_mA()
melse 0:eee9c8ba72ff 82 {
melse 0:eee9c8ba72ff 83 float raw_current = read_current_raw();
melse 0:eee9c8ba72ff 84 return raw_current / current_divider;
melse 0:eee9c8ba72ff 85 }