Electronics > Beginners

INA219 voltage/current sense module - Modifying the Library for 0.01R resistor

(1/5) > >>

castingflame:

I have been working for 3 days solid trying to get better readings from a INA219 Adafruit module. While the device is quite accurate with the default Adafruit library (which is 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 them 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. I have made changes to the..  'ina219_powerMultiplier_mW'   because I believe there is an error in the library. It looks like copy and paste error from the original author.


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



--- Code: ---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);
}

--- End code ---


Thanks in advance for any help you can give me.

Buriedcode:
Well it looks like its about 10% out on the upper end.  What resistor are you using?  Also, what are you comparing the voltage/current measurements with?  Its all well and good saying you've got 24V @ 4.5A flowing through it, but what meter are you using to measure this? 105 seems like a lot, but given tolerances of measurements and parts, it's not completely implausible.

It seems you've commented out most of the calculations.  Have you tried using the "default library" just with a different resistor?  Sure you will get an error by a factor of 2 for the current measurement, but it will at least help determine whether its hardware or software (ie: your custom config).

mariush:
How did you measure the resistor ?
Did you zero out the multimeter probes before measuring? Did you clean the meter probes with isopropyl alcohol or something? Maybe they're dirty.
The resistance may change as it heats up, if it's not a proper current shunt resistor... but shouldn't be that much difference.

castingflame:
The new sense resistor I am using is a R010  BOURNS  CRL2512-FU-R010ELF


--- Quote ---How did you measure the resistor ?
--- End quote ---

I measured the resistor with one of these meters

https://www.amazon.co.uk/Acompatible-5000-Handheld-Meter-Tl-21/dp/B00S298KJO

in DC resistance mode.



--- Quote ---Did you zero out the multimeter probes before measuring?
--- End quote ---


I calibrated the meter before measuring, without and with the probes attached, in accordance with the instructions in the meters manual.



--- Quote ---Did you clean the meter probes with isopropyl alcohol or something?
--- End quote ---
The meter was brand new out of the box and didn't see the need to do it although I will try it anyway.



--- Quote ---The resistance may change as it heats up, if it's not a proper current shunt resistor... but shouldn't be that much difference.
--- End quote ---

It is a proper shunt resistor.



--- Quote ---Also, what are you comparing the voltage/current measurements with?
--- End quote ---

I have two modules that I am just switching between. A standard module has a R100 (0.1 Ohm) shunt resistor and a modified module that has a R010 resistor. My code is setup to read both modules but only one is 'live' at a time as I switch the load between modules. If I switch in the original module with the 0.1R resistor and use the 32V_2A profile in the Adafruit library the Current and Voltage measurements that it is reporting are similar to what I am seeing with an inline Current meter and a Voltage meter over the PSU. The PSU has its own meters but they are generally not as accurate in my experience. I have also used a clamp meter for measuring the current. Overall with the standard Module the reading reported by the INA219 seem pretty close to the Meters.

When I switch in the other INA219 module that I replaced the R100 with a 0R10 (0.01 Ohm) resistor and use the Profile I created myself in the Adafruit library (32V_16A as I have already posted) this is where the problems are, as reported.



--- Quote ---It seems you've commented out most of the calculations.  Have you tried using the "default library" just with a different resistor?  Sure you will get an error by a factor of 2 for the current measurement, but it will at least help determine whether its hardware or software (ie: your custom config).
--- End quote ---

The calculations are not meant to be commented In. They are there to use as a 'fill in the blanks' type formula. You have to make several calculations to get to one number.

Example: to get the 'ina219_calValue' you need to do 5 previous steps of calculations so that you get the correct numbers to 'plug in' for the 'ina219 calValue'  calculation. There are 3 that take several steps;

ina219 calValue
ina219_currentDivider_mA
ina219_powerMultiplier_mW

These values also have to be changed if the resolution changes...
INA219_CONFIG_GAIN_1_40MV |
INA219_CONFIG_BADCRES_12BIT |

but I am just sticking to how the 2Amp profile was setup so they are unmodified. I am not 100% sure if that is the correct decision but I dont feel I have a choice as I can not choose any better.

All of the comments/instructions about the steps for the calculations have been taken from the Ti datasheet for the INA219 by Adafruit and included in the library as instructions in the form of comments.

There are several versions of the datasheet but this one has the formula examples (Page 17).
https://cdn-shop.adafruit.com/datasheets/ina219.pdf




--- Quote ---Have you tried using the "default library" just with a different resistor?
--- End quote ---

Yes it was the first thing I did and of course it was incorrect because in theory it was a factor of 10 out before all of the calculations. I initially thought I could just fudge that in my code and multiply the current by 10. However, in practice the 0.01 shunt resistor seems to read 0.02 in practice with the meter. I have tried both values in the equations.



As already stated, I am using a standard device and library to check that my meter reading are not a mile off. Even though the library states it goes up to 2Amps the standard device and 2Amp library does actually work up to 4.5Amps and the module is reporting similar values as the meters. So I believe how I am reading the values is close enough. Things just go downhill when I use the 0.01 Ohm resistor an a default or my own library 'profile'.


Here is the Adafruit .cpp driver library complete https://github.com/adafruit/Adafruit_INA219/blob/master/Adafruit_INA219.cpp


My target to be able to read is 24 volts at 8Amps although at the moment I am only going as far as 4.5Amps in testing with the modules before making my own beefier version as part of my project.

I will also mention that I am using an electronic DC load.



Thanks everyone for their help so far.

tooki:
I've had good results with this library: https://github.com/SV-Zanshin/INA

It's MUCH easier to configure than what the Adafruit library seems to be.

When you instantiate it, you just give it the maximum current in amps and the shunt value in microohms. (Both numbers are integers, so don't try fractional amps.) So for example, in one project, I'm using it with this within the initialization code block:

--- Code: ---  INA.begin(6,9815);

--- End code ---
That's 6A max, and a 0.01R (10000 microohm) shunt, with the shunt value tweaked for calibration.


Older versions of this library (e.g. the one called "INA226") were not as flexible as far as INA chip models, and they had some bugs when near the upper bounds of the measurement range. Those appear to have been fixed, as it's now working as expected.

Navigation

[0] Message Index

[#] Next page

There was an error while thanking
Thanking...
Go to full version
Powered by SMFPacks Advanced Attachments Uploader Mod