Sharing Discoveries on MAX31855 Inaccuracies/Problems

Hi All,

Just thought I would post this up here, as I'm sure this is a problem that others will encounter in the future.

So I recently started building a 8-channel thermocouple monitor with an Arduino using the MAX31855 chip. I am using T thermocouples. If you read the datasheet closely, it says that the MAX31855 uses a linear approximation to find the thermocouple temperatures. However, if you read up on thermocouples themselves, you will find out that they are very non-linear devices. I've attached a picture showing the Seebeck Coefficient plotted versus temperature. If thermocouples were linear, the Seebeck Coefficient would be the same across all temperatures. In fact, this is what the MAX31855 assumes.

The datasheet for the MAX31855 claims it can have accuracies of +/-2C. However, I find that claim suspicious, as I've seen various posts in forums about how the temperature readings are off when at extreme low or high temperatures. Also, this claim is only for the K-type which is much more linear than the T-type. I personally am using T-types because they fit my application better and actually have better tolerances than K-types in terms of manufacturing (according to Omega).

I was getting very large errors (+/-5C or more) using T-types and the default thermocouple readings from the MAX31855 at very low and very high temperatures (-20 or lower and +100 or higher) because of the reasons above.

In order to get around this, you need to actually backcalculate the millivolts data from the MAX31855 and use a thermocouple lookup table to compute more accurate results.

I've attached my code here and hopefully it can be of use to someone. I've only programmed it to work with T-type thermocouples, but I hope it is self explanatory enough so that others can modify it for other types. I never bothered to test the code in terms of timing so there may be some inefficiencies there, but I only needed to poll 8 temperatures every second. This was giving me +/-2C for temperatures from -80 to 100C. I haven't tested it on other temperatures, but I hope this will help some people.

Phil

MAX31855.cpp (11 KB)

MAX31855.h (1.61 KB)

MAX31855_T_LUT.h (4.28 KB)

TemperatureMonitor_8Channel.ino (4.89 KB)

Just realized there's a bug with how I did the linear interpolation...will be uploading a fix soon...

Alright, I've updated my original post/attachments with the new code. This seems to work much better and I've spent a good deal of time verifying it and comparing the temperatures to ice baths, dry ice, and heating blocks.

Let me know if anyone finds any other bugs! Hope this helps some people out.