Precise voltage measurement [0-10V]

I'm at task to build a closed loop system for a pneumatics control application.

There's already a controller that's programmed to give out certain voltages to regulate a flow control valve for particular settings selected on the HMI. As of now, the users select the setting and assume the fluid output to be stable, but really it's not.

So I want to use an Arduino, correspond each voltage from the HMI to it's expected fluid output and use a pressure sensor to detect and regulate the flow control valve accordingly to maintain a stable fluid flow.

The part where I'm stuck at is, the HMI controller gives out voltages ranging from 0-10V and the voltages vary at a resolution of three decimal places (ex: 3.145v) and start at 0.121v and some readings vary by a tolerance of 0.01v.

I have been exploring precise voltage measurement using Arduino and most precision voltage reference ICs like the AD587 or even the cheap 10v version of the LM4040-N are proving to be expensive or locally inaccessible at the moment. So I'm here to explore the alternatives, also I'm a mechatronics engineer with a shaky base in electronics.

I'm on a shoe-string budget to prove the closed-loop concept so I can manage to get the unnecessary HMI controller replaced with a simpler setup.

Anjanbabu:
The part where I'm stuck at is, the HMI controller gives out voltages ranging from 0-10V and the voltages vary at a resolution of three decimal places (ex: 3.145v) and start at 0.121v and some readings vary by a tolerance of 0.01v.

Are you saying that you want to control the fluid flow to a precision of 1 part 10,000?

if not, what level of precision do you require?

The standard 10 bit ADC in an Arduino should be accurate to about 1 part in a 1000 if you use a precision voltage reference.

...R

Your original system is open loop control. Adding a pressure transducer and an Arduino to regulate that pressure would make it a closed loop system and a closed loop control system can only be as accurate as its reference and feedback.

It sounds like the reference is not accurate so closing the loop may not give you the overall accuracy you're looking for. It is possible the the reference has been conditioned in some way to compensate for open loop control? The non-uniformity you see in the output may be there to linearize the open loop response. Once you have a pressure transducer in the system, you can map the voltage to pressure relationship and better understand the voltage reference characteristics (perhaps).

While you're considering that possibility, give some serious thought to Robin's question above, how accurate do you need or want the system to be?

If you need really high resolution analog, have a look at the common, inexpensive breakout boards with the ADS1015 (12 bit) and ADS1115 (16 bit) external, 4 channel ADC's that connect via the 2 wire I2C interface.

ADS1115 (16 bit) external, 4 channel ADC's that connect via the 2 wire I2C interface.

+1 for that idea. They are slow, but fast enough for your purpose, and so much more accurate and noise-free than Arduino's built-in adc. Cheap too.

Will need a voltage divider as they don't measure more than just over 6V.
So use a divider of say 2x10k (assuming 20k is enough impedance on your analog output) and end up with a voltage of 0V to about 5V (about, as you have to take the tolerance of the resistors into account: just measure what output you get at 10V signal for a given pair of resistors).

Is it really pressure you need to control, or flow? If this is a dispensing output, then the feedback would be flow, not pressure. Pressure might be handy on the upstream side of the flow-control valve, but only if you can control it.

What material and application are you working with?