Термометр на Attiny85 и термопаре

thermocouplewater

В этой статье приводится схема термометра на термопаре, способном измерять температуры до +1350°C, собранном на ATtiny85 и OLED-дисплее. В проекте используется АЦП ATtiny85's с функцией усиления на 20 для измерения напряжения на термопаре, а также внутренний датчик температуры для измерения температуры окружающей среды (отображается в нижней сроке дисплея). Точность измерений < 5°C.

ATtiny85 имеет 10-битный дифференциальный аналоговый вход с возможностью усиления до 20 раз, что позволяет измерять напряжение на термопаре напосредственно микроконтроллером. Термопара K-типа генерирует напряжение примерно 41мкВ/°C, так что, используяч опорное напряжение в  1.1В, мы можем вычислеть разрешение и максимальное значение температуры следующим образом:

  • Разрешение= 1.1/(1024 x 20 x 41 x 10-6) = 1.31°C
  • Макс. значение= 1024 x 1.31 = 1341°C.

Используя оверсемплинг можно добитсья разрешения менее 1°C, что более чем достаточно для многих задач.

ATtiny85 - один из немногих контроллеров AVR, имеющих усилитель на входах АЦП; также его имеют ATtiny861, ATtiny167 и ATmega1284P.

Несмотря на то, что K-термопары могут измерять температуры до -200°C, для простоты проекта в программе реализовано измерение температур больше комнатной.

Получение температуры

Как преобразовать напряжение на термопаре в температуру?

Простейший способ - это принять, что отношение напряжения к температуре имеет линейную зависимость в  41мкВ/°C. Для узких температурных диапазонов это достаточное приближение; однако, на больших диапазонах отклонение от линейности уже заметно.

Для максимальной точности можно вычислчть полином 9го прядка, используя специальные коэффициенты для К-термопары. Однако для данного проекта это не актуально.

Подход, который здесь использован - это кусочно-линейная модель, аппроксимирующая стандартную кривую отклика серией прямых сегментов. Я искал температуру для серии фиксированных точек, соответствующих показаниям АЦП, кратным 128, используя онлайн-калькулятор температуры термопары:

Значение ADC Напряжение (mV) Температура(°C)
0 0 0
128 6.875 168.36
256 13.750 337.02
384 20.625 499.55
512 27.500 661.26
640 34.375 826.91
768 41.250 999.34
896 48.125 1180.53
1024 55.000 1375.09

Затем они были закодированы в виде следующего массива констант, в десятых долях градуса, для линейной интерполяции температуры:

int Temperature[9] = { 0, 1684, 3370, 4995, 6613, 8269, 9993, 11805, 13751 };

Принцип работы термопары

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

Если термопара подсоединена к электрической цепи, то величина генерируемого напряжения будет отображаться на шкале измерительного прибора. Затем показания прибора могут быть преобразованы в температурные показания с помощью таблицы. На некоторых приборах шкала откалибрована непосредственно в градусах.

Спаи термопары

В конструкции большинства термопар предусмотрен только один спай. Однако, когда термопара подсоединяется к электрической цепи, то в точках ее подсоединения может образовываться еще один спай. Холодный спай представляет собой дополнительный спай, который образуется, когда термопара подсоединяется к цепи. Этот спай называется свободным (холодным) спаем термопары. Другой спай  — это рабочий (горячий) спай. В цепи находится измерительный прибор, который измеряет разницу величин напряжения на двух спаях.

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

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

Холодный спай термопары

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

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

Если температура вокруг холодного спая меняется, то величина напряжения на холодном спае также изменится. В результате изменится напряжение на холодном спае. И как следствие разница в напряжении на двух спаях тоже изменится, что в конечном итоге приведет к неточным показаниям температуры.

Для того, чтобы сохранить температуру на холодном спае на неизменном уровне во многих термопарах используются компенсирующие резисторы. Резистор находится в том же месте, что и холодный спай, так что температура воздействует на спай и резистор одновременно. Второй способ коррекци вычислений - измерение температуры холдного спая и внесение поправок в вычисление температуры горячего спая. К счастью в ATtiny85 есть встроенный температурный датчик, так что данный термометр использует его для вычисления температуры холодного спая.

Рабочий спай термопары (горячий)

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

Когда термопара подключается к электрической цепи, то она не будет работать нормально пока не будет соблюдена полярность при подключении. Плюсовые провода должны быть соединены вместе и подсоединены к плюсовому выводу цепи, а минусовые к минусовому. Если провода перепутать, то рабочий спай и холодный спай не будут в противофазе и показания температуры будут неточными. Одним из способов определения полярности проводов термопары -это определение по цвету изоляции на проводах. Помните, что минусовой провод во всех термопарах — красный.

 

Схема термометра на термопаре

Вот схема термометра на Attiny85, термопере и OLED дисплее:

tinythermocouple

Для индикациия выбран I2C 128x32 OLED-дисплей. Резистор 33kΩ и конденсатор 0.1 µF обеспечивают сброс дисплея при подаче питания, хотя они могут и не понадобиться.

Использована термопара K-типа.

thermocoupleprobe

 

Программа

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

Измерение внутренней температуры

Процедура настройки АЦП для измерения внутренней температуры заключается в следующем:

void SetupInternal () {
  ADMUX = 0<<REFS2 | 2<<REFS0 | 15<<MUX0;  // Temperature and 1.1V reference
  ADCSRA = 1<<ADEN | 1<<ADIE | 4<<ADPS0;   // Enable ADC, interrupt, 62.5kHz clock
  ADCSRB = 0<<ADTS0;                       // Free running
  set_sleep_mode(SLEEP_MODE_ADC);
}

Процедура ReadInternal() выполняет чтение; она просто переводит процессор в спящий режим. АЦП генерирует прерывание для пробуждения процессора после завершения преобразования, после чего программа считывает и возвращает значение регистра АЦП:

unsigned int ReadInternal () {
  sleep_enable();
  sleep_cpu();                             // Start in ADC noise reduction mode
  return ADC;
}

Измерение напряжения термопары

Аналогичная процедура настраивает АЦП для измерения термопары:

void SetupThermocouple () {
  ADMUX = 0<<REFS2 | 2<<REFS0 | 7<<MUX0;   // PB4 (ADC2) +, PB3 (ADC3) was 7
  ADCSRA = 1<<ADEN | 1<<ADIE | 4<<ADPS0;   // Enable ADC, interrupt, 62.5kHz clock
  ADCSRB = 0<<ADTS0;                       // Free running 
  set_sleep_mode(SLEEP_MODE_ADC);
}

Процедура ReadThermocouple () фактически производит чтение:

unsigned int ReadThermocouple () {
  sleep_enable();
  sleep_cpu();                             // Start in ADC noise reduction mode
  return ADC;
}

Преобразование термоэлектрического напряжения в температуру

Значение АЦП из ReadThermocouple () преобразуется в температуру с помощью кусочно-линейной интерполяции, как описано в разделе Получение температуры выше. Для большей точности  используется сумма четырех последовательных показаний АЦП; процедура Convert () принимает это значение и использует значения в массиве Temperature[] для преобразования его в температуру, в градусах::

int Temperature[9] = { 0, 1684, 3370, 4995, 6613, 8269, 9993, 11805, 13751 };

int Convert (int adc) {
  int n = adc>>9;
  unsigned int difference = Temperature[n+1] - Temperature[n];
  unsigned int proportion = adc - (n<<9);
  unsigned int extra = ((unsigned long)proportion * difference)>>9;
  return (Temperature[n] + extra + 5)/10;
}

Если параметр для Convert() является точным кратным n от 512,  то температур равнаs Temperature[n]/10. В противном случае температура интерполируется между  Temperature[n] и Temperature[n+1].

Отображение информации

Наконец, главная функция в loop () считывает внутреннюю температуру и температуру термопары каждую секунду и отображает показания на дисплее. Для каждого измерения берется среднее из 16 последовательных показаний, чтобы уменьшить шум:

  SetupThermocouple();
  ReadThermocouple();                      // Throw away first reading
  int reading = 0;
  for (int i=0; i<16; i++) reading = reading + ReadThermocouple();
  reading = Convert(max((reading>>2) + ADCOffset*4, 0));
  Scale = 2;
  PlotTemperature(reading + internal, 0, 0);

Повышение точности

Есть два фактора, которые влияют на точность термометра, и вы можете откалибровать каждый из них, чтобы улучшить точность.

Внутренний датчик температуры

Если внутренний датчик неисправен, все показания будут искажены этой ошибкой. Поэтому рекомендуется калибровать датчик при комнатной температуре по отношению к известному (поверенному) термометру следующим образом:

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

Смещение АЦП

При отсутствии входного сигнала на дифференциальном входе x20 обычно имеется небольшое смещение, которое добавляется к каждому показанию. Чтобы измерить его:

  • Отключите термопару и поставьте перемычку между двумя дифференциальными входами, PB3 и PB4, чтобы получить нулевое значение на входе.
  • Обратите внимание на разницу между показаниями термопары и внутренней температурой.
  • Установите константу ADCOffset в программе на требуемую поправку, чтобы сделать эту разницу нулевой.

Тестирование

Обратите внимание, что перед использованием термометра термопары в точных задачах вы должны протестировать его при известных температурах. Этот термометр проверялся с помощью промышленного термометра в  кипящей воде при 100°C и в оливковым масле при 220°C, и показания были в пределах 5°C в каждом случае.

thermocouple2

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

Компиляция программы

Компилировалась программа с помощью Spence Konde's ATTiny Core. Нужно выбрать контроллер ATtiny25/45/85 в разделе ATTinyCore меню Board. Затем проверьте, что следующие параметры установлены данным образом (игнорируйте другие параметры):

Chip: "ATtiny85"
Clock: "1 MHz (internal)"
B.O.D: "B.O.D. Disabled"
Timer 1 Clock: "CPU"

Это настройки фьюхов по умолчанию для нового ATtiny85, но если вы ранее использовали ATtiny85 с другими настройками, выберите Burn Bootloader, чтобы установить фьюзы соответствующим образом.

Затем загрузите программу с помощью ISP (внутрисистемное Программирование);

Вот полная программа термометра термопары:

 Программа термометра на термопаре.

 

Загрузка...