A compilation of some hardware sensors and their shared programming interfaces.

Committer:
mgottscho
Date:
Wed Mar 19 00:35:31 2014 +0000
Revision:
1:15396cab58d1
Parent:
0:8d34cc2ff388
Updated for most recent UtilityLib.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mgottscho 0:8d34cc2ff388 1 /* INA219.cpp
mgottscho 0:8d34cc2ff388 2 * Tested with mbed board: FRDM-KL46Z
mgottscho 0:8d34cc2ff388 3 * Author: Mark Gottscho
mgottscho 0:8d34cc2ff388 4 * mgottscho@ucla.edu
mgottscho 0:8d34cc2ff388 5 */
mgottscho 0:8d34cc2ff388 6
mgottscho 0:8d34cc2ff388 7 #include "mbed.h"
mgottscho 0:8d34cc2ff388 8 #include "I2CSensor.h"
mgottscho 0:8d34cc2ff388 9 #include "INA219.h"
mgottscho 0:8d34cc2ff388 10
mgottscho 0:8d34cc2ff388 11 INA219::INA219(PinName sda, PinName scl, int i2c_addr) :
mgottscho 0:8d34cc2ff388 12 I2CSensor(sda, scl, i2c_addr),
mgottscho 0:8d34cc2ff388 13 PeriodicSensor(0.1), //default max sampling rate of 10Hz
mgottscho 0:8d34cc2ff388 14 __bus_voltage_range_32V(true),
mgottscho 0:8d34cc2ff388 15 __shunt_amp_gain(8),
mgottscho 0:8d34cc2ff388 16 __shunt_resolution(12),
mgottscho 0:8d34cc2ff388 17 __shunt_num_samples_in_average(0),
mgottscho 0:8d34cc2ff388 18 __bus_resolution(12),
mgottscho 0:8d34cc2ff388 19 __bus_num_samples_in_average(0),
mgottscho 0:8d34cc2ff388 20 __active(true),
mgottscho 0:8d34cc2ff388 21 __measure_shunt_voltage(true),
mgottscho 0:8d34cc2ff388 22 __measure_bus_voltage(true),
mgottscho 0:8d34cc2ff388 23 __continuous_measurements(true),
mgottscho 0:8d34cc2ff388 24 __shunt_voltage(0),
mgottscho 0:8d34cc2ff388 25 __bus_voltage(0),
mgottscho 0:8d34cc2ff388 26 __power(0),
mgottscho 0:8d34cc2ff388 27 __shunt_current(0),
mgottscho 0:8d34cc2ff388 28 __calibration(0),
mgottscho 0:8d34cc2ff388 29 __current_div(1),
mgottscho 0:8d34cc2ff388 30 __power_div(1)
mgottscho 0:8d34cc2ff388 31 {
mgottscho 0:8d34cc2ff388 32
mgottscho 0:8d34cc2ff388 33 }
mgottscho 0:8d34cc2ff388 34
mgottscho 0:8d34cc2ff388 35 INA219::~INA219() { }
mgottscho 0:8d34cc2ff388 36
mgottscho 0:8d34cc2ff388 37 void INA219::selfInit() {
mgottscho 0:8d34cc2ff388 38 __i2c.frequency(400000);
mgottscho 0:8d34cc2ff388 39 reset();
mgottscho 0:8d34cc2ff388 40 __calibrate();
mgottscho 0:8d34cc2ff388 41 }
mgottscho 0:8d34cc2ff388 42
mgottscho 0:8d34cc2ff388 43 void INA219::reset() {
mgottscho 0:8d34cc2ff388 44 uint16_t data = CONFIG_RST_MASK;
mgottscho 0:8d34cc2ff388 45 setRegister16b(CONFIG, data);
mgottscho 0:8d34cc2ff388 46 wait(0.1);
mgottscho 0:8d34cc2ff388 47
mgottscho 0:8d34cc2ff388 48 //reset private data to match device default state
mgottscho 0:8d34cc2ff388 49 __bus_voltage_range_32V = true;
mgottscho 0:8d34cc2ff388 50 __shunt_amp_gain = 8;
mgottscho 0:8d34cc2ff388 51 __shunt_resolution = 12;
mgottscho 0:8d34cc2ff388 52 __shunt_num_samples_in_average = 0;
mgottscho 0:8d34cc2ff388 53 __bus_resolution = 12;
mgottscho 0:8d34cc2ff388 54 __bus_num_samples_in_average = 0;
mgottscho 0:8d34cc2ff388 55 __active = true;
mgottscho 0:8d34cc2ff388 56 __measure_shunt_voltage = true;
mgottscho 0:8d34cc2ff388 57 __measure_bus_voltage = true;
mgottscho 0:8d34cc2ff388 58 __continuous_measurements = true;
mgottscho 0:8d34cc2ff388 59 __shunt_voltage = 0;
mgottscho 0:8d34cc2ff388 60 __bus_voltage = 0;
mgottscho 0:8d34cc2ff388 61 __power = 0;
mgottscho 0:8d34cc2ff388 62 __shunt_current = 0;
mgottscho 0:8d34cc2ff388 63 __calibration = 0;
mgottscho 0:8d34cc2ff388 64 __current_div = 1;
mgottscho 0:8d34cc2ff388 65 __power_div = 1;
mgottscho 0:8d34cc2ff388 66 }
mgottscho 0:8d34cc2ff388 67
mgottscho 0:8d34cc2ff388 68 void INA219::setBusVoltageRange32V(bool enable) {
mgottscho 0:8d34cc2ff388 69 uint16_t data = getRegister16b(CONFIG);
mgottscho 0:8d34cc2ff388 70 if (enable) {
mgottscho 0:8d34cc2ff388 71 data |= CONFIG_BRNG_MASK; //set bit
mgottscho 0:8d34cc2ff388 72 __bus_voltage_range_32V = true;
mgottscho 0:8d34cc2ff388 73 }
mgottscho 0:8d34cc2ff388 74 else {
mgottscho 0:8d34cc2ff388 75 data &= ~CONFIG_BRNG_MASK; //clear bit
mgottscho 0:8d34cc2ff388 76 __bus_voltage_range_32V = false;
mgottscho 0:8d34cc2ff388 77 }
mgottscho 0:8d34cc2ff388 78 setRegister16b(CONFIG, data);
mgottscho 0:8d34cc2ff388 79 }
mgottscho 0:8d34cc2ff388 80
mgottscho 0:8d34cc2ff388 81 bool INA219::isBusVoltageRange32V() {
mgottscho 0:8d34cc2ff388 82 return __bus_voltage_range_32V;
mgottscho 0:8d34cc2ff388 83 }
mgottscho 0:8d34cc2ff388 84
mgottscho 0:8d34cc2ff388 85 void INA219::setShuntAmpGain(unsigned int gain) {
mgottscho 0:8d34cc2ff388 86 uint16_t tmp = 0;
mgottscho 0:8d34cc2ff388 87 switch (gain) {
mgottscho 0:8d34cc2ff388 88 case 1:
mgottscho 0:8d34cc2ff388 89 __shunt_amp_gain = 1;
mgottscho 0:8d34cc2ff388 90 break; //PG = b00
mgottscho 0:8d34cc2ff388 91 case 2:
mgottscho 0:8d34cc2ff388 92 tmp |= (CONFIG_PG_MASK & (1 << 11)); //PG = b01
mgottscho 0:8d34cc2ff388 93 __shunt_amp_gain = 2;
mgottscho 0:8d34cc2ff388 94 break;
mgottscho 0:8d34cc2ff388 95 case 4:
mgottscho 0:8d34cc2ff388 96 tmp |= (CONFIG_PG_MASK & (2 << 11)); //PG = b10
mgottscho 0:8d34cc2ff388 97 __shunt_amp_gain = 4;
mgottscho 0:8d34cc2ff388 98 break;
mgottscho 0:8d34cc2ff388 99 case 8:
mgottscho 0:8d34cc2ff388 100 tmp |= (CONFIG_PG_MASK & (3 << 11)); //PG = b11
mgottscho 0:8d34cc2ff388 101 __shunt_amp_gain = 8;
mgottscho 0:8d34cc2ff388 102 break;
mgottscho 0:8d34cc2ff388 103 default:
mgottscho 0:8d34cc2ff388 104 return; //bad input, do nothing
mgottscho 0:8d34cc2ff388 105 }
mgottscho 0:8d34cc2ff388 106 uint16_t data = getRegister16b(CONFIG);
mgottscho 0:8d34cc2ff388 107 data = (data & (~CONFIG_PG_MASK)) | tmp; //Set the gain bits
mgottscho 0:8d34cc2ff388 108 setRegister16b(CONFIG, data);
mgottscho 0:8d34cc2ff388 109 }
mgottscho 0:8d34cc2ff388 110
mgottscho 0:8d34cc2ff388 111 unsigned int INA219::getShuntAmpGain() {
mgottscho 0:8d34cc2ff388 112 return __shunt_amp_gain;
mgottscho 0:8d34cc2ff388 113 }
mgottscho 0:8d34cc2ff388 114
mgottscho 0:8d34cc2ff388 115 void INA219::setADCResolutionAndAveraging(bool shunt, bool resolution, unsigned int value) {
mgottscho 0:8d34cc2ff388 116 uint16_t code = 0;
mgottscho 0:8d34cc2ff388 117 uint16_t resolution_tmp;
mgottscho 0:8d34cc2ff388 118 uint16_t num_samples_in_average_tmp;
mgottscho 0:8d34cc2ff388 119
mgottscho 0:8d34cc2ff388 120 if (resolution) {
mgottscho 0:8d34cc2ff388 121 switch (value) {
mgottscho 0:8d34cc2ff388 122 case 9:
mgottscho 0:8d34cc2ff388 123 resolution_tmp = 9;
mgottscho 0:8d34cc2ff388 124 code = 0x00; //b0000 0X00
mgottscho 0:8d34cc2ff388 125 break;
mgottscho 0:8d34cc2ff388 126 case 10:
mgottscho 0:8d34cc2ff388 127 resolution_tmp = 10;
mgottscho 0:8d34cc2ff388 128 code = 0x01; //b0000 0X01
mgottscho 0:8d34cc2ff388 129 break;
mgottscho 0:8d34cc2ff388 130 case 11:
mgottscho 0:8d34cc2ff388 131 resolution_tmp = 11;
mgottscho 0:8d34cc2ff388 132 code = 0x02; //b0000 0X10
mgottscho 0:8d34cc2ff388 133 break;
mgottscho 0:8d34cc2ff388 134 case 12:
mgottscho 0:8d34cc2ff388 135 resolution_tmp = 12;
mgottscho 0:8d34cc2ff388 136 code = 0x03; //b0000 0X11, default
mgottscho 0:8d34cc2ff388 137 break;
mgottscho 0:8d34cc2ff388 138 default:
mgottscho 0:8d34cc2ff388 139 return; //bad input, do nothing
mgottscho 0:8d34cc2ff388 140 }
mgottscho 0:8d34cc2ff388 141 num_samples_in_average_tmp = 0;
mgottscho 0:8d34cc2ff388 142 } else { //sample averaging
mgottscho 0:8d34cc2ff388 143 switch (value) {
mgottscho 0:8d34cc2ff388 144 case 2:
mgottscho 0:8d34cc2ff388 145 num_samples_in_average_tmp = 2;
mgottscho 0:8d34cc2ff388 146 code = 0x09; //b0000 1001
mgottscho 0:8d34cc2ff388 147 break;
mgottscho 0:8d34cc2ff388 148 case 4:
mgottscho 0:8d34cc2ff388 149 num_samples_in_average_tmp = 4;
mgottscho 0:8d34cc2ff388 150 code = 0x0A; //b0000 1010
mgottscho 0:8d34cc2ff388 151 break;
mgottscho 0:8d34cc2ff388 152 case 8:
mgottscho 0:8d34cc2ff388 153 num_samples_in_average_tmp = 8;
mgottscho 0:8d34cc2ff388 154 code = 0x0B; //b0000 1011
mgottscho 0:8d34cc2ff388 155 break;
mgottscho 0:8d34cc2ff388 156 case 16:
mgottscho 0:8d34cc2ff388 157 num_samples_in_average_tmp = 16;
mgottscho 0:8d34cc2ff388 158 code = 0x0C; //b0000 1100
mgottscho 0:8d34cc2ff388 159 break;
mgottscho 0:8d34cc2ff388 160 case 32:
mgottscho 0:8d34cc2ff388 161 num_samples_in_average_tmp = 32;
mgottscho 0:8d34cc2ff388 162 code = 0x0D; //b0000 1101
mgottscho 0:8d34cc2ff388 163 break;
mgottscho 0:8d34cc2ff388 164 case 64:
mgottscho 0:8d34cc2ff388 165 num_samples_in_average_tmp = 64;
mgottscho 0:8d34cc2ff388 166 code = 0x0E; //b0000 1110
mgottscho 0:8d34cc2ff388 167 break;
mgottscho 0:8d34cc2ff388 168 case 128:
mgottscho 0:8d34cc2ff388 169 num_samples_in_average_tmp = 128;
mgottscho 0:8d34cc2ff388 170 code = 0x0F; //b0000 1111
mgottscho 0:8d34cc2ff388 171 break;
mgottscho 0:8d34cc2ff388 172 default:
mgottscho 0:8d34cc2ff388 173 return; //bad input, do nothing
mgottscho 0:8d34cc2ff388 174 }
mgottscho 0:8d34cc2ff388 175 resolution_tmp = 0;
mgottscho 0:8d34cc2ff388 176 }
mgottscho 0:8d34cc2ff388 177
mgottscho 0:8d34cc2ff388 178 //Now set the actual bits based on whether it is shunt or bus setting
mgottscho 0:8d34cc2ff388 179 uint16_t data = getRegister16b(CONFIG);
mgottscho 0:8d34cc2ff388 180 if (shunt) { //shunt ADC
mgottscho 0:8d34cc2ff388 181 data &= ~CONFIG_SADC_MASK; //clear SADC bits
mgottscho 0:8d34cc2ff388 182 data |= (code << 3); //set SADC bits
mgottscho 0:8d34cc2ff388 183 __shunt_resolution = resolution_tmp;
mgottscho 0:8d34cc2ff388 184 __shunt_num_samples_in_average = num_samples_in_average_tmp;
mgottscho 0:8d34cc2ff388 185 } else { //bus ADC
mgottscho 0:8d34cc2ff388 186 data &= ~CONFIG_BADC_MASK; //clear BADC bits
mgottscho 0:8d34cc2ff388 187 data |= (code << 7); //set BADC bits
mgottscho 0:8d34cc2ff388 188 __bus_resolution = resolution_tmp;
mgottscho 0:8d34cc2ff388 189 __bus_num_samples_in_average = num_samples_in_average_tmp;
mgottscho 0:8d34cc2ff388 190 }
mgottscho 0:8d34cc2ff388 191
mgottscho 0:8d34cc2ff388 192 setRegister16b(CONFIG, data); //update the register
mgottscho 0:8d34cc2ff388 193 }
mgottscho 0:8d34cc2ff388 194
mgottscho 0:8d34cc2ff388 195 unsigned int INA219::getADCResolutionAndAveraging(bool shunt, bool &resolution) {
mgottscho 0:8d34cc2ff388 196 if (shunt) { //get shunt ADC setting
mgottscho 0:8d34cc2ff388 197 if (__shunt_resolution == 0) { //sample averaging
mgottscho 0:8d34cc2ff388 198 resolution = false;
mgottscho 0:8d34cc2ff388 199 return __shunt_num_samples_in_average;
mgottscho 0:8d34cc2ff388 200 } else if (__shunt_num_samples_in_average == 0) { //resolution
mgottscho 0:8d34cc2ff388 201 resolution = true;
mgottscho 0:8d34cc2ff388 202 return __shunt_resolution;
mgottscho 0:8d34cc2ff388 203 } else { //this should never happen
mgottscho 0:8d34cc2ff388 204 return 0; //to keep compiler happy, this should never get reached
mgottscho 0:8d34cc2ff388 205 }
mgottscho 0:8d34cc2ff388 206 }
mgottscho 0:8d34cc2ff388 207 else {//get bus ADC setting
mgottscho 0:8d34cc2ff388 208 if (__bus_resolution == 0) { //sample averaging
mgottscho 0:8d34cc2ff388 209 resolution = false;
mgottscho 0:8d34cc2ff388 210 return __bus_num_samples_in_average;
mgottscho 0:8d34cc2ff388 211 } else if (__bus_num_samples_in_average == 0) { //resolution
mgottscho 0:8d34cc2ff388 212 resolution = true;
mgottscho 0:8d34cc2ff388 213 return __bus_resolution;
mgottscho 0:8d34cc2ff388 214 } else { //this should never happen
mgottscho 0:8d34cc2ff388 215 return 0; //to keep compiler happy, this should never get reached
mgottscho 0:8d34cc2ff388 216 }
mgottscho 0:8d34cc2ff388 217 }
mgottscho 0:8d34cc2ff388 218 }
mgottscho 0:8d34cc2ff388 219
mgottscho 0:8d34cc2ff388 220 void INA219::setMode(bool shuntVoltage, bool busVoltage, bool continuous) {
mgottscho 0:8d34cc2ff388 221 uint16_t code = 0;
mgottscho 0:8d34cc2ff388 222
mgottscho 0:8d34cc2ff388 223 //Handle all 8 cases
mgottscho 0:8d34cc2ff388 224 if (continuous) {
mgottscho 0:8d34cc2ff388 225 code += 4;
mgottscho 0:8d34cc2ff388 226 __continuous_measurements = true;
mgottscho 0:8d34cc2ff388 227 } else
mgottscho 0:8d34cc2ff388 228 __continuous_measurements = false;
mgottscho 0:8d34cc2ff388 229 if (busVoltage) {
mgottscho 0:8d34cc2ff388 230 code += 2;
mgottscho 0:8d34cc2ff388 231 __measure_bus_voltage = true;
mgottscho 0:8d34cc2ff388 232 } else
mgottscho 0:8d34cc2ff388 233 __measure_bus_voltage = false;
mgottscho 0:8d34cc2ff388 234 if (shuntVoltage) {
mgottscho 0:8d34cc2ff388 235 code += 1;
mgottscho 0:8d34cc2ff388 236 __measure_shunt_voltage = true;
mgottscho 0:8d34cc2ff388 237 } else
mgottscho 0:8d34cc2ff388 238 __measure_shunt_voltage = false;
mgottscho 0:8d34cc2ff388 239
mgottscho 0:8d34cc2ff388 240 uint16_t data = getRegister16b(CONFIG);
mgottscho 0:8d34cc2ff388 241 data &= ~CONFIG_MODE_MASK; //Clear mode bits
mgottscho 0:8d34cc2ff388 242 data |= (CONFIG_MODE_MASK & code); //Set mode bits
mgottscho 0:8d34cc2ff388 243 setRegister16b(CONFIG, data);
mgottscho 0:8d34cc2ff388 244 }
mgottscho 0:8d34cc2ff388 245
mgottscho 0:8d34cc2ff388 246 void INA219::getMode(bool &shuntVoltage, bool &busVoltage, bool &continuous) {
mgottscho 0:8d34cc2ff388 247 shuntVoltage = __measure_shunt_voltage;
mgottscho 0:8d34cc2ff388 248 busVoltage = __measure_bus_voltage;
mgottscho 0:8d34cc2ff388 249 continuous = __continuous_measurements;
mgottscho 0:8d34cc2ff388 250 }
mgottscho 0:8d34cc2ff388 251
mgottscho 0:8d34cc2ff388 252
mgottscho 0:8d34cc2ff388 253 int16_t INA219::getShuntVoltage(bool sampleNow) {
mgottscho 0:8d34cc2ff388 254 __disable_irq();
mgottscho 0:8d34cc2ff388 255 if (sampleNow)
mgottscho 0:8d34cc2ff388 256 __shunt_voltage = (int16_t) getRegister16b(SHUNT_VOLTAGE);
mgottscho 0:8d34cc2ff388 257 __dataReady = false;
mgottscho 0:8d34cc2ff388 258 __enable_irq();
mgottscho 0:8d34cc2ff388 259
mgottscho 0:8d34cc2ff388 260 return __shunt_voltage;
mgottscho 0:8d34cc2ff388 261 }
mgottscho 0:8d34cc2ff388 262
mgottscho 0:8d34cc2ff388 263 float INA219::getShuntVoltageFloat(bool sampleNow) {
mgottscho 0:8d34cc2ff388 264 return getShuntVoltage(sampleNow) * SHUNT_VOLTAGE_DIV;
mgottscho 0:8d34cc2ff388 265 }
mgottscho 0:8d34cc2ff388 266
mgottscho 0:8d34cc2ff388 267 int16_t INA219::getBusVoltage(bool sampleNow) {
mgottscho 0:8d34cc2ff388 268 __disable_irq();
mgottscho 0:8d34cc2ff388 269 if (sampleNow) {
mgottscho 0:8d34cc2ff388 270 uint16_t tmp = getRegister16b(BUS_VOLTAGE);
mgottscho 0:8d34cc2ff388 271 tmp &= BUS_VOLTAGE_BD_MASK; //Clear the irrelevant bits
mgottscho 0:8d34cc2ff388 272 int16_t data = (((int16_t) tmp) >> 3); //extract bits and keep sign from arithmetic right shift
mgottscho 0:8d34cc2ff388 273 __bus_voltage = data;
mgottscho 0:8d34cc2ff388 274 }
mgottscho 0:8d34cc2ff388 275 __dataReady = false;
mgottscho 0:8d34cc2ff388 276 __enable_irq();
mgottscho 0:8d34cc2ff388 277
mgottscho 0:8d34cc2ff388 278 return __bus_voltage;
mgottscho 0:8d34cc2ff388 279 }
mgottscho 0:8d34cc2ff388 280
mgottscho 0:8d34cc2ff388 281 float INA219::getBusVoltageFloat(bool sampleNow) {
mgottscho 0:8d34cc2ff388 282 return getBusVoltage(sampleNow) * BUS_VOLTAGE_DIV;
mgottscho 0:8d34cc2ff388 283 }
mgottscho 0:8d34cc2ff388 284
mgottscho 0:8d34cc2ff388 285 int16_t INA219::getPower(bool sampleNow) {
mgottscho 0:8d34cc2ff388 286 __disable_irq();
mgottscho 0:8d34cc2ff388 287 if (sampleNow) {
mgottscho 0:8d34cc2ff388 288 uint16_t unsignedPower = getRegister16b(POWER); //The INA219 does not internally track sign of power, only current and voltage, so we need to do it
mgottscho 0:8d34cc2ff388 289 __shunt_current = (int16_t) getRegister16b(CURRENT);
mgottscho 0:8d34cc2ff388 290 if (__shunt_current < 0) //check sign
mgottscho 0:8d34cc2ff388 291 __power = -((int16_t) unsignedPower);
mgottscho 0:8d34cc2ff388 292 else
mgottscho 0:8d34cc2ff388 293 __power = (int16_t) unsignedPower;
mgottscho 0:8d34cc2ff388 294 }
mgottscho 0:8d34cc2ff388 295 __dataReady = false;
mgottscho 0:8d34cc2ff388 296 __enable_irq();
mgottscho 0:8d34cc2ff388 297
mgottscho 0:8d34cc2ff388 298 return __power;
mgottscho 0:8d34cc2ff388 299 }
mgottscho 0:8d34cc2ff388 300
mgottscho 0:8d34cc2ff388 301 float INA219::getPowerFloat(bool sampleNow) {
mgottscho 0:8d34cc2ff388 302 return getPower(sampleNow) * __power_div;
mgottscho 0:8d34cc2ff388 303 }
mgottscho 0:8d34cc2ff388 304
mgottscho 0:8d34cc2ff388 305 int16_t INA219::getCurrent(bool sampleNow) {
mgottscho 0:8d34cc2ff388 306 __disable_irq();
mgottscho 0:8d34cc2ff388 307 if (sampleNow)
mgottscho 0:8d34cc2ff388 308 __shunt_current = (int16_t) getRegister16b(CURRENT);
mgottscho 0:8d34cc2ff388 309 __dataReady = false;
mgottscho 0:8d34cc2ff388 310 __enable_irq();
mgottscho 0:8d34cc2ff388 311
mgottscho 0:8d34cc2ff388 312 return __shunt_current;
mgottscho 0:8d34cc2ff388 313 }
mgottscho 0:8d34cc2ff388 314
mgottscho 0:8d34cc2ff388 315 float INA219::getCurrentFloat(bool sampleNow) {
mgottscho 0:8d34cc2ff388 316 return getCurrent(sampleNow) * __current_div;
mgottscho 0:8d34cc2ff388 317 }
mgottscho 0:8d34cc2ff388 318
mgottscho 0:8d34cc2ff388 319 uint16_t INA219::getCalibration() {
mgottscho 0:8d34cc2ff388 320 __disable_irq();
mgottscho 0:8d34cc2ff388 321 __calibration = getRegister16b(CURRENT);
mgottscho 0:8d34cc2ff388 322 __enable_irq();
mgottscho 0:8d34cc2ff388 323
mgottscho 0:8d34cc2ff388 324 return __calibration;
mgottscho 0:8d34cc2ff388 325 }
mgottscho 0:8d34cc2ff388 326
mgottscho 0:8d34cc2ff388 327 void INA219::__calibrate() {
mgottscho 0:8d34cc2ff388 328 /*float vbus_max = 6; //5V supply, so guardband to 6V just in case
mgottscho 0:8d34cc2ff388 329 float rshunt = 0.1; //0.1 Ohm CSR
mgottscho 0:8d34cc2ff388 330 float curr_max = 0.6; //600 mA worst case
mgottscho 0:8d34cc2ff388 331 float vshunt_max = rshunt * curr_max;
mgottscho 0:8d34cc2ff388 332 float curr_max_expected = 0.5; //500 mA expected worst case
mgottscho 0:8d34cc2ff388 333 float min_lsb = 0.00001525925474; //curr_max_expected / 32767
mgottscho 0:8d34cc2ff388 334 float max_lsb = 0.00012207031250; //curr_max_expected / 4096*/
mgottscho 0:8d34cc2ff388 335 __current_div = 0.000016; //round up min_lsb to a nice number, in this case 16 uA
mgottscho 0:8d34cc2ff388 336 __power_div = __current_div * 20;
mgottscho 0:8d34cc2ff388 337 uint16_t calibration = 25600 & 0xFFFE; //trunc(0.04096 / (sel_lsb * Rshunt))
mgottscho 0:8d34cc2ff388 338 setRegister16b(CALIBRATION, calibration);
mgottscho 0:8d34cc2ff388 339 __calibration = calibration;
mgottscho 0:8d34cc2ff388 340 }
mgottscho 0:8d34cc2ff388 341
mgottscho 0:8d34cc2ff388 342 void INA219::__sample_data_ISR() {
mgottscho 0:8d34cc2ff388 343 getBusVoltage(true);
mgottscho 0:8d34cc2ff388 344 getShuntVoltage(true);
mgottscho 0:8d34cc2ff388 345 getCurrent(true);
mgottscho 0:8d34cc2ff388 346 getPower(true);
mgottscho 0:8d34cc2ff388 347 __dataReady = true;
mgottscho 0:8d34cc2ff388 348 }