Kenji Arai / INA219

Dependents:   BratRobot

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers INA219.cpp Source File

INA219.cpp

00001 /*
00002  * mbed library program
00003  *  INA219 High-Side Measurement,Bi-Directional CURRENT/POWER MONITOR with I2C Interface
00004  *  by Texas Instruments
00005  *
00006  * Copyright (c) 2015,'17 Kenji Arai / JH1PJL
00007  *  http://www.page.sannet.ne.jp/kenjia/index.html
00008  *  http://mbed.org/users/kenjiArai/
00009  *      Created: January    25th, 2015
00010  *      Revised: August     23rd, 2017
00011  */
00012 
00013 #include    "mbed.h"
00014 #include    "INA219.h"
00015 
00016 INA219::INA219 (PinName p_sda, PinName p_scl, const INA219_TypeDef *ina219_parameter)
00017  : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
00018 {
00019     _i2c.frequency(400000);
00020     ina219_set_data = *ina219_parameter;
00021     initialize();
00022 }
00023 
00024 INA219::INA219 (PinName p_sda, PinName p_scl, uint8_t addr)
00025  : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
00026 {
00027     _i2c.frequency(400000);
00028     // Use standard setting
00029     ina219_set_data = ina219_std_paramtr;
00030     // Change user defined address
00031     ina219_set_data.addr = addr;
00032     initialize();
00033 }
00034 
00035 INA219::INA219 (PinName p_sda, PinName p_scl)
00036  : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
00037 {
00038     _i2c.frequency(400000);
00039     // Use standard setting
00040     ina219_set_data = ina219_std_paramtr;
00041     initialize();
00042 }
00043 
00044 INA219::INA219 (I2C& p_i2c, const INA219_TypeDef *ina219_parameter)
00045  : _i2c(p_i2c)
00046 {
00047     _i2c.frequency(400000);
00048     ina219_set_data = *ina219_parameter;
00049     initialize();
00050 }
00051 
00052 INA219::INA219 (I2C& p_i2c, uint8_t addr)
00053  : _i2c(p_i2c)
00054 {
00055     _i2c.frequency(400000);
00056     // Use standard setting
00057     ina219_set_data = ina219_std_paramtr;
00058     // Change user defined address
00059     ina219_set_data.addr = addr;
00060     initialize();
00061 }
00062 
00063 INA219::INA219 (I2C& p_i2c) : _i2c(p_i2c)
00064 {
00065     _i2c.frequency(400000);
00066     // Use standard setting
00067     ina219_set_data = ina219_std_paramtr;
00068     initialize();
00069 }
00070 
00071 /////////////// Read Current //////////////////////////////
00072 float INA219::read_current()
00073 {
00074     dt[0] = INA219_CURRENT;
00075     _i2c.write((int)ina219_set_data.addr, (char *)dt, 1, true);
00076     _i2c.read((int)ina219_set_data.addr, (char *)dt, 2, false);
00077     int16_t data = (dt[0] << 8) | dt[1];
00078     return (float)data * 25 /1000;
00079 }
00080 
00081 /////////////// Read Power ////////////////////////////////
00082 float INA219::read_power()
00083 {
00084     dt[0] = INA219_POWER;
00085     _i2c.write((int)ina219_set_data.addr, (char *)dt, 1, true);
00086     _i2c.read((int)ina219_set_data.addr, (char *)dt, 2, false);
00087     int16_t data = (dt[0] << 8) | dt[1];
00088     return (float)data / 2000;
00089 }
00090 
00091 /////////////// Read Bus_volt /////////////////////////////
00092 float INA219::read_bus_voltage()
00093 {
00094     dt[0] = INA219_BUS_VOLT;
00095     _i2c.write((int)ina219_set_data.addr, (char *)dt, 1, true);
00096     _i2c.read((int)ina219_set_data.addr, (char *)dt, 2, false);
00097     int16_t data = ((dt[0] << 8) | dt[1]) >> 3;
00098     return (float)data * 4 / 1000;
00099 }
00100 
00101 /////////////// Read Shunt volt ///////////////////////////
00102 float INA219::read_shunt_voltage()
00103 {
00104     dt[0] = INA219_SHUNT_V;
00105     _i2c.write((int)ina219_set_data.addr, (char *)dt, 1, true);
00106     _i2c.read((int)ina219_set_data.addr, (char *)dt, 2, false);
00107     int16_t data = (dt[0] << 8) | dt[1];
00108     return (float)data;
00109 }
00110 
00111 float INA219::read_current_by_shuntvolt()
00112 {
00113     dt[0] = INA219_SHUNT_V;
00114     _i2c.write((int)ina219_set_data.addr, (char *)dt, 1, true);
00115     _i2c.read((int)ina219_set_data.addr, (char *)dt, 2, false);
00116     int16_t data = (dt[0] << 8) | dt[1];
00117     return (float)data / 10;
00118 //    return ((float)data / ina219_set_data.shunt_register) / 1000;
00119 }
00120 
00121 /////////////// Read configulation ////////////////////////
00122 uint16_t INA219::read_config()
00123 {
00124     dt[0] = INA219_CONFIG;
00125     _i2c.write((int)ina219_set_data.addr, (char *)dt, 1, true);
00126     _i2c.read((int)ina219_set_data.addr, (char *)dt, 2, false);
00127     uint16_t data = (dt[0] << 8) | dt[1];
00128     return data;
00129 }
00130 
00131 /////////////// Set configulation /////////////////////////
00132 uint16_t INA219::set_config(uint16_t cfg)
00133 {
00134     uint16_t data = cfg;
00135     dt[0] = INA219_CONFIG;
00136     dt[1] = data >> 8;    // MSB 1st
00137     dt[2] = data & 0xff;  // LSB 2nd
00138     _i2c.write((int)ina219_set_data.addr, (char *)dt, 3, false);
00139     return data;
00140 }
00141 
00142 /////////////// Read Calibration reg. /////////////////////
00143 uint16_t INA219::read_calb(void)
00144 {
00145     dt[0] = INA219_CALBLATION;
00146     _i2c.write((int)ina219_set_data.addr, (char *)dt, 1, true);
00147     _i2c.read((int)ina219_set_data.addr, (char *)dt, 2, false);
00148     uint16_t data = (dt[0] << 8) | dt[1];
00149     return data;
00150 }
00151 
00152 /////////////// Set Calibration reg. //////////////////////
00153 uint16_t INA219::set_calb(uint16_t clb)
00154 {
00155     uint16_t data = clb;
00156     dt[0] = INA219_CALBLATION;
00157     dt[1] = data >> 8;    // MSB 1st
00158     dt[2] = data & 0xff;  // LSB 2nd
00159     _i2c.write((int)ina219_set_data.addr, (char *)dt, 3, false);
00160     return data;
00161 }
00162 
00163 /////////////// Read/Write specific register //////////////
00164 uint8_t INA219::read_reg(uint8_t addr)
00165 {
00166     dt[0] = addr;
00167     _i2c.write((int)ina219_set_data.addr, (char *)dt, 1, true);
00168     _i2c.read((int)ina219_set_data.addr, (char *)dt, 1, false);
00169     return dt[0];
00170 }
00171 
00172 uint8_t INA219::write_reg(uint8_t addr, uint8_t data)
00173 {
00174     dt[0] = addr;
00175     dt[1] = data;
00176     _i2c.write((int)ina219_set_data.addr, (char *)dt, 2, false);
00177     return dt[1];
00178 }
00179 
00180 /////////////// Initialize ////////////////////////////////
00181 void INA219::initialize()
00182 {
00183     uint16_t data = 0;
00184     data  = (ina219_set_data.v_max & 0x01) << 13;
00185     data |= (ina219_set_data.gain & 0x03) << 11;
00186     data |= (ina219_set_data.bus_adc_resolution & 0x0f) << 6;
00187     data |= (ina219_set_data.Shunt_adc_resolution & 0x0f) << 3;
00188     data |= (ina219_set_data.mode & 0x07);
00189     dt[0] = INA219_CONFIG;
00190     dt[1] = data >> 8;    // MSB 1st
00191     dt[2] = data & 0xff;  // LSB 2nd
00192     _i2c.write((int)ina219_set_data.addr, (char *)dt, 3, false);
00193     dt[0] = INA219_CALBLATION;
00194     dt[1] = ina219_set_data.calibration_data >> 8;    // MSB 1st
00195     dt[2] = ina219_set_data.calibration_data & 0xff;  // LSB 2nd
00196     _i2c.write((int)ina219_set_data.addr, (char *)dt, 3, false);
00197     scale_factor = 0;
00198 }
00199 
00200 /////////////// I2C Freq. /////////////////////////////////
00201 void INA219::frequency(int hz)
00202 {
00203     _i2c.frequency(hz);
00204 }
00205 
00206