This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

INA219: Amplifiers forum

Part Number: INA219



I have been working for 3 days solid trying to get better readings from a Adafruit module that contains the INA219. While the device is auite accurate with the default Adafruit library (which ia basically all taken from the INA219 Ti datasheet)  I have struggled to use it with a non standard value of shut resistor. I have several of these modules so one of the I modified, replacing the R100 (0.1 Ohm) with a R010 (0.01 Ohm). The actual measurement of the resistor is 0.02 Ohms but I have tried both 0.01 and 0.02 in the calculations.


 

My Target is 8Amps @ 24V 

24V @ 4.5A   the INA219 is showing as   24.9V    @   3.9A /4A        <<< NOT so good at the higher current  end 
24V@  4.9 / 5A   the INA219 is showing as  24.89V  @4.5/4.6A
24V@  1A  the INA219 is showing as  24.89V  @1.020Amps     <<< so good at the lower end 

You will see all the comments in the Library and I have checked it against the Ti Datasheet for the INA219 and it looks okay.

This is a section from the Adafruit Library that I have added based on an already working section but modified to use my resistor....


void Adafruit_INA219::setCalibration_32V_16A(void)
{
// By default we use a pretty huge range for the input voltage,
// which probably isn't the most appropriate choice for system
// that don't use a lot of power. But all of the calculations
// are shown below if you want to change the settings. You will
// also need to change any relevant register settings, such as
// setting the VBUS_MAX to 16V instead of 32V, etc.

// VBUS_MAX = 32V (Assumes 32V, can also be set to 16V)
// VSHUNT_MAX = 0.32 (Assumes Gain 8, 320mV, can also be 0.16, 0.08, 0.04)
// RSHUNT = 0.02 (Resistor value in ohms)


// 1. Determine max possible current
// MaxPossible_I = VSHUNT_MAX / RSHUNT
// 0.32/ 0.02
// MaxPossible_I = 16A

// 2. Determine max expected current
// MaxExpected_I = 8.0A

// 3. Calculate possible range of LSBs (Min = 15-bit, Max = 12-bit)
// MinimumLSB = MaxExpected_I/32767
// MinimumLSB = 0.000244 (244uA per bit)
// MaximumLSB = MaxExpected_I/4096
// MaximumLSB = 0.001953 (1953uA per bit)

// 4. Choose an LSB between the min and max values
// (Preferrably a roundish number close to MinLSB)
// CurrentLSB = 0.000300 (300uA per bit)

// 5. Compute the calibration register
// Cal = trunc (0.04096 / (Current_LSB * RSHUNT))
// 0.04096 / (0.000006)
// trunc Cal = 6826

ina219_calValue = 6826;

// 6. Calculate the power LSB
// PowerLSB = 20 * CurrentLSB
// PowerLSB = 0.006 (6mW per bit)

// 7. Compute the maximum current and shunt voltage values before overflow
//
// Max_Current = Current_LSB * 32767
// Max_Current = 9.9301A before overflow
//
// If Max_Current > Max_Possible_I then
// Max_Current_Before_Overflow = MaxPossible_I
// Else
// Max_Current_Before_Overflow = Max_Current
// 
// SO - Max_Current_Before_Overflow = 9.9301A <<< True
// 
//End If
//
// Max_ShuntVoltage = Max_Current_Before_Overflow * RSHUNT
// Max_ShuntVoltage = 0.198602V
//
// If Max_ShuntVoltage >= VSHUNT_MAX
// Max_ShuntVoltage_Before_Overflow = VSHUNT_MAX
// Else
// Max_ShuntVoltage_Before_Overflow = Max_ShuntVoltage
// 
// SO - Max_ShuntVoltage_Before_Overflow = 0.198602V <<< True
// 
// End If

// 8. Compute the Maximum Power
// MaximumPower = Max_Current_Before_Overflow * VBUS_MAX
// MaximumPower = 9.9301 * 32V
// MaximumPower = 317.7632Watts
//
// @ 24V Max= 9.9301 * 24V = 238.3224Watts


// Set multipliers to convert raw current/power values
ina219_currentDivider_mA = 3.33; // Current LSB = 300uA per bit (1000/300 = 3.33)
ina219_powerMultiplier_mW = 0.1666; // Power LSB = 6mW per bit (1/6)

// Set Calibration register to 'Cal' calculated above 
wireWriteRegister(INA219_REG_CALIBRATION, ina219_calValue);

// Set Config register to take into account the settings above
uint16_t config = INA219_CONFIG_BVOLTAGERANGE_32V |
INA219_CONFIG_GAIN_8_320MV |
INA219_CONFIG_BADCRES_12BIT |
INA219_CONFIG_SADCRES_12BIT_1S_532US |
INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS;
wireWriteRegister(INA219_REG_CONFIG, config);
}

Thanks in advance for any help you can give me.

  • Hello Paul,

    Thanks for using our forum. I suspect your issue could be related to how you process the data you read from the INA219. I see that your max expected current is 8A. Yet you chose a current_LSB of 300uA, which yields a max current of 9.8304 A. If we truncate that value to 9A for the calibration, then if we take your register value and multiply it by the current_LSB for an 8A scale we get values similar to what you are getting for the current measurements. However, I would not expect the calibration register to truncate 9.8304A to 9A. Other sources of error would include the tolerance of your shunt resistor. You did not happen to put a input filter between your shunt and the INA219 did you? This could lead to offset and gain errors.

    What tolerance does the manufacturer give to the shunt you are using? Can you show the code corresponding to how you convert the register values you read from the INA219? I see a line corresponding to a currentDivider, can you tell me why you are dividing 1000 by 300uA? Perhaps you can include a diagram or schematic showing what you are doing.
  • Hey Paul,

    Do you have any update for us on this issue?
  • Hey Paul,
    I have not heard from you in a while. As such, I presume you were able to resolve you issue and I will therefore close this thread. However, if you still need support, please reply below.