Термометр с четырьмя датчиками DS18B20 » Программирование устройств на PIC микроконтроллерах


Логин:
Пароль:
О сайте:

Pic.Rkniga.ru - Сайт как для начинающих, так и для опытных радиолюбителей, разрабатывающих свои устройства на популярных PIC микроконтроллерах.
Здесь можно обмениваться сообщениями на форуме, а также добавлять на сайт статьи и схемы своих устройств.

Меню сайта
Главная Форум по PIC микроконтроллерам Форум Статьи по PIC микроконтроллерам Статьи Справочная информаци по PIC микроконтроллерам Справочник Литература по PIC микроконтроллерам Литература Схемотехника Схемотехника устройств на PIC микроконтроллерах Микроконтроллеры Программаторы Все по программированию PIC микроконтроллеров Программы, Софт Программы Ссылки Написать нам
Опрос

На каком языке программирования вы пишите программы?


Ассемблер
Си
Бейсик
Паскаль
Другой


Последние материалы
  • Каршеринг в Москве - это Просто, Удобно и Недорого.
  • Кнопка On/OFF на PIC12F629.
  • Часы с синхронизацией от китайского будильника
  • ШИМ регулятор на PIC16F628A.
  • Счетчики прямого и обратного счета на PIC16F628A.
  • Таймер отключения питания для мультиметра и не только.
  • Программирование на C микроконтроллеров PIC24
  • Измеритель напряжения и тока
  • Маршрутный компьютер для электровелосипеда
  • Простой двухканальный термометр на PIC16F690 и датчиках DS18B20
  • Популярные материалы
    Случайная книга
    Термометр с четырьмя датчиками DS18B20
    Автор публикации: alex Просмотров: 6445 Добавлен: 20-11-2014, 11:36 Комментарии: 0

         К этому микроконтроллерному термометру можно подключить до четырёх цифровых датчиков температуры DS18B20, расположив их в тех местах, где необходимо контролировать температуру, и соединив с прибором, общим для всех трёхпроводным кабелем. Значения температуры отображаются на четырёхстрочном символьном ЖКИ.
         Схема термометра изображена на рис. 1. Напряжение 5 В для его питания подают, например, от зарядного устройства для сотового телефона. Включают и выключают термометр выключателем SA1. Управляет датчиками температуры BK1—BK4 и считывает результаты их работы микроконтроллер DD1 (PIC16F628A-I/P), работающий от встроенного тактового генератора. Индикатор HG1 связан с микроконтроллером трёхразрядной шиной управления (линии RA2—RA4 микроконтроллера) и четырёхразрядной шиной данных (линии RB0—RB3). Поскольку выход RA4 микроконтроллера, в отличие от других, выполнен по схеме с открытым стоком, для него предусмотрен нагрузочный резистор R2, поддерживающий здесь высокий логический уровень, когда внутренний транзистор микроконтроллера закрыт.


         Неиспользуемые линии разрядов D0—D3 шины данных индикатора во избежание воздействия на них помех соединены с общим проводом. Оптимальную контрастность изображения на экране ЖКИ устанавливают подстроечным резистором R4.
         Термометр собран на односторонней печатной плате из фольгированного стеклотекстолита, изображённой на рис. 2. В собранном виде вместе с индикатором она показана на рис. 3.
         Когда датчики BK1—BK4 подключены к прибору, как показано на схеме, цепи +5 В (выв. 3) и ввода—вывода информации (выв. 2) всех четырёх датчиков соединены параллельно. Но их выводы 1, обычно соединяемые с общим проводом прибора, в данном случае подключены раздельно к линиям RA0, RA1, RA6 и RA7 микроконтроллера. Это позволяет его программе включать датчики раздельно. Чтобы включить, например, датчик BK1, программа переводит линию RA0 в режим выхода и устанавливает на нём низкий логический уровень напряжения. Это эквивалентно соединению вывода 1 датчика с общим проводом. Цепь питания датчика замыкается, и он включается. Потребляемый им ток не превышает 1,5 мА при нагрузочной способности линии порта микроконтроллера 25 мА. Остальные три линии из четырёх, перечисленные выше, программа оставляет в режиме входов. Их входное сопротивление в этом режиме очень велико, и цепи питания трёх датчиков остаются разомкнутыми.


         Следует заметить, что нельзя управлять питанием датчиков DS18B20, отключая от плюса питающего напряжения их выводы 3. Дело в том, что в этих датчиках предусмотрена возможность так называемого "паразитного питания", когда для их нормальной работы достаточно напряжения высокого логического уровня, поступающего на информационный вывод 2 в процессе обмена информацией с микроконтроллером.
         Каждый датчик DS18B20 имеет уникальный номер длиной 64 двоичных разряда, хранящийся в его ПЗУ Это позволяет ведущему устройству интерфейса 1 -Wire (микроконтроллеру) различать соединённые параллельно ведомые устройства (датчики) по этим номерам, не прибегая к отключению питания от каждого из них. Для этого предусмотрены специальные команды, на которые реагирует только ведомое устройство с указанным в команде номером. Но чтобы воспользоваться такой командой, нужно знать этот номер, а он уникален и от датчика к датчику не повторяется. Существует алгоритм программного определения номеров всех соединённых параллельно датчиков. Но он очень сложен, проще оказалось определять номера, включая датчики по одному, и лишь затем подключать их все параллельно.
         При нажатии на кнопку SB1 программа микроконтроллера поочерёдно включает по одному датчику, запрашивает его номер и запоминает его в EEPROM. В случае отсутствия датчика "принятая" от него информация состоит из одних логических единиц. Поскольку такого номера у реального датчика быть не может, запись его в EEPROM эквивалентна стиранию хранившейся информации о ранее подключённом датчике.


         Завершив определение номеров датчиков, программа включает их все и отправляет общую (без указания номеров) команду выполнить измерение температуры. Её принимают и исполняют все датчики. По готовности результатов программа обращается к каждому датчику отдельно по его уникальному номеру, считывает измеренные значения температуры и отправляет их на индикатор. Далее циклы измерения, считывания результатов и их вывода на индикатор периодически повторяются.
         При повторном включении термометра вновь нажимать на кнопку SB1 для определения номеров датчиков нет никакой необходимости, поскольку эти номера уже записаны в энергонезависимой памяти микроконтроллера. Программа сразу же начнёт выполнять циклы измерения температуры. Более того, теперь все зарегистрированные датчики можно соединить одноимёнными выводами параллельно и подключить их к устройству одной тройкой проводов. Например, такой, как показана на рис. 4 (датчики в разъёмы не вставлены). Новое раздельное подключение датчиков и нажатие на кнопку SB1 потребуются лишь при замене любого из них или всего комплекта.
         Программа микроконтроллера создана в среде PIC Simulator IDE v6.97, в которой предусмотрены средства работы с интерфейсом 1-Wire. Но для связи с устройствами по этому интерфейсу может быть использован только один вывод микроконтроллера, заданный при инициализации программы. Для датчика DS18B20 в среде программирования имеются процедуры высокого уровня (например, послать определённую команду), но в программе они не использованы, так как могут работать только при условии, что к микроконтроллеру подключён единственный датчик. Применены только низкоуровневые процедуры 1wireInit (инициализация интерфейса), 1wireSendByte (передача байта), 1wireGetByte (приём байта) и 1wireGetBit (приём одного двоичного разряда).


         Измеренное датчиком DS18B20 12-разрядное значение температуры находится в двух байтах его оперативной памяти, которые могут быть прочитаны ведущим интерфейса. Сразу после включения датчика, когда измерение ещё не выполнялось, это значение равно 85 °C. Чтобы датчик выполнил измерение, ему нужно подать соответствующую команду. Процесс определения температуры занимает около 750 мс, после чего полученное значение может быть считано.
         Чтобы точно узнать момент готовности информации о температуре, после команды начала измерения ведущий может периодически посылать запросы чтения разряда состояния датчика. Ответом на запрос будет логический 0, если измерение ещё продолжается, или логическая 1, когда оно завершено. При параллельном соединении датчиков, получивших команду одновременно, логическая 1 будет принята только по завершении измерения всеми датчиками.
         Чтобы избежать операций с дробными числами, полученные от датчиков 12-разрядные значения температуры с ценой младшего разряда 0,0625 оС программа округляет для вывода на индикатор до целых чисел, в 10 раз больших реальных значений. Например, при температуре 25,25 оС прочитанное из датчика двоичное число 000110010100 умножением на десять и последующим сдвигом на четыре разряда вправо преобразуется в целое десятичное число 252. На индикаторе оно будет выглядеть как 25,2, поскольку после второго разряда всегда предусмотрен вывод десятичной запятой.
         ЖКИ-модуль LCD1604 на основе контролера HD44780, применённый в качестве HG1, не содержит в своём знакогенераторе русских букв и некоторых других символов, необходимых для формирования нужных сообщений на экране. Многие русские буквы можно вывести, используя их схожесть с латинскими. Для вывода остальных использована возможность загрузить в первые восемь ячеек знакогенератора изображения символов, вид которых на экране определён пользователем с помощью операторов Lcddefchar. Если двоичные коды, заданные в рассматриваемой программе этими операторами, расположить столбцами, как в таблице, то можно увидеть, что единицами в них сформированы изображения символа, образующего вместе с буквой N знак номера №, символа градуса и букв Я, З, И. Эти буквы использованы для вывода сообщения "НЕТ СВЯЗИ" вместо значения температуры при отсутствии подключённого датчика.

    Автор: К. Абдукаримов, г. Шымкент, Казахстан
    Материал взят из: Журнала Радио 2014 №8

    В архиве: Исходный код программы и прошивка микроконтроллера PIC16F628A.

    termomschtrmdatch.rar [26,58 Kb] (cкачиваний: 797)

    Комментарии