Двухканальный термометр на ATmega8 и DS18B20

Admin 13.12.2015

Доброго дня уважаемые друзья!
Приветствую Вас на сайте «Мир микроконтроллеров»


Двухканальный термометр на микроконтроллере ATmega8 и датчиках DS18B20

Характеристики термометра:
— 2 канала измерения текущей температуры, датчики подключены к разным разрядам порта микроконтроллера
— каждый канал позволяет измерять текущую температуру в интервале от +125 ºС до -55 ºС с разрешением до 0,1 ºС
— погрешность измерения температуры ±0,5 ºС
— обнаружение и индикация возможных ошибок в работе с датчиками температуры
— интервал измерения текущей температуры — 2 сек

Уважаемые читатели сайта!
Если вас интересует именно конструкция двухканального термометра, то могу посоветовать для прошивки микроконтроллера использовать прошивку для конструкции «Двухканальный термостат/терморегулятор» (здесь более оптимизированный и «причесанный» код)
Двухканальный термометр на ATmega8 и датчиках DS18B20

Сегодня, в продолжении развития проекта на ATmega8 (одноканальный термометр), мы рассмотрим конструкцию «Двухканальный термометр с датчиками температуры DS18B20«.
Предложенная Вашему вниманию конструкция проста, содержит минимум деталей, не требует настройки.

(Хочу сразу предупредить, что время не стоит на месте и после публикации статьи программа термометров была доработана — в нее внесены три изменения: в работе задействован только один таймер Т0, повышена внутренняя тактовая частота микроконтроллера до 8 МГц, изменен алгоритм определения десятых температуры (теперь десятые не рассчитывается а принимают значение в зависимости от числа записанного в младший полубайт регистра LS-bite. Новая программа выложена ниже описанной в этой статье))

Индикация текущей температуры осуществляется на два трехразрядных семисегментных светодиодных индикатора, при этом:
— температура ниже +100 ºС — индикация осуществляется на трех разрядах с точностью до десятых
— температура выше +99,9 ºС — индикация осуществляется на трех разрядах с точностью до градуса
— температура выше -10 ºС — индикация осуществляется: первый разряд знак «-«, второй и третий разряд — единицы и десятки градусов
— температура ниже -9,9 ºС — индикация осуществляется: первый разряд знак «-«, второй и третий разряды — десятки и единицы градусов
— незначащие нули не выводятся
При возникновении возможных ошибок в работе с датчиками температуры на индикаторы выводится:
— нет высокого уровня на линии DQ датчика — «Er1»
— нет импульса присутствия от датчика — «Er2»
— после импульса присутствия линия DQ не вернулась в состоянии логической «1» — «Er3»
Индикация ошибок позволяет своевременно выявить и устранить неисправность.


Схема двухканального термометра на ATmega8 и датчиках DS18B20:

Термометр на ATmega8 с 2 датчиками DS18B20
Детали, примененные в конструкции термометра

Микроконтроллер ATmega8-16PU с внутренней тактовой частотой — 4 мГц.
Индикаторы — трехразрядные семисегментные светодиодные индикаторы со схемой включения — «общий катод».
Транзисторы — «NPN»-структуры BC547 (транзисторы можно заменить на любые другие маломощные структуры NPN).
Постоянные сопротивления — любого типа, мощностью 0,25 Вт, близкие к номиналам указанным в схеме.
Датчики — датчики температуры DS18B20. Разрешающая способность установлена «по умолчанию» — 12 bit, что соответствует дискретности измерения температуры 0,0625 ºС.

Соединение датчиков с микроконтроллером осуществляется по трехпроводной линии — «GND, +5V, линия данных DQ», подключение по двухпроводной линии (паразитное питание) не предусмотрено по причинам:
— возможной ошибки при конвертирование температуры выше +100 ºС
— необходимости применения дополнительных MOSFET транзисторов

Общение датчиков с микроконтроллером происходит по 1-Wire шине, что позволяет, в принципе, «посадить» датчики на одну линию. В представленной конструкции датчики подсоединены к разным разрядам порта «PB» (6 и 7 — соответственно) из трех соображений:
— при необходимости разноса датчиков в разных направлениях упрощается прокладка соединительных линий
— упрощается программа — не надо определять 64-битные коды датчиков, соответственно уменьшается время затрачиваемое на общение с датчиками (что немаловажно в данной конструкции при динамической индикации 6 разрядов индикаторов)
— и так остается незадействованным целый порт
Циклический контроль избыточности (CRC) не определяется — в данной конструкции проверять правильность передачи результатов конвертирования температуры датчиками я не вижу смысла.
При больших расстояниях между датчиками и основным блоком возможно потребуется подобрать подтягивающие сопротивления (от 1 до 5 кОм). Возможно лучше будет подсоединять эти сопротивления непосредственно к датчикам (более подробно о подсоединении датчиков к микроконтроллеру здесь).

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


Работа термометра

Программа двухканального термометра написана в среде «Algorithm Builder»

Программа термометра в Algorithm Builder
В программе задействовано два таймера микроконтроллера ATmega8 — Т0 и Т1, которые настроены на вызов прерываний по переполнению счетчиков.
При включении устройства осуществляются предварительные настройки задействованных в работе портов микроконтроллера, занесение необходимых данных в переменные и разрешение прерываний, затем программа переходит в бесконечный цикл. В дальнейшем вся работа устройства осуществляется по перываниям от таймеров Т0 и Т1.
При этом:
При обработке прерывания от таймера Т0 осуществляется:
— динамическая индикация текущих значений температуры на светодиодных индикаторах
— поочередное считывание данных с датчиков температуры
— расчет и преобразование температуры для вывода на индикаторы
При обработке прерывания от таймера Т1 осуществляется
— поочередная подача команды на конвертирование температуры датчиками (с периодичностью — 1 сек)
Делители частоты таймеров при внутренней частоте микроконтроллера 4 мГц настроены:
— Т1 — СК/64 — вызов прерывания происходит почти через 1 секунду
— Т0 — настройка частоты делителя для таймера должна быть СК или СК/8 — 512mcs или 64mcs — не критично (но не менее 2ms). Это обусловлено тем, что время обработки прерывания от таймера Т1 равно времени которое затрачивает датчик на конвертирование температуры (по даташиту, при разрешающей способности 12bit, максимальное время конвертирования — 750ms, реально — намного быстрее)

Для более частого обновления текущей температуры можно настроить внутренний генератор микроконтроллера на частоту 8 мГц а делители частоты таймеров установить:
— T0 — СК/64 (периодичность вызова прерывания около 2ms)
— Т1 — СК/64 (периодичность вызова прерывания около 0,5sec)
что позволит обновлять текущую температуру с датчиков каждую секунду. Более частая подача команды на конвертирование температуры датчикам может привести к их нагреву, и, соответственно, к увеличению погрешности измерений.

Если вы «дружите» с программой «Algorithm Builder» то ее можно настроить для обновления текущей температуры непрерывно, сразу после конвертирования температуры датчиком. Для этого необходимо выполнить следующиу действия:
1. Отключить таймер Т1
2. Отключить подпрограмму обработки прерывания от таймера Т1 (можно и не отключать)
3. Включить кусок «серого кода» в «бесконечном цикле»
Возможно для предотвращения мерцания индикаторов тактовую частоту микроконтроллера придется увеличить до 8 мГц
4. Настроить делитель частоты таймера Т0 на периодичность прерывания не менее 2ms

Изменение программы термометра

Если индикаторы все же будут мерцать, попробуйте «поиграть» командами NOP в начале и в конце бесконечного цикла — добавьте или уберите. К примеру:

Настройка программы термометра
Часть кода программы отключена, она предназначена для уменьшения разрешающей способности датчиков. Для изменения разрешающей способности температурного преобразователя необходимо:
1. Включить часть кода на главной странице и подпрограмму изменения разрешающей способности на вкладке «DS18B20»:

Изменение разрешения 1

Изменение разрешения 2

2. Включить во вкладке «DS18B20» константы выделенные красным цветом:

Изменение разрешения 3

Назначение констант:
Read_Scratchpad — функциональная команда DS18B20 ($4E). Эта команда позволяет устройству управления записывать 3 байта данных в память DS18B20. Первый байт данных записывается в регистр (TH), второй байт записывается в регистр (TL), третий байт записывается в регистр конфигурации
TH и TL — регистры Аварии верхнего и нижнего предела, константа b#01010101 — соответствует 85 ºС (как и установлено в датчиках по умолчанию)
bit11 — регистр конфигурации, запись константы b#01011111 изменит разрешение с 12 до 11 bit, что вдвое уменьшит время конвертирования температуры датчиками. Для 10-битного разрешения — b#00111111, для 9-битного разрешения — b#00011111
3. Изменить в подпрограмме расчета температуры на вкладке «DS18B20» число 625 на число дискретности измерения температуры для соответствующего разрешения (125, 25, 5) и числа 1000 и 999 соответственно (для 125 — 1000 и 999, для 25 — 100 и 99, для 5 — 10 и 9)

Изменения разрешения 4


Распиновку примененных деталей можно посмотреть здесь

Если возникли вопросы, пишите, отвечу.


Приложения к статье:

  Схема двухканального термометра на ATmega8 и DS18B20 в формате SPL (50,6 KiB, 26 256 hits)

  Программа двухканального термометра в формате HEX (4,8 KiB, 26 570 hits)

  Программа двухканального термометра в Algorithm Builder (19,5 KiB, 31 615 hits)


  Вторая версия программы термометра в НЕХ-файле (5,0 KiB, 1 407 hits)

  Вторая версия программы термометра в Algorithm Builder (20,1 KiB, 25 949 hits)

Скачать программу с ЯндексДиска


(46 голосов, оценка: 4,96 из 5)
Загрузка...

Другие конструкции на микроконтроллерах
1. Простые электронные часы на микроконтроллере ATyni26, с использование микросхемы часов реального времени DS1307
2. Простой термометр на микроконтроллере ATmega8 и датчика температуры DS18B20
3. Двухканальный термостат, терморегулятор на ATmega8 и датчиках DS18B20
4. Двухканальный термометр, термостат, терморегулятор с возможностью работы по времени, одноканальный таймер реального времени на ATmega8 и датчиках DS18B20
5. Двухканальный термометр, часы на ATmega8, датчиках температуры DS18B20, RTC DS1307, LCD 1602


Конструкция двухканального термометра на микроконтроллере ATmega8 и датчиках температуры DS18B20
Published by: Мир микроконтроллеров
Date Published: 12/13/2015

Комментарии

Двухканальный термометр на ATmega8 и DS18B20 — 25 комментариев

    • Здравствуйте Владимир!
      Вторая версия более часто измеряет текущую температуру и выводит результаты на индикаторы.
      Кроме того, я бы порекомендовал прошить программой от двухканального термостата (тактовая частота внутренняя — 8 МГц)
      С уважением, Admin.

      • R17 в схеме не ставится. Это если я правильно понял подтягивающее сопротивление, если очень длинная магистраль от блока до датчика.

  1. Спасибо за схему и прошивку. С удовольствием занимался этим проектом. Т.к. мк только начинаю осваивать. Спасибо всем за комментарии. У меня сначала тоже все мерцало на второй прошивке, пока фьюзы не поставил на 8мгц.
    Файл spl не смог открыть. И нигде не смог найти схему печатки. Пришлось осваивать sprint layout. На этом проекте первый раз в жизни сам развел печатную плату.Печатка оказалась вполне жизнеспособна. Если кому надо, пишите здесь, выложу.
    Когда один датчик сжег(перепутал полярность), перестала видеть второй датчик. Поставил новый вместо горелого, все заработало.
    Питание сделал от кроны, хватило ровно на одну ночь работы, поэтому в плюс питания добавил нормальноразомкнутую кнопку. Надо узнать температуру — нажал кнопку, подождал секунду,посмотрел. Экономия батарейки ОГО-ГО! Пользуюсь уже месяц полет нормальный. Еще раз спасибо автору и всем участникам этого замечательного проекта.

  2. Здравствуйте Admin! А у Вас случайно нет прошивки для индикатора с общим анодом, или могли бы Вы переделать прошивку под данный индикатор?

    • Здравствуйте Руслан!
      Прошивки для индикаторов с общим анодом нет.
      Переделать прошивку пока возможности нет.
      С уважением, Admin.

  3. Христос воскрес.Чего-то вообще ничего невозможно скачать с данной страницы-пишет всё время загрузка прервана.А так хотелось бы повторить Вашу конструкцию.

    • Здравствуйте Александр!
      Воистину воскрес!
      Проверил, у меня все качается.
      Отправляю файл в НЕХ-коде на Ваш почтовый ящик.
      С уважением, Admin.

  4. Здравствуйте! подскажите, Atmega8 и Atmega8a в TQFP-корпусе в данной конструкции взаимозаменяемы? Установил Atmega8a, постоянно горит Er.2, на второй прошивке тоже самое но еще и сильно мерцает. датчики 100% рабочие.

    • Здравствуйте Виталий!
      Микроконтроллеры взаимозаменяемы.
      Программа проверена, работает без замечаний.
      Ошибка Er.2 возникает в следующих случаях:
      — отсутствие датчика
      — обрыв линии DQ
      — обрыв «-» питания датчика
      Не забывайте установить Fuse-биты на тактовую частоту 8 МГц от внутреннего RC генератора.
      Также попробуйте прошить МК программой двухканального термостата (схемы одинаковы).
      С Уважением, Admin.

      • Извините, не подскажите какие именно фузы отвечают за 8 мгц на внутреннем генераторе?
        прошивка от термостата распаковывается, но с сообщением «архив поврежден». то что распаковывается, прошиватся отказывается. программу использую avrdudeprog33.

        • Отвечу сам себе: в программировании я не спец, но какие фузы выставить для внутреннего генератора на 8 мгц, нашел в сети, выставил, все полетело! Автору огромное спасибо за конструкцию!!

  5. Каждый канал показывает разную температуру. Разница 0,3 градуса. Но не понятно почему при смене местами датчиков , показания на дисплеях не меняется местами. Причина в программе???. Ответьте пожалуйста. Как исправить?

    • Здравствуйте Юрий!
      В чем причина — сказать трудно, но не в программе. Оба канала работают по абсолютно одинаковым алгоритмам.
      У меня, к примеру, был такой случай: два датчика стоят на макетной плате на расстоянии 1 см, разница в показаниях — 0,6 градуса. Меняю местами датчики — все по нулям (если менял местами только выводы DQ датчиков, то все равно разница в показаниях). Перепробовал 5 пар датчиков — такая же картина, только разница в показаниях немного разная. Попробуйте и Вы поменять местами датчики (именно датчики, а не выводы DQ).
      С уважением, Admin.

      • Сменил 5 датчиков и пришел к выводу что среднее отклонение между датчиками около 0,3 градуса, что соответствует заявленной производителем норме. И меня такая погрешность вполне устраивает. Так что большое вам спасибо за схему и прошивку. Термометр работает нормально.

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

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