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

Committer:
kenjiArai
Date:
Tue May 05 07:54:46 2015 +0000
Revision:
0:d17469a618b3
Child:
1:91ce58cd3489
INA226 (Texas Instruments) High-or Low-Side Measurement,Bi-Directional CURRENT/POWER MONITOR with I2C Interface

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 0:d17469a618b3 6 * Copyright (c) 2015 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 0:d17469a618b3 9 * Created: January 25th, 2015
kenjiArai 0:d17469a618b3 10 * Revised: May 5th, 2015
kenjiArai 0:d17469a618b3 11 *
kenjiArai 0:d17469a618b3 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 0:d17469a618b3 13 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 0:d17469a618b3 14 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 0:d17469a618b3 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 0:d17469a618b3 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 0:d17469a618b3 17 */
kenjiArai 0:d17469a618b3 18
kenjiArai 0:d17469a618b3 19 #include "mbed.h"
kenjiArai 0:d17469a618b3 20 #include "INA226.h"
kenjiArai 0:d17469a618b3 21
kenjiArai 0:d17469a618b3 22 INA226::INA226 (PinName p_sda, PinName p_scl, const INA226_TypeDef *ina226_parameter) :
kenjiArai 0:d17469a618b3 23 _i2c(p_sda, p_scl)
kenjiArai 0:d17469a618b3 24 {
kenjiArai 0:d17469a618b3 25 _i2c.frequency(400000);
kenjiArai 0:d17469a618b3 26 ina226_set_data = *ina226_parameter;
kenjiArai 0:d17469a618b3 27 initialize();
kenjiArai 0:d17469a618b3 28 }
kenjiArai 0:d17469a618b3 29
kenjiArai 0:d17469a618b3 30 INA226::INA226 (PinName p_sda, PinName p_scl, uint8_t addr) :
kenjiArai 0:d17469a618b3 31 _i2c(p_sda, p_scl)
kenjiArai 0:d17469a618b3 32 {
kenjiArai 0:d17469a618b3 33 _i2c.frequency(400000);
kenjiArai 0:d17469a618b3 34 // Use standard setting
kenjiArai 0:d17469a618b3 35 ina226_set_data = ina226_std_paramtr;
kenjiArai 0:d17469a618b3 36 // Change user defined address
kenjiArai 0:d17469a618b3 37 ina226_set_data.addr = addr;
kenjiArai 0:d17469a618b3 38 initialize();
kenjiArai 0:d17469a618b3 39 }
kenjiArai 0:d17469a618b3 40
kenjiArai 0:d17469a618b3 41 INA226::INA226 (PinName p_sda, PinName p_scl) :
kenjiArai 0:d17469a618b3 42 _i2c(p_sda, p_scl)
kenjiArai 0:d17469a618b3 43 {
kenjiArai 0:d17469a618b3 44 _i2c.frequency(400000);
kenjiArai 0:d17469a618b3 45 // Use standard setting
kenjiArai 0:d17469a618b3 46 ina226_set_data = ina226_std_paramtr;
kenjiArai 0:d17469a618b3 47 initialize();
kenjiArai 0:d17469a618b3 48 }
kenjiArai 0:d17469a618b3 49
kenjiArai 0:d17469a618b3 50 INA226::INA226 (I2C& p_i2c, const INA226_TypeDef *ina226_parameter) : _i2c(p_i2c)
kenjiArai 0:d17469a618b3 51 {
kenjiArai 0:d17469a618b3 52 _i2c.frequency(400000);
kenjiArai 0:d17469a618b3 53 ina226_set_data = *ina226_parameter;
kenjiArai 0:d17469a618b3 54 initialize();
kenjiArai 0:d17469a618b3 55 }
kenjiArai 0:d17469a618b3 56
kenjiArai 0:d17469a618b3 57 INA226::INA226 (I2C& p_i2c, uint8_t addr) : _i2c(p_i2c)
kenjiArai 0:d17469a618b3 58 {
kenjiArai 0:d17469a618b3 59 _i2c.frequency(400000);
kenjiArai 0:d17469a618b3 60 // Use standard setting
kenjiArai 0:d17469a618b3 61 ina226_set_data = ina226_std_paramtr;
kenjiArai 0:d17469a618b3 62 // Change user defined address
kenjiArai 0:d17469a618b3 63 ina226_set_data.addr = addr;
kenjiArai 0:d17469a618b3 64 initialize();
kenjiArai 0:d17469a618b3 65 }
kenjiArai 0:d17469a618b3 66
kenjiArai 0:d17469a618b3 67 INA226::INA226 (I2C& p_i2c) : _i2c(p_i2c)
kenjiArai 0:d17469a618b3 68 {
kenjiArai 0:d17469a618b3 69 _i2c.frequency(400000);
kenjiArai 0:d17469a618b3 70 // Use standard setting
kenjiArai 0:d17469a618b3 71 ina226_set_data = ina226_std_paramtr;
kenjiArai 0:d17469a618b3 72 initialize();
kenjiArai 0:d17469a618b3 73 }
kenjiArai 0:d17469a618b3 74
kenjiArai 0:d17469a618b3 75 /////////////// Read Current //////////////////////////////
kenjiArai 0:d17469a618b3 76 float INA226::read_current()
kenjiArai 0:d17469a618b3 77 {
kenjiArai 0:d17469a618b3 78 dt[0] = INA226_CURRENT;
kenjiArai 0:d17469a618b3 79 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 80 _i2c.read((int)ina226_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:d17469a618b3 81 int16_t data = (dt[0] << 8) | dt[1];
kenjiArai 0:d17469a618b3 82 return (float)data /1000;
kenjiArai 0:d17469a618b3 83 }
kenjiArai 0:d17469a618b3 84
kenjiArai 0:d17469a618b3 85 /////////////// Read Power ////////////////////////////////
kenjiArai 0:d17469a618b3 86 float INA226::read_power()
kenjiArai 0:d17469a618b3 87 {
kenjiArai 0:d17469a618b3 88 dt[0] = INA226_POWER;
kenjiArai 0:d17469a618b3 89 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 90 _i2c.read((int)ina226_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:d17469a618b3 91 int16_t data = (dt[0] << 8) | dt[1];
kenjiArai 0:d17469a618b3 92 return (float)data * 25 / 1000;
kenjiArai 0:d17469a618b3 93 }
kenjiArai 0:d17469a618b3 94
kenjiArai 0:d17469a618b3 95 /////////////// Read Bus_volt /////////////////////////////
kenjiArai 0:d17469a618b3 96 float INA226::read_bus_voltage()
kenjiArai 0:d17469a618b3 97 {
kenjiArai 0:d17469a618b3 98 dt[0] = INA226_BUS_VOLT;
kenjiArai 0:d17469a618b3 99 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 100 _i2c.read((int)ina226_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:d17469a618b3 101 int16_t data = (dt[0] << 8) | dt[1];
kenjiArai 0:d17469a618b3 102 return (float)data * 1.25 / 1000;
kenjiArai 0:d17469a618b3 103 }
kenjiArai 0:d17469a618b3 104
kenjiArai 0:d17469a618b3 105 /////////////// Read Shunt volt ///////////////////////////
kenjiArai 0:d17469a618b3 106 float INA226::read_shunt_voltage()
kenjiArai 0:d17469a618b3 107 {
kenjiArai 0:d17469a618b3 108 dt[0] = INA226_SHUNT_V;
kenjiArai 0:d17469a618b3 109 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 110 _i2c.read((int)ina226_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:d17469a618b3 111 int16_t data = (dt[0] << 8) | dt[1];
kenjiArai 0:d17469a618b3 112 return (float)data * 2.5 / 1000;
kenjiArai 0:d17469a618b3 113 }
kenjiArai 0:d17469a618b3 114
kenjiArai 0:d17469a618b3 115 float INA226::read_current_by_shuntvolt()
kenjiArai 0:d17469a618b3 116 {
kenjiArai 0:d17469a618b3 117 dt[0] = INA226_SHUNT_V;
kenjiArai 0:d17469a618b3 118 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 119 _i2c.read((int)ina226_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:d17469a618b3 120 int16_t data = (dt[0] << 8) | dt[1];
kenjiArai 0:d17469a618b3 121 return (float)data / 10;
kenjiArai 0:d17469a618b3 122 // return ((float)data / ina226_set_data.shunt_register) / 1000;
kenjiArai 0:d17469a618b3 123 }
kenjiArai 0:d17469a618b3 124
kenjiArai 0:d17469a618b3 125 /////////////// Read configulation ////////////////////////
kenjiArai 0:d17469a618b3 126 uint16_t INA226::read_config()
kenjiArai 0:d17469a618b3 127 {
kenjiArai 0:d17469a618b3 128 dt[0] = INA226_CONFIG;
kenjiArai 0:d17469a618b3 129 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 130 _i2c.read((int)ina226_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:d17469a618b3 131 uint16_t data = (dt[0] << 8) | dt[1];
kenjiArai 0:d17469a618b3 132 return data;
kenjiArai 0:d17469a618b3 133 }
kenjiArai 0:d17469a618b3 134
kenjiArai 0:d17469a618b3 135 /////////////// Set configulation /////////////////////////
kenjiArai 0:d17469a618b3 136 uint16_t INA226::set_config(uint16_t cfg)
kenjiArai 0:d17469a618b3 137 {
kenjiArai 0:d17469a618b3 138 uint16_t data = cfg;
kenjiArai 0:d17469a618b3 139 dt[0] = INA226_CONFIG;
kenjiArai 0:d17469a618b3 140 dt[1] = data >> 8; // MSB 1st
kenjiArai 0:d17469a618b3 141 dt[2] = data & 0xff; // LSB 2nd
kenjiArai 0:d17469a618b3 142 _i2c.write((int)ina226_set_data.addr, (char *)dt, 3, false);
kenjiArai 0:d17469a618b3 143 return data;
kenjiArai 0:d17469a618b3 144 }
kenjiArai 0:d17469a618b3 145
kenjiArai 0:d17469a618b3 146 /////////////// Read Calibration reg. /////////////////////
kenjiArai 0:d17469a618b3 147 uint16_t INA226::read_calb(void)
kenjiArai 0:d17469a618b3 148 {
kenjiArai 0:d17469a618b3 149 dt[0] = INA226_CALBLATION;
kenjiArai 0:d17469a618b3 150 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 151 _i2c.read((int)ina226_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:d17469a618b3 152 uint16_t data = (dt[0] << 8) | dt[1];
kenjiArai 0:d17469a618b3 153 return data;
kenjiArai 0:d17469a618b3 154 }
kenjiArai 0:d17469a618b3 155
kenjiArai 0:d17469a618b3 156 /////////////// Set Calibration reg. //////////////////////
kenjiArai 0:d17469a618b3 157 uint16_t INA226::set_calb(uint16_t clb)
kenjiArai 0:d17469a618b3 158 {
kenjiArai 0:d17469a618b3 159 uint16_t data = clb;
kenjiArai 0:d17469a618b3 160 dt[0] = INA226_CALBLATION;
kenjiArai 0:d17469a618b3 161 dt[1] = data >> 8; // MSB 1st
kenjiArai 0:d17469a618b3 162 dt[2] = data & 0xff; // LSB 2nd
kenjiArai 0:d17469a618b3 163 _i2c.write((int)ina226_set_data.addr, (char *)dt, 3, false);
kenjiArai 0:d17469a618b3 164 return data;
kenjiArai 0:d17469a618b3 165 }
kenjiArai 0:d17469a618b3 166
kenjiArai 0:d17469a618b3 167 /////////////// Read Mask/Enable reg. /////////////////////
kenjiArai 0:d17469a618b3 168 uint16_t INA226::read_msk_enbl(void)
kenjiArai 0:d17469a618b3 169 {
kenjiArai 0:d17469a618b3 170 dt[0] = INA226_MASK_EN;
kenjiArai 0:d17469a618b3 171 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 172 _i2c.read((int)ina226_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:d17469a618b3 173 uint16_t data = (dt[0] << 8) | dt[1];
kenjiArai 0:d17469a618b3 174 return data;
kenjiArai 0:d17469a618b3 175 }
kenjiArai 0:d17469a618b3 176
kenjiArai 0:d17469a618b3 177 /////////////// Set Mask/Enable reg. /////////////////////
kenjiArai 0:d17469a618b3 178 uint16_t set_msk_enbl(uint16_t msk_enable)
kenjiArai 0:d17469a618b3 179 {
kenjiArai 0:d17469a618b3 180 uint16_t data = msk_enable;
kenjiArai 0:d17469a618b3 181 dt[0] = INA226_MASK_EN;
kenjiArai 0:d17469a618b3 182 dt[1] = data >> 8; // MSB 1st
kenjiArai 0:d17469a618b3 183 dt[2] = data & 0xff; // LSB 2nd
kenjiArai 0:d17469a618b3 184 _i2c.write((int)ina226_set_data.addr, (char *)dt, 3, false);
kenjiArai 0:d17469a618b3 185 return data;
kenjiArai 0:d17469a618b3 186 }
kenjiArai 0:d17469a618b3 187
kenjiArai 0:d17469a618b3 188 uint8_t INA226::read_ID()
kenjiArai 0:d17469a618b3 189 {
kenjiArai 0:d17469a618b3 190 dt[0] = INA226_DIE_ID;
kenjiArai 0:d17469a618b3 191 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 192 _i2c.read((int)ina226_set_data.addr, (char *)dt, 1, false);
kenjiArai 0:d17469a618b3 193 id_number = dt[0];
kenjiArai 0:d17469a618b3 194 return id_number;
kenjiArai 0:d17469a618b3 195 }
kenjiArai 0:d17469a618b3 196
kenjiArai 0:d17469a618b3 197 /////////////// Read/Write specific register //////////////
kenjiArai 0:d17469a618b3 198 uint8_t INA226::read_reg(uint8_t addr)
kenjiArai 0:d17469a618b3 199 {
kenjiArai 0:d17469a618b3 200 dt[0] = addr;
kenjiArai 0:d17469a618b3 201 _i2c.write((int)ina226_set_data.addr, (char *)dt, 1, true);
kenjiArai 0:d17469a618b3 202 _i2c.read((int)ina226_set_data.addr, (char *)dt, 1, false);
kenjiArai 0:d17469a618b3 203 return dt[0];
kenjiArai 0:d17469a618b3 204 }
kenjiArai 0:d17469a618b3 205
kenjiArai 0:d17469a618b3 206 uint8_t INA226::write_reg(uint8_t addr, uint8_t data)
kenjiArai 0:d17469a618b3 207 {
kenjiArai 0:d17469a618b3 208 dt[0] = addr;
kenjiArai 0:d17469a618b3 209 dt[1] = data;
kenjiArai 0:d17469a618b3 210 _i2c.write((int)ina226_set_data.addr, (char *)dt, 2, false);
kenjiArai 0:d17469a618b3 211 return dt[1];
kenjiArai 0:d17469a618b3 212 }
kenjiArai 0:d17469a618b3 213
kenjiArai 0:d17469a618b3 214 /////////////// Initialize ////////////////////////////////
kenjiArai 0:d17469a618b3 215 void INA226::initialize()
kenjiArai 0:d17469a618b3 216 {
kenjiArai 0:d17469a618b3 217 uint16_t data = 0;
kenjiArai 0:d17469a618b3 218 data = (ina226_set_data.average & 0x07) << 9;
kenjiArai 0:d17469a618b3 219 data |= (ina226_set_data.b_volt_cnv_time & 0x07) << 6;
kenjiArai 0:d17469a618b3 220 data |= (ina226_set_data.s_volt_cnv_time & 0x07) << 3;
kenjiArai 0:d17469a618b3 221 data |= (ina226_set_data.mode & 0x07);
kenjiArai 0:d17469a618b3 222 dt[0] = INA226_CONFIG;
kenjiArai 0:d17469a618b3 223 dt[1] = data >> 8; // MSB 1st
kenjiArai 0:d17469a618b3 224 dt[2] = data & 0xff; // LSB 2nd
kenjiArai 0:d17469a618b3 225 _i2c.write((int)ina226_set_data.addr, (char *)dt, 3, false);
kenjiArai 0:d17469a618b3 226 dt[0] = INA226_CALBLATION;
kenjiArai 0:d17469a618b3 227 dt[1] = ina226_set_data.calibration_data >> 8; // MSB 1st
kenjiArai 0:d17469a618b3 228 dt[2] = ina226_set_data.calibration_data & 0xff; // LSB 2nd
kenjiArai 0:d17469a618b3 229 _i2c.write((int)ina226_set_data.addr, (char *)dt, 3, false);
kenjiArai 0:d17469a618b3 230 scale_factor = 0;
kenjiArai 0:d17469a618b3 231 read_ID();
kenjiArai 0:d17469a618b3 232 }
kenjiArai 0:d17469a618b3 233
kenjiArai 0:d17469a618b3 234 /////////////// I2C Freq. /////////////////////////////////
kenjiArai 0:d17469a618b3 235 void INA226::frequency(int hz)
kenjiArai 0:d17469a618b3 236 {
kenjiArai 0:d17469a618b3 237 _i2c.frequency(hz);
kenjiArai 0:d17469a618b3 238 }