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:

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:

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:

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…
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.
The performance of the TOM thermocouple doesn’t surprise me since it appears that they didn’t pay attention to the MAX6675 data sheet:
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.