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.
Dependents: INA219-HelloWorld INA_219 Light example-ublox-cellular-psm ... more
INA219.cpp
00001 #include "INA219.hpp" 00002 00003 INA219::INA219 (PinName sda, PinName scl, int addr, int freq, resolution_t res) : I2C(sda, scl), resolution(res), i2c_addr(addr << 1) 00004 { 00005 I2C::frequency(freq); 00006 00007 // by default, calibrate to this level. 00008 calibrate_16v_400mA(); 00009 } 00010 00011 // Private Methods 00012 00013 void INA219::write_register (uint8_t reg, uint8_t* data, int length) 00014 { 00015 char* transmission = (char*)malloc(length + 1); 00016 memcpy(transmission + 1, data, length); 00017 00018 transmission[0] = reg; 00019 I2C::write(i2c_addr, transmission, length + 1); 00020 00021 free(transmission); 00022 } 00023 00024 void INA219::write_register_u16 (uint8_t reg, uint16_t data) 00025 { 00026 char transmission[3]; 00027 transmission[0] = reg; 00028 transmission[1] = (data >> 8) & 0xff; 00029 transmission[2] = data & 0xff; 00030 00031 I2C::write(i2c_addr, transmission, 3); 00032 } 00033 00034 void INA219::write_null(uint8_t reg) { 00035 I2C::write(i2c_addr, (char*)®, 1); 00036 } 00037 00038 uint16_t INA219::read_register_u16 (uint8_t reg) 00039 { 00040 write_null(reg); 00041 00042 char data[2]; 00043 I2C::read(i2c_addr, data, 2); 00044 00045 uint16_t ret_val = data[0] << 8 | data[1]; 00046 return ret_val; 00047 } 00048 00049 // Public Methods 00050 00051 void INA219::calibrate_16v_400mA() 00052 { 00053 // ASSUMING A 0.1 OHM RESISTOR! 00054 write_register_u16(INA219_REG_CALIBRATION, 8192); 00055 00056 // Write to config register 00057 00058 uint16_t resolution_mask = 0x0000; 00059 00060 if (resolution == RES_12BITS) 00061 resolution_mask = INA219_CONFIG_BADCRES_12BIT | INA219_CONFIG_SADCRES_12BIT_1S_532US; 00062 else if (resolution == RES_11BITS) 00063 resolution_mask = INA219_CONFIG_BADCRES_11BIT | INA219_CONFIG_SADCRES_11BIT_1S_276US; 00064 else if (resolution == RES_10BITS) 00065 resolution_mask = INA219_CONFIG_BADCRES_10BIT | INA219_CONFIG_SADCRES_10BIT_1S_148US; 00066 else // resolution == RES_9BITS 00067 resolution_mask = INA219_CONFIG_BADCRES_9BIT | INA219_CONFIG_SADCRES_9BIT_1S_84US; 00068 00069 write_register_u16(INA219_REG_CONFIG, INA219_CONFIG_BVOLTAGERANGE_16V | 00070 INA219_CONFIG_GAIN_1_40MV | 00071 resolution_mask | 00072 INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS); 00073 00074 // Set current divider 00075 current_divider = 20; 00076 power_divider = 1; 00077 } 00078 00079 int16_t INA219::read_current_raw() 00080 { 00081 return (int16_t)read_register_u16(INA219_REG_CURRENT); 00082 } 00083 00084 float INA219::read_current_mA() 00085 { 00086 float raw_current = read_current_raw(); 00087 return raw_current / current_divider; 00088 }
Generated on Tue Jul 12 2022 13:24:03 by
1.7.2
INA219 High Side Current Sensor