INA219 (Texas Instruments) High-Side Measurement,Bi-Directional CURRENT/POWER MONITOR with I2C Interface

Dependents:   BratRobot

Committer:
kenjiArai
Date:
Wed Aug 23 09:24:35 2017 +0000
Revision:
3:8c444591d7f2
Parent:
2:088b8d5de7e9
countermeasure for  NonCopyable

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:a3b41ab8433b 1 /*
kenjiArai 0:a3b41ab8433b 2 * mbed library program
kenjiArai 1:fea983b0385b 3 * INA219 High-Side Measurement,Bi-Directional CURRENT/POWER MONITOR with I2C Interface
kenjiArai 0:a3b41ab8433b 4 * by Texas Instruments
kenjiArai 0:a3b41ab8433b 5 *
kenjiArai 3:8c444591d7f2 6 * Copyright (c) 2015,'17 Kenji Arai / JH1PJL
kenjiArai 0:a3b41ab8433b 7 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:a3b41ab8433b 8 * http://mbed.org/users/kenjiArai/
kenjiArai 3:8c444591d7f2 9 * Created: January 25th, 2015
kenjiArai 3:8c444591d7f2 10 * Revised: August 23rd, 2017
kenjiArai 0:a3b41ab8433b 11 */
kenjiArai 0:a3b41ab8433b 12
kenjiArai 0:a3b41ab8433b 13 #include "mbed.h"
kenjiArai 0:a3b41ab8433b 14 #include "INA219.h"
kenjiArai 0:a3b41ab8433b 15
kenjiArai 3:8c444591d7f2 16 INA219::INA219 (PinName p_sda, PinName p_scl, const INA219_TypeDef *ina219_parameter)
kenjiArai 3:8c444591d7f2 17 : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
kenjiArai 0:a3b41ab8433b 18 {
kenjiArai 1:fea983b0385b 19 _i2c.frequency(400000);
kenjiArai 0:a3b41ab8433b 20 ina219_set_data = *ina219_parameter;
kenjiArai 0:a3b41ab8433b 21 initialize();
kenjiArai 0:a3b41ab8433b 22 }
kenjiArai 0:a3b41ab8433b 23
kenjiArai 3:8c444591d7f2 24 INA219::INA219 (PinName p_sda, PinName p_scl, uint8_t addr)
kenjiArai 3:8c444591d7f2 25 : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
kenjiArai 0:a3b41ab8433b 26 {
kenjiArai 1:fea983b0385b 27 _i2c.frequency(400000);
kenjiArai 0:a3b41ab8433b 28 // Use standard setting
kenjiArai 0:a3b41ab8433b 29 ina219_set_data = ina219_std_paramtr;
kenjiArai 0:a3b41ab8433b 30 // Change user defined address
kenjiArai 0:a3b41ab8433b 31 ina219_set_data.addr = addr;
kenjiArai 0:a3b41ab8433b 32 initialize();
kenjiArai 0:a3b41ab8433b 33 }
kenjiArai 0:a3b41ab8433b 34
kenjiArai 3:8c444591d7f2 35 INA219::INA219 (PinName p_sda, PinName p_scl)
kenjiArai 3:8c444591d7f2 36 : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
kenjiArai 0:a3b41ab8433b 37 {
kenjiArai 1:fea983b0385b 38 _i2c.frequency(400000);
kenjiArai 0:a3b41ab8433b 39 // Use standard setting
kenjiArai 0:a3b41ab8433b 40 ina219_set_data = ina219_std_paramtr;
kenjiArai 0:a3b41ab8433b 41 initialize();
kenjiArai 0:a3b41ab8433b 42 }
kenjiArai 0:a3b41ab8433b 43
kenjiArai 3:8c444591d7f2 44 INA219::INA219 (I2C& p_i2c, const INA219_TypeDef *ina219_parameter)
kenjiArai 3:8c444591d7f2 45 : _i2c(p_i2c)
kenjiArai 0:a3b41ab8433b 46 {
kenjiArai 1:fea983b0385b 47 _i2c.frequency(400000);
kenjiArai 0:a3b41ab8433b 48 ina219_set_data = *ina219_parameter;
kenjiArai 0:a3b41ab8433b 49 initialize();
kenjiArai 0:a3b41ab8433b 50 }
kenjiArai 0:a3b41ab8433b 51
kenjiArai 3:8c444591d7f2 52 INA219::INA219 (I2C& p_i2c, uint8_t addr)
kenjiArai 3:8c444591d7f2 53 : _i2c(p_i2c)
kenjiArai 0:a3b41ab8433b 54 {
kenjiArai 1:fea983b0385b 55 _i2c.frequency(400000);
kenjiArai 0:a3b41ab8433b 56 // Use standard setting
kenjiArai 0:a3b41ab8433b 57 ina219_set_data = ina219_std_paramtr;
kenjiArai 0:a3b41ab8433b 58 // Change user defined address
kenjiArai 0:a3b41ab8433b 59 ina219_set_data.addr = addr;
kenjiArai 0:a3b41ab8433b 60 initialize();
kenjiArai 0:a3b41ab8433b 61 }
kenjiArai 0:a3b41ab8433b 62
kenjiArai 0:a3b41ab8433b 63 INA219::INA219 (I2C& p_i2c) : _i2c(p_i2c)
kenjiArai 0:a3b41ab8433b 64 {
kenjiArai 1:fea983b0385b 65 _i2c.frequency(400000);
kenjiArai 0:a3b41ab8433b 66 // Use standard setting
kenjiArai 0:a3b41ab8433b 67 ina219_set_data = ina219_std_paramtr;
kenjiArai 0:a3b41ab8433b 68 initialize();
kenjiArai 0:a3b41ab8433b 69 }
kenjiArai 0:a3b41ab8433b 70
kenjiArai 0:a3b41ab8433b 71 /////////////// Read Current //////////////////////////////
kenjiArai 0:a3b41ab8433b 72 float INA219::read_current()
kenjiArai 0:a3b41ab8433b 73 {
kenjiArai 0:a3b41ab8433b 74 dt[0] = INA219_CURRENT;
kenjiArai 0:a3b41ab8433b 75 _i2c.write((int)ina219_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:a3b41ab8433b 76 _i2c.read((int)ina219_set_data.addr, (char *)dt, 2, false);
kenjiArai 1:fea983b0385b 77 int16_t data = (dt[0] << 8) | dt[1];
kenjiArai 1:fea983b0385b 78 return (float)data * 25 /1000;
kenjiArai 0:a3b41ab8433b 79 }
kenjiArai 0:a3b41ab8433b 80
kenjiArai 0:a3b41ab8433b 81 /////////////// Read Power ////////////////////////////////
kenjiArai 0:a3b41ab8433b 82 float INA219::read_power()
kenjiArai 0:a3b41ab8433b 83 {
kenjiArai 0:a3b41ab8433b 84 dt[0] = INA219_POWER;
kenjiArai 0:a3b41ab8433b 85 _i2c.write((int)ina219_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:a3b41ab8433b 86 _i2c.read((int)ina219_set_data.addr, (char *)dt, 2, false);
kenjiArai 1:fea983b0385b 87 int16_t data = (dt[0] << 8) | dt[1];
kenjiArai 1:fea983b0385b 88 return (float)data / 2000;
kenjiArai 0:a3b41ab8433b 89 }
kenjiArai 0:a3b41ab8433b 90
kenjiArai 0:a3b41ab8433b 91 /////////////// Read Bus_volt /////////////////////////////
kenjiArai 0:a3b41ab8433b 92 float INA219::read_bus_voltage()
kenjiArai 0:a3b41ab8433b 93 {
kenjiArai 0:a3b41ab8433b 94 dt[0] = INA219_BUS_VOLT;
kenjiArai 0:a3b41ab8433b 95 _i2c.write((int)ina219_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:a3b41ab8433b 96 _i2c.read((int)ina219_set_data.addr, (char *)dt, 2, false);
kenjiArai 1:fea983b0385b 97 int16_t data = ((dt[0] << 8) | dt[1]) >> 3;
kenjiArai 1:fea983b0385b 98 return (float)data * 4 / 1000;
kenjiArai 0:a3b41ab8433b 99 }
kenjiArai 0:a3b41ab8433b 100
kenjiArai 0:a3b41ab8433b 101 /////////////// Read Shunt volt ///////////////////////////
kenjiArai 0:a3b41ab8433b 102 float INA219::read_shunt_voltage()
kenjiArai 0:a3b41ab8433b 103 {
kenjiArai 0:a3b41ab8433b 104 dt[0] = INA219_SHUNT_V;
kenjiArai 0:a3b41ab8433b 105 _i2c.write((int)ina219_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:a3b41ab8433b 106 _i2c.read((int)ina219_set_data.addr, (char *)dt, 2, false);
kenjiArai 1:fea983b0385b 107 int16_t data = (dt[0] << 8) | dt[1];
kenjiArai 0:a3b41ab8433b 108 return (float)data;
kenjiArai 0:a3b41ab8433b 109 }
kenjiArai 0:a3b41ab8433b 110
kenjiArai 0:a3b41ab8433b 111 float INA219::read_current_by_shuntvolt()
kenjiArai 0:a3b41ab8433b 112 {
kenjiArai 0:a3b41ab8433b 113 dt[0] = INA219_SHUNT_V;
kenjiArai 0:a3b41ab8433b 114 _i2c.write((int)ina219_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:a3b41ab8433b 115 _i2c.read((int)ina219_set_data.addr, (char *)dt, 2, false);
kenjiArai 1:fea983b0385b 116 int16_t data = (dt[0] << 8) | dt[1];
kenjiArai 1:fea983b0385b 117 return (float)data / 10;
kenjiArai 0:a3b41ab8433b 118 // return ((float)data / ina219_set_data.shunt_register) / 1000;
kenjiArai 0:a3b41ab8433b 119 }
kenjiArai 0:a3b41ab8433b 120
kenjiArai 0:a3b41ab8433b 121 /////////////// Read configulation ////////////////////////
kenjiArai 0:a3b41ab8433b 122 uint16_t INA219::read_config()
kenjiArai 0:a3b41ab8433b 123 {
kenjiArai 0:a3b41ab8433b 124 dt[0] = INA219_CONFIG;
kenjiArai 0:a3b41ab8433b 125 _i2c.write((int)ina219_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:a3b41ab8433b 126 _i2c.read((int)ina219_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:a3b41ab8433b 127 uint16_t data = (dt[0] << 8) | dt[1];
kenjiArai 0:a3b41ab8433b 128 return data;
kenjiArai 0:a3b41ab8433b 129 }
kenjiArai 0:a3b41ab8433b 130
kenjiArai 0:a3b41ab8433b 131 /////////////// Set configulation /////////////////////////
kenjiArai 0:a3b41ab8433b 132 uint16_t INA219::set_config(uint16_t cfg)
kenjiArai 0:a3b41ab8433b 133 {
kenjiArai 0:a3b41ab8433b 134 uint16_t data = cfg;
kenjiArai 0:a3b41ab8433b 135 dt[0] = INA219_CONFIG;
kenjiArai 0:a3b41ab8433b 136 dt[1] = data >> 8; // MSB 1st
kenjiArai 0:a3b41ab8433b 137 dt[2] = data & 0xff; // LSB 2nd
kenjiArai 0:a3b41ab8433b 138 _i2c.write((int)ina219_set_data.addr, (char *)dt, 3, false);
kenjiArai 0:a3b41ab8433b 139 return data;
kenjiArai 0:a3b41ab8433b 140 }
kenjiArai 0:a3b41ab8433b 141
kenjiArai 0:a3b41ab8433b 142 /////////////// Read Calibration reg. /////////////////////
kenjiArai 0:a3b41ab8433b 143 uint16_t INA219::read_calb(void)
kenjiArai 0:a3b41ab8433b 144 {
kenjiArai 0:a3b41ab8433b 145 dt[0] = INA219_CALBLATION;
kenjiArai 0:a3b41ab8433b 146 _i2c.write((int)ina219_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:a3b41ab8433b 147 _i2c.read((int)ina219_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:a3b41ab8433b 148 uint16_t data = (dt[0] << 8) | dt[1];
kenjiArai 0:a3b41ab8433b 149 return data;
kenjiArai 0:a3b41ab8433b 150 }
kenjiArai 0:a3b41ab8433b 151
kenjiArai 0:a3b41ab8433b 152 /////////////// Set Calibration reg. //////////////////////
kenjiArai 0:a3b41ab8433b 153 uint16_t INA219::set_calb(uint16_t clb)
kenjiArai 0:a3b41ab8433b 154 {
kenjiArai 0:a3b41ab8433b 155 uint16_t data = clb;
kenjiArai 0:a3b41ab8433b 156 dt[0] = INA219_CALBLATION;
kenjiArai 0:a3b41ab8433b 157 dt[1] = data >> 8; // MSB 1st
kenjiArai 0:a3b41ab8433b 158 dt[2] = data & 0xff; // LSB 2nd
kenjiArai 0:a3b41ab8433b 159 _i2c.write((int)ina219_set_data.addr, (char *)dt, 3, false);
kenjiArai 0:a3b41ab8433b 160 return data;
kenjiArai 0:a3b41ab8433b 161 }
kenjiArai 0:a3b41ab8433b 162
kenjiArai 0:a3b41ab8433b 163 /////////////// Read/Write specific register //////////////
kenjiArai 0:a3b41ab8433b 164 uint8_t INA219::read_reg(uint8_t addr)
kenjiArai 0:a3b41ab8433b 165 {
kenjiArai 0:a3b41ab8433b 166 dt[0] = addr;
kenjiArai 0:a3b41ab8433b 167 _i2c.write((int)ina219_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:a3b41ab8433b 168 _i2c.read((int)ina219_set_data.addr, (char *)dt, 1, false);
kenjiArai 0:a3b41ab8433b 169 return dt[0];
kenjiArai 0:a3b41ab8433b 170 }
kenjiArai 0:a3b41ab8433b 171
kenjiArai 0:a3b41ab8433b 172 uint8_t INA219::write_reg(uint8_t addr, uint8_t data)
kenjiArai 0:a3b41ab8433b 173 {
kenjiArai 0:a3b41ab8433b 174 dt[0] = addr;
kenjiArai 0:a3b41ab8433b 175 dt[1] = data;
kenjiArai 0:a3b41ab8433b 176 _i2c.write((int)ina219_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:a3b41ab8433b 177 return dt[1];
kenjiArai 0:a3b41ab8433b 178 }
kenjiArai 0:a3b41ab8433b 179
kenjiArai 0:a3b41ab8433b 180 /////////////// Initialize ////////////////////////////////
kenjiArai 0:a3b41ab8433b 181 void INA219::initialize()
kenjiArai 0:a3b41ab8433b 182 {
kenjiArai 0:a3b41ab8433b 183 uint16_t data = 0;
kenjiArai 2:088b8d5de7e9 184 data = (ina219_set_data.v_max & 0x01) << 13;
kenjiArai 2:088b8d5de7e9 185 data |= (ina219_set_data.gain & 0x03) << 11;
kenjiArai 2:088b8d5de7e9 186 data |= (ina219_set_data.bus_adc_resolution & 0x0f) << 6;
kenjiArai 2:088b8d5de7e9 187 data |= (ina219_set_data.Shunt_adc_resolution & 0x0f) << 3;
kenjiArai 2:088b8d5de7e9 188 data |= (ina219_set_data.mode & 0x07);
kenjiArai 0:a3b41ab8433b 189 dt[0] = INA219_CONFIG;
kenjiArai 0:a3b41ab8433b 190 dt[1] = data >> 8; // MSB 1st
kenjiArai 0:a3b41ab8433b 191 dt[2] = data & 0xff; // LSB 2nd
kenjiArai 0:a3b41ab8433b 192 _i2c.write((int)ina219_set_data.addr, (char *)dt, 3, false);
kenjiArai 0:a3b41ab8433b 193 dt[0] = INA219_CALBLATION;
kenjiArai 0:a3b41ab8433b 194 dt[1] = ina219_set_data.calibration_data >> 8; // MSB 1st
kenjiArai 0:a3b41ab8433b 195 dt[2] = ina219_set_data.calibration_data & 0xff; // LSB 2nd
kenjiArai 0:a3b41ab8433b 196 _i2c.write((int)ina219_set_data.addr, (char *)dt, 3, false);
kenjiArai 0:a3b41ab8433b 197 scale_factor = 0;
kenjiArai 0:a3b41ab8433b 198 }
kenjiArai 0:a3b41ab8433b 199
kenjiArai 0:a3b41ab8433b 200 /////////////// I2C Freq. /////////////////////////////////
kenjiArai 0:a3b41ab8433b 201 void INA219::frequency(int hz)
kenjiArai 0:a3b41ab8433b 202 {
kenjiArai 0:a3b41ab8433b 203 _i2c.frequency(hz);
kenjiArai 0:a3b41ab8433b 204 }
kenjiArai 3:8c444591d7f2 205
kenjiArai 3:8c444591d7f2 206