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

Изучаем DS1820/DS18B20

Автор: AntonChip Опубликовано 07 Май 2012. Опубликовано в Программирование на Си

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

Рейтинг:   / 16

Плохо Отлично 

Датчик температуры ds1820 измерения температуры

Датчики температуры с однопроводным интерфейсом 1-WIRE были разработаны фирмой DALLAS SEMICONDUKTOR для использования совместно с микроконтроллерами. Впоследствие эти датчики стали выпускаться фирмой MAXIM. Каждый датчик температуры имеет 56-разрядный индивидуальный идентификационный код, поэтому по одному проводу может быть опрошено практически неограниченное число датчиков. Перед установкой таких датчиков в одну линию необходимо считать 64 разрядный код ROM (в него входит 56-битный номер датчика и 8 бит регистра контроля четности) для каждого датчика и учитывать его при программировании микроконтроллера. Передача 64 разрядов занимает много времени, поэтому в устройствах, использующих небольшое число датчиков, можно обойтись выделением отдельного выхода микроконтроллера для каждого датчика.

Термодатчики DS1820 (DS18S20, DS1821, DS18B20)имеют следующие технические характеристики:

- индивидуальный 64-битный идентификационный номер;

- напряжение питания от +3 до +5,5 В;

- измеряемая температура от -55 до + 125°С;

- погрешность измерения температуры в диапазоне -10. +85°С не более 0,5°С;

Датчик температуры ds1820 измерения температуры

- в остальном диапазоне температур погрешность измерения не превышает 2°С;

- информация о температуре выдается 9-битным кодом;

- установка пороговых значений температуры по максимуму и минимуму,

- максимальное время преобразования температуры в код 750 мс;

- возможность питания от высокого уровня шины данных;

- термодатчики не требуют индивидуальной настройки при замене.

Принцип измерения температуры основан на сравнении частоты двух генераторов. Частота одного генератора не зависит от температуры, а частота второго изменяется с изменением температуры. Разность частот двух генераторов определяет значение температуры. Восьмиразрядный код температуры побитно, начиная с младшего бита, выводится в линию связи. Девятый бит определяет знак измеренной температуры. Если девятый бит единичный, то температура имеет знак минус, и наоборот. Передача каждого бита данных длится 60 мкс. Если длительность низкого уровня в линии от 1 до 15 мкс, то импульс идентифицируется как лог. 1. Лог. 0 идентифицируется при длительности низкого уровня в линии от 15 до 60 мкс.

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

Поиск ROM (Search ROM) [0xF0]

Команда выдается управляющим микроконтроллером для определения числа и типа термодатчиков, подключенных к одной линии.

Чтение ROM (Read ROM) [0x33]

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

Идентификация ROM (Match ROM) [0x55]

Команда выдается перед 64-битным идентификационным номером и подтверждает обращение именно к этому термодатчику. Все последующие команды будут восприниматься только одним датчиком до команды обнуления линии.

Пропуск ROM (Skip ROM) [0xCC]

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

Поиск аварии (Alarm Search) [0xEC]

Действие команды аналогично команде «Поиск ROM», но отвечает на нее термодатчик, если измеренная температура выходит за пределы предварительных установок по максимуму и минимуму.

Начало преобразования температуры (Convert Т) [0x44]

Команда разрешает преобразование температуры и запись результата в блокнот.

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

Чтение блокнота (Read Scratchpad) [0xBE]

В блокноте содержится 8 байт информации (рис. 1). Если нужна информация только о температуре, то считывается 9 бит. Термодатчик будет выдавать информацию до тех пор, пока управляющий микроконтроллер не выдаст в линию нулевой импульс.

Рисунок 1. Карта памяти датчика DS1820

Запись в блокнот (Write Scratchpad) [0x4E]

После этой команды управляющий микроконтроллер должен послать два байта для записи в блокнот максимальной ТН и минимальной TL температуры ограничения по максимуму и минимуму. Все 16 бит необходимо передавать непрерывно без обнуления линии.

Копирование блокнота (Copy Scratchpad) [0x48]

После этой команды минимальная (TL) и максимальная (ТН) установленные значения температур переписываются в энергонезависимую память (EEPROM). После отключения напряжения питания записанные значения сохранятся в памяти.

Восстановление (Recall Е2) [0xB8]

Эта команда необходима для копирования значений температуры из EEPROM в рабочую зону блокнота. При выполнении восстановления термодатчик выдает в линию низкий уровень, а после окончания записи — высокий.

Питание от линии (Read Power Supply) [0xB4]

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

Передача данных по однопроводной шине выполняется импульсами нулевого уровня, но различной длительности лог. 0 и лог. 1. Импульс воспринимается как лог. 1, если его длительность не превышает 15 мкс (рис. 2). Если длительность импульса больше 15 мкс, то он воспринимается как лог. 0. Длительность одного бита информации принята равной 60 мкс. Отсюда и разброс возможных длительностей импульсов: лог. 0 — 1. 15 мкс, лог. 1 — 15. 60 мкс.

Рисунок 2. Временные диаграммы импульсов однопроводной шины

Для того чтобы термодатчик подготовить к приему информации, управляющий микроконтроллер должен послать в линию импульс обнуления (Reset) (рис. 54). Импульс обнуления должен иметь длительность 480. 960 мкс. В ответ на обнуление линии термодатчик посылает импульс присутствия (Presence). Если в устройстве не предусмотрено отключение датчика, то импульс присутствия для упрощения программы можно не проверять, а заполнить это время (около 100 мкс) паузой. Длительность импульса Presence может быть в пределах 60. 240 мкс.

Если к одной линии подключено несколько термодатчиков, то проверка импульса присутствия обязательна. Перед приемом каждого бита информации с датчика микроконтроллер управления должен послать короткий импульс готовности (запроса) длительностью 1. 3 мкс.

Обмен данными и командами начинается с младшего бита. Формат регистров термодатчика показан на рис. 3. Младший регистр температуры (LS) несет информацию о температуре. В нулевой бит записана информация о десятых долях температуры. Если нулевой бит единичный, то десятые доли равны 0,5°С. Старший регистр температуры (MS) содержит информацию о знаке температуры. Если значения регистра нулевые, то знак температуры положительный, и наоборот. Поскольку все биты регистра MS одинаковы, то достаточно считать только младший бит.

Рисунок 3. Форматы регистров термодатчика DS1820

Регистры установки ограничения температуры Тh, Tl несут информацию только о целых значениях температуры. В седьмом бите записывают информацию о знаке температуры. При отрицательной температуре в седьмой бит необходимо записать единицу.

В табл. 1 приведен пример принимаемых кодов при различных температурах. Для того чтобы получить значение температуры при минусовых температурах, необходимо принятую информацию перевести в дополнительный код. Для перевода в дополнительный код необходимо принятый код инвертировать и прибавить единицу. Например, для значения 1111 1111 получим 0000 0001, т.е. 0,5°С, но со знаком минус.

Подключение термодатчика к микроконтроллеру показано на рис. 4. Шина данных должна быть подключена к плюсу питания через резистор номиналом 4,7 кОм, поскольку выходной транзистор датчика имеет открытый сток. При питании датчика от шины данных вывод 3 остается свободным.

Рисунок 4. Схема подключения термодатчика к микроконтроллеру AVR

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

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

Т = Тu - 0,25 + (CUNT_PER - COUNT_REMAIN)/COUNT_PER,

где Тu - измеренная температура в °С; COUNT REMAIN, COUNT_PER - 6 и 7 байты блокнота (рис. 53). В документации на термодатчик не указана точность значений вычисленных температур, поэтому радиолюбителям советую провести экспериментальную проверку.

Вообще, если необходима точность измерения температуры 0,5°С за пределами диапазона -10. +85°С, то необходимо делать поправку на точность измерения температуры для каждого датчика. Для этого экспериментально сравнивают показания температуры вашей системы с показаниями образцового термометра. Полученную относительную погрешность программно прибавляют со своим знаком к измеренному значению.

Микроконтроллерные термодатчики DS18B20, как упоминалось выше, отличаются повышенной точностью измерения температуры. Формат регистров термодатчика показан на рис. 5. Младший полубайт регистра LS предназначен для передачи данных температуры с максимальной точностью, т. е. 0,0625°С. Если точность измерения температуры будет в два раза меньше, то все данные сдвинутся на разряд вправо, а в нулевом бите будет информация 2(в минус третей степени). Если будет установлена точность измерения температуры, равная 0,5°С, то формат регистров температуры ничем не будет отличаться от формата регистров термодатчика DS1820.

В табл. 2 показан пример данных при различных температурах, измеренных с максимальной точностью измерения.

Точность измерения температуры термодатчиком DS18B20 задается при его инициализации установкой пятого и шестого бита регистра конфигурации (рис. 5). В табл. 3 показаны устанавливаемые значения битов регистра конфигурации при различной точности измерения и максимальном времени преобразования температуры. Реально это время может быть значительно меньшим.

Рисунок 5. Формат регистров термодатчика DS18B20

При подаче управляющим микроконтроллером команды 0x4E (запись в блокнот) подряд передаются 3 байта. Первым передается байт установки ограничения температуры по максимуму (Тh), вторым — по минимуму (Tl), а третьим — байт конфигурации. Назначение других команд ничем не отличается от назначения команд термодатчика DS1820.

Последовательность действий управляющего микроконтроллера при считывании температуры с одного термодатчика DS1820:

1) послать сигнал обнуления линии (480. 960 мкc);

2) принять импульс присутствия или заполнить время паузой (60. 240 мкc);

3) послать команду пропуска идентификации 0xCC;

4) послать команду начала преобразования 0x44;

5) пауза не менее 500 мкc для завершения процесса преобразования;

6) обнулить линию;

7) послать команду пропуска идентификации 0xCC;

8) послать команду считывания блокнота 0xBE;

9) принять 9 байт;

10) выделить и проанализировать бит десятых долей градуса;

11) проанализировать бит знака;

12) если знак отрицательный, то перевести значение температуры в дополнительный код.

Последовательность действий управляющего микроконтроллера для датчика DS18B20 отличается посылом байта конфигурации с любыми значениями температур ограничения. Кроме того, необходимо вводить вычисления долей градуса с установленным весом (точностью).

Теоретический материал был взят из книги Н. И. Заеца "Радиолюбительские конструкции на PIC микроконтроллерах"

Практическое программирование Arduino/CraftDuino - температурный 1-Wire датчик DS18S20

В продолжение темы 1-Wire рассмотрим температурный 1-Wire датчик — DS18S20 :)

DS18S20 – высокоточный цифровой термометр с интерфейсом 1-Wire (High Precision 1-Wire Digital Thermometer) от DALLAS Semiconductor (Maxim).

Для подключения датчика достаточно двух проводов – линии данных и заземления;

питание элемента в этом случае называется «паразитным»/фантомным (Parasite power mode ) и осуществляется по линии данных за счёт накопления энергии во встроенном конденсаторе во время высокого уровня напряжения

(не рекомендуется при температуре свыше +100 С из-за быстрого разряда конденсатора).

Нормальный режим питания (external supply ), заключается в подключении к датчику источника питания (3V-5V).

В обоих случаях рекомендуется использовать подтягивающий резистор в 4.7k

Характеристики DS18S20:

Интерфейс 1-Wire

Измеряемая температура от -55 до +125 °C

Точность 0.5 °C в диапазоне от -10 до +85 °С

Температура считывается 9 -ю битами данных

Время на конвертацию температуры — 750 ms (максимальное)

Как и любое 1-Wire устройство — каждый DS18S20 содержит уникальный 64-битный ROM

Первые 8 бит — код серии ( для DS18S20 код — 10h. а для DS18B20 — 28h ).

Затем 48 бит уникального номера, и в конце 8 бит CRC-кода.

Однако, самое интересное — данные о температуре хранятся в оперативной памяти (scratch-pad memory ) датчика.

Память состоит из оперативной ROM и энергонезависимой EEPROM:

Первые два байта – содержат данные об измеренной температуре,

Третий и четвёртый байты хранят верхний (TH) и нижний (TL) пределы температуры.

Пятый и шестой – не используются.

Седьмой и восьмой – байты – счётчики – могут использоваться для более точного измерения температуры.

Девятый байт хранит CRC-код предыдущих восьми :)

Теперь осталось разобраться с тем – какие команды может выполнять этот датчик.

Кроме уже знакомых нам:

Поиск адресов — Search ROM [F0h]

Чтение адреса устройства — Read ROM [33h]

Выбор адреса — Match ROM [55h]

Игнорировать адрес — Skip ROM [CCh]

Добавились:

Поиск Тревоги — Alarm Search [ECh] – операция этой команды идентична операции поиска адресов [F0h]. за исключением того, что в данном случае ответят только те датчики, у которых, при последнем измерении, температуры вышла за установленные пределы (выше TH или ниже TL).

И команды работы со scratch-pad memory:

Конвертировать температуру — Convert T [44h] – датчик произведёт измерение и запись данных о текущей температуре. Если ведущее устройство будет за этой командой слать тайм-слоты чтения, то пока конвертация не закончена — DS18S20 будет выдавать в линию «0», а после завершения конвертации «1».

Если датчик работает в режиме паразитного питания, то не позже 10 мкс после подачи команды устройство управления должно установить высокий уровень на шине на время продолжительности преобразование (не менее 750 ms )

Запись в память — Write Scratchpad [4Eh] – эта команда позволяет записать 3 байта в память датчику. Первый байт запишется в TH, второй в TL, а третий байт запишется в пятый байт памяти – у DS18S20 – он не используется, а у DS18B20 – это байт конфигурации

Чтение памяти — Read Scratchpad [BEh] – позволяет нам считать память датчика. В ответ на эту команду датчик вернёт 9 байт своей памяти, начиная с 0-го байта TEMPERATURE LSB и заканчивая восьмым – CRC.

Копировать память — Copy Scratchpad [48h] – датчик скопирует содержимое ОЗУ — TH и TL в EEPROM

Если датчик работает в режиме паразитного питания, то не позднее 10 мкс после подачи этой команды устройство управление должно установить высокий уровень на шине и поддерживать его в течении не менее 10ms.

Производители обещают, что EEPROM датчика DS18S20 должен выдержать минимум 50000 циклов перезаписи и будет хранить данные 10 лет при T = +55°C.

Повторная загрузка — Recall E2 [B8h] – загружает данные из EEPROM в ОЗУ. Эта операция выполняется автоматически, как только на датчик подаётся напряжение.

Вид электропитания датчика — Read Power Supply [B4h] – с помощью этой команды можно определить – какой вид питания использует датчик. Если датчик выставит на шине «0» — значит он использует паразитное питание. Если же датчик использует внешнее питание, то он ответит «1».

Теперь становится понятно, что нужно сделать, чтобы получить от датчика данные о температуре :)

После RESET-а и поиска устройств на линии 1-Wire, нужно выдать команду

0x44. чтобы запустить конвертацию температуры датчиком.

Подождать не менее 750 ms и выдать команду

0xBE. чтобы считать ОЗУ датчика.

Данные о температуре будут в первых двух байтах.

Остаётся только сложить эти два байта, предварительно сдвинув старший байт на 8 бит влево:

Температуру получим просто разделив на 2 (шаг ведь в пол-градуса)

Однако, датчик ведь называется «высокоточный»! Поэтому предусмотрена процедура для получения более точных данных о температуре:

0. Считать данные с датчика: LSB, MSB, COUNT_REMAIN, COUNT_PER_C

1. Получить данные о температуре с точностью в пол-градуса. (Tc_100)

2. Уточнённые данные о температуре высчитываются по формуле:

Как помним, для работы с датчиками с интерфейсом 1-Wire можно использовать библиотеку Jim Studt-а – OneWire. скачать

Соответственно, скетч для получения температуры от DS18S20 будет таким:

Этот скетч можно опробовать даже не собирая схемы :)

Элемент DS18S20 есть в базе протеуса, поэтому можно набросать схему в нём:

Загрузив в МК полученный после компиляции hex и запустив симуляцию увидим в окошке терминала:

А вот что будет в порту, если попробуем подключить реальный датчик DS18S20

Пример чтения датчика на микроконтроллерах на языке Си:

Пример для работы с одним датчиком (код чуть больше 300 байт!) ds18b20.c.zip

Проверено на микроконтроллерах Atmel AVR.

Работа с adruino:

Необходимы библиотеки DallasTemperature и OneWire .Так же есть варианты использования без библиотеки DallasTemperature.Примеры можно посмотреть в папке примеров скетчей среды arduino IDE.

Работа с energia (LaunchPad):

Необходимы библиотеки StellarisDS18B20 и OneWire .Примеры можно посмотреть в папке примеров скетчей среды Energia.

Работа с Raspberry PI в Raspbian:

Перед подключением датчиков необходима установленная библиотека для работы с GPIO bcm2835 .

Требуется,чтобы были загружены модули ядра для работы с 1-wire: w1_therm и w1-gpio (подробнее в статье про настройку GPIO )

Датчики могут работать используя паразитное питание,сопротивление подтягивающего резистора в этом случае должно быть 1 кОм.Для работы этого режима необходимо указать через пробел параметр pullup=1 в загрузке модуля w1-gpio.

Считать данные можно обратившись к файлам в /sys/bus/w1/devices/w1_bus_master1/ID_сенсора

Пример чтения датчиков из php находится тут .

Подключение к компьютеру на Linux и Windows:

Пример подключения через USB можно посмотреть в этой статье .

Беспроводной вариант подключения

Рекомендуем также прочитать
Ремонт двигателей УМЗ-4216 и УМЗ-4213 ОАО "Ульяновский моторный завод" специализируется на выпуске автомобильных четырехцилиндровых рядных бензиновых двигателей.
Автосигнализация Pandora LX 3257
Обзор умной GSM-розетки Senseit GS2