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

Committer:
kenjiArai
Date:
Wed Aug 23 09:25:12 2017 +0000
Revision:
3:d4affcc81306
Parent:
2:b1e759cb121e
countermeasure for  NonCopyable

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:d17469a618b3 1 /*
kenjiArai 0:d17469a618b3 2 * mbed library program
kenjiArai 0:d17469a618b3 3 * INA226 High-or Low-Side Measurement,Bi-Directional CURRENT/POWER MONITOR with I2C Interface
kenjiArai 0:d17469a618b3 4 * by Texas Instruments
kenjiArai 0:d17469a618b3 5 *
kenjiArai 3:d4affcc81306 6 * Copyright (c) 2015,'17 Kenji Arai / JH1PJL
kenjiArai 0:d17469a618b3 7 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:d17469a618b3 8 * http://mbed.org/users/kenjiArai/
kenjiArai 3:d4affcc81306 9 * Created: January 25th, 2015
kenjiArai 3:d4affcc81306 10 * Revised: August 23rd, 2017
kenjiArai 0:d17469a618b3 11 */
kenjiArai 0:d17469a618b3 12
kenjiArai 0:d17469a618b3 13 #include "mbed.h"
kenjiArai 0:d17469a618b3 14 #include "INA226.h"
kenjiArai 0:d17469a618b3 15
kenjiArai 3:d4affcc81306 16 INA226::INA226 (PinName p_sda, PinName p_scl, const INA226_TypeDef *ina226_parameter)
kenjiArai 3:d4affcc81306 17 : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
kenjiArai 0:d17469a618b3 18 {
kenjiArai 0:d17469a618b3 19 _i2c.frequency(400000);
kenjiArai 0:d17469a618b3 20 ina226_set_data = *ina226_parameter;
kenjiArai 0:d17469a618b3 21 initialize();
kenjiArai 0:d17469a618b3 22 }
kenjiArai 0:d17469a618b3 23
kenjiArai 3:d4affcc81306 24 INA226::INA226 (PinName p_sda, PinName p_scl, uint8_t addr)
kenjiArai 3:d4affcc81306 25 : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
kenjiArai 0:d17469a618b3 26 {
kenjiArai 0:d17469a618b3 27 _i2c.frequency(400000);
kenjiArai 0:d17469a618b3 28 // Use standard setting
kenjiArai 0:d17469a618b3 29 ina226_set_data = ina226_std_paramtr;
kenjiArai 0:d17469a618b3 30 // Change user defined address
kenjiArai 0:d17469a618b3 31 ina226_set_data.addr = addr;
kenjiArai 0:d17469a618b3 32 initialize();
kenjiArai 0:d17469a618b3 33 }
kenjiArai 0:d17469a618b3 34
kenjiArai 3:d4affcc81306 35 INA226::INA226 (PinName p_sda, PinName p_scl)
kenjiArai 3:d4affcc81306 36 : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
kenjiArai 0:d17469a618b3 37 {
kenjiArai 0:d17469a618b3 38 _i2c.frequency(400000);
kenjiArai 0:d17469a618b3 39 // Use standard setting
kenjiArai 0:d17469a618b3 40 ina226_set_data = ina226_std_paramtr;
kenjiArai 0:d17469a618b3 41 initialize();
kenjiArai 0:d17469a618b3 42 }
kenjiArai 0:d17469a618b3 43
kenjiArai 3:d4affcc81306 44 INA226::INA226 (I2C& p_i2c, const INA226_TypeDef *ina226_parameter)
kenjiArai 3:d4affcc81306 45 : _i2c(p_i2c)
kenjiArai 0:d17469a618b3 46 {
kenjiArai 0:d17469a618b3 47 _i2c.frequency(400000);
kenjiArai 0:d17469a618b3 48 ina226_set_data = *ina226_parameter;
kenjiArai 0:d17469a618b3 49 initialize();
kenjiArai 0:d17469a618b3 50 }
kenjiArai 0:d17469a618b3 51
kenjiArai 3:d4affcc81306 52 INA226::INA226 (I2C& p_i2c, uint8_t addr)
kenjiArai 3:d4affcc81306 53 : _i2c(p_i2c)
kenjiArai 0:d17469a618b3 54 {
kenjiArai 0:d17469a618b3 55 _i2c.frequency(400000);
kenjiArai 0:d17469a618b3 56 // Use standard setting
kenjiArai 0:d17469a618b3 57 ina226_set_data = ina226_std_paramtr;
kenjiArai 0:d17469a618b3 58 // Change user defined address
kenjiArai 0:d17469a618b3 59 ina226_set_data.addr = addr;
kenjiArai 0:d17469a618b3 60 initialize();
kenjiArai 0:d17469a618b3 61 }
kenjiArai 0:d17469a618b3 62
kenjiArai 3:d4affcc81306 63 INA226::INA226 (I2C& p_i2c)
kenjiArai 3:d4affcc81306 64 : _i2c(p_i2c)
kenjiArai 0:d17469a618b3 65 {
kenjiArai 0:d17469a618b3 66 _i2c.frequency(400000);
kenjiArai 0:d17469a618b3 67 // Use standard setting
kenjiArai 0:d17469a618b3 68 ina226_set_data = ina226_std_paramtr;
kenjiArai 0:d17469a618b3 69 initialize();
kenjiArai 0:d17469a618b3 70 }
kenjiArai 0:d17469a618b3 71
kenjiArai 0:d17469a618b3 72 /////////////// Read Current //////////////////////////////
kenjiArai 0:d17469a618b3 73 float INA226::read_current()
kenjiArai 0:d17469a618b3 74 {
kenjiArai 0:d17469a618b3 75 dt[0] = INA226_CURRENT;
kenjiArai 0:d17469a618b3 76 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 77 _i2c.read((int)ina226_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:d17469a618b3 78 int16_t data = (dt[0] << 8) | dt[1];
kenjiArai 0:d17469a618b3 79 return (float)data /1000;
kenjiArai 0:d17469a618b3 80 }
kenjiArai 0:d17469a618b3 81
kenjiArai 0:d17469a618b3 82 /////////////// Read Power ////////////////////////////////
kenjiArai 0:d17469a618b3 83 float INA226::read_power()
kenjiArai 0:d17469a618b3 84 {
kenjiArai 0:d17469a618b3 85 dt[0] = INA226_POWER;
kenjiArai 0:d17469a618b3 86 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 87 _i2c.read((int)ina226_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:d17469a618b3 88 int16_t data = (dt[0] << 8) | dt[1];
kenjiArai 0:d17469a618b3 89 return (float)data * 25 / 1000;
kenjiArai 0:d17469a618b3 90 }
kenjiArai 0:d17469a618b3 91
kenjiArai 0:d17469a618b3 92 /////////////// Read Bus_volt /////////////////////////////
kenjiArai 0:d17469a618b3 93 float INA226::read_bus_voltage()
kenjiArai 0:d17469a618b3 94 {
kenjiArai 0:d17469a618b3 95 dt[0] = INA226_BUS_VOLT;
kenjiArai 0:d17469a618b3 96 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 97 _i2c.read((int)ina226_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:d17469a618b3 98 int16_t data = (dt[0] << 8) | dt[1];
kenjiArai 3:d4affcc81306 99 return (float)data * 1.25f / 1000.0f;
kenjiArai 0:d17469a618b3 100 }
kenjiArai 0:d17469a618b3 101
kenjiArai 0:d17469a618b3 102 /////////////// Read Shunt volt ///////////////////////////
kenjiArai 0:d17469a618b3 103 float INA226::read_shunt_voltage()
kenjiArai 0:d17469a618b3 104 {
kenjiArai 0:d17469a618b3 105 dt[0] = INA226_SHUNT_V;
kenjiArai 0:d17469a618b3 106 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 107 _i2c.read((int)ina226_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:d17469a618b3 108 int16_t data = (dt[0] << 8) | dt[1];
kenjiArai 3:d4affcc81306 109 return (float)data * 2.5f / 1000.0f;
kenjiArai 0:d17469a618b3 110 }
kenjiArai 0:d17469a618b3 111
kenjiArai 0:d17469a618b3 112 float INA226::read_current_by_shuntvolt()
kenjiArai 0:d17469a618b3 113 {
kenjiArai 0:d17469a618b3 114 dt[0] = INA226_SHUNT_V;
kenjiArai 0:d17469a618b3 115 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 116 _i2c.read((int)ina226_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:d17469a618b3 117 int16_t data = (dt[0] << 8) | dt[1];
kenjiArai 0:d17469a618b3 118 return (float)data / 10;
kenjiArai 0:d17469a618b3 119 // return ((float)data / ina226_set_data.shunt_register) / 1000;
kenjiArai 0:d17469a618b3 120 }
kenjiArai 0:d17469a618b3 121
kenjiArai 2:b1e759cb121e 122 int16_t INA226::read_shunt_raw_voltage()
kenjiArai 2:b1e759cb121e 123 {
kenjiArai 2:b1e759cb121e 124 dt[0] = INA226_SHUNT_V;
kenjiArai 2:b1e759cb121e 125 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 2:b1e759cb121e 126 _i2c.read((int)ina226_set_data.addr, (char *)dt, 2, false);
kenjiArai 2:b1e759cb121e 127 int16_t data = (dt[0] << 8) | dt[1];
kenjiArai 2:b1e759cb121e 128 return data;
kenjiArai 2:b1e759cb121e 129 }
kenjiArai 2:b1e759cb121e 130
kenjiArai 0:d17469a618b3 131 /////////////// Read configulation ////////////////////////
kenjiArai 0:d17469a618b3 132 uint16_t INA226::read_config()
kenjiArai 0:d17469a618b3 133 {
kenjiArai 0:d17469a618b3 134 dt[0] = INA226_CONFIG;
kenjiArai 0:d17469a618b3 135 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 136 _i2c.read((int)ina226_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:d17469a618b3 137 uint16_t data = (dt[0] << 8) | dt[1];
kenjiArai 0:d17469a618b3 138 return data;
kenjiArai 0:d17469a618b3 139 }
kenjiArai 0:d17469a618b3 140
kenjiArai 0:d17469a618b3 141 /////////////// Set configulation /////////////////////////
kenjiArai 0:d17469a618b3 142 uint16_t INA226::set_config(uint16_t cfg)
kenjiArai 0:d17469a618b3 143 {
kenjiArai 0:d17469a618b3 144 uint16_t data = cfg;
kenjiArai 0:d17469a618b3 145 dt[0] = INA226_CONFIG;
kenjiArai 0:d17469a618b3 146 dt[1] = data >> 8; // MSB 1st
kenjiArai 0:d17469a618b3 147 dt[2] = data & 0xff; // LSB 2nd
kenjiArai 0:d17469a618b3 148 _i2c.write((int)ina226_set_data.addr, (char *)dt, 3, false);
kenjiArai 0:d17469a618b3 149 return data;
kenjiArai 0:d17469a618b3 150 }
kenjiArai 0:d17469a618b3 151
kenjiArai 0:d17469a618b3 152 /////////////// Read Calibration reg. /////////////////////
kenjiArai 0:d17469a618b3 153 uint16_t INA226::read_calb(void)
kenjiArai 0:d17469a618b3 154 {
kenjiArai 0:d17469a618b3 155 dt[0] = INA226_CALBLATION;
kenjiArai 0:d17469a618b3 156 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 157 _i2c.read((int)ina226_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:d17469a618b3 158 uint16_t data = (dt[0] << 8) | dt[1];
kenjiArai 0:d17469a618b3 159 return data;
kenjiArai 0:d17469a618b3 160 }
kenjiArai 0:d17469a618b3 161
kenjiArai 0:d17469a618b3 162 /////////////// Set Calibration reg. //////////////////////
kenjiArai 0:d17469a618b3 163 uint16_t INA226::set_calb(uint16_t clb)
kenjiArai 0:d17469a618b3 164 {
kenjiArai 0:d17469a618b3 165 uint16_t data = clb;
kenjiArai 0:d17469a618b3 166 dt[0] = INA226_CALBLATION;
kenjiArai 0:d17469a618b3 167 dt[1] = data >> 8; // MSB 1st
kenjiArai 0:d17469a618b3 168 dt[2] = data & 0xff; // LSB 2nd
kenjiArai 0:d17469a618b3 169 _i2c.write((int)ina226_set_data.addr, (char *)dt, 3, false);
kenjiArai 0:d17469a618b3 170 return data;
kenjiArai 0:d17469a618b3 171 }
kenjiArai 0:d17469a618b3 172
kenjiArai 0:d17469a618b3 173 /////////////// Read Mask/Enable reg. /////////////////////
kenjiArai 0:d17469a618b3 174 uint16_t INA226::read_msk_enbl(void)
kenjiArai 0:d17469a618b3 175 {
kenjiArai 0:d17469a618b3 176 dt[0] = INA226_MASK_EN;
kenjiArai 0:d17469a618b3 177 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 178 _i2c.read((int)ina226_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:d17469a618b3 179 uint16_t data = (dt[0] << 8) | dt[1];
kenjiArai 0:d17469a618b3 180 return data;
kenjiArai 0:d17469a618b3 181 }
kenjiArai 0:d17469a618b3 182
kenjiArai 0:d17469a618b3 183 /////////////// Set Mask/Enable reg. /////////////////////
kenjiArai 1:91ce58cd3489 184 uint16_t INA226::set_msk_enbl(uint16_t msk_enable)
kenjiArai 0:d17469a618b3 185 {
kenjiArai 0:d17469a618b3 186 uint16_t data = msk_enable;
kenjiArai 0:d17469a618b3 187 dt[0] = INA226_MASK_EN;
kenjiArai 0:d17469a618b3 188 dt[1] = data >> 8; // MSB 1st
kenjiArai 0:d17469a618b3 189 dt[2] = data & 0xff; // LSB 2nd
kenjiArai 0:d17469a618b3 190 _i2c.write((int)ina226_set_data.addr, (char *)dt, 3, false);
kenjiArai 0:d17469a618b3 191 return data;
kenjiArai 0:d17469a618b3 192 }
kenjiArai 0:d17469a618b3 193
kenjiArai 0:d17469a618b3 194 uint8_t INA226::read_ID()
kenjiArai 0:d17469a618b3 195 {
kenjiArai 0:d17469a618b3 196 dt[0] = INA226_DIE_ID;
kenjiArai 0:d17469a618b3 197 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 198 _i2c.read((int)ina226_set_data.addr, (char *)dt, 1, false);
kenjiArai 0:d17469a618b3 199 id_number = dt[0];
kenjiArai 0:d17469a618b3 200 return id_number;
kenjiArai 0:d17469a618b3 201 }
kenjiArai 0:d17469a618b3 202
kenjiArai 0:d17469a618b3 203 /////////////// Read/Write specific register //////////////
kenjiArai 0:d17469a618b3 204 uint8_t INA226::read_reg(uint8_t addr)
kenjiArai 0:d17469a618b3 205 {
kenjiArai 0:d17469a618b3 206 dt[0] = addr;
kenjiArai 0:d17469a618b3 207 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 208 _i2c.read((int)ina226_set_data.addr, (char *)dt, 1, false);
kenjiArai 0:d17469a618b3 209 return dt[0];
kenjiArai 0:d17469a618b3 210 }
kenjiArai 0:d17469a618b3 211
kenjiArai 0:d17469a618b3 212 uint8_t INA226::write_reg(uint8_t addr, uint8_t data)
kenjiArai 0:d17469a618b3 213 {
kenjiArai 0:d17469a618b3 214 dt[0] = addr;
kenjiArai 0:d17469a618b3 215 dt[1] = data;
kenjiArai 0:d17469a618b3 216 _i2c.write((int)ina226_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:d17469a618b3 217 return dt[1];
kenjiArai 0:d17469a618b3 218 }
kenjiArai 0:d17469a618b3 219
kenjiArai 0:d17469a618b3 220 /////////////// Initialize ////////////////////////////////
kenjiArai 0:d17469a618b3 221 void INA226::initialize()
kenjiArai 0:d17469a618b3 222 {
kenjiArai 0:d17469a618b3 223 uint16_t data = 0;
kenjiArai 0:d17469a618b3 224 data = (ina226_set_data.average & 0x07) << 9;
kenjiArai 0:d17469a618b3 225 data |= (ina226_set_data.b_volt_cnv_time & 0x07) << 6;
kenjiArai 0:d17469a618b3 226 data |= (ina226_set_data.s_volt_cnv_time & 0x07) << 3;
kenjiArai 0:d17469a618b3 227 data |= (ina226_set_data.mode & 0x07);
kenjiArai 0:d17469a618b3 228 dt[0] = INA226_CONFIG;
kenjiArai 0:d17469a618b3 229 dt[1] = data >> 8; // MSB 1st
kenjiArai 0:d17469a618b3 230 dt[2] = data & 0xff; // LSB 2nd
kenjiArai 0:d17469a618b3 231 _i2c.write((int)ina226_set_data.addr, (char *)dt, 3, false);
kenjiArai 0:d17469a618b3 232 dt[0] = INA226_CALBLATION;
kenjiArai 0:d17469a618b3 233 dt[1] = ina226_set_data.calibration_data >> 8; // MSB 1st
kenjiArai 0:d17469a618b3 234 dt[2] = ina226_set_data.calibration_data & 0xff; // LSB 2nd
kenjiArai 0:d17469a618b3 235 _i2c.write((int)ina226_set_data.addr, (char *)dt, 3, false);
kenjiArai 0:d17469a618b3 236 scale_factor = 0;
kenjiArai 0:d17469a618b3 237 read_ID();
kenjiArai 0:d17469a618b3 238 }
kenjiArai 0:d17469a618b3 239
kenjiArai 0:d17469a618b3 240 /////////////// I2C Freq. /////////////////////////////////
kenjiArai 0:d17469a618b3 241 void INA226::frequency(int hz)
kenjiArai 0:d17469a618b3 242 {
kenjiArai 0:d17469a618b3 243 _i2c.frequency(hz);
kenjiArai 0:d17469a618b3 244 }
kenjiArai 3:d4affcc81306 245