Урок 27. Термопары в системе Ардуино. Проект Ардуино термометра-регистратора для высоких температур.

Термопара TP-01A

Серия статей об измерении температуры контроллерами Ардуино была бы неполной, без рассказа о термопарах. Тем более что измерять высокие температуры больше нечем.

Предыдущий урок     Список уроков     Следующий урок

Термопары (термоэлектрические преобразователи).

Все термодатчики из предыдущих уроков позволяли измерять температуру в диапазоне не шире – 55 … + 150 °C. Для измерения более высоких температур самыми распространенными датчиками являются термопары. Они:

  • имеют крайне широкий диапазон измерения температуры -250 … +2500 °C;
  • могут быть откалиброваны на высокую точность измерения, до погрешности не более 0,01 °C;
  • как правило, имеют низкую цену;
  • считаются надежными датчиками температуры.

Главный недостаток термопар – это необходимость в достаточно сложном прецизионном измерителе, который должен обеспечивать:

  • измерение низких значений термо-ЭДС с верхним значением диапазона десятки, а иногда и единицы мВ;
  • компенсацию термо-ЭДС холодного спая;
  • линеаризацию характеристики термопары.

 

Принцип действия термопар.

Принцип действия датчиков такого типа основан на термоэлектрическом эффекте (эффекте Зеебека). Поэтому другое название термопары – термоэлектрический преобразователь.

В цепи между соединенными разнородными металлами образовывается разность потенциалов. Ее величина зависит от температуры. Поэтому она называется термо-ЭДС. У разных материалов величина термо-ЭДС разная.

Термопара

Если в цепи стыки (спаи) разнородных проводников связаны в кольцо и имеют одинаковую температуру, то сумма термо-ЭДС равна нулю. Если же спаи проводов находятся при разных температурах, то общая разность потенциалов между ними зависит от разности температур. В результате мы приходим к конструкции термопары.

Устройство термопары

Два разнородных металла 1 и 2 в одной точке образуют рабочий спай. Рабочий спай помещают в точку, температуру которой необходимо измерить.

Рабочий спай

Холодные спаи это точки подключения металлов термопары к другому металлу, как правило, к меди. Это могут быть клеммные колодки измерительного прибора или медные провода связи с термопарой. В любом случае необходимо измерять температуру холодного спая и учитывать ее в вычислениях измеренной температуры.

Основные типы термопар.

Наиболее широкое распространение получили термопары ХК (хромель – копель) и ХА (хромель – алюмель).

Название Обозначение НСХ Материалы Диапазон измерения, °C Чувствительность, мкВ/°C, (при температуре, °C) Термо-ЭДС, мВ, при 100 °C
ТХК (хромель-копелевые) L Хромель, копель - 200 … + 800 64 (0)

88 (600)

6,86
ТХА (хромель-алюмель) K Хромель, алюмель - 270 … +1372 35 (0)

42 (1300)

4,10
ТПР (платино-родиевые) B Платинородий, платина 100 … 1820 8 (1000)

12 (1800)

0, 03
ТВР (вольфрам-рениевые) A Вольфрам-рений, вольфрам-рений 0 … 2500 14 (1300)

7 (2500)

1,34

 

Как практически измерять температуру с помощью термопары. Методика измерения.

Номинальная статическая характеристика (НСХ) термопары задана в виде таблицы с двумя столбцами: температура рабочего спая и термо-ЭДС. ГОСТ Р 8.585-2001 содержит НСХ термопар разных типов, заданные для каждого градуса. Можно загрузить в PDF формате по этой ссылке ГОСТ Р 8.585-2001.

Для измерения температуры с помощью термопары необходимо выполнить следующие действия:

  • измерить термо-ЭДС термопары (E общ.);
  • измерить температуру холодного спая (T хол. спая);
  • по таблице НСХ термопары определить термо-ЭДС холодного спая, используя температуру холодного спая (E хол. спая);
  • определить термо-ЭДС рабочего спая, т.е. прибавить ЭДС холодного спая к общей термо-ЭДС (  E раб. спая = E общ. + E хол. спая  );
  • по таблице НСХ определить температуру рабочего спая, используя термо-ЭДС рабочего спая.

Вот пример, как я замерил с помощью термопары типа ТХА температуру жала паяльника.

  • Прикоснулся рабочим спаем к жалу паяльника, замерил напряжение на выводах термопары. Получилось 10,6 мВ.
  • Температура окружающей среды, т.е. температура холодного спая – примерно 25 °C. ЭДС холодного спая из таблицы ГОСТ Р 8.585-2001 для термопары типа K при 25 °C равна 1 мВ.
  • Термо-ЭДС рабочего спая равна 10,6 + 1 = 11,6 мВ.
  • Температура из той же таблицы для 11,6 мВ равна 285 °C. Это и есть измеренное значение.

Такую последовательность действий нам надо реализовать в программе Ардуино термометра.

 

Ардуино термометр для измерения высоких температур с помощью термопары типа ТХА.

У меня нашлась термопара TP-01A. Типичная, широко распространенная ТХА термопара от тестера. Ее я и буду использовать в термометре.

Термопара TP-01A

На упаковке указаны параметры:

  • тип K;
  • диапазон измерения – 60 … + 400 °C;
  • точность ±2,5 % в диапазоне до 400 °C.

Диапазон измерения указан для кабеля из стекловолокна. Существует похожая термопара TP-02, но с зондом длиной 10 см.

Термопара TP-02

У TP-02 верхняя граница измерения 700 °C . Значит, будем разрабатывать термометр:

  • для термопары типа ТХА;
  •  с диапазоном  измерения – 60 … + 700 °C.

Разобравшись в программе и схеме устройства, Вы сможете создать измеритель для  термопар любых типов с любым диапазоном измерения.

Остальные функциональные возможности термометра такие же, как у устройств из трех предыдущих уроков, включая функцию регистрации изменения температуры.

Схема Ардуино термометра для термопары.

Мы должны подключить к плате Ардуино:

  • светодиодный семисегментный индикатор;
  • датчик температуры холодного спая, я использовал  TMP36;
  • термопару.

Первые два элемента мы подключали в предыдущих уроках об измерении температуры. А вот для подключения термопары к плате Ардуино необходимо разработать прецизионный усилитель. Не очень простая задача.

Схема измерительного усилителя для термопары.

Сформируем требования к усилителю.

  • Диапазон входного напряжения – 2,24 … + 29,13 мВ. Это крайние значения термо-ЭДС для нашего диапазона измерения (–60 … + 700 °C). Взяты из ГОСТ Р 8.585-2001 для термопары типа K. Но это для температуры холодного спая равной 0 °C. Расширим диапазон еще на 2 мВ с учетом максимальной температуры холодного спая + 40 °C. В результате для термопары типа ТХА:
Тип термопары ТХА
Диапазон измеряемой температуры –6 0 … + 700 °C
Диапазон температуры холодного спая 0 … + 40 °C
Диапазон входного напряжения - 4,3 … + 30 мВ
  • Диапазон выходного напряжения усилителя 0 … 1,1 В. Очевидно, для того чтобы коэффициент усиления был меньше выберем минимальное опорное напряжение АЦП, т.е 1,1 В.
  • Коэффициент усиления  1100 / (4,3 + 30) = 32 , смещение для измерения отрицательного напряжения + 4,3 мВ.
Выходное напряжение 0 … 1100 мВ
Коэффициент усиления 32
Смещение + 4,3 мВ

Эти параметры надо несколько расширить, чтобы был запас на погрешности элементов усилителя. Все погрешности мы скомпенсируем в программе.

Теперь непосредственно о схеме измерительного усилителя. Я построил его по схеме неинвертирующего усилителя на основе операционного усилителя (ОУ). В качестве ОУ я выбрал OP07. Это прецизионный операционный усилитель с низким напряжением смещения, низким входным током, высоким коэффициентом усиления.

В связи с этим я полностью отказался от аналоговых регулировок, т.е. с помощью подстроечных резисторов, и заменил их программными коэффициентами.

Схема усилителя для термопары выглядит так.

Схема усилителя термопары

Коэффициент усиления задают резисторы R2 и R3.

K = R3 / R2 + 1

Я выбрал K = 43 / 1.6 + 1 = 27.875.

Резисторы R4 и R5 задают смещение + 5,1 мВ, необходимое для измерения температуры ниже 0. Термо-ЭДС в этом случае имеет отрицательное значение и для того, чтобы измерить его с помощью однополярного АЦП необходимо сместить в положительную сторону. Смещение учтем в программе.

Конденсаторы обеспечивают аналоговую фильтрацию наводок и помех. При таких низких уровнях сигнала это абсолютно необходимо. Дополнительно в программе реализована цифровая фильтрация сигнала.

Для того, чтобы усилитель работал при выходных напряжениях близких к нулю необходимо обеспечить двух полярное питание ОУ. Подключать дополнительный блок питания к устройству желания нет. Отрицательное напряжение питания можно получить из платы Ардуино с помощью следующей простой схемы.

Схема формирования отрицательного питания

На цифровом выводе платы Ардуино формируется сигнал с формой меандр и логическими уровнями 0 и 5 В. Можно сформировать его с помощью аппаратного ШИМ, но мы сделаем программно. В обработчике прерывания от таймера 2 мс поставим команду инверсии состояния вывода. Получится прямоугольный сигнал с периодом 4 мс.

  • При высоком уровне сигнала конденсатор C8 заряжается по цепи: выход контроллера, резистор R8, диод VD1.
  • При низком уровне – разряжается на конденсатор C9 по цепи: выход контроллера, резистор R8, диод VD2.
  • В результате на конденсаторе C9 формируется напряжение приблизительно - 4 В.

Полностью принципиальная схема Ардуино термометра для термопары выглядит так.

Схема Ардуино термометра для термопары

В качестве резисторов R3, R4, R5, R6 желательно использовать точные, термостабильные элементы. Я использовал обыкновенные резисторы с точностью 5%. Предварительно замерил их реальное сопротивление и учел это в программе.

Для отладки программы и проверки работы устройства я собрал его на макетной плате.

Макет устройства

Измеритель я спаял отдельным макетом. На беспаечной макетной плате он вряд ли бы заработал. Все связи должны быть минимальной длины, все соединения компонентов – надежно спаянными.

Макет измерительного усилителя

 

Резидентная программа Ардуино термометра для термопары.

Программное обеспечение устройства отличается от программ термометров из трех предыдущих уроков только блоком вычисления температуры рабочего спая термопары. Я не буду приводить всю программу термометра в статье. Покажу только программные модули обработки данных термопары.

Полностью резидентную программу термометра для термопары можно загрузить по этой ссылке.

Я напомню, последовательность действий, которую необходимо выполнить в программе:

  • измерить термо-ЭДС на выводах термопары;
  • измерить температуру холодного спая;
  • по таблице НСХ термопары определить термо-ЭДС холодного спая;
  • определить термо-ЭДС рабочего спая, т.е. прибавить ЭДС холодного спая к общей термо-ЭДС;
  • по таблице НСХ термопары определить температуру рабочего спая, используя термо-ЭДС рабочего спая.

Прежде всего, в программе  необходима таблица номинальной статической характеристики (НСХ) термопары. Возьмем ее из ГОСТ Р 8.585-2001 для термопары типа K. В документе она задана для каждого градуса.

Нам необходима часть таблицы от – 60 до + 700 °C. Массив значений термо ЭДС для термопары будет выглядеть так.

float termTable[761] = {  
  -2.243,-2.208,-2.173, … ,
…………………… 

  29.129  };

Нулевой элемент массива содержит значение термо-ЭДС для температуры – 60 °C, 760 элемент – для + 700 °C.

Не думайте, что я набирал массив termTable вручную. Я создал его в текстовом виде, затем сделал автозамену пробелов на запятые.

Массив имеет размер 761 элемент. Каждое значение типа float, т.е. 4 байта. Для создания такого массива в ОЗУ не хватит места. Да и зачем он в ОЗУ, если мы его не собираемся менять. Поэтому массив надо разместить в программной памяти, т.е. FLASH памяти.

 

Размещение данных в программной памяти (FLASH памяти). Модификатор PROGMEM.

В памяти программ могут размещаться только данные, которые не требуется изменять в ходе выполнения программы. Я вижу две основные причины хранения данных во FLASH памяти:

  • недостаточно оперативной памяти для хранения данных;
  • данные требуют высокой надежности хранения, они не должны измениться даже при сбое работы программы.

В Ардуино функции управления данными в памяти программ предоставляет библиотека pgmspace.h. Поэтому, прежде всего, необходимо подключить эту библиотеку.

Искать ее в интернете и загружать не надо. Это стандартная библиотека, находится в папке Arduino. У меня в D:\Arduino\hardware\tools\avr\avr\include\avr\ pgmspace.h. Просто напишите:

#include <avr/pgmspace.h>

Теперь при описании любой переменной можно использовать модификатор PROGMEM, который и сообщает компилятору о том, что данные необходимо разместить в памяти программы. В общем случае это выглядит так:

const  PROGMEM dataTyp name[] = { dt0, dt1, …};

  • dataTyp – тип переменной;
  • name – имя.

В нашем случае мы размещаем во FLASH памяти массив типа float:

const PROGMEM float termTable [761] = {
  -2.243,-2.208,-2.173, … ,
  …………………………………………………………………………
  29.129 };

Для чтения данных программной памяти в библиотеке pgmspace.h существуют специальные функции. Для разных типов данных используются разные функции:

  • для чтения байта - pgm_read_byte(address_short);
  • для чтения двух байтов -  pgm_read_word(address_short);
  • для чтения четырех байтов - pgm_read_dword(address_short);
  • для чтения данных с плавающей запятой - pgm_read_float(address_short).

Например, чтение 60 элемента из нашего массива termTable[] типа float будет выглядеть так:

coolEDS = pgm_read_float(termTable + 60);

 

Вычисление температуры рабочего спая термопары.

Последовательность действий для определения температуры описана выше. В программе термометра она реализована следующим образом:

  • Температура холодного спая вычисляется так же, как и в уроке 24 для датчика TMP36. В уроке написано, какие изменения следует сделать при использовании термодатчика LM35.
  • Определение термо-ЭДС – это измерение напряжения на аналоговом входе. Подробно описано в уроке 13. EDS_OFFSET – константа учитывающая смещение для измерения отрицательных температур.
  • ЭДС холодного спая определяется по температуре холодного спая из массива termTable[].
  • Температура рабочего спая также определяется из массива termTable[], только наоборот вычисляется номер элемента массива по его значению. Я использовал не перебор всех значений массива  последовательно, а метод последовательного приближения. Определил, в какой половине массива находится требуемое значение, затем в какой четверти и т.д. Это значительно ускорило выполнение программы.

Для отладки термометра я вывел на компьютер кроме измеренной температуры:  температуру холодного спая, термо ЭДС, ЭДС холодного спая и ЭДС рабочего спая.

    // вычисление температуры холодного спая
    coolTemperature = (int)(((float)averageTemp * ADC_RESOLUTION / 500. - OFFSET ) / SCALE_FACTOR);

    // вычисление термо ЭДС
    termoEDS = (float)averageTermoEDS * ADC_RESOLUTION / 500. / (R4 / R3 + 1) - EDS_OFFSET;

    // вычисление ЭДС холодного спая
    coolEDS = pgm_read_float(termTable + coolTemperature + 60);

    // вычисление ЭДС рабочего спая
    workEDS = termoEDS + coolEDS;
   
    // вычисление температуры рабочего спая
    temperature = 0;
    if ( workEDS >= pgm_read_float(termTable + temperature + 380))  temperature += 380; 
    if ( workEDS >= pgm_read_float(termTable + temperature + 190))  temperature += 190; 
    if ( workEDS >= pgm_read_float(termTable + temperature + 95))  temperature += 95; 
    if ( workEDS >= pgm_read_float(termTable + temperature + 48))  temperature += 48; 
    if ( workEDS >= pgm_read_float(termTable + temperature + 24))  temperature += 24; 
    if ( workEDS >= pgm_read_float(termTable + temperature + 12))  temperature += 12; 
    if ( workEDS >= pgm_read_float(termTable + temperature + 6))  temperature += 6; 
    if ( workEDS >= pgm_read_float(termTable + temperature + 3))  temperature += 3; 
    if ( workEDS >= pgm_read_float(termTable + temperature + 2))  temperature += 2; 
    if ( temperature < 760 ) {
      if ( workEDS >= pgm_read_float(termTable + temperature + 1))  temperature += 1;       
    }
    temperature -= 60;
   
    // вывод температуры на LED индикатор
    if (temperature >= 0) {
      // температура положительна
      disp.print((int)(temperature), 4, 1);  
    }
    else {
      // температура отрицательная
      disp.digit[3]= 0x40;  // отображается минус
      disp.print((int)(temperature * -1), 3, 1);        
    }     
                             
    // передача температуры рабочего спая на компьютер
    Serial.println(temperature);
/*
    // передача температуры холодного спая на компьютер
    Serial.print(" CoolTemp= ");  Serial.print(coolTemperature);

    // передача термо ЭДС на компьютер
    Serial.print(" TermoEDS= ");  Serial.print(termoEDS);

    // передача ЭДС холодного спая на компьютер
    Serial.print(" CoolEDS= ");  Serial.print(coolEDS);

    // передача ЭДС рабочего спая на компьютер
    Serial.print(" WorkEDS= ");  Serial.println(workEDS);   
*/           

Для использования термометра с программой верхнего уровня Thermometer.exe из предыдущих уроков передачу этих данных на компьютер необходимо отключить, оставив только измеренную температуру.

Загрузить резидентную программу Ардуино термометра для термопары.

Настройка и калибровка термометра.

Для практического использование измерительный усилитель термометра должен обладать достаточно высокими метрологическими характеристиками. Я решил избежать применения всякого рода регулировок подстроечными резисторами, и все калибровки выполнил программно. Конечно, желательно использовать в  качестве резисторов R3, R4, R5, R6 точные, термостабильные элементы. Но и на 5% резисторах можно получить неплохие результаты при использовании термометра в условиях без значительных колебаний температуры окружающей среды.

Я выполнил следующую последовательность действий:

  • Измерил вольтметром напряжение источника опорного напряжения АЦП платы (1.1 В) и рассчитал разрешающую способность АЦП:

#define ADC_RESOLUTION  1.061523 // разрешающая способность АЦП, мВ (1087 мВ / 1024)

  • Предварительно замерил сопротивление резисторов  R3, R4 и задал в программе их значения:

#define R3  1.61    // сопротивление резистора R3, кОм
#define R4  44.2    // сопротивление резистора R4, кОм

  • Замерил смещение ЭДС на резисторе R5 и задал его в программе:

#define EDS_OFFSET  4.60  // смещение термо-ЭДС

  • Затем расположил рабочий спай рядом с холодным спаем (можно замкнуть выводы термопары) и подкорректировал EDS_OFFSET так, чтобы термо-ЭДС была равна 0. Значение термо-ЭДС контролировал в мониторе последовательного порта Arduino IDE.

Калибровка устройства

Таким образом, мы скорректировали все погрешности, кроме температурных и временных.

 

Использование Ардуино термометра совместно с персональным компьютером.

При подключении термометра к компьютеру функциональные возможности устройства расширяются. В частности появляется функция регистрации изменения температуры.

На компьютере должна быть установлена программа Thermometer из урока 24. В этом уроке есть подробное описание программы, там же можно загрузить саму программу.

Показания термометра

Вот диаграмма изменения температуры в закипающем чайнике. Резкое падение температуры в конце диаграммы – это я вытащил термопару из воды. Можно видеть какой малой инерционностью обладает термопара.

Диаграмма регистратора

Затем я сунул рабочий спай в лед из холодильника.

Показания термометра

Это диаграмма.

Диаграмма регистратора

Мне кажется, в моем устройстве градуса на 2 привирает датчик температуры холодного спая. В остальном термометр получился довольно точный.

 

По крайней мере, мы использовали самую точную методику измерения температуры с помощью термопары.

Предыдущий урок     Список уроков     Следующий урок

16 комментариев на «Урок 27. Термопары в системе Ардуино. Проект Ардуино термометра-регистратора для высоких температур.»

  1. А если нужно 2 термопары, то придётся собирать 2 схемы на ОУ (от А1 до А2 на вашей принципиальной схеме). Ну и конечно же указывать в коде усреднение между двумя измеренными значениями. Я верно понял?

    • Здравствуйте!
      Нет, не обязательно. Можно использовать аналоговый коммутатор для термопар. Я когда-то делал измеритель температуры, в котором через коммутатор к одному АЦП подключались 24 термопары.

      • Я только начал свой путь) и он будет долгим и тернистым, можете пожалуйста показать где я могу подробнее прочитать про необходимый коммутатор?

        • Здравствуйте!
          Речь идет о любом аналоговом коммутаторе, лучше дифференциальном. Если желаете, откройте тему на форуме я найду старую схему контроллера термопар и выложу там.

          • Думаю для меня будет проще собрать с двумя ОУ т.к. термопары нужно всего 2. Спасибо за крайне подробные уроки)

          • Если я подключу 2 термопары через 2 ОУ, могли я объеденить у них контакт который идёт на AREF. Если нет, то как выйти из ситуации?

          • Вы можете объединить термопары в точке +5.1 мВ.

          • Минус к минусу термопары соединяются возле C3,R5,R6 (в один AREF), а плюсы идут к разным ОУ. Верно?
            Что Вы можете сказать о точности измерений, если использовать 2 MAX31855 ?

          • Да, вы правильно поняли. А что касается ОУ, то надо посмотреть параметр напряжение смещения 0. Именно он даст основную погрешность. Можете его в температуру пересчитать и решить, устроит ли вас такая точность.

  2. На основе Вашего урока вышла следующая схема.
    https://easyeda.com/lifequip/TempReader-49db1ed756ec46728e21d5d55470c264
    Без опытного образца скетч писать не было желания

    • Здравствуйте!
      Думаю, проще было использовать аналоговые коммутаторы.
      Отрицательное питание можно сделать общее. Датчик TMP36 должен быть расположен в месте холодного спая, т.е. в месте подключения выводов термопар к клеммникам или разъемам.

      • Спасибо за совет с отрицательным питанием)
        А ещё такой вопрос. Какой предел измерения температуры у ОУ OP07? И какой параметр определяет предел?
        Какой пример коммутатора Вы могли бы посоветовать?

        • Здравствуйте!
          Предел измерения температуры определяет прежде всего термопара. Усилитель на ОУ должен иметь такой коэффициент усиления, чтобы преобразовать диапазон термоэдс термопары во входной диапазон АЦП Ардуино (в нашем случае 0 … 1,1 В). В уроке есть пояснения по этому поводу.
          Можно использовать любой аналоговый коммутатор. Лучше с двумя каналами, чтобы переключать сразу оба вывода термопары. Таким образом можно сделать на одном усилителе и АЦП подключение нескольких термопар. Я когда-то подключал через аналоговый коммутатор до 24х термопар.

          • Ну термопара типа К может мерять до 1100 по тем данным, что я находил в интернете. Хватит ли ОР07 для этого?

          • Что значит хватит ли OP07. Надо установить такой коэффициент усиления, чтобы при максимальной температуре на выходе усилителя было напряжение немного меньше 1,1 В.
            По поводу коммутаторов. Если хотите, откройте тему на форуме сайта. Я поищу и выложу схему своего старого контроллера на 24 термопары.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *