Подключение и программирование датчика DS18B20
Подключение датчика DS18B20 к микроконтроллеру
Программирование работы микроконтроллера с датчиком DS18B20
В двух предыдущих статьях мы рассмотрели устройство датчика температуры DS18B20 и систему команд датчика. В этой статье мы рассмотрим схему подключения одного или нескольких датчиков к микроконтроллеру и программирование работы МК с датчиком (датчиками) по шине 1-Wire с внешним питанием
Подключение датчика DS18B20 к микроконтроллеру
Типовая схема подключения датчиков DS18B20 к микроконтроллеру:
Как видно из схемы, датчик DS18B20 (или датчики) подключаются к микроконтроллеру, если они имеют общее питание, тремя проводниками:
- вывод №1 - общий провод (масса, земля)
- вывод №2 - он же DQ, по которому происходит общение между МК и DS18B20, подключается к любому выводу любого порта МК. Вывод DQ обязательно должен быть "подтянут" через резистор к плюсу питания
- вывод №3 - питание датчика - +5 вольт
Если в устройстве используется несколько датчиков температуры, то их можно подключить к разным выводам порта МК, но тогда увеличится объем программы. Датчики лучше подключать как показано на схеме - параллельно, к одному выводу порта МК.
Напомню о величине подтягивающего резистора:
"Сопротивление резистора надо выбирать из компромисса между сопротивлением используемого кабеля и внешними помехами. Сопротивление резистора может быть от 5,1 до 1 кОм. Для кабелей с высоким сопротивлением жил надо использовать более высокое сопротивление. А там где присутствуют промышленные помехи – выбирать более низкое сопротивление и использовать кабель с более большим сечением провода. Для телефонной лапши (4 жилы) для 100 метров необходим резистор 3,3 кОм. Если вы применяете «витую пару» даже 2 категории длина может быть увеличена да 300 метров"
Программирование работы микроконтроллера с датчиком DS18B20
Как происходит общение датчика DS18B20 с микроконтроллером мы рассмотрим используя даташит датчика и программу Algorithm Builder.
Последовательность операций общения
ОЧЕНЬ ВАЖНО следовать установленной последовательности (которая состоит из трех пунктов) каждый раз при обращении к DS18B20:
1. Инициализация
2. Команда ROM
3. Функциональная команда DS18B20
Только две команды выполняется в два шага: Поиск ROM и Поиск Аварии.
Инициализация DS18B20
Последовательность выполнения инициализации состоит из двух частей:
- импульс сброса - который формирует микроконтроллер
- импульс присутствия - который формирует DS18B20
Исходное состояние шины DQ, по которой происходит общение МК и датчика, - логическая 1, так как шина DQ "подтянута" через резистор к питанию.
По состоянию шины DQ можно определить подключен ли датчик к микроконтроллеру:
- если на шине логическая 1 - значит датчик подключен
- если не логическая 1 - значит датчик не подключен (или забыли подключить, или обрыв линии DQ)
Поэтому, последовательность выполнения инициализации можно дополнить еще одним пунктом - проверка подключения датчика. Но учтите, что эту проверку можно провести только при одном датчике.
Проверяем подключение датчика DS18B20:
Где:
- INI_DS18B20 - подпрограмма инициализации
- DQ_Pin - имя, которое я присвоил, разряду порта к которому подключен датчик (если смотреть по схеме, то это вывод PB0 порта В)
- DQ_Pin=1 - проверка подключения датчика - если на выводе DQ_Pin логическая единица то переходим по стрелке, если нет, то:
- 1--> Term_Error, где Term_Error - переменная в которую записывается код ошибки, в данном случае "1"
- Show_Term_Error - переход к подпрограмме вывода ошибки на дисплей
К примеру, при использовании трехразрядного семисегментного дисплея, можно вывести такую строчку:
- Er1, что означает - возникла ошибка, код ошибки-1 (датчик не подключен)
Теперь заглянем в даташит датчика и посмотрим временной график процедуры инициализации:
Переводим график в слова:
1. Исходный уровень шины DQ - логическая единица (за счет подтягивающего резистора)
2. Микроконтроллер формирует импульс сброса:
- МК переводит шину DQ в состоянии логического нуля на время не менее 480 микросекунд
- МК отпускает шину (переводим вывод в режим приема), при этом шина DQ опять переходит в состоянии логической единицы
3. DS18B20 обнаружив перепад уровня на шине (с логического нуля на логическую единицу) через 15-60 микросекунд передает импульс присутствия - переводит шину DQ в состояние логического нуля на длительность 60-240 микросекунд
4. По завершению импульса присутствия DS18B20 возвращает шину DQ в уровень логической единицы (судя по графику - через 480 микросекунд, от окончания импульса сброса, шина должна стопроцентно вернуться в уровень логической единицы)
Теперь переведем это все на язык программы. Но при этом следует учесть, что в процессе инициализации могут возникнуть еще две ошибки:
- DS18B20 не выдал импульс присутствия
- после импульса присутствия от DS18B20 шина DQ не вернулась в состоянии логической единицы
На графике указаны минимальные временные характеристики, поэтому в программе они несколько завышены или взяты максимальные (из минимальных) значения:
- импульс сброса от МК - не 480 а 500 микросекунд
- пауза от окончания импульса сброса до импульса присутствия - 60 микросекунд
- возврат шины в состояние логической единицы после импульса присутствия через 420 микросекунд
Я надеюсь с первым вопросом - ИНИЦИАЛИЗАЦИЯ, мы разобрались
Переходим к следующему шагу обязательной последовательности - "Команда ROM"
Команда ROM
Следующим шагом нашего общения с DS18B20 мы должны подать ему нужную команду ROM
Напоминаю, что команд ROM всего пять:
1. Поиск ROM - может применяется (а может и не применяться, я, к примеру, ее в большинстве случаев не использую) в случае применения нескольких датчиков или других устройств общающихся с МК по шине 1-Wire
2. Чтение ROM - применяется при одном подключенном датчике для считывания его 64-битного кода
3. Соответствие ROM - применяется в случае если датчиков более одного для обращения к конкретному датчику
4. Пропуск ROM - команда используется для обращения сразу ко всем датчикам (устройствам) подключенным к МК. Практически применяется для подачи функциональной команды на конвертирование температуры (определение температуры) всеми подключенными датчиками одновременно
5. Поиск тревоги - если мы задали DS18B20 верхний и нижний предел температуры, которые нам нужно контролировать. В этом случае нам ответят только те датчики измеренная температура которыми соответствует заданным пределам
Каждая команда ROM имеет шестнадцатиразрядный код (также как и функциональные команды), поэтому для удобства в программе очень можно определить константы, которые имеют понятные названия команд, к примеру:
В этой таблице заданы константы нужных мне для работы с датчиками команд.
После первого шага - ИНИЦИАЛИЗАЦИЯ, и передачи датчику DS18B20 команды ROM, датчик готов выполнить функциональную команду.
В предыдущей статье я подробно рассказал и о командах ROM, и о функциональных командах, повторяться не буду (я про функциональные команды).
Два примера алгоритма работы с DS18B20:
1. При использовании одного датчика:
- выполняем инициализацию
- подаем датчику команду ROM - "Пропуск ROM"
- подаем датчику функциональную команду - "Конвертировать температуру" (измерить температуру)
В процессе конвертирования контролируем работу датчика - если на шине ноль, то конвертирование не закончилось, если на шине логическая единица - конвертирование закончено.
Теперь можно считать температуру с датчика:
- выполняем инициализацию
- подаем датчику команду ROM - "Пропуск ROM"
- подаем датчику функциональную команду - "Чтение памяти"
По команде "чтение памяти" датчик начинает передачу данных из своей памяти - все девять байт. Но нам нужны только первые два байта - в них записана текущая измеренная датчиком температура. Поэтому считываем только два первых байта и выходим из подпрограммы.
Предыдущие статьи:
1. Устройство цифрового термометра DS18B20
2. Система команд датчика DS18B20
3. Подключение DS18B20 к микроконтроллеру
Следующая статья:
1. Микроконтроллер AVR и датчик DS18B20: программирование работы
>> Два примера алгоритма работы с DS18B20
>> 1. При использовании одного датчика:
А где 2-ой алгоритм?
Добрый день. Видимо автор планировал его написать, но по каким то причинам не дописал. К сожалению, он уже не посещает наш сайт
Здравствуйте. А про подключение двух и более датчиков никто нигде не говорит. Сколько ни пытался, так и не смог опросить два датчика.
Добрый вечер. На Arduino это делается достаточно просто (можете посмотреть эту статью), а вот в случае с просто микроконтроллером AVR, к сожалению, не могу подсказать.
Полезные статьи пишите, Вадим. За использование АБ- особая Благодарность!))
По этой теме: в верху на картинке видимо ошибка, сопротивления находятся у каждого датчика! А ежли у меня на шине будет 50 или 80 штук? Так это штож, сигнальная линия будет на конкретном плюсе? Достаточно ведь единого сопротивления, подтянутого к плюсу питания..
Поправие если не так..!
Здравствуйте Виталий!
Да, Вы правы.
С уважением, Admin.
Можете ли вы запрограммировать мне 5шт.ds18s20?
Здравствуйте Сергей!
К сожалению помочь не смогу.
С уважением, Admin.
Добрый день.Помогите,пожалуйста,с DS18B20.С одним датчиком все получилось.Читаю температуру,
поочередно коды считал.Пытаюсь читать через код,ничего не получается.Читаю код и тут-же через него пытаюсь что-то прочитать,получаю все единицы.Грешу на то,что код передаю пачками, или по 2 байта,или по 4.Mожет какая-то военная хитрость есть.Прошу помощи.
Здравствуйте Иван!
Так очень трудно ответить на вопрос. Пришлите программу и тогда попытаемся разобраться.
С уважением, Admin.
Здравствуйте я новичок по мк но я изучаю pic контроллеры. Как я понимаю что инициализация относиться к цифровым датчикам. Инициализация это проверка готовности к работе датчика? Она заключается послание сигнала мк к из того порта к которому подключен датчик с задержкой по времени а потом порт должен перейти в приём информации с датчика как я понимаю?
Здравствуйте Александр!
Инициализация - подготовка к работе (датчика или любого другого цифрового устройства позволяющая менять какие-то начальные установки для получения нужных результатов) - мы задаем начальные настройки, а потом просто считываем данные с датчика.
С уважением, Турчак Вадим.
Здравствуйте! Скажите пожалуйста верхний предел температуры DS18B20. Одно предприятие предлагает термостаты с диапазоном до +250С с этим датчиком,и меня одолевают сомнения. Спасибо!
Здравствуйте Евгений!
Датчик DS18B20 обеспечивает по даташиту с приемлемой погрешностью рабочую температуру от -55 до +125 градусов Цельсия. Вполне возможна его работа и при высших температурах, трудно сказать, я не проверял, но лучше от такого изделия отказаться, даже если ему доступны 250 градусов, то будет очень большая погрешность в измерение температуры.
С уважением, Admin.
Ещё, вот вариант, засунуть его в медную гильзу, А корпус гильзы соединить с экраном кабеля. Датчик разместить не в обмотке а на железе статора.
С принципом работы данных датчиков уже знаком, писал на асме когда-то прогу, правда под один датчик) Теперь возник вопрос, Может ли, DS18B20 работать (АДЕКВАТНО) в зоне сильных эл-магнитных наводок, скажем контролировать температуру обмоток асинхронного двигателя, большой мощности например 132 КВт (380в). Естественно для лучшего теплового контакта размещать его нужно внутри мотора, между витков обмотки на термо пасте. Что то думается что наводки будут такие сильные особенно при пуске, мотора (а это 600А пусковой на звезде потом переключение на треугольник) думаю просто сгорит, а сама шина из за паразитной индукции сгенерит напряжение которое спалит порт контролера. Вот сижу и думаю применять этот датчик или аналоговые использовать, что вы думаете?
Доброго дня Basel!
Точного ответа я не знаю.
Я бы попробовал применить DS18B20
C уважением, Admin.
Я сегодня почитал тут, в общем нашел ответ на свой вопрос, скорее всего придется ставить аналоговые, слишком большие наводки, сегодня чтоб убедиться пустой кабель провели, витая пара, питание отдельным проводом, экран соединен в одной точке, (все равно его проводить) конец изолирован проходит по эстакаде сигнальных линий (не силовых) и заходит в барно мотора, и то цифровой вольтметр показывает 40-60 вольт, то есть контролеру тут же кранты. ))) Либо резисторы вешать, (типа терминаторов как в RS485) либо аналоговый датчик использовать опять же нагруженный на резистор. А жаль))) с цифровым побольше опций, есть даже калибровка датчика.
Убил кучу времени пока разбирался, как обращаться к датчику по адресу (когда на шине несколько датчиков).
А где продолжение?
Очень жду!
Доброго дня Мгер!
Продолжение будет до 10 января.
С уважением, Admin.