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


Работа с этим датчиком довольно проста. Если нужно просто получать значения температуры, то достаточно тупо читать из него данные. Никаких лишних телодвижений (респект разработчикам за продуманые «настройки по умолчанию»). Здесь я постараюсь описать не только работу с датчиком (это почти-что перевод даташита), но и возможные баги и способы их убийства.
Все эксперименты с датчиком я проводил с помощью своего 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
Не перепутали ток через OS? В даташите вместо 100 мкА вижу 10 мА. И подтянут он резистором 10 кОм на типовой схеме.
Щас тоже увидел 10ма. Но до этого точно помню — было где-то написано про микроамперы.
Да и Medved писал, что убил вывод, подключив к нему светодиод.
Да и Medved писал, что убил вывод, подключив к нему светодиод.
Вот. даташит от NXP (24 стр) На 15ой странице табличка, в ней:
Ilo (output leakage current SDA and OS pins); — 10 µA (max)
Хотя выше и впрямь 10ма.
Но в разделе про вывод OS написано, что подтягивающий резистор должен быть как можно больше, чтобы не искажались показания.
Ilo (output leakage current SDA and OS pins); — 10 µA (max)
Хотя выше и впрямь 10ма.
Но в разделе про вывод OS написано, что подтягивающий резистор должен быть как можно больше, чтобы не искажались показания.
Насколько я понимаю, Ilo — это максимальный ток утечки через вывод (при закрытом транзисторе).
Да, увидел, сопротивление вплоть до 200 кОм, для уменьшения нагрева м/с из-за тока через открытый транзистор. Предполагаю, что можно в железе посмотреть намного ли плывет температура при нужной нагрузке на этом выводе.
Да, увидел, сопротивление вплоть до 200 кОм, для уменьшения нагрева м/с из-за тока через открытый транзистор. Предполагаю, что можно в железе посмотреть намного ли плывет температура при нужной нагрузке на этом выводе.
Спасибо за статью, лежит парочка микрух в ожидании моего к ним внимания. Вижу что ошибался, когда откладывал их на потом, думая что времени не будет на их освоение.
Да, на самом деле они легче в управлении, чем ds18b20. Хотя-бы потому, что протокол i2c поддерживается большим количеством МК на аппаратном уровне, а 1-wire придется делать программно.
И для получения температуры с lm75 нужно просто передать адрес и прочитать два байта. При аппаратной реализации i2c получается очень быстро и просто.
И для получения температуры с lm75 нужно просто передать адрес и прочитать два байта. При аппаратной реализации i2c получается очень быстро и просто.
А какой у них реальный разброс и калибруются ли они?
вот здесь пишут что разброс почти 3 градуса.
вот здесь пишут что разброс почти 3 градуса.
Про реальный разброс ничего сказать не могу — тестировал всего 1 датчик. Но от показаний ds18b20 он отставал примерно на 1 градус.
Функции калибровки в датчике нет, но что мешает прибавить нужное значение программно?
Функции калибровки в датчике нет, но что мешает прибавить нужное значение программно?
у меня 2 датчика висят, показывают одинаковую температру, по комнате еще есть 3 цифровых термометра, на всех совпадает целое значение температуры с моими датчиками. Дробную часть не считаю, может там и есть отличия.
- bigdigital
- 15 октября 2011, 00:07
- ↑
- ↓
Пользовал практически аналогичный термометр от National Instruments LM92, так тот врал примерно на 3-4 градуса. Причем перепробовал несколько экземпляров, результат один и тот же. Сначала думал что перегрел при пайке, но перерыл весь даташит на предмет критичности к температуре и времени пайки, даташит на этот счет молчит. Никто кстати не юзал эти LM92?
Доброго времени суток. Не получается запустить этот термометр. Пишу на асме под MCS-51. Использую атмеловскую иблиотеку I2C. Делаю все как для чтения памяти EEPROM (которая к слову прекрасно читается и пишеться с помощью этой либы), а оно читает одни нули. Наверняка есть какие-то отличия, надо читать как-то иначе, чем ячейку EEPROM?
Комментарии (27)
RSS свернуть / развернуть