Урок 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 привирает датчик температуры холодного спая. В остальном термометр получился довольно точный.

 

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

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

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

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