Датчик температуры LMT86

           Среди аналоговых термодатчиков, применяемых в любительской и промышленной электронике, выделяются такие модели как LM35, TMP36 или MCP9700. Благодаря приемлемой точности и линейности преобразования, а также лёгкости эксплуатации, они заслуженно стали одними из самых популярных термосенсоров. В рамках данной статьи предлагается рассмотреть датчик температуры LMT86 как один из альтернативных вариантов вышеуказанным преобразователям.

Цоколёвка

           Данный полупроводниковый прибор является представителем семейства сенсоров LMT8x. По своей сути он аналогичен LM35 | TMP36 | MCP9700, а в корпусе TO-92 они все имеют идентичную цоколёвку:


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

           В зависимости от модификации, сенсоры LM35 | TMP36 | MCP9700, очень грубо говоря, являются взаимозаменяемыми, но с некоторыми оговорками по точности и диапазону измерений. А вот преобразователи серии LMT8x имеют очень важное отличие от вышеуказанных микросхем: у термосенсоров LMT8x коэффициент преобразования является отрицательным, то есть при росте температуры выходное напряжение (Uвых) уменьшается. Это наглядно видно по соответствующим графикам, представленных в datasheet’ах к датчикам:

           Серия LMT8x включает в себя 4 модели (ниже представлена сводная таблица), отличающиеся между собой коэффициентом преобразования и диапазоном питания:

           Следует сделать важное уточнение: в рамках этой статьи будем экспериментировать конкретно с моделью LMT86LP в корпусе TO-92, а для сравнения возьмём уже вышеупомянутые модели приборов следующих модификаций: LM35DZ/NOPB, TMP36GT9Z и MCP9700-E/TO. Это важно, поскольку в зависимости от модификации параметры преобразователей сильно отличаются. Например, LM35AH имеет погрешность ±0,5 ℃ и диапазон измерения -55…+150 ℃. А вот LM35DZ измеряет с погрешностью ±1,5 ℃ в диапазоне 0…+100 ℃.

           Ниже представлена сводная таблица основных параметров рассматриваемых термодатчиков.

           По сравнению с рассматриваемыми аналогами, термодатчик LMT86LP отличается более высокой точностью и широким диапазоном измеряемых температур. Также у него самый низкий уровень минимального напряжения питания (2,2 В) и ток потребления (5,4 мкА), что позволяет его использовать в портативных устройствах с батарейным питанием.


Схема включения

           На рисунке ниже представлена схема подключения термодатчика к аналого-цифровому преобразователю (АЦП), взятая из документации от производителя:

Рисунок 1 — Схема подключения термодатчика к АЦП

           Для считывания выходного сигнала (Uвых) сенсора можно воспользоваться либо встроенным в микроконтроллер АЦП, либо подключить микросхему внешнего. Чем выше разрядность АЦП, тем выше точность измерений. Но микроконтроллер на плате Arduino UNO располагает всего лишь 10-разрядным преобразователем. Соответственно, дискретность измерений будет примерно 4,8 милливольта, а это соответствует 0,5 градуса. Однако можно несколько повысить точность, варьируя уровнем опорного напряжения Uопорное.

Читайте также:  Как сделать диктофон на ESP32 с микрофоном INMP441 и записью на microSD

           По умолчанию уровень Uопорное равен напряжению питания микроконтроллера (5 В). При необходимости можно включить встроенный источник, который выдаёт 1,1 В (для ATmega328P), если в скетче прописать следующую функцию:

analogReference(INTERNAL);

           Для LM35DZ значение Uопорное = 1,1 В подходит идеально, так как оно полностью покрывает диапазон выходного напряжения (0 мВ — 0 ℃, 1000 мВ — 100 ℃). А вот для TMP36 и MCP9700 такой уровень уже будет маловат, поскольку 500 мВ — 0 ℃, а 1750 мВ — 125 ℃. А для LMT86LP — 0 ℃ соответствует Uвых = 2100 мВ.

           Чтобы прийти к компромиссу, можно прибегнуть к внешнему источнику Uопорное в виде микросхемы программируемого стабилитрона TL431, у которого точность стабилизации 0,5 %.

Рисунок 2 — Условное графическое обозначение и цоколёвка программируемого стабилитрона TL431

           При базовой схеме включения TL431 выдаёт 2,5 В. Это значение вполне нам подходит для покрытия всех диапазонов выходных напряжений исследуемых термосенсоров. Для подключения внешнего источника у микроконтроллера есть специальный вывод — AREF (пин №21 для ATmega328P). Чтобы его активировать, в скетч надо добавить соответствующую функцию:

analogReference(EXTERNAL);
Рисунок 3 — Базовая схема включения TL431

           Как уже говорилось, в рамках эксперимента будем сравнивать показания LMT86LP с другими преобразователями: TMP36GT9Z, MCP9700-E/TO и LM35DZ/NOPB. В качестве эталонного измерительного канала воспользуемся цифровым модулем SHT30, у которого заявленная производителем погрешность измерений составляет ±0,3 ℃.  Ниже представлены схема подключения и фотография собранного макета:

Рисунок 4 — Схема подключения термосенсоров к отладочной плате Arduino UNO
Рисунок 5 — Экспериментальный макет

Принцип преобразования

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

где Uвых — выходной сигнал в процессе измерений;

Tокр.ср. — измеряемая температура окружающей среды;

Tкоэфф — коэффициент преобразования;

U0℃ — выходной сигнал при 0℃.

           Выразим из этой формулы искомую температуру:

           Рассмотрим на примерах с разными приборами:

           1) LMT86

Читайте также:  Bluetooth-колонка на базе ESP32 и аудиомодуля PCM5102

           Исходные данные:

— сигнал на выходе при 0 ℃: U0℃ = 2100 мВ;

— коэффициент преобразования: Tкоэфф = -10,9 мВ/℃;

— измеренный уровень сигнала на выходе сенсора: Uвых = 1874 мВ.

           Подставляем значения в формулу, вычисляем искомую величину Tокр.ср.:

           В документации от производителя приводится таблица преобразования, что довольно удобно для проверки:

           2) TMP36 и MCP9700

U0℃ = 500 мВ;

Tкоэфф = 10 мВ/℃;

Uвых = 731 мВ.

           3) LM35DZ

U0℃ = 0 мВ;

Tкоэфф = 10 мВ/℃;

Uвых = 234 мВ.


Скетч для Arduino

           Ниже представлен подробно прокомментированный полный листинг скетча. Для уменьшения разброса показаний при работе АЦП воспользуемся методом вычисления среднего арифметического.

#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"

Adafruit_SHT31 sht31 = Adafruit_SHT31(); 

int data_A0;
int data_A1;
int data_A2;
int data_A3;
float temp_TMP36;
float temp_MCP9700;
float temp_LM35;
float temp_LMT86;
float temp_SHT30;

long amount_data_A0;
long amount_data_A1;
long amount_data_A2;
long amount_data_A3;

long arithmetic_mean_A0;
long arithmetic_mean_A1;
long arithmetic_mean_A2;
long arithmetic_mean_A3;


float voltage_ref = 2.5; // уровень опорного напряжения 

void setup() {
  analogReference(EXTERNAL); // активация входа AREF для подключения внешнего источника опорного напряжения

  Serial.begin(9600); // подключаем монитор порта

    if (! sht31.begin(0x44)) {   // Set to 0x45 for alternate i2c addr
    Serial.println("Couldn't find SHT31");
    while (1) delay(1);
  }
}

void loop() {

  temp_SHT30 = 0;
  temp_SHT30 = sht31.readTemperature(); // показания температуры с датчика SHT30


  amount_data_A0 = 0;
  amount_data_A1 = 0;
  amount_data_A2 = 0;
  amount_data_A3 = 0;

  // сбор данных с каналов АЦП
  for (int i = 0; i < 100; i = i + 1) {
    amount_data_A0 = amount_data_A0 + analogRead(0);
    amount_data_A1 = amount_data_A1 + analogRead(1);
    amount_data_A2 = amount_data_A2 + analogRead(2);
    amount_data_A3 = amount_data_A3 + analogRead(3);
  }

  // вычисляем среднее арифметическое значение по каждому каналу
  arithmetic_mean_A0 = amount_data_A0 / 100;
  arithmetic_mean_A1 = amount_data_A1 / 100;
  arithmetic_mean_A2 = amount_data_A2 / 100;
  arithmetic_mean_A3 = amount_data_A3 / 100;



  // осуществляем преобразование отсчётов в градусы Цельсия для каждого датчика

  temp_TMP36 = (arithmetic_mean_A0 * voltage_ref) / 1023.0; // преобразование отсчётов в напряжение
  temp_TMP36 -= 0.5;  // убираем смещение ноля
  temp_TMP36 /= 0.01;   // учитываем коэффициент преобразования

  temp_MCP9700 = (arithmetic_mean_A1 * voltage_ref) / 1023.0; // преобразование отсчётов в напряжение
  temp_MCP9700 -= 0.5;  // убираем смещение ноля
  temp_MCP9700 /= 0.01;   //учитываем коэффициент преобразования

  temp_LM35 = (arithmetic_mean_A2 * voltage_ref) / 1023.0; // преобразование отсчётов в напряжение
  temp_LM35 /= 0.01;  //учитываем коэффициент преобразования, смещение ноля отсутствует

  temp_LMT86 = (arithmetic_mean_A3 * voltage_ref) / 1023.0; // преобразование отсчётов в напряжение
  temp_LMT86 = 2.1 - temp_LMT86; // убираем смещение ноля
  temp_LMT86 /= 0.0109;   //учитываем коэффициент преобразования




  // вывод температуры на монитор порта
  Serial.print("TMP36:   ");
  Serial.print(temp_TMP36);
  Serial.println(F(" °C"));

  Serial.print("MCP9700: ");
  Serial.print(temp_MCP9700);
  Serial.println(F(" °C"));           

  Serial.print("LM35:    ");
  Serial.print(temp_LM35);
  Serial.println(F(" °C"));

  Serial.print("LMT86:   ");
  Serial.print(temp_LMT86);
  Serial.println(F(" °C"));

  Serial.print("SHT30:   ");
  Serial.print(temp_SHT30);
  Serial.println(F(" °C")); 

  Serial.println(" ");
  Serial.println("--------------------");
  Serial.println(" ");

  delay(3000);
}

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

           Положим, что SHT30 является наиболее достоверным измерительным каналом. Следовательно, по полученным данным можно сделать вывод, что наиболее близкие к истине значения показали LM35DZ и LMT86LP. Иные сенсоры показали значения, которые укладываются в заявленные производителями погрешности, что вполне приемлемо для бытовых нужд и приложений, в которых не требуется особая точность измерений.

Читайте также:  Тиристорный регулятор мощности на микроконтроллере

Выводы

           Аналоговый термодатчик LMT86 является достойной альтернативой сенсорам типа LM35, TMP36 или MCP9700. Данный преобразователь выгодно отличается от указанных аналогов: относительно невысокая стоимость, широкий рабочий диапазон (-50…+150 ℃), сравнительно высокая точность (±0,7 ℃), подходит для работы в портативных приборах с батарейным питанием (ток потребления 5,4 мкА, минимальное Uпит = 2,2 В). Благодаря отрицательному коэффициенту преобразования, данный прибор также может применяться как альтернатива термисторам.