External ADC design help

Hey guys!

This is my first time designing circuit for ADC and I have built a board a while ago but unfortunately did not get good result, and I am pretty sure I made some design error here and there so I just put my idea aside. Now that I got more free time on my hands, I wish to pick up the project again and design a new board (and to restore my pride), I am wondering if you guys could offer any recommendation.

So I got 9 analog sensors (basically a photo-transistor plus a precision resistor) that output from 0-3v3 that I would love to enhance the sampling accuracy, and I have been thinking about using an external ADC to take higher quality samples. I got a couple of LTC1864 16-bit delta sigma dual channel ADC that runs on SPI which made it easy to interface with an Arduino. Since I got 9 sensors, I have also got an analog MUX. I would like to operate my sensors at the same exact voltage as my ADC reference at 3.300V, therefore I also got a LM4132 precision LDO voltage reference chip dropped down from a linear regulator at 5V from a switch regulator from a 12V battery regulated by a solar charged controller. Finally, the voltage reference won’t source enough current to drive all of my sensors, so I included an unity gain OpAmp to amplify the current. I digitized the signal right at the output of the MUX in attempt to minimize noise. As a backup, I also transmit the analog signal to my internal ADC through a coaxial cable just for comparing the result. The shield is grounded only at the sensor side to avoid ground loop. The signal from the photo-transistors is maybe 10Hz at most.

Tech sheets are given below:

Long story short, both 10bit and 16bit results are crappy, with huge amount of fluctuation. It got better after I removed the two OpAmp, but still both result are not acceptable. The trial was done a while ago and I think I have already thrown the data away. But just by looking at the design, what do you guys think might have went wrong? I would love to re design the board, so any comments will be extreamly helpful!

Thank you!!

Couple of things missing here:

1) What kind of op amp are you using? Op amps have an input offset voltage that will show up on their output. If you really want precision, you need a low offset voltage op amp.

2) Your voltage reference says it's capable of 20 milliamps. That's about what most op amps are capable of outputting too. Are you sure it won't be able to power your sensors?

3) What kind of phototransistor are you using, and what are you measuring with it? Are you sure the signal itself is stable when you try to read it? Have you viewed the signal on an oscilloscope? How much fluctuation are you seeing in the data? "Not acceptable" is very vague.

Thank you for your response! (1) The OpAmp is am using is a OPA2340U single power supply, rail to rail, dual OpAmp from TI. I am not sure about input offset voltage, but I am going to look it up. But as long as the ADC reference and sensor operating voltage is the same, it think it will be fine. http://www.ti.com.cn/cn/lit/ds/symlink/opa340.pdf (2) Yes. Each of my nine sensors have composed of a photo transistor and a 1K resistor. Maximum current is (9)(3.3/1000)=29.7mA. I also believe that a bandgap reference is not meant for driving sensors and should be buffered regardless of current consumption, but I am not sure... just my personal thought. (3) It is a TEPT4400 NPN ambient light sensor, I put them outside to check ambient light level. I am not sure how the raw signal looks like, but the 10bit does give better result then the 16bit when I scale the 16bit data down to 10bit range. Both ADC always report 00000 when I short the MUX output to the ground which is perfect. When I pull the output to 3v3, my lowest sample is 64683 and the highest sample is 64732, which is 49 counts (3.3/65535*49=2.47mV) apart, and 852 counts (42.9mV) away from 65535. http://www.vishay.com/docs/81341/tept4400.pdf

Do you Is there is design fault to my circuit? Is this how people usually design external ADC circuit? Thanks you!!

I've never worked with a 16-bit ADC before, so i'm just going off of what I do know.

When you say "When I pull the output to 3v3...", which 3.3 V point specifically? The ouput of the LDO reference, or the output of the op amp? If it's the output of the op amp, the current draw may be causing the output to sag, causing a lower voltage to appear than what's on the ADC reference.

Also, I just noticed a 0.1uF capacitor on the output of the opamp. This is a bad thing to do. Op amps can become unstable when driving large capacitive loads. Check page 10 of the datasheet titled "CAPACITIVE LOAD AND STABILITY". Try removing C6 and see if it helps the situation.

I would use a proper 3.3V linear voltage regulator to power the sensors and as the ADC voltage reference. If you must know to a high degree of accuracy what the input voltage actually is, get a lower voltage voltage reference (like 2.5V or 1.1V) and hook that to channel 9 of the multiplexer. Every so often, you can read the value of the precise reference and perform some algebra to figure out what the supply voltage actually is.

Granted, I have no experience with circuits like this, so that'd just be my first try.

Your schematic show 10k resistors. Is the schematic or your posts in error?

Thanks again for the input.

(1) When I said pulling to 3v3, I meant putting a jumper across one of nine male header pairs, so that the 3v3 from the OpAmp buffer goes directly through the 1K resistor to the ground. So it should give me 65535 because that is the same voltage I apply to my ADC reference terminal. (2) All the resistors are 1K, not 10K. Sorry my schematic is wrong. (3) OpAmp becomes unstable when driving capacitive load without compensation, but isn't it only effective when amplifying signal with higher frequency contents? The bandgap reference produces a DC voltage of 3v3, maybe with some tiny amplitude AC noise. But I will certainly give it a try.

I am thinking maybe it's the MUX that has problem. Maybe the ON state resistance is too high? The Arduino ADC has a input impedance of 10MOhms thought... hmmm

dominicfhk: (1) When I said pulling to 3v3, I meant putting a jumper across one of nine male header pairs, so that the 3v3 from the OpAmp buffer goes directly through the 1K resistor to the ground. So it should give me 65535 because that is the same voltage I apply to my ADC reference terminal.

If the current output of the op amp is too much, the output voltage might sag, causing a lower than reference voltage to be applied to the resistors. You might need an op amp with a higher drive capability, or use something else.

(3) OpAmp becomes unstable when driving capacitive load without compensation, but isn't it only effective when amplifying signal with higher frequency contents? The bandgap reference produces a DC voltage of 3v3, maybe with some tiny amplitude AC noise. But I will certainly give it a try.

Don't know. I found a couple of articles by Analog Devices (http://www.analog.com/library/analogdialogue/archives/31-2/appleng.html & http://www.analog.com/library/analogdialogue/archives/38-06/capacitive_loading.pdf) that say capcitive loading can cause problems at DC since it can cause the op amp to oscilliate. Using such a high bandwidth op amp may be hurting you in that respect. The articles also list "poorly terminated coaxial cables" as a source of parasitic capacitance. Have you tried measuring with the ADC with the coax cable disconnected?

I am thinking maybe it's the MUX that has problem. Maybe the ON state resistance is too high? The Arduino ADC has a input impedance of 10MOhms thought... hmmm

You're buffering the output of the MUX anyway, to the switch resistance shouldn't be a problem.

What bandwidth do you need to sample?

If you don't bandwidth-limit the input to ADCs suitably you risk anti-aliasing all the unwanted high frequency noise down into the baseband. Noise voltage is proportional to the square-root of bandwidth. Photo detectors are already very noisy devices, unless you low-pass filter the outputs appropriate to your sampling rate you'll see all the noise, although some ADCs are integrating which automatically achieves this filtering.