Embedded HandbookПриложения
Все разделы › XI. Датчики: подключение, схемы, драйверы
STM32F103, STM32F407 · уровень средний · 8 мин чтения
Открыть в интерактивном справочнике

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 Термопара и холодный спай

Термопара типа K на MAX31855: три провода SPI и два провода термопары

Напряжение термопары — это 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. Температуру из кадра с неисправностью не берут.

Кадр MAX31855: 32 бита, два числа со знаком и неисправность


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.

Ошибка MAX31855 от −200 до +1350 °C при холодном спае 25 °C: без поправки до +58,00 °C внизу и −37,75 °C вверху, после поправки таблицей — не больше 2,50 °C


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 Итоги

Дальше: раздел 104а «Паяльник на STM32: разбор IronOS — термопара в жале, ПИД и USB Power Delivery» — та же термопара, но внутри жала: её меряют встроенным АЦП между импульсами нагрева.

Открыть в интерактивном справочнике