Термометр LM75A - описание.

Гость нашей сегодняшней программы — LM75A. Цифровой термометр с I2C выходом. По характеристикам похож на DS18b20. Стоит раза в два дешевле. Правда, наш градусник бывает только в восьминогих корпусах, а это большое западло.



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

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

Подключение и схемотехника.


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



Первое, на что надо обратить внимание — питание. Градусник начинает страшно глючить, если на линиях питания появляется шум. Лечится конденсатором на 1uF (Примерно. Я поставил 680nF) между питанием lm75A и землей. Ставить его нужно как можно ближе к выводам питания.

Линии, задающие адрес устройства (A0, A1, A2), тоже могут доставить неприятности. Здесь подстава заключается в том, что их нельзя оставлять висящими в воздухе (адресные пины у памяти 24Cxx это спокойно переживают — изнутри подтянуты к земле). У LM75A их нужно обязательно подтянуть или к питанию, или к земле. Иначе можно поймать непонятную багу, при которой девайс будет отвечать на адрес через раз, или будет пытаться ответить на адреса других устройств, что приведет к конфликтам.

Есть еще один интересный пин — OS. Это выход с открытым стоком (open drain). Он сигнализирует о том, что температура вышла за предел (настраивается программно). Главная проблема с этим выходом в том, что он может пропустить очень маленький ток, до 100uA по даташиту. Это наводит на три грустные мысли:
1) Им нельзя зажигать светодиоды и управлять другой нагрузкой напрямую.
2) Подтягивающий резистор должен иметь большое сопротивление. Я поставил 100к, тогда ток получается 50мкА.
3) С такой слабой подтяжкой можно поймать помехи и ложные срабатывания (например, если выход OS подключен ко входу МК)

Если нужно рулить с этого выхода какой-либо нагрузкой (например системой охлаждения), то нужно ставить транзисторный ключ. Причем обычным биполярным транзистором вряд-ли удасться обойтись. Нужна сборка Дарлингтона или полевик (из тех, что управляются логическим уровнем).



Связь.

Общение с датчиком ведется по протоколу i2c. Частота линии SCL тут ограничена 400кГц, но такая скорость вряд-ли понадобится.

Алгоритм связи примерно тот-же, что и при работе с EEPROM памятью 24Cxx. После адреса устройства мы передаем номер регистра, к которому хотим обратиться. Их всего 4. Причем три из них 16и битные, а один — configuration — 8и битный. После номера регистра мы либо записываем в него данные, либо даем повторный старт, и читаем данные (после повторного старта нужно будет опять послать адрес устройства)



Первый — регистр температуры. Два байта, из которых 11 бит содержат температуру, а младшие 5 бит равны 0.

Чтобы получить значение температуры делаем так:
Если старший бит = 0, то (температура положительная)
	Сдвигаем на 5 разрядов вправо (деление на 32), чтобы избавиться от пустых младших разрядов.
	Делим на 8. (Т.е. умножаем на LSB = 0.125)
Если старший бит = 1, то (температура ниже 0)
    Находим дополнение до 2 для всего регистра.
	Сдвигаем на 5 разрядов вправо. 
	Делим на 8. 

Часто необходимости в высокой точности нету, и достаточно знать температуру с точностью до градуса, отбросив дробную часть. Тогда задача заметно упрощается. Младший байт можно смело выкинуть, и работать только со старшим:
Если старший бит = 0, то ничего делать не надо — в регистре уже значение температуры в «нормальном» виде.
Если старший бит = 1, то ищем дополнение до 2. Делается это командой NEG. И ставим где-нибудь флажок, что температура < 0.

* Через мой Multiprog можно общаться с LM75A — читать текущую температуру.

Второй регистр — configuration. То-есть настройка. Он состоит всего из 1 байта.



Начнем с младшего бита.

SHUTDOWN отвечает за спящий режим.
Если он = 0, то устройство находится в активном режиме. При этом оно производит замер температуры каждые 100 мс и складывает результат в регистр Temp. Если SHUTDOWN = 1, то градусик переходит в спящий режим. При этом потребление тока снижается до 100мкА. Линия i2c продолжает работать нормально. Логика, которая управляет выводом OS отключается, и он остается в том состоянии в котором был до перевода в спящий режим. Если у нас к выходу OS подключен вентилятор для охлаждения, и мы перевели градусник в спящий режим, когда вентилятор был включен, то вентилятор так и будет работать, до тех пор, пока термометр не разбудят.

OS_COMP_INT отвечает за режим работы выхода OS.
Если он равен 0 (это, кстати режим по-умолчанию), то выход OS ведет себя так:
Когда температрура поднимается выше значения в регистре Tos — выход OS переходит в активное состояние. Он останется в этом состоянии до тех пор, пока температура не упадет ниже значения в регистре Thyst. Это режим называется OS comparator mode.

Во втором режиме, OS interrupt mode, (когда OS_COMP_INT = 1) OS ведет себя намного интереснее:
Когда температура поднимается выше Tos — выход переходит в активное состояние. И остается в нем до тех пор, пока не будет прочитано значение регистра Temp. Никакая другая сила (даже падение температуры ниже Thyst) не заставит его перейти в неактивное состояние.
А вот когда регистр температуры будет прочитан, OS тут-же переключается в неактивное состояние и находится в нем до тех пор, пока… температура не опустится ниже Thyst. Тогда он опять переходит в активное состояние и висит в нем, пока кто-нибудь не прочитает регистр температуры. Получается, что в этом режиме можно контролировать уход температуры за пределы какого-либо диапазона. Нижней границей будет Thyst, а верхней — Tos.

График наглядно показывает два режима работы вывода OS:



Следующий бит, OS_POL, отвечает за полярность вывода OS и не представляет из себя ничего интересного. Если он = 0, то активный уровень низкий. Если 1, то высокий. По умолчанию = 0. Только надо помнить, что OS это выход с «открытым стоком», а значит, высокий уровень там создается подтягивающим резистором.

Потом идет пачка из двух бит — OS_F_QUE1:OS_F_QUE0. С их помощью можно настроить, сколько раз датчик будет проверять значение температуры, перед тем, как выдать сигнал тревоги. Например, если они настроены на 4 проверки, то выход OS сработает только в том случае, если 4 раза подряд замер температуры покажет, что она выше порога.

OS_F_QUE1	OS_F_QUE0	Количество проверок
   0               0             	1
   0               1	                2
   1	           0             	4
   1	           1            	6


Все, configuration кончился. Старшие три бита зарезервированы и = 0. Хотя записывать в них можно, и читать тоже.

После configuration, под номером 02h, идет регистр гистерезиса Thyst. Он 16и битный, хотя активны всего 9 бит (младшие 7 бит = 0). С их помощью настраивается нижний порог срабатывания сигнала OS. По умолчанию 75 градусов.

Та-же история со следующим регистром Tos (номер 03h). Задает верхний порог для сигнала OS. По умолчанию = 80 градусов.

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

В общем этот датчик имеет несколько иную специфику, чем DS18b20. Если градусник от DALLAS можно спокойно закинуть куда-угодно (паразитное питани требует всего 2 провода), то LM75A скорее подходит для измерений температуры в тех случаях, когда можно ставить градусник прямо на плату. В таком случае проявляются все его плюсы: простота обмена (можно использовать аппаратный I2C вместо программного 1-wire) и детектор превышения температуры (в DS18b20 нечто подобное тоже было, но уж больно уныло).

PS Похожая статья есть на сайте Medved'a. В ней он, кроме прочего, привел код для работы с датчиком.

  • +13
  • 15 марта 2011, 22:32
  • dcoder

Комментарии (27)

RSS свернуть / развернуть
Не перепутали ток через OS? В даташите вместо 100 мкА вижу 10 мА. И подтянут он резистором 10 кОм на типовой схеме.
0
  • avatar
  • John
  • 15 марта 2011, 22:44
Щас тоже увидел 10ма. Но до этого точно помню — было где-то написано про микроамперы.

Да и Medved писал, что убил вывод, подключив к нему светодиод.
0
100 мкА там ниже, табл. 17, Idd — ток потребления.
0
Вот. даташит от NXP (24 стр) На 15ой странице табличка, в ней:
Ilo (output leakage current SDA and OS pins); — 10 µA (max)

Хотя выше и впрямь 10ма.

Но в разделе про вывод OS написано, что подтягивающий резистор должен быть как можно больше, чтобы не искажались показания.
0
Насколько я понимаю, Ilo — это максимальный ток утечки через вывод (при закрытом транзисторе).
Да, увидел, сопротивление вплоть до 200 кОм, для уменьшения нагрева м/с из-за тока через открытый транзистор. Предполагаю, что можно в железе посмотреть намного ли плывет температура при нужной нагрузке на этом выводе.
0
В статье Medved написал, что подключил светодиод через резистор 200 Ом. Прикинем ток: (5−2)/200=15 мА, а в даташите максимум 10. Для точного расчета хорошо бы знать тип светодиода (взял падение в 2 В) и напряжение питание (взял 5 В).
0
В общем да — тут надо проверить,
но если он и правда тащит 10ма — то вообще круто :)
0
интересно.
0
Знаем-знаем такую микруху! А ссылочку-то мог бы и активную поставить :-)
0
Да без проблем :)
0
Спасибо за статью, лежит парочка микрух в ожидании моего к ним внимания. Вижу что ошибался, когда откладывал их на потом, думая что времени не будет на их освоение.
0
Да, на самом деле они легче в управлении, чем ds18b20. Хотя-бы потому, что протокол i2c поддерживается большим количеством МК на аппаратном уровне, а 1-wire придется делать программно.
И для получения температуры с lm75 нужно просто передать адрес и прочитать два байта. При аппаратной реализации i2c получается очень быстро и просто.
0
Минус только в том, что проц будет долго «тупить» в ожидании результата. 100-400кГц медленновато, по этом желательно делать по прерываниям обработку — что несколько посложнее. Ну не столько скложнее, но подумать надо будет :)
0
Если сделать на аппаратном интерфейсе да на прерываниях то не будет. Но тут надо программу правильно писать. Без дебилок.
+1
Интересно. Надо прикупить, побаловаться.
0
  • avatar
  • Rom
  • 17 марта 2011, 19:04
Дкодер, а что за отладчик для I2C?
0
0
А какой у них реальный разброс и калибруются ли они?
вот здесь пишут что разброс почти 3 градуса.
0
  • avatar
  • valio
  • 26 сентября 2011, 05:29
Про реальный разброс ничего сказать не могу — тестировал всего 1 датчик. Но от показаний ds18b20 он отставал примерно на 1 градус.

Функции калибровки в датчике нет, но что мешает прибавить нужное значение программно?
0
Т.о. факт состоит в том, что купленный датчик — не обладает доверительными показаниями.
0
у меня 2 датчика висят, показывают одинаковую температру, по комнате еще есть 3 цифровых термометра, на всех совпадает целое значение температуры с моими датчиками. Дробную часть не считаю, может там и есть отличия.
0
>>Все, configuration кончился. Старшие три бита зарезервированы и = 0. Хотя записывать >>в них можно, и читать тоже.
А значения сохраняются?
Можно испоьзовать как микро ЕЕПРОМку (мне как раз 3 бита сохранить негде).
0
В этой микросхеме нет EEPROM, значения регистров не сохраняются при отключении питания.
0
Благодарю.
0
Пользовал практически аналогичный термометр от National Instruments LM92, так тот врал примерно на 3-4 градуса. Причем перепробовал несколько экземпляров, результат один и тот же. Сначала думал что перегрел при пайке, но перерыл весь даташит на предмет критичности к температуре и времени пайки, даташит на этот счет молчит. Никто кстати не юзал эти LM92?
0
Доброго времени суток. Не получается запустить этот термометр. Пишу на асме под MCS-51. Использую атмеловскую иблиотеку I2C. Делаю все как для чтения памяти EEPROM (которая к слову прекрасно читается и пишеться с помощью этой либы), а оно читает одни нули. Наверняка есть какие-то отличия, надо читать как-то иначе, чем ячейку EEPROM?
0
Получилось запустить, но пришлось отказаться от проверки занятости шины, и проверок состояния флага ошибки. С этими проверками датчик не работает.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.