Thermocouple Calibration: Linear Regression

With the thermistors nestled all snug in their wells, I turned on the heat and recorded the temperatures. I picked currents roughly corresponding to the wattages shown, only realizing after the fact that I’d been doing the calculation for the 5 Ω Thing-O-Matic resistors, not the 6 Ω resistor I was actually using. Doesn’t matter, as the numbers depend only on the temperatures, not the wattage.

This would be significantly easier if I had a thermocouple with a known-good calibration, but I don’t. Assuming that the real temperature lies somewhere near the average of the six measurements is the best I can do, so … onward!

Plotting the data against the average at each measurement produces a cheerful upward-and-to-the-right graph:

Data vs Ensemble Average
Data vs Ensemble Average

So the thermocouples seem reasonably consistent.

Plotting the difference between each measurement and the average of all the measurements at that data point produces this disconcertingly jaggy result:

Difference from Ensemble Average
Difference from Ensemble Average

The TOM thermocouple seems, um, different, which is odd, because the MAX6675 converts directly from thermocouple voltage to digital output with no intervening software. It’s not clear what’s going on; I don’t know if the bead was slightly out of its well or if that’s an actual calibration difference. I’ll check it later, but for now I will simply run with the measurements.

Eliminating the TOM data from the average produces a better clustering of the remaining five readings, with the TOM being even further off. The regression lines show the least-squares fit to each set of points, which look pretty good:

Difference from Average without TOM
Difference from Average without TOM

Those regression lines give the offset and slope of the best-fit line that goes from the average reading to the actual reading, but I really need an equation from the actual reading for each thermocouple to the combined average. Rather than producing half a dozen graphs, I applied the spreadsheet’s SLOPE() and INTERCEPT() functions with the average temperature as Y and the measured temperature as X.

That produced this table:

                    TOM     MPJA  Craftsman A  Craftsman B   Fluke T1  Fluke T2
M = slope        1.0534   0.5434       0.5551       0.5539     1.0112    1.0154
B = intercept   -1.6073 -15.3703     -19.4186     -16.9981    -0.7421   -0.3906

And then, given a reading from any of the thermocouples, converting that value to the average requires plugging the appropriate values from that table into good old

  • y = mx + b

For example, converting the Fluke 52 T1 readings produces this table of values. The Adjusted column shows the result of that equation and the Delta Avg column gives the difference from the average temperature (not shown here) for that reading.

Fluke T1    Adjusted   Delta Avg   Max Abs Err
21.0        20.5        -0.4          0.78
29.0        28.6        -0.3
34.8        34.4        -0.3
45.5        45.3        -0.2
50.1        49.9         0.0
52.0        51.8         0.2
69.3        69.3         0.3
76.4        76.5         0.4
78.9        79.0         0.6
107.9       108.4         0.2
112.3       112.8         0.4
117.5       118.1         0.3
127.8       128.5        -0.2
133.2       134.0         0.1
136.6       137.4         0.1
138.1       138.9         0.1
146.4       147.3        -0.4
155.8       156.8        -0.8

The Max Avg Error (the largest value of the absolute difference from the average temperature at each point) after correction is 0.78 °C for this set. The others are less than that, with the exception of the TOM thermocouple, which differs by 1.81 °C.

So now I can make a whole bunch of temperature readings, adjust them to the same “standard”, and be off by (generally) less than 1 °C. That’s much better than the 10 °C of the unadjusted readings and seems entirely close enough for what I need…

11 thoughts on “Thermocouple Calibration: Linear Regression

  1. why not calibrate against the triple & boiling points of water and a few other things? seems the obvious approach. at least as a reality check on the ensemble average.

  2. The performance of the TOM thermocouple doesn’t surprise me since it appears that they didn’t pay attention to the MAX6675 data sheet:

    Optimal performance from the MAX6675 is achieved
    when the thermocouple cold junction and the MAX6675
    are at the same temperature. Avoid placing heat-generating
    devices or components near the MAX6675
    because this may produce cold-junction-related errors.

    1. Yeah, having those MOSFETs a few cm away isn’t optimal, but I think the terminal block and the MAX6675 are pretty nearly the same temperature anyway.

      The results from tests on the full-up core indicate that the bead wasn’t tucked securely in its allegedly isothermal well, so I think it’s doing better than that chart shows. It doesn’t make much difference in the tests, as I always compared it with another bead in a similar location because I didn’t quite trust it.

Comments are closed.