Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
Generated on Wed Jul 13 2022 15:14:54 by
1.7.2