Max 31855 Reading High Temperatures
Moderators: adafruit_support_bill, adafruit
Please be positive and constructive with your questions and comments.
- coryjfowler
- Posts: 12
- Joined: Sat Oct 12, 2013 11:52 am
Re: Max 31855 Reading High Temperatures
This kind of linearity regression calculation should have been included in the IC. I wonder if Maxim overlooked this?
- diemkae
- Posts: 7
- Joined: Wed Jan 25, 2012 4:55 pm
Re: Max 31855 Reading High Temperatures
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.
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.
- coryjfowler
- Posts: 12
- Joined: Sat Oct 12, 2013 11:52 am
Re: Max 31855 Reading High Temperatures
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.
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.
- adafruit_support_mike
- Posts: 66992
- Joined: Thu Feb 11, 2010 2:51 pm
Re: Max 31855 Reading High Temperatures
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:
The +2C/-2C spec over the -200C to 700C range is subject to the following notes:
which looks consistent with the standard nonlinearity profile for a type-K thermocouple:
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
WRT information I can discuss publically, the datasheet (http://www.adafruit.com/datasheets/MAX31855.pdf) says:
Its calculation is based on a linear 41.276uV/C characteristic for a K-type thermocouple.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
The +2C/-2C spec over the -200C to 700C range is subject to the following notes:
The temperature data you listed plots out like so:Note 3: Guaranteed by design; not production tested.
Note 4: Not including cold-junction temperature error or thermocouple nonlinearity.
which looks consistent with the standard nonlinearity profile for a type-K thermocouple:
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
- coryjfowler
- Posts: 12
- Joined: Sat Oct 12, 2013 11:52 am
Re: Max 31855 Reading High Temperatures
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
Re: Max 31855 Reading High Temperatures
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.pdfadafruit_support_mike wrote:[...] this page from Maxim has a fair amount of information: http://www.maximintegrated.com/app-note ... vp/id/5032
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.
- adafruit_support_mike
- Posts: 66992
- Joined: Thu Feb 11, 2010 2:51 pm
Re: Max 31855 Reading High Temperatures
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.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.
- heypete
- Posts: 32
- Joined: Sat Jan 11, 2014 4:50 pm
Re: Max 31855 Reading High Temperatures
Hi Bob (or anyone else reading this thread),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?
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
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};
Code: Select all
const double MAXTEMF_K = 0.041276; // mV/deg C
const double MAXRJEMF_K = 0.040730; // mV/deg C
Code: Select all
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 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.Internal Temp = 21.69
C = -131.25
Corrected Temp = -174.53
-5.45 mv/C
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
emf = MAXTEMF_K*(c - thermocouple.readInternal());
Code: Select all
emf = MAXTEMF_K*c - MAXRJEMF_K*thermocouple.readInternal();
3. Any suggestions for improving things further? (Or pointing out parts where I've gone horribly wrong.)
Cheers!
-Pete
- jh421797
- Posts: 7
- Joined: Mon Jul 07, 2014 10:54 am
Re: Max 31855 Reading High Temperatures
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
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
- heypete
- Posts: 32
- Joined: Sat Jan 11, 2014 4:50 pm
Re: Max 31855 Reading High Temperatures
Hi Jeff,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
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
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
-
- Linearization information from Maxim.
- MAX31855 Linearized Thermocouple Temperature-1.png (249.71 KiB) Viewed 5947 times
- jh421797
- Posts: 7
- Joined: Mon Jul 07, 2014 10:54 am
Re: Max 31855 Reading High Temperatures
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:
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
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
// 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);
}
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
- adafruit_support_bill
- Posts: 87348
- Joined: Sat Feb 07, 2009 10:11 am
Re: Max 31855 Reading High Temperatures
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.
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.
- jh421797
- Posts: 7
- Joined: Mon Jul 07, 2014 10:54 am
Re: Max 31855 Reading High Temperatures
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
You may want to look over the code, I did not test it across the entire temperature range.
- Jeff
- heypete
- Posts: 32
- Joined: Sat Jan 11, 2014 4:50 pm
Re: Max 31855 Reading High Temperatures
Woot! Those are excellent results. I'm glad the linearization method worked for you.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
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
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
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
Please be positive and constructive with your questions and comments.