Components / INA219

Dependents:   INA219-HelloWorld INA_219 Light example-ublox-cellular-psm ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers INA219.cpp Source File

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*)&reg, 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 }