I embarked on building a Thermistor DAQ using a MCP 3421 (http://ww1.microchip.com/downloads/en/DeviceDoc/22003e.pdf). It's fed by a 4067D Mux, 16 channels, from NXP. I have a couple of precision resistors hooked up now (0.1% tolerance) and I also calculated the integer values that the ADC should be sending back. I am using the following bridge circuit:
I have the unit set up for 16 bit operation, 1-shot, PGA=2. I get consistent results from each channel in 16-bit mode. The first byte (hi-byte) contains the sign (MSB), followed by 7 bits of data. The second byte(low-byte) contains 8 bits of data. The third byte contains the configuration setup. Thanks to retrolefty, coding badly and other luminaries here (http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1256765353), I even managed to turn a two's complement number into positive and negative numbers. In order to simplify things for me, I add 32768 to the output integer to create a "output" from the ADC that ranges from 0-65535 vs. -32768 to 32767. So far so good.
The three precision resistors are 100 Ohm, 2k7, and 11k Ohm. Per my calculations (with all-precision resistors, including the bridge), the converted ADC output should be
9795(argh!) 8927, 36449, and 63311, respectively. However, we live in the real world, and I thought I would use these three resistors as a means of compensating for the impact of the bridge resistor tolerances, as well as the impact of the MUX chip. As I would like to design it, the circuit / program would self-calibrate once a second to account for the various tolerances using these three precision resistors.
The problem is that the measured integer values do not imply a constant or even linear offset. As measured, the three resistors consistently (i.e. within a LSB) return 10226, 36893, and 63097. That is an offset of
-431-1299, -444, and +232, respectively. I added a delay before and after changing MUX channels to see if there was an settling impact (no). The only thing I can think of is that somehow my 11k resistor is not of the 0.1% variety. I'll have to double-check that. In the meantime, are there any other possibilities that I have overlooked?
There is always the possibility of getting the 'ideal' values wrong, eh? :)
So, now the offsets are linear, I'll calculate a compensating equation for it. Sorry for the bother!
But this approach seems to work and may be interesting for others to use also, i.e. marrying a inexpensive MUX like the 4067D with a nice ADC to get a lot of channels. Add three precision resistors and all sorts of things can get compensated for, allowing you to use higher-tolerance resistors / components elsewhere.