I have designed and built a small fairly simple circuit that uses a MAX6675 chip to take temperature readings from a multiplexed array of 16 k-type thermocouples.
For the channel multiplexing I'm using a pair of MAX4544EUT+T and a CD4051BM96 (the latter is definitely a CMOS device, not sure about the former).
The system basically works from end-to-end. The data output from the MAX6675 is coherent and well formatted. However the actual temperatures indicated by the data are too high.
The circuit board and the thermocouples are just sitting at ambient temperature on my desk (about 19 Celsius at the moment). Yet I'm getting readings in the region of 47 Celsius from the MAX6675. This is far higher than the typical error rates suggested in the MAX6675's datasheet.
I believe that the firmware in the microcontroller is reading the data correctly, as it does properly identify "open" circuits for those channels where no thermocouple has been attached. The values do change if I touch one of the thermocouple junctions with my hand (ramping up quickly and then ramping down again when I let go). So fundamentally it is all working.
What could be the cause of this ~28 degree offset in the readings?
28 degrees is equivalent to 112 LSBs counts on the MAX6675's ADC!
I did wonder if it would be the extra resistance in the circuit because of the multiplexing chips, but this additional 160 Ohms is negligible compared to the 60,000 Ohm thermocouple input impedance on the MAX6675.
I think that the readings coming from the device should be absolute temperatures (e.g. any compensation for the cold junction is done by the MAX6675 internally), and do not need any further compensation in software.
The circuit itself does not warm up appreciably with prolonged use (no more than ambient + 4 degrees on top of the MAX6675 package measured with a Fluke meter). I don't think this is the cause of the discrepancy, as the readings are wrong by the same amount even when the board is starting from ambient temp.
The data format presented by the MAX6675 is shown on page 6 of the datasheet.
Consequently my readings of
0x05f8 for instance resolve to 47.75 Celsius.
To convert: right-shift the raw value by 3 bits, convert to float then multiply by 0.25 to get the temperature in Celsius.
Is this behaviour something I should simply be compensating for by calibrating my system with a compensation value? The datasheet doesn't mention anything about having to do that.