INA219 (Texas Instruments) High-Side Measurement,Bi-Directional CURRENT/POWER MONITOR with I2C Interface
INA219.cpp@3:8c444591d7f2, 2017-08-23 (annotated)
- 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?
User | Revision | Line number | New 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 |