🐍 CircuitPython is the easiest way to program microcontrollers now celebrating over 200 boards!🐍
0

Max 31855 Reading High Temperatures
Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.

Re: Max 31855 Reading High Temperatures

by coryjfowler on Sun Oct 13, 2013 8:27 am

This kind of linearity regression calculation should have been included in the IC. I wonder if Maxim overlooked this?

coryjfowler
 
Posts: 12
Joined: Sat Oct 12, 2013 11:52 am
Location: Indiana

Re: Max 31855 Reading High Temperatures

by diemkae on Sun Oct 13, 2013 9:06 am

I thought so too, but apparently Maxim did not.

For this reason, I am considering the AD595AQ chip. It seems to give fairly linear mV readings of 10mV/degreeC above 0C, and there is a handy table of mV/degree from -200C to 1250C, in 20 degree increments, if you want to interpolate for more accurate readings.

diemkae
 
Posts: 7
Joined: Wed Jan 25, 2012 4:55 pm

Re: Max 31855 Reading High Temperatures

by coryjfowler on Mon Oct 14, 2013 12:43 am

Testing the breakout against an Altek Model 322-1 "Thermocouple Calibrator" in source mode shows that Maxim's description of this product is falling short of what its supposed to do.
The particular Altek I am using was last calibrated September 9th of this year.

My breakout is reading the cold junction (die temperature) at 23.75°C.
With the Altek set at 1200.0°C, the MAX31855 breakout displays 1183.5°C.
Altek at 700.0°C, the breakout is at 706°C.
Altek at 550.0°C, the breakout is at 552.5°C.
Altek at 100.0°C, the breakout is at 100.0°C.
Altek at 0.0°C, the breakout is at 0.5°C.
Altek at -17.7°C, the breakout is at -16.00°C.
Altek at -25.0°C, the breakout is at -22.75°C.
Altek at -50.0°C, the breakout is at -45.0°C.
Altek at -100.0°C, the breakout is at -85.5°C.
Altek at -200.0°C, the breakout is at -142.0°C

Snippet from the MAX31855 data sheet: This converter resolves temperatures to 0.25°C, allows readings as high as +1800°C and as low as -270°C, and exhibits thermocouple accuracy of ±2°C for temperatures ranging from -200°C to +700°C for K-type thermocouples.
Where was the IC sourced from, and can it be traced back to a legit MAXIM manufacturing plant, there is a quality issue here... I am not impressed.
I can take this thermocouple source and hook it up to a Opto 22 SNAP Module or Gantner module and get these temperatures. I trust the output of the Altek over the IC.

coryjfowler
 
Posts: 12
Joined: Sat Oct 12, 2013 11:52 am
Location: Indiana

Re: Max 31855 Reading High Temperatures

by adafruit_support_mike on Mon Oct 14, 2013 1:51 am

The contracts we have with our suppliers prohibit public discussion of sources or prices.

WRT information I can discuss publically, the datasheet (http://www.adafruit.com/datasheets/MAX31855.pdf) says:

Note that the MAX31855 assumes a linear relationship between temperature and voltage. Because all thermocouples exhibit some level of nonlinearity, apply appropriate correction to the device’s output data

Its calculation is based on a linear 41.276uV/C characteristic for a K-type thermocouple.

The +2C/-2C spec over the -200C to 700C range is subject to the following notes:

Note 3: Guaranteed by design; not production tested.
Note 4: Not including cold-junction temperature error or thermocouple nonlinearity.


The temperature data you listed plots out like so:

temps.png
temps.png (15.12 KiB) Viewed 5160 times

which looks consistent with the standard nonlinearity profile for a type-K thermocouple:

type-k.png
type-k.png (147.62 KiB) Viewed 5160 times


Overall, it looks like the device is performing according to its published specs.

WRT compensating for the nonlinearity, this page from Maxim has a fair amount of information: http://www.maximintegrated.com/app-note ... vp/id/5032
When you void a product warranty, you give up your right to sue the manufacturer if something goes wrong and accept full responsibility for whatever happens next. And then you truly own the product.

adafruit_support_mike
 
Posts: 62212
Joined: Thu Feb 11, 2010 2:51 pm

Re: Max 31855 Reading High Temperatures

by coryjfowler on Mon Oct 14, 2013 3:07 am

I would prefer a digital voltage reading, then do all the calculations inside the MCU if I have to do any at all to maintain a linear temperature response. Its easier that way and I would be able to support any thermocouple type.. I should have just gone that route but I clearly did not rake through the datasheet with a fine comb before purchasing the MAX31855 breakouts. Its common knowledge that thermocouples are not linear if you work with them, its sad this chip assumes they are linear. I've taken for granted the consistency of the thermocouple input equipment I use at my employer, and falsely assumed this IC would do what I wanted... oh well.

coryjfowler
 
Posts: 12
Joined: Sat Oct 12, 2013 11:52 am
Location: Indiana

Re: Max 31855 Reading High Temperatures

by coryjfowler on Mon Oct 14, 2013 6:14 am

adafruit_support_mike wrote:[...] this page from Maxim has a fair amount of information: http://www.maximintegrated.com/app-note ... vp/id/5032

The coefficients listed on that page by Maxim have different decimals than what is printed here from Omega... http://www.omega.com/temperature/z/pdf/z198-201.pdf
The Omega coefficients expect a microvolt input and the Maxim coefficients expect millivolt input... given that information, I would expect the decimals to only be off by 3. I'm really loosing faith in Maxim at this point... I would go to NIST to get their data for comparison but I'll leave politics out of this.

Regardless, this type of math is too complex for an ATmega328 based Arduino to handle and give out a linear temperature response with a decent amount of accuracy.. I definitely have my first and last two MAX31855*s.

coryjfowler
 
Posts: 12
Joined: Sat Oct 12, 2013 11:52 am
Location: Indiana

Re: Max 31855 Reading High Temperatures

by adafruit_support_mike on Mon Oct 14, 2013 7:15 pm

coryjfowler wrote:The coefficients listed on that page by Maxim have different decimals than what is printed here from Omega... http://www.omega.com/temperature/z/pdf/z198-201.pdf
The Omega coefficients expect a microvolt input and the Maxim coefficients expect millivolt input... given that information, I would expect the decimals to only be off by 3.

You're forgetting that it's a power series. In the first term, you have millivolts versus microvolts.. a factor of 1000. In the second term, you have millivolts-squared versus microvolts-squared.. a factor of 1000^2 or 10^6. In the third term, you have millivolts-cubed versus microvolts-cubed.. a factor of 1000^3 or 10^9. Generalizing to the Nth term, the offset between the tables will be 10^3N.
When you void a product warranty, you give up your right to sue the manufacturer if something goes wrong and accept full responsibility for whatever happens next. And then you truly own the product.

adafruit_support_mike
 
Posts: 62212
Joined: Thu Feb 11, 2010 2:51 pm

Re: Max 31855 Reading High Temperatures

by heypete on Thu May 15, 2014 8:02 am

ashurbr wrote:Greetings diemkae,

I know all about this. Please see a post I did previously - search for 31855 chip transplant. The MAX 31855 modules use a constant conversion from measured emf to temperature. The actual emf is not linear. What you can do is back out the emf using the measured temperature and reference junction temperature, then use the primary NIST emf data as a lookup/interpolation or regress the NIST data to a better polynomial.

Adafruit support - this issue has arisen several times - do you want to work with me to develop a "better" library?


Hi Bob (or anyone else reading this thread),

I realize it's been a while since this thread was active, but I hope you might still be getting notifications about it.

I'm also using a MAX31855 and a K-type thermocouple and need to measure very low temperatures (-200 to -100C). I've attempted to "back out the emf", as you say, using your code in the "chip transplant" thread.

I've used the NIST K-type coefficients over the full range of -200 to +1372C -- they both go to zero at 0C, so the output of the two formulas join together with no discontinuity.

Again, based on your work in the other thread, I fit a 22nd-order polynomial to the whole range (it fits quite well) using LibreOffice Calc -- I'd be happy to supply the ODS file on request, or to make it public if people are interested. Alas, I don't have access to MATLAB. The polynomial has the following coefficients:
Code: Select all | TOGGLE FULL SIZE
const double pTofEMF_K[23] = {0.1848013805, 26.0040600894, -0.6659309757, -0.0950680281, 0.0470137601, 0.0077148174, -0.0038861697, 0.0002252546, 8.02620899467851E-005, -1.53997722795589E-005, 6.70120567745449E-007, 1.18557275279114E-007, -2.32089040330256E-008, 2.11696476207507E-009, -1.26202276209997E-010, 5.36096010213247E-012, -1.67449721896137E-013, 3.87519041444531E-015, -6.58496406083465E-017, 7.99924246322705E-019, -6.58394029689987E-021, 3.29246264672238E-023, -7.55726972137995E-026};


Since this is a K-type thermocouple, I'm using the sensitivity for the thermocouple and cold junction sensor for that type from the datasheet:
Code: Select all | TOGGLE FULL SIZE
const double MAXTEMF_K =  0.041276;     // mV/deg C
const double MAXRJEMF_K = 0.040730;     // mV/deg C


I've adapted the formula you used from the "chip transplant" thread to use the Adafruit MAX31855 library. Here's the loop() and relevant function:
Code: Select all | TOGGLE FULL SIZE
void loop() {
  // basic readout test, just print the current temp
  Serial.print("Internal Temp = ");
  Serial.println(thermocouple.readInternal());

  double c = thermocouple.readCelsius();
  if (isnan(c)) {
    Serial.println("Something wrong with thermocouple!");
  }
  else {
    Serial.print("C = ");
    Serial.println(c);
  }

  double emf = MAXTEMF_K*c - (MAXTEMF_K - MAXRJEMF_K)*thermocouple.readInternal();  //the key line
  double output= correctedT(emf);

  Serial.print("Corrected Temp = ");
  Serial.println(output);
  Serial.print(emf);
  Serial.println(" mv/C");
  Serial.println("");
  delay(1000);
}

double correctedT (double EMF){
  double temp = 0;
  for (int k=0; k<23; k++){
    temp += pTofEMF_K[k]*pow(EMF, k);
  }
  return temp;
}


A typical result when the thermocouple is immersed in liquid nitrogen (about -195C) is:
Internal Temp = 21.69
C = -131.25
Corrected Temp = -174.53
-5.45 mv/C


A Fluke 50S thermometer (which uses a K-type thermocouple) reports the temperature as -189.5C, which is close enough to the actual temperature to not be an issue. Other thermometers in my lab report similar temperatures. However, even the corrected temperature data from the MAX31855 is only -174.53, which is quite a bit off.

I have a few questions:
1. Is my re-casting of your "emf" formula into a form that uses the Adafruit library correct (that is, is the readInternal() function equivalent to your "rjTemp" value, readCelsius() is equivalent to your "measTemp", etc.)? To me, it seems to be equivalent but I may be overlooking something.

2. How did you derive the "emf" formula? Page 8 of the datasheet says that the MAX31855 uses the formula "Vout = (41.276 uV/C) * (Tr - Tamb)". To my (admittedly non-expert) eye, that seems like the emf formula should be written like this:
Code: Select all | TOGGLE FULL SIZE
emf = MAXTEMF_K*(c - thermocouple.readInternal());

Since the sensitivity of the cold junction sensor differs slightly from that of the thermocouple itself, perhaps the formula could be written as:
Code: Select all | TOGGLE FULL SIZE
emf = MAXTEMF_K*c - MAXRJEMF_K*thermocouple.readInternal();

However, when I tried using either of those formulas the results were even more wildly inaccurate, so I'm curious how you arrived at the "emf" formula from your "chip transplant" thread.

3. Any suggestions for improving things further? (Or pointing out parts where I've gone horribly wrong.)

Cheers!
-Pete

heypete
 
Posts: 32
Joined: Sat Jan 11, 2014 4:50 pm

Re: Max 31855 Reading High Temperatures

by jh421797 on Tue May 12, 2015 1:33 pm

Hi Pete,

Did you ever resolve this problem to your satisfaction?

I am trying to monitor a -80 degC freezer with a k-type thermocouple and the MAX31855 breakout board.

My readings are about 10 degC higher on the circuit than what the freezer & a fluke thermocouple reader are reporting. It sounds like a similar issue you were experiencing.

Thanks,
- Jeff

jh421797
 
Posts: 7
Joined: Mon Jul 07, 2014 10:54 am

Re: Max 31855 Reading High Temperatures

by heypete on Tue May 12, 2015 3:38 pm

jh421797 wrote:Hi Pete,

Did you ever resolve this problem to your satisfaction?

I am trying to monitor a -80 degC freezer with a k-type thermocouple and the MAX31855 breakout board.

My readings are about 10 degC higher on the circuit than what the freezer & a fluke thermocouple reader are reporting. It sounds like a similar issue you were experiencing.

Thanks,
- Jeff


Hi Jeff,

Not exactly. Short answer is: the thermocouples I have are cheap and not quite accurate.

I ended up implementing the NIST thermocouple equations instead of the 22nd-order polynomial previously mentioned. I corrected the data for the non-linearity using the method described in the attached file (courtesy of Maxim Integrated, whose customer service staff was enormously helpful). Note that their variable names for the NIST coefficients differ from the variable names in the NIST document. According to Maxim, the method described in the attached file is the proper and correct way for doing linearization correction for this chip.

My workplace (a university lab) has a Fluke thermocouple calibrator so I was able to test to make sure the MAX31855 was working as expected. The MAX31855 breakout board was working fine, but whenever I'd connect one of the K-type thermocouples I had around the house (all no-name, generic ones) I was off by several tens of degrees at very low temperatures. I suspect, but did not confirm, that using quality thermocouples from a company like Omega would provide better results.

Here's the results of my experiment with the simulator connected to my MAX31855. The format is as follows:

* Simulator: the temperature the Fluke thermocouple simulator was set to simulate, in degrees Celsius.
* Hex value #1: the hex representation of the data read out from the MAX3185.
* Hex value #2: I don't remember. Sorry. This was just for debugging purposes.
* Internal Temp: the cold-junction temperature of the MAX31855 in degrees Celsius. (bits 15:4)
* Raw Temp: the raw, uncorrected temperature output by the MAX31855 in degrees Celsius (bits 31:18).
* Raw Temp - Internal: the raw temperature minus the internal temperature in degrees Celsius.
* Thermocouple voltage: the calculated thermocouple voltage using the microvolts/degree value of from the MAX31855 datasheet. This is found by calculating (Raw Temp - Internal Temp)*(0.041276 volts/degree).
* Internal voltage: The cold-junction equivalent thermocouple voltage found using the NIST temperature-to-voltage formula. See step #3 in the attached file.
* Total voltage: this is the sum of the thermocouple voltage and internal voltage.
* Corrected Temp: the cold-junction compensated, linearized, corrected temperature value in degrees Celsius. This is calculated using the NIST voltage-to-temperature (inverse) coefficients. See step #5 in the attached file.

As you can see, the corrected temperature is quite accurate over the full range of measurable temperatures. However, when I use a real thermocouple instead of the simulator the readings are not quite as good, but that's due to the thermocouple itself.

Data follows:
Code: Select all | TOGGLE FULL SIZE
Simulator: +1370
53001640
14C0
Internal Temp = 22.25
Raw Temp = 1328.00
Raw Temp - Internal = 1305.75
Thermocouple voltage: 53.89614
Internal voltage: 0.88896
Total voltage: 54.78509
Corrected Temp = 1369.05

Simulator +977.5
3D2C1630
F4B
Internal Temp = 22.25
Raw Temp = 978.75
Raw Temp - Internal = 956.50
Thermocouple voltage: 39.48049
Internal voltage: 0.88896
Total voltage: 40.36945
Corrected Temp = 976.81

Simulator: +585
24C01650
930
Internal Temp = 22.25
Raw Temp = 588.00
Raw Temp - Internal = 565.75
Thermocouple voltage: 23.35190
Internal voltage: 0.88896
Total voltage: 24.24086
Corrected Temp = 584.39

Simulator: +300
127C1640
49F
Internal Temp = 22.31
Raw Temp = 295.75
Raw Temp - Internal = 273.44
Thermocouple voltage: 11.28641
Internal voltage: 0.89148
Total voltage: 12.17789
Corrected Temp = 299.27

Simulator: +192.5
BDC1640
2F7
Internal Temp = 22.25
Raw Temp = 189.75
Raw Temp - Internal = 167.50
Thermocouple voltage: 6.91373
Internal voltage: 0.88896
Total voltage: 7.80269
Corrected Temp = 191.59

Simulator: +100
6341640
18D
Internal Temp = 22.25
Raw Temp = 99.25
Raw Temp - Internal = 77.00
Thermocouple voltage: 3.17825
Internal voltage: 0.88896
Total voltage: 4.06721
Corrected Temp = 99.27

Simulator: 0
1640
0
Internal Temp = 22.25
Raw Temp = 0.00
Raw Temp - Internal = -22.25
Thermocouple voltage: -0.91839
Internal voltage: 0.88896
Total voltage: -0.02943
Corrected Temp = -0.74

Simulator: -50
FD241630
FFFFFF49
Internal Temp = 22.19
Raw Temp = -45.75
Raw Temp - Internal = -67.94
Thermocouple voltage: -2.80419
Internal voltage: 0.88643
Total voltage: -1.91776
Corrected Temp = -50.79

Simulator -100
FAA01620
FFFFFEA8
Internal Temp = 22.06
Raw Temp = -86.00
Raw Temp - Internal = -108.06
Thermocouple voltage: -4.46039
Internal voltage: 0.88138
Total voltage: -3.57901
Corrected Temp = -100.82

Simulator: -150
F8901620
FFFFFE24
Internal Temp = 22.12
Raw Temp = -119.00
Raw Temp - Internal = -141.13
Thermocouple voltage: -5.82508
Internal voltage: 0.88391
Total voltage: -4.94117
Corrected Temp = -151.21

Simulator: -200
F7141640
FFFFFDC5
Internal Temp = 22.25
Raw Temp = -142.75
Raw Temp - Internal = -165.00
Thermocouple voltage: -6.81054
Internal voltage: 0.88896
Total voltage: -5.92158
Corrected Temp = -201.93

Attachments
MAX31855 Linearized Thermocouple Temperature-1.png
Linearization information from Maxim.
MAX31855 Linearized Thermocouple Temperature-1.png (249.71 KiB) Viewed 4883 times

heypete
 
Posts: 32
Joined: Sat Jan 11, 2014 4:50 pm

Re: Max 31855 Reading High Temperatures

by jh421797 on Wed May 13, 2015 9:57 am

Wow Pete, thank you!

I've been tinkering around with this for a while thinking I was doing something wrong. This seems to have fixed it.

I was using a cheap eBay thermocouple, and switched to an Omega thermocouple thinking that was the issue. They do make very nice products.

Here are my results:

Freezer = -81 degC
Fluke Reading (same thermocouple as below) = -78.3 degC

Standard 31855 Reading vs This Corrected Reading: (2 sec intervals)
Sensor Read Time =67ms -68.25 degC Corrected Sensor Read Time =205ms -77.85 degC
Sensor Read Time =67ms -68.25 degC Corrected Sensor Read Time =206ms -77.85 degC
Sensor Read Time =66ms -68.25 degC Corrected Sensor Read Time =206ms -77.70 degC
Sensor Read Time =67ms -68.25 degC Corrected Sensor Read Time =206ms -77.85 degC
Sensor Read Time =66ms -68.25 degC Corrected Sensor Read Time =206ms -77.85 degC
Sensor Read Time =67ms -68.25 degC Corrected Sensor Read Time =206ms -77.85 degC
Sensor Read Time =66ms -68.25 degC Corrected Sensor Read Time =206ms -77.77 degC
Sensor Read Time =67ms -68.25 degC Corrected Sensor Read Time =206ms -77.85 degC
Sensor Read Time =66ms -68.25 degC Corrected Sensor Read Time =206ms -77.77 degC
Sensor Read Time =67ms -68.25 degC Corrected Sensor Read Time =206ms -77.93 degC
Sensor Read Time =66ms -68.25 degC Corrected Sensor Read Time =206ms -77.77 degC
Sensor Read Time =67ms -68.25 degC Corrected Sensor Read Time =205ms -77.85 degC
Sensor Read Time =66ms -68.25 degC Corrected Sensor Read Time =206ms -77.85 degC

Using your info implemented as:
Code: Select all | TOGGLE FULL SIZE
// corrected temperature reading for a K-type thermocouple
// allowing accurate readings over an extended range
// http://forums.adafruit.com/viewtopic.php?f=19&t=32086&p=372992#p372992
// assuming global: Adafruit_MAX31855 thermocouple(CLK, CS, DO);
float correctedCelsius(){
   
   // MAX31855 thermocouple voltage reading in mV
   float thermocoupleVoltage = (thermocouple.readCelsius() - thermocouple.readInternal()) * 0.041276;
   
   // MAX31855 cold junction voltage reading in mV
   float coldJunctionTemperature = thermocouple.readInternal();
   float coldJunctionVoltage = -0.176004136860E-01 +
      0.389212049750E-01  * coldJunctionTemperature +
      0.185587700320E-04  * pow(coldJunctionTemperature, 2.0) +
      -0.994575928740E-07 * pow(coldJunctionTemperature, 3.0) +
      0.318409457190E-09  * pow(coldJunctionTemperature, 4.0) +
      -0.560728448890E-12 * pow(coldJunctionTemperature, 5.0) +
      0.560750590590E-15  * pow(coldJunctionTemperature, 6.0) +
      -0.320207200030E-18 * pow(coldJunctionTemperature, 7.0) +
      0.971511471520E-22  * pow(coldJunctionTemperature, 8.0) +
      -0.121047212750E-25 * pow(coldJunctionTemperature, 9.0) +
      0.118597600000E+00  * exp(-0.118343200000E-03 *
                           pow((coldJunctionTemperature-0.126968600000E+03), 2.0)
                        );
                        
                        
   // cold junction voltage + thermocouple voltage         
   float voltageSum = thermocoupleVoltage + coldJunctionVoltage;
   
   // calculate corrected temperature reading based on coefficients for 3 different ranges   
   float b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10;
   if(thermocoupleVoltage < 0){
      b0 = 0.0000000E+00;
      b1 = 2.5173462E+01;
      b2 = -1.1662878E+00;
      b3 = -1.0833638E+00;
      b4 = -8.9773540E-01;
      b5 = -3.7342377E-01;
      b6 = -8.6632643E-02;
      b7 = -1.0450598E-02;
      b8 = -5.1920577E-04;
      b9 = 0.0000000E+00;
   }
   
   else if(thermocoupleVoltage < 20.644){
      b0 = 0.000000E+00;
      b1 = 2.508355E+01;
      b2 = 7.860106E-02;
      b3 = -2.503131E-01;
      b4 = 8.315270E-02;
      b5 = -1.228034E-02;
      b6 = 9.804036E-04;
      b7 = -4.413030E-05;
      b8 = 1.057734E-06;
      b9 = -1.052755E-08;
   }
   
   else if(thermocoupleVoltage < 54.886){
      b0 = -1.318058E+02;
      b1 = 4.830222E+01;
      b2 = -1.646031E+00;
      b3 = 5.464731E-02;
      b4 = -9.650715E-04;
      b5 = 8.802193E-06;
      b6 = -3.110810E-08;
      b7 = 0.000000E+00;
      b8 = 0.000000E+00;
      b9 = 0.000000E+00;
   }
   
   else {
      // TODO: handle error - out of range
      return 0;
   }
   
   return b0 +
      b1 * voltageSum +
      b2 * pow(voltageSum, 2.0) +
      b3 * pow(voltageSum, 3.0) +
      b4 * pow(voltageSum, 4.0) +
      b5 * pow(voltageSum, 5.0) +
      b6 * pow(voltageSum, 6.0) +
      b7 * pow(voltageSum, 7.0) +
      b8 * pow(voltageSum, 8.0) +
      b9 * pow(voltageSum, 9.0);
}


Memory Usage: 9% of UNO

Adafruit: could this be added to the library as another function? It obviously has a higher memory and time expense, but it is necessary for some applications.

Thanks again Pete, lifesaver!
- Jeff

jh421797
 
Posts: 7
Joined: Mon Jul 07, 2014 10:54 am

Re: Max 31855 Reading High Temperatures

by adafruit_support_bill on Wed May 13, 2015 10:10 am

Thanks Pete and Jeff,

I am in the process of writing a sensor calibration tutorial. If it is OK with you I'd like to include this code there, as well as in the existing thermocouple tutorial.

adafruit_support_bill
 
Posts: 80840
Joined: Sat Feb 07, 2009 10:11 am

Re: Max 31855 Reading High Temperatures

by jh421797 on Wed May 13, 2015 10:22 am

Yes, that's certainly fine with me.

You may want to look over the code, I did not test it across the entire temperature range.

- Jeff

jh421797
 
Posts: 7
Joined: Mon Jul 07, 2014 10:54 am

Re: Max 31855 Reading High Temperatures

by heypete on Wed May 13, 2015 10:24 am

jh421797 wrote:Wow Pete, thank you!

I've been tinkering around with this for a while thinking I was doing something wrong. This seems to have fixed it.

I was using a cheap eBay thermocouple, and switched to an Omega thermocouple thinking that was the issue. They do make very nice products.

Here are my results:

Freezer = -81 degC
Fluke Reading (same thermocouple as below) = -78.3 degC

Standard 31855 Reading vs This Corrected Reading: (2 sec intervals)
Sensor Read Time =67ms -68.25 degC Corrected Sensor Read Time =205ms -77.85 degC
Sensor Read Time =67ms -68.25 degC Corrected Sensor Read Time =206ms -77.85 degC
Sensor Read Time =66ms -68.25 degC Corrected Sensor Read Time =206ms -77.70 degC
Sensor Read Time =67ms -68.25 degC Corrected Sensor Read Time =206ms -77.85 degC
Sensor Read Time =66ms -68.25 degC Corrected Sensor Read Time =206ms -77.85 degC
Sensor Read Time =67ms -68.25 degC Corrected Sensor Read Time =206ms -77.85 degC
Sensor Read Time =66ms -68.25 degC Corrected Sensor Read Time =206ms -77.77 degC
Sensor Read Time =67ms -68.25 degC Corrected Sensor Read Time =206ms -77.85 degC
Sensor Read Time =66ms -68.25 degC Corrected Sensor Read Time =206ms -77.77 degC
Sensor Read Time =67ms -68.25 degC Corrected Sensor Read Time =206ms -77.93 degC
Sensor Read Time =66ms -68.25 degC Corrected Sensor Read Time =206ms -77.77 degC
Sensor Read Time =67ms -68.25 degC Corrected Sensor Read Time =205ms -77.85 degC
Sensor Read Time =66ms -68.25 degC Corrected Sensor Read Time =206ms -77.85 degC

[snip]

Thanks again Pete, lifesaver!
- Jeff


Woot! Those are excellent results. I'm glad the linearization method worked for you.

Out of curiosity, what did the cheap thermocouple read using the Fluke and MAX31855?

Cheers!
-Pete

heypete
 
Posts: 32
Joined: Sat Jan 11, 2014 4:50 pm

Re: Max 31855 Reading High Temperatures

by heypete on Wed May 13, 2015 10:38 am

Also, Maxim now sells the MAX31856. This is essentially the same as the MAX31855 except that it has a 19-bit (vs 14-bit) resolution, automatic removal of 50/60Hz line noise, and (most importantly to me) has a built in lookup table for the linearization parameters so it can output linearized, corrected temperature readings without needing to do the correction on one's microcontroller. It also supports a wide range of different thermocouple types and allows the user to use SPI to set which thermocouple type is being used.

Unfortunately, it's not drop-in replaceable for the MAX31855: it's a 14-pin package and requires some additional external capacitors, but otherwise should be pretty straightforward to implement. It'd be great if Adafruit could use this chip the next time it does a hardware refresh on the thermocouple board.

Cheers!
-Pete

heypete
 
Posts: 32
Joined: Sat Jan 11, 2014 4:50 pm

Please be positive and constructive with your questions and comments.