Optimising a 4-20mA circuit

I currently have these locked in parts:

Arduino UNO
Adafruit ADS1115 (15-Bit/16-Bit ADC)
Siemens SITRANS P200 Series Pressure Transmitter (4-20mA output)
Siemens, SITOP PSU6200, 24V, 1.3A
Murata Switching Regulator, 5V, 1.5A

After multiple trials and evaluation I’ve got these ADC requirements:

128-256 SPS (this fits the P200’s stated <5ms response)
14bit+ (application requires this level of accuracy from P200)
2 channels (I have 2 x P200)
3.3v, 5v, or 24v ADC power with easy comms to UNO

Currently the circuit is a very simply between the ADS1115 and P200 voltage divide converts the 4-20mA into 1-5V (250Ω ±0.1% 0.125W ±10ppm/°C).
R=V/I. 5V/0.02A = 250Ω.
V=IR. 0.004*250 = 1V (min voltage.)

Code and spec overview

ADS1115 set to 250SPS (1000/250 = 4) so reading the ADS1115 every 4ms
ADS1115 set to +/-6.144V range (not ideal i know)
PGA @ 2/3 ((5-1)/6.144 = 65% of 15bit = 32767*.81 = 21332 range 1 - 5V)
Code noise reduction is mean average of last 4 readings.
After extensive testing min sensitivity required is 0.01psi ≈ 5units of 15bit
At current PGA (81% efficient) that equates to (6.144/32767*5 = 0.0011v) 1.1mV

Simplified questions -

  • Is there a more appropriate external ADC than the ADS1115? Thanks Leo
  • Does the PGA setting have any effect on stability (i.e. should I stick to the 6.144V max and adjust my voltage divider to suit)? Thanks Leo
  • How do I calculate an appropriate noise reducing capacitor?
  • Should my circuit include anything else to improve stability?
  • Would oversampling achieve anything (should I look to something faster than the UNO)?
  • Would “multi-sampling” (no idea if this is what its called) achieve anything (i.e. using 2 channels per pressure transducer)
  • Would taking the readings against GND (differential) to get 16Bit resolution be advantageous? (Doing so effectively double ADC unit resolution but diff to hardware. Might improve software noise handling?)

Proposed solution -

ADS1115 set to 250SPS (1000/250 = 4) so reading the ADS1115 every 4ms
ADS1115 set to +/-2.048V range (seems best noise compromise)
R=V/I. 2V/0.02A = 100Ω. V=IR. 0.004100 = 0.4V (min voltage.)
PGA @ 2 ((2-0.4)/2.048 = 78% of 15bit = 32767
.78 = 25599 range 0.4 - 2V)
Sensitivity required is 0.01psi ≈ 7units of 15bit
That equates to (2.048/32767*7 = 0.0004v) 0.4mV

Too many questions in one post.
Trying to answer a few.

Adafruit ADS1115 (12-Bit ADC) >> Typo? 16 bit differential, 15 bit single-ended.

4-20mA into 1-5V (250Ω... >> Bad idea. Default Uno Aref is unstable/noisy.
51ohm/1% and 1.1volt Aref would be much better.

0.1% >> BS, because default Aref can be ±5%. Result depends on both (chain as strong as weakest link).
±10ppm/°C >> Only stability is important.

81% of available 16bit >> No, of 15-bit.

Is there a more appropriate ADC than the ADS1115? >> Nah, other 4-20mA converters also use this chip.

Does the PGA setting have any effect on stability >> Maybe. Study the single-ended graphs in the datasheet.

should I stick to the 6.144V max >> And loose resolution? PGA2 (2.048V) sounds right (100 ohm sense resistor).

There is a trade-off between noise reduction and speed.
Better get things working first and see what kind/level of noise you actually have before working on that.
Diagram in post#10 here can be used (change 51 to 100 for the ADS), and it has some reverse and over-voltage protection.
Leo..

Thank you Leo,

I've gone over my post carefully and correct a number of errors (most notable the % efficient at I neglected the lost range due to 4mA != 0V!

I've been contemplating this for a while and wondered if using a voltage reference (e.g. LT6650IS5) of 0.4V instead of GND for the differential would be sensible as it would expand the efficiency from 78% to 100%? Making the measured increments 0.56mV as opposed to 0.44mV? If so would that be a sensible chip?

Not very likely you get 14 bits significant with some home brew parts slapped together, but with some serious effort you may be getting there. As you say you need 14-bit reading it'd not be that bad an idea to try and get a 15-bit precision and stability from your project.

For starters, focus on keeping the noise out of the ADC, don't try to filter it out later. Garbage in = garbage out. It's a current loop so should be less sensitive to EMI than a voltage signal still it's not immune. Good shielding of at least the part where you have your low noise, low temperature drift, high precision sense resistor connected to your ADC, which of course is housed in a well shielded enclosure and is powered by a shielded, dedicated, well decoupled and stabilised power supply. Your Arduino and any other electronics go on another power supply.

To test, get your sensor to produce a stable signal- where your sensor says it's stable, or better: a known stable current source, stable to at least 0.01% (that's a little better than the 16th bit in your signal). Now the first 14 bits of your reading should always be the same. If not, improve your circuit.