104. Термопара: MAX31855 и MAX6675
DS18B20 кончается на +125 °C, термистор в стеклянном корпусе — на 250–300 °C, а печи, паяльнику и выхлопу нужна термопара. Это два провода из разных сплавов, сваренные на конце. Меряет она не температуру, а разность: напряжение появляется между горячим спаем и тем местом, где её провода переходят в медь, — холодным спаем. У типа K это около 41 мкВ на градус. MAX6675 и MAX31855 меряют эти микровольты, сами измеряют температуру холодного спая и отдают готовое число по SPI. Остаётся разобрать кадр — со знаком и битами неисправности — и поправить линейный пересчёт, которым MAX31855 заменяет настоящую характеристику термопары.
Шина SPI — раздел 18, температура до +125 °C — раздел 96, знак 24 бит — раздел 102, подключение модулей — раздел 95.
Как это называется в документации
Оригинал Перевод thermocouple термопара hot junction, measuring junction горячий (рабочий) спай cold junction, reference junction холодный спай cold-junction compensation (CJC) компенсация холодного спая Seebeck coefficient коэффициент Зеебека: микровольт на градус type K (chromel–alumel) тип K (хромель — алюмель) thermoelectric voltage, EMF термо-ЭДС extension wire удлинительный термопарный провод grounded / ungrounded junction спай, соединённый с корпусом / изолированный спай open circuit (OC) обрыв short to GND / VCC (SCG / SCV) замыкание на землю / на питание linearization поправка на нелинейность
104.1 Термопара и холодный спай
Напряжение термопары — это E(горячий) − E(холодный), где E — стандартная таблица термо-ЭДС своего типа. Для типа K:
| Температура | Термо-ЭДС |
|---|---|
| −200 °C | −5,891 мВ |
| −100 °C | −3,554 мВ |
| 25 °C | 1,000 мВ |
| 100 °C | 4,096 мВ |
| 500 °C | 20,644 мВ |
| 1000 °C | 41,276 мВ |
Поэтому преобразователь меряет две вещи: напряжение термопары и свою температуру — она и есть температура холодного спая, если провода термопары приходят прямо к его выводам. Шаг 0,25 °C — это 10,3 мкВ: такое напряжение встроенному АЦП микроконтроллера не различить.
104.2 Два преобразователя
| MAX6675 | MAX31855K | |
|---|---|---|
| Кадр | 16 бит | 32 бита |
| Температура | 0 … 1023,75 °C, без знака | −200 … +1350 °C для типа K, со знаком |
| Шаг | 0,25 °C | 0,25 °C; холодный спай — 0,0625 °C |
| Неисправности | «термопары нет» | обрыв, замыкание на землю, замыкание на питание |
| Питание | 3,0 … 5,5 В | 3,0 … 3,6 В |
| Измерение | до 0,22 с | до 0,1 с |
| SCK | до 4,3 МГц | до 5 МГц |
MAX31855 выпускают под разные типы термопар — буква в конце названия говорит, под какой; MAX6675 — только для типа K.
104.3 SPI только на приём
Обе микросхемы только отдают: пока CS в нуле, на каждый такт SCK выходит очередной бит, старшим вперёд. MOSI не нужен, но SPI микроконтроллера всё равно передаёт — ради тактов. Режим 0, кадр 16 бит:
void tc_spi_init(void)
{
#if defined(STM32F10X_MD)
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_SPI1EN;
GPIOA->CRL = (GPIOA->CRL & ~0x0FFF0000u) | 0x04B30000u; /* PA4 выход, PA5 альт. выход, PA6 вход */
#else
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
GPIOA->MODER = (GPIOA->MODER & ~0x3F00u) | 0x2900u; /* PA4 выход, PA5 и PA6 — AF */
GPIOA->AFR[0] = (GPIOA->AFR[0] & ~0x0FF00000u) | 0x05500000u; /* AF5 — SPI1 */
#endif
GPIOA->BSRR = 1u << 4; /* CS в единице */
SPI1->CR1 = SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_DFF | (TC_BR << 3);
SPI1->CR1 |= SPI_CR1_SPE;
}
Делитель частоты — 32. У F103 SPI1 тактируется от 72 МГц, и SCK получается
2,25 МГц, у F407 от 84 МГц — 2,625 МГц. С делителем 16 было бы 4,5
и 5,25 МГц — выше предела MAX6675; это ловят два _Static_assert при
сборке. Весь кадр MAX31855 — 14,2 мкс.
uint32_t tc_read(unsigned words)
{
GPIOA->BSRR = 1u << (4 + 16); /* CS в ноль: текущее преобразование прерывается */
uint32_t v = tc_xfer16();
if (words == 2)
v = v << 16 | tc_xfer16();
while (SPI1->SR & SPI_SR_BSY) {}
GPIOA->BSRR = 1u << 4; /* CS в единицу: пошло новое преобразование */
return v;
}
Опущенный CS прерывает текущее измерение, поднятый — запускает новое. MAX6675 меряет до 0,22 с: если читать чаще, число не обновится никогда. Поэтому опрашивают не чаще раза в 250 мс.
104.4 Кадр MAX6675
D15 — всегда ноль, D14…D3 — температура в четвертях градуса, D2 — единица, если термопары нет:
int32_t max6675_q(uint16_t frame)
{
if (frame & MAX6675_OPEN)
return -1;
return (int32_t)(frame >> 3);
}
Модель: код 100 — это 25,00 °C, 4095 — предел 1023,75 °C, а тот же код с поднятым D2 — −1, «термопары нет». Отрицательных температур MAX6675 не знает.
104.5 Кадр MAX31855: знак и неисправности
В 32-битном кадре два числа со знаком: горячий спай — 14 бит в D31…D18, в четвертях градуса, и холодный — 12 бит в D15…D4, в шестнадцатых. Оба — в дополнительном коде, и знак расширяют так же, как у HX711:
int32_t max31855_hot_q(uint32_t frame)
{
uint32_t v = frame >> 18;
return (v & 0x2000u) ? (int32_t)(v | 0xFFFFC000u) : (int32_t)v;
}
int32_t max31855_cold_q(uint32_t frame)
{
uint32_t v = (frame >> 4) & 0xFFFu;
return (v & 0x800u) ? (int32_t)(v | 0xFFFFF000u) : (int32_t)v;
}
Проверка по кодам из документации: 0x1900 — это 1600,00 °C, 0x3C18 — −250,00 °C, 0x3FFF — −0,25 °C; холодный спай 0x7F0 — 127 °C, 0xC90 — −55 °C. Без расширения знака −250 °C превратились бы в 3846,00 °C.
Бит D16 говорит, что неисправность есть, а D2…D0 — какая:
unsigned max31855_fault(uint32_t frame)
{
return (frame & MAX31855_FAULT) ? (unsigned)(frame & 7u) : 0u;
}
Модель с обрывом, замыканием на землю и на питание даёт 1, 2 и 4, исправная — 0. Температуру из кадра с неисправностью не берут.
104.6 Поправка на нелинейность
MAX31855 переводит напряжение в градусы одним коэффициентом: делит его на 41,276 мкВ/°C и прибавляет температуру холодного спая. Это точная термо-ЭДС на 1000 °C, делённая на 1000, — средний наклон от 0 до 1000 °C. Термопара нелинейна, и в стороне от этого участка ошибка растёт. Модель при холодном спае 25 °C:
| Горячий спай | MAX31855 | После поправки |
|---|---|---|
| −200 °C | −142,00 | −199,75 |
| −100 °C | −85,25 | −99,75 |
| 100 °C | 100,00 | 100,00 |
| 300 °C | 296,50 | 300,00 |
| 800 °C | 807,00 | 800,25 |
| 1200 °C | 1184,00 | 1200,25 |
| 1350 °C | 1312,25 | 1350,00 |
Поправка идёт обратно: из показаний восстанавливают напряжение, которое видел чип, добавляют термо-ЭДС холодного спая и находят температуру по стандартной таблице — 32 узла через 50 °C, 128 байт:
static const int32_t K_UV[K_N] = {
-5891, -4913, -3554, -1889, 0, 2023, 4096, 6138,
8138, 10153, 12209, 14293, 16397, 18516, 20644, 22776,
24905, 27025, 29129, 31213, 33275, 35313, 37326, 39314,
41276, 43211, 45119, 46995, 48838, 50644, 52410, 54138,
};
int32_t max31855_true_q(uint32_t frame)
{
int32_t hot = max31855_hot_q(frame), cold = max31855_cold_q(frame);
int32_t uv = (int32_t)((int64_t)(hot * 4 - cold) * 41276 / 16000); /* что увидел чип */
return k_q(uv + k_uv(cold));
}
k_uv и k_q — линейная интерполяция между узлами, в одну и в другую
сторону. На прогоне от −200 до +1350 °C через 0,5 °C ошибка без поправки
доходит до 58,00 °C ниже нуля и до 37,75 °C выше; после поправки —
не больше 2,50 и 0,50 °C. Поправка учитывает и холодный спай: 500 °C
при 25 °C на плате чип показывает как 501,00, при 50 °C — как 501,25,
а после поправки выходит 500,25 и 500,00.
104.7 Грабли
−250 °C читается как 3846 °C. 14-битный код без расширения знака.
Показания MAX6675 не меняются. CS опускают чаще, чем раз в 0,22 с, — каждое чтение прерывает измерение. Читать раз в 250 мс.
При нагреве температура падает. Провода термопары перепутаны: плюс и минус меняют знак напряжения.
Показания уходят, когда греются клеммы. Термопару удлинили медным проводом: холодный спай переехал на клеммы, а преобразователь меряет свою температуру. Удлинять только термопарным проводом того же типа.
Ошибка SCG при целой термопаре. Спай касается заземлённого металла, и MAX31855 видит замыкание на землю. Нужна термопара с изолированным спаем.
В печи 1200 °C, а на экране 1184. Линейный пересчёт MAX31855 без поправки.
MAX31855 не отвечает или греется. Его питают от 5 В, а он рассчитан на 3,0 … 3,6 В.
104.8 Итоги
- Термопара даёт разность: горячий спай минус холодный. Тип K — около 41 мкВ/°C, шаг 0,25 °C — 10,3 мкВ.
- MAX6675 — 16 бит, 0 … 1023,75 °C и только «термопары нет»; MAX31855 — 32 бита со знаком, холодный спай и три неисправности, питание только 3,3 В.
- SPI только на приём, SCK не выше 4,3 МГц — делитель 32; CS не опускать чаще раза в 250 мс.
- Знак 14 и 12 бит расширять, неисправность проверять раньше температуры.
- Линейный пересчёт MAX31855 ошибается до 37,75 °C выше нуля и 58 °C ниже; таблица из 32 узлов сводит ошибку к 0,5 и 2,5 °C.
Дальше: раздел 104а «Паяльник на STM32: разбор IronOS — термопара в жале, ПИД и USB Power Delivery» — та же термопара, но внутри жала: её меряют встроенным АЦП между импульсами нагрева.