Precision Current Sensing Using Arduino

Hello Team,
We are designing a circuit to measure the current consumed by a Ultra-low power communication module.
The requirement is below:

  1. Min current = 0.2mA
  2. Max current = 100mA
  3. Resolution = 0.005mA (5uA)
    We do not need to measure DYNAMIC current, just want to measure AVERAGE current at a specified working condition such as Active, Sleep, Shutdown
    we will use a sensing resistor in series to the load.
    I have some questions, please provide clarifications.

1).The sense resistor value selected is 500mOhm. According to my understanding to get 5uA resolution ADC’s 1LSB must be less than or equal to 2.5uV (RsenseCurrent step,ie (500mohm5uA). Please correct me if I am wrong.

  1. Do I need to use a pre-amplifier after current sense resistor? Imagine I am using an ADC with 24bit resolution and 5V reference then my 1LSB will be 0.3uV, less than the required resolution. Is it possible to connect a buffer after Rsense and connect its output directly to ADC input?
    May I know can I use Arduino for this application

regards
Hari

Since you did not post a schematic to outline how things are connected, no one can tell you if you are on the right track.

Instead I will give you an alternate method. You cannot measure current, you can only measure voltage. The typical purpose of Rsense is to do that. 100mA through 0.5 Ohm is 50mV. Using a differential amplifier (or instrumentation amplifier) with gain=100 will give a voltage range of 10mV to 5V. Using a external 24bit ADC, gives 0.3uV resolution.

24 bit: 0.3uV / 100 gain / 0.5 ohms = 0.006uA per bit

10 bit: 4.9uV / 100 gain / 0.5 ohms = 9.7uA per bit

Keep in mind that when working with signals this small, error due to component tolerance and electrical noise can be an issue.

To measure small currents correctly and easily, make or buy a uCurrent.

1. Your minimum load current is 0.2 mA = 0.0002 A. The Rsense is 500mohm = 0.5 ohm. The voltage proportional to current is: .0002*0.5 = 0.1 mV. For Arduino UNO/NANO with VREF = 1.1V, the resolution (mV/LSBit) ~= 1 mV. So, you cannot use Arduino in this application. You can try using UNO/NANO by connecting VREF at external adjustable voltage via AREF-pin as per Step-3. Edit: deleted in the light of Post#4.

2. If you are using external 24-bit Serial ADC with 5V VREF, the resolution is: 5/224 = 0.0003 mV. You can use this ADC for you application. There is no need to put any amplifier between the Load Signal and the ADC.

3. You can try to use UNO/NANO with VREF = adjustableVolt at the AREF-pin of the UNO/NANO. The setting will be analogReference(EXTERNAL). The adjustableVolt should be set at the following voltage from a variable DC source: ~=103 mV. Edit: delected in the light of Post#4.

GolamMostafa:
You can try to use UNO/NANO with VREF = adjustableVolt at the AREF-pin of the UNO/NANO. The setting will be analogReference(EXTERNAL). The adjustableVolt should be set at the following voltage from a variable DC source: ~=103 mV.

I think somewhere is the Atmel datasheet is mentioned that Aref shouldn't be much less than 1volt.
Better to use an external A/D if you want a higher resolution.
The 16-bit ADS1115 has a PGA setting of 0.256volt full scale.
Not sure about noise performance at that level.
Leo..

Wawa:
I think somewhere is the Atmel datasheet is mentioned that Aref shouldn't be much less than 1volt.

It appears that you are right from the following experiment (though I have not yet found your above quote in the data sheet): ~=200 mv at AREF-pin, input at A5-pin ~= 80 mV. Output = 0x3FF (saturated)

void setup()
{
  Serial.begin(9600);
  analogReference(EXTERNAL);  //about 200 mV at AREF-pin
}

void loop()
{
  int x = analogRead(A5);    //input is around 80 mV.
  Serial.println(x, HEX);       //always shows 0x3FF = the saturated voltage.
  delay(2000);  

}

To average accurately for a load that is bursty it might make sense to integrate the current and measure
the charge over a fixed interval. Integrate circuits are a single opamp, and if that opamp has a good
bandwidth you'll correctly sum all the current peaks.

Sampling the current might miss pulses and rapid changes unless a very high sampling rate is used.

Any charge integrating circuit needs a way to zero the value after taking a reading, so its a little more
involved than just the plain integration circuit.

Google opamp integrator.

GolamMostafa:
It appears that you are right from the following experiment (though I have not yet found your above quote in the data sheet)

The table on page 310 of the 'Atmega 328' lists a minimum Vref of 1volt, as well as a Vint of 1.0-1.2 volt (internal 1.1volt Aref).
Leo..

harivadakara:
The requirement is below:

  1. Min current = 0.2mA
  2. Max current = 100mA
  3. Resolution = 0.005mA (5uA)

This is close to what you are looking for PowMeter Shield for Nano

harivadakara:
2. Max current = 100mA
3. Resolution = 0.005mA (5uA)

100 mA, 0.005 mA resolution requires at least 20,000 steps. An Arduino's built-in 10-bit ADC offers a mere 1,024 steps. You need a 15-bit ADC or better for this resolution.

Next problem. 500 mΩ gives 50 mV at 100 mA, so you're at just 1/5 of the scale of the ADS1115, for 6,400 steps full scale. So you'll need a 5x gain amplifier circuit, and probably some filter after that to get rid of noise and to average out the current. Not trivial at those very low voltages.