1-Wire. Работа с DS18B20. Часть 1

18/01/2011 - 18:42
     Все (и в том числе я) называют DS18B20 цифровым датчиком температуры. Однако это не просто датчик, это программируемый цифровой термометр. Он измеряет температуру в диапазоне от –55 до +125 градусов Цельсия, имеет программируемое температурное разрешение от 9 до 12 бит и позволяет задавать верхний и нижний температурные пороги, в случае превышения которых,  устанавливается флаг аварии. 
   Каждый термометр DS18B20 имеет уникальный 64 битный серийный номер, который используется для его адресации на 1-Wire шине. Это позволяет объединять на одной шине несколько независимо работающих термометров и осуществлять между ними и микроконтроллером обмен данными по 1-Wire протоколу. 
   Также особенностью данного термометра является то, что его можно запитывать не только от источника питания, но и от сигнального провода. Это так называемый режим паразитного питания. В этом режиме для подключения DS18B20 требуется всего два провода — сигнальный и возвратный (земляной, GND).

  Схема подключения DS18B20 (DS18S20, DS1820)

   Подключение датчика DS18B20 к микроконтроллеру
   Схема подключения нескольких датчиков DS18B20 с внешним питанием. 
   1-Wire шина  должна быть обязательно подтянута к плюсу питания через резистор номиналом 4,7 Ком. Напряжение источника питания от 3 до 5 Вольт. 

Подключение DS18B20 к микроконтроллеру. Режим паразитного питания
   Схема подключения датчика DS18B20 в режиме паразитного питания. 
   Вывод Vdd соединяется с GND, а 1-Wire шина дополнительно подключается к источнику питания через полевой транзистор. 
   Когда датчик DS18B20 выполняет преобразование температуры или копирует данные из ОЗУ в EEPROM память, он потребляет ток до 1,5 мА. Этот ток может вызывать недопустимое снижение напряжения на 1-Wire шине. Чтобы этого не происходило, 1-Wire шину на время выполнения этих операций подключают к источнику питания. Для этого и нужен полевой транзистор.   

   Несколько слов о 1-Wire протоколе

     Для обмена данными термометр DS18B20 использует 1-Wire протокол (однопроводный протокол). Это низкоскоростной двунаправленный полудуплексный последовательный протокол обмена данными использующий всего один сигнальный провод. Естественно требуется еще и возвратный (земляной) провод, но об этом маркетологи обычно умалчивают. 1-Wire протокол был разработан фирмой Dallas Semiconductor в конце 90-х годов.    
     
   Имеется несколько типов сигналов, определенных 1-Wire протоколом - импульс сброса, импульс присутствия, запись 0, запись 1, чтение 0 и чтение 1. Все эти сигналы, за исключением импульса присутствия, формируются на шине главным устройством — MASTERом . В нашем случае это  микроконтроллер AVR. 
  Принцип формирования сигналов во всех случаях одинаковый. В начальном состоянии 1-Wire шина с помощью резистора подтянута к плюсу питания. Главное устройство «проваливает» на определенное время 1-Wire шину в ноль, затем «отпускает» ее и, если нужно, «слушает» ответ подчиненного (SLAVE) устройства. В нашем случае подчиненное устройство - термометр DS18B20. 
 
  Физически это реализуется так. 
  Операция записи бита: Вывод микроконтроллера устанавливается в режим выхода и на нем устанавливается логический ноль. Выдерживается пауза, длительность которой зависит от значения передаваемого бита (0 или 1), затем вывод переводится в режим входа в состоянии Hi-z и снова выдерживается пауза. 
  Операция чтения бита: Вывод микроконтроллера устанавливается в режим выхода и на нем устанавливается логический ноль. Выдерживается определенная пауза, вывод переводится в режим входа в состоянии Hi-z, выдерживается пауза, а затем микроконтроллер считывает потенциал вывода. 
 

    Инициализация: сигнал сброса и присутствия

   Все сеансы связи микроконтроллера с датчиком DS18B20 начинаются с сигнала сброса.  Микроконтроллер на 480 мкс «проваливает» 1-Wire шину в ноль, а затем «отпускает» ее. Если к шине подключен термометр DS18B20, то он  обнаруживает положительный перепад и после паузы в 15-60 мкс отвечает микроконтроллеру импульсом присутствия — «проваливает» шину в ноль на время от 60 до 240 мкс. 
  1-Wire. Импульс сброса и присутствия

   Запись данных на 1-Wire шине

   Обмен данными по 1-Wire шине происходит последовательно, младшим битом вперед. Передача или прием одного бита данных выполняются в течении фиксированного промежутка времени, так называемого тайм слота (time slot). Различают тайм слоты записи и тайм слоты чтения. Длительность всех тайм слотов должна быть > 60 мкс, а пауза между тайм слотами  > 1 мкс.   
 
   Для передачи нуля микроконтроллер «проваливает» 1-Wire шину на время от 60 до 120 мкс. Затем «отпускает» ее и перед записью следующего бита выдерживает паузу >1  мкс.
   Для передачи единицы микроконтроллер «проваливает» 1-Wire шину на время от 1 до 15 мкс,  «отпускает» ее и выдерживает паузу. Пауза должна быть такой, чтобы длительность тайм слота была > 60+1 мкс. 
   1-Wire. Тайм слот записи

   Чтение данных на 1-Wire шине

   DS18B20 является подчиненным устройством и может передавать данные, только когда микроконтроллер формирует на 1-Wire шине тайм слоты чтения. Для формирования тайм слота чтения микроконтроллер «проваливает» 1-Wire шину на время от 1 до 15 мкс, а затем «отпускает» ее, передавая  управление состоянием 1-Wire шины датчику DS18B20. Если DS18B20 передает ноль, он удерживает шину в «проваленном» состоянии (в состоянии логического нуля) до конца тайм слота. Если он передает 1, он оставляет шину в «подтянутом» состоянии. 
   Микроконтроллер может считывать данные датчика DS18B20 через 15 мкс после начала тайм слота чтения. 

1-Wire. Тайм слот чтения

Comments   

# Riniy 2011-01-18 23:27
Давно использую этот протокол. Работал с 5-ю датчиками на шине. Важно! при использовании датчика с паразитным питанием необходимо, перед подачей на шину + питания, убедиться в отсутствии КЗ между шиной и землей. Мало ли где мог провод перемкнуть..
# Pashgan 2011-01-19 04:28
Спасибо. Полезное замечание!
# Petr 2016-01-27 11:09
Подскажите пожалуйста как правильно проверять цепь на КЗ?
# DVF 2011-01-19 16:05
Ждем-с продолжения на Си ;-)
# alkoizh 2011-03-04 08:11
DS18B20 в режиме паразитного питания, я уменьшаю резестор подтяжки до 1,8 кОм, иначе выше 71 градуса Цельсия на экран выдаёт "12". Напряжение источника питания 5 Вольт.
Кто как откомментирует?
# Pashgan 2011-03-05 06:32
А схема включения какая?
# alkoizh 2011-03-05 07:01
Pashgan
Схема подключения датчика DS18B20 в режиме паразитного питания.Без полевого транзистора.
Я уж понял, что это из за отсутствия транзистора.
# Владимир 2011-04-12 13:35
Спасибо за статью. Кое-что для меня прояснилось...
# NikB 2011-05-29 09:36
1. "Для передачи единицы микроконтроллер «проваливает» 1-Wire шину на время от 1 до 15 мкс, «отпускает» ее и выдерживает паузу. Пауза должна быть такой, чтобы длительность тайм слота была > 60+1 мкс. "
2. "Для формирования тайм слота чтения микроконтроллер «проваливает» 1-Wire шину на время от 1 до 15 мкс, а затем «отпускает» ее, передавая управление состоянием 1-Wire шины датчику DS18B20."

Не вижу разницу. Наверное что-то не заметил. Наверное, не только я.
# LessM 2011-05-30 09:02
Все правильно. Во втором случае данные передаются датчиком, т.е. контроллером только дается провал для синхронизации. А уж датчик если хочет передать единицу - ничего не делает, а если ноль, то сам проваливает, т.е. растягивает провал до конца слота.
# XanderEVG 2012-03-18 09:12
Здравствуйте, не подскажите куда копать....
Сделал на асме реализацию обмена по 1-wire. считываю серийник с iButton и термодатчика без проблем командой 33h. Но другие команды не распознает. в частности 0CCh и 0BEh. просто не отвечает после них. В чем может быть дело
# Dimon 2012-04-03 12:42
комманда 0CCh выполняется только после Reset, а 0BEh только после любой из комманд Master Tx ROM
# Dimon 2012-04-03 12:48
к стати, на комманду 0CCh контроллер никак отвечать не будет, он будет ждать либо следующей комманды, либо сброса
# Dimon 2012-03-29 22:10
Ломаю голову второй день с DS18S20, до 60-62 градусов измеряет идеально, а потом вываливает одни нули вплоть до 127, но при 127 гр. и выше регистр заполняется единицами
# Dimon 2012-04-03 12:44
Разобрался, Reset был слишком короткий :-)
# azfox 2013-12-08 09:35
Датчик ds18b20 от батареи показывет десятые, а от блока питания 5 вольт только целые и 5 после запятой! И смех и слезы):
# Pashgan 2013-12-09 04:34
Другой датчик попробуй.
# azfox 2013-12-09 18:58
Пробовал. Он и от батарейки по 0.5 считает!
# Pashgan 2013-12-10 08:51
У тебя по ходу DS1820, а не DS18B20. У него как раз разрешение 0.5 градуса.
# Dmitr 2015-11-24 16:30
"Отпустить шину" - значит j,zpfntkmyj перевести ее из режима записи в режим чтения микроконтроллер ом или достаточно в режиме записи переключить порт на котором висит датчик с 1 на 0?
# Dmitr 2015-11-24 17:39
То есть с 0 на 1.

У вас недостаточно прав для комментирования.