Датчик температуры LM75A микросхема

60 руб.

8 в наличии

Артикул: 37 Категория:

Описание

Гость нашей сегодняшней программы — 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 нечто подобное тоже было, но уж больно уныло).