Цифровой термометр на микроконтроллере PIC и датчике DS18B20


Достаточно часто для конструирования термометров на основе микроконтроллеров используется датчик LM35 поскольку он дешев и прост в использовании. Но датчик LM35 аналоговый, поэтому для считывания с него значения температуры необходимо задействовать АЦП (аналого-цифровой преобразователь) микроконтроллера. Поэтому в данном проекте для измерения температуры мы решили использовать датчик DS18B20, при подключении которого к микроконтроллеру PIC нет необходимости в использовании АЦП.

Внешний вид цифрового термометра на микроконтроллере PIC и датчике DS18B20

Измеряемое значение температуры мы будем выводить на экран ЖК дисплея 16х2. Общие принципы работы нашего цифрового термометра на основе микроконтроллера PIC16F877A и датчика DS18B20 будут следующие:

  1. Мы будем показывать на экране ЖК дисплея весь измеряемый датчиком диапазон температур: от -55 до +125 градусов.
  2. Изменять выводимое на экран ЖК дисплея значение температуры только если произошло ее изменение не менее чем на + / - 0.2 градуса.

Ранее на нашем сайте мы рассматривали подключение датчика DS18B20 к плате Arduino, плате Raspberry Pi и микроконтроллеру AVR.

Необходимые компоненты

  1. Микроконтроллер PIC16F877A (купить на AliExpress).
  2. Датчик температуры DS18B20 (купить на AliExpress).
  3. Держатель микросхем на 40 контактов (купить на AliExpress).
  4. Программатор PICkit 3 (купить на AliExpress).
  5. Кварцевый генератор 20 МГц (купить на AliExpress).
  6. Конденсаторы 33 пФ (2 шт.) (купить на AliExpress).
  7. Резистор 4,7 кОм – 2 шт. (купить на AliExpress).
  8. Потенциометр 10 кОм (купить на AliExpress).
  9. ЖК дисплей 16х2 (купить на AliExpress).
  10. Светодиод (купить на AliExpress).
  11. Адаптер 5V.
  12. Макетная плата и соединительные провода.

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

Датчик DS18B20 широко применяется в современной электронике и обеспечивает отличную точность измерения температуры. Разрешающая способность датчика составляет от 9 до 12 бит. На выход значение температуры датчик передает через интерфейс one wire и поэтому для считывания с него значений АЦП не требуется.

Технические характеристики датчика DS18B20:

  • диапазон измеряемых температур: от -55°C до +125°C (от -67°F до +257°F);
  • точность измерения температуры в диапазоне от -10°C до +85°C: ±0.5°C;
  • программно настраиваемое разрешение от -10°C до +85°C;
  • не требует никаких внешних компонентов для своей работы;
  • интерфейс: 1-Wire®.

Внешний вид и распиновка датчика DS18B20 показаны на следующем рисунке.

Как видно из рисунка, по внешнему виду датчик DS18B20 очень похож на транзисторы BC547 или BC557. Датчик имеет 3 контакта: Ground, DQ (выходной контакт) и VCC.

На следующем рисунке показаны технические характеристики из даташита на датчик DS18B20, которые потребуются нам в нашем проекте. Как видно из представленных характеристик, напряжения питания для датчика составляет от +3.0V до +5.5V. Также необходим подтягивающий резистор для питающего напряжения.

Технические характеристики датчика DS18B20 из его даташита

Для диапазона от -10°C до +85°C точность измерения температуры датчиком составляет ±0.5°C, а для полного диапазона от -55°C до +125°C она составляет ±2°C.

Как следует из даташита на датчик DS18B20 мы можем подключить его либо в двухпроводном режиме, в котором для его подключения нам будут необходимы всего два провода – DATA или GND, либо в режиме с внешним питанием, в котором для его подключения необходимы три провода. Мы в нашем проекте будем использовать трехпроводное подключение датчика.

Трехпроводная схема подключения датчика DS18B20

Схема проекта

Схема подключения датчика температуры DS18B20 к микроконтроллеру PIC представлена на следующем рисунке.

Схема подключения датчика температуры DS18B20 к микроконтроллеру PICВ представленной схеме мы подключили контакты RS, R/W и E ЖК дисплея к контактам RB0, RB1, RB2 микроконтроллера PIC16F877A, а контакты D4, D5, D6, D7 ЖК дисплея – к контактам RB4, RB5, RB6 и RB7 микроконтроллера. ЖК дисплей будет работать в 4 битном режиме.

Кварцевый генератор 20MHz с помощью двух керамических конденсаторов подключен к контактам OSC1 и OSC2 микроконтроллера PIC. Он обеспечивает стабильную тактовую частоту 20MHz для микроконтроллера.

Датчик DS18B20 подключен к контакту микроконтроллера с помощью подтягивающего резистора 4,7 кОм.

Алгоритм работы программы термометра

В программе для нашего цифрового термометра на основе микроконтроллера PIC и датчика DS18B20 нам необходимо выполнить следующую последовательность шагов:

  1. Настроить биты конфигурации микроконтроллера, включая биты, отвечающие за работу с кварцевым генератором.
  2. Настроить порт микроконтроллера, к которому подключен ЖК дисплей.
  3. Каждый цикл датчик DS18B20 будет начинать со сброса, поэтому нам необходимо сбрасывать DS18B20 и ждать наличия импульса.
  4. Установить разрешение работы датчика равное 12 бит.
  5. Пропустить считывание из ROM, следующее за импульсом сброса.
  6. Подтвердить команду преобразования температуры.
  7. Считать значение температуры из scratchpad (временной памяти).
  8. Проверить значение температуры является положительным или отрицательным.
  9. Вывести значение температуры на экран ЖК дисплея.
  10. Подождать пока значение температуры изменится на величину не менее чем +/-.20 градуса Цельсия.

Тестирование работы термометра

Объяснение программы для микроконтроллера PIC

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Первым делом в программе настроим биты конфигурации микроконтроллера. Затем подключим необходимые заголовочные файлы: lcd.h, ds18b20.h и xc.h.

Затем укажем команды, которые мы будем передавать на датчик температуры. Эти команды перечислены в даташите на датчик.

На приведенном рисунке в таблице 3 из даташита на датчик показаны команды, которые можно подавать на датчик.

Команды, которые можно подавать на датчик температуры DS18B20

Мы будем изменять значения температуры на экране ЖК дисплея только если температура изменится не менее чем на +/- .20 градуса. Мы можем изменить этот температурный диапазон, изменив макрос temp_gap.

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

Далее в функции void main() функция lcd_init(), которая вызывается из библиотеки lcd.h, используется для инициализации ЖК дисплея.

Регистр TRIS используется для задания режима работы контактов микроконтроллера – на ввод или вывод данных. Переменные TempL и TempH используются для хранения 12-битного разрешения датчика температуры.

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

Далее мы инициализируем датчик температуры и передаем ему команду на преобразование значения температуры.

Затем мы сохраняем 12-битное значение температуры в двух переменных типа unsigned short.

Далее в программе мы с помощью условных операторов if проверяем является ли значение температуры положительным или отрицательным и изменилось ли ее значение на величину +/- .20 градуса или нет.

Считывание данных с датчика температуры DS18B20

Давайте посмотрим на интервалы времени в интерфейсе 1-Wire®. Мы используем кварцевый генератор на 20Mhz. Если мы посмотрим внутрь файла ds18b20.c, мы там увидим:

Эта команда задает временную задержку для компилятора XC8. В качестве тактовой частоты у нас используется частота 20Mhz.

Мы запрограммируем 5 функций:

  1. ow_reset.
  2. read_bit.
  3. read_byte.
  4. write_bit.
  5. write_byte.

Протокол 1-Wire® требует соблюдения строгих временных рамок (интервалов). Их значения можно найти в даташите на данный протокол.

Временные тайминги в протоколе 1-Wire®

Внутри функции ow_reset(void) мы создадим точное значение временного слота – это очень важно для работы с протоколом 1-Wire®.

Затем, используя это точное значение временного слота, мы запрограммируем функции для чтения и записи данных в датчик.

Тайминги для функций чтения и записи данных в датчик

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

Исходный код программы

Видео, демонстрирующее работу проекта

Источник статьи

(Проголосуй первым!)
Загрузка...
1 081 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *