Клуб "Трёх инженеров"
 

Email:

Пароль:

Забыли пароль?

Вступить в клуб?

Микроконтроллеры AVR

MS Visual Studio & C#

MODBUS-RTU & RS485

SolidWorks & Cosmos

Компьютерная техника

Мехатроника & Авиация

Силовая электроника

Всего статей:

Категорий/рубрик:

Комментариев:

Пользователей:

33

7

239

2019

 
видео прикол из Городка
На опознании
Для корректного отображения этого элемента вам необходимо установить FlashPlayer и включить в браузере Java Script.

Термометр с датчиком DALLAS

Автор: Рудаков Г. В.

Дата: 2009-07-28


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

В этой статье я расскажу о принципе действия такого устройства, и о том, как собрать его в домашних условиях, вооружившись паяльником и терпением. В результате должна получиться конструкция представленная на рисунке 1.

Общий вид цифрового термометра

Рисунок 1 – Общий вид цифрового термометра.

Для изготовления термометра нам потребуются следующие основные компоненты:

  1. Цифровой датчик DALLAS DS1820

  2. Микроконтроллер AVR Attiny2313

  3. Индикатор LED R 4DIG AN BQ-M326R (с общим анодом)

  4. Корпус защитный BOX-G023

На рисунке 2 представлена принципиальная электрическая схема. К микроконтроллеру по шине 1-WIRE подключается цифровой датчик, который передает значение температуры в виде числа integer. Затем микроконтроллер выводит полученное значение на индикатор. Индикатор динамический, поэтому в обязанности микроконтроллера входит переключать разряды индикатора по прерыванию таймера с частотой не заметной для глаза человека. Устройство питается от любого Li-ion аккумулятора снятого со старенького сотового телефона, зарядка которого осуществляется через USB-шнур от ПК или БП. Контроль зарядки не предусмотрен, так как современные аккумуляторы сотовых телефонов в своем составе уже имеют плату управления процессом заряда.

Принципиальная электрическая схема цифрового термометра

Рисунок 2 – Принципиальная электрическая схема цифрового термометра.

На рисунке 3 и рисунке 4 представлен чертеж печатной платы термометра выполненный в программе Sprint Layout 5. Печатная выполнена из двух частей (основная и плата для индикатора) и имеет габаритные размеры 68 мм × 46 мм, с крепежными отверстиями под винты M3.

Печатная плата термометра

Рисунок 3 – Печатная плата термометра.

Печатная плата для индикатора BQ-M326RD

Рисунок 4 – Печатная плата для индикатора BQ-M326RD.

В корпусе предусмотрены крепежные стойки для платы. Причем высота стоек позволяет свободно под платой разместить Li-ion аккумулятор практически от любого сотового телефона (см. рисунок 5).

Расположение аккумулятора в корпусе

Рисунок 5 – Расположение аккумулятора в корпусе.

Готовые печатные платы представлены на рисунке 6. Изначально такое разделение было задумано, для того, чтобы как можно лучше вписаться в габариты готового корпуса. Так как корпус достаточно высокий, то индикатор был вынесен на отдельную плату, которая при помощи разъема стыкуется с основной платой (рисунок 7).

Печатные платы в собранном виде

Рисунок 6 – Печатные платы в собранном виде.

Печатные платы в сопряжении

Рисунок 7 – Печатные платы в сопряжении.

Цифровой датчик DS18B20 подключается к колодке на плате. При желании его можно вынести за пределы корпуса, предварительно засунув в термоусадочную трубку.

В крышке корпуса необходимо аккуратно проделать отверстие (рисунок 8) под индикатор, светодиод и кнопку включения.

Цифровой термометр в разобранном виде

Рисунок 8 – Цифровой термометр в разобранном виде.

Аккумулятора емкостью 750 мА хватает приблизительно на сутки бесперебойной работы термометра, поэтому в качестве кнопки включения была выбрана кнопка без фиксации. Для зарядки аккумулятора от ПК необходим шнур USB (USB A - USB B). Светодиод, расположенный на плате термометра показывает процесс зарядки (рисунок 9).

Зарядка аккумулятора от ПК

Рисунок 9 – Зарядка аккумулятора от ПК.

Рассмотрим детально некоторые фрагменты микропрограммы (прошивки) для микроконтроллера, написанной в среде CodeVision.

Изначально нам необходимо подключить несколько библиотек. Причем, библиотеку для работы с шиной 1-wire, нужно подключить лишь после назначения к какому порту и какой ножке МК будет подключен цифровой датчик Dallas. В нашем случае это PORTD.5:

  1. #include <tiny2313.h>

  2. //определяем порт обмена по 1-WIRE

  3. #asm

  4. .equ __w1_port=0x12 ;PORTD

  5. .equ __w1_bit=5

  6. #endasm

  7. #include <1wire.h>

  8. #include <ds1820.h>

  9. #include <delay.h>

Затем опишем массив состояния ножек порта «B», соответствующих выводимой цифре или символу. Так, например, чтобы отобразить цифру 7, необходимо включить следующие биты: 0, 2 и 5 (включенное состояние бита порта определяется как «0», а выключенное как «1», так как используемый в схеме динамический индикатор с общим анодом).

  1. unsigned char digits[] = {

  2. //0

  3. 0b01010000,

  4. //1

  5. 0b11011011,

  6. //2

  7. 0b01100010,

  8. //3

  9. 0b01001010,

  10. //4

  11. 0b11001001,

  12. //5

  13. 0b01001100,

  14. //6

  15. 0b01000100, 

  16. //7

  17. 0b11011010,

  18. //8

  19. 0b01000000, 

  20. //9

  21. 0b01001000,

  22. //минус

  23. 0b11101111,

  24. //пусто

  25. 0b11111111,

  26. //градус

  27. 0b11101000

  28. };

Рассмотрим фрагмент кода, отвечающий за динамическое переключение разрядов индикатора:

  1. //Функция обработки прерывания от Таймера 0

  2. interrupt [TIM0_OVF] void timer0_ovf_isr(void)

  3. {

  4. switch (cursor)

  5. {

  6. case 0:{PORTD=0b0000010;break;};

  7. case 1:{PORTD=0b0010000;break;};

  8. case 2:{PORTD=0b0000100;break;};

  9. case 3:{PORTD=0b0001000;break;};

  10. }

  11. PORTB=digits[digit_out[cursor]];

  12. cursor++;

  13. if (cursor==4) cursor=0;

  14. }

Переменная "cursor" определяет номер разряда индикатора. По достижении значения "4", "cursor" обнуляется. После того как оператору switch был передан номер активного разряда, выводим в этот разряд соответствующую цифру, определенную ранее функцией output().

Затем, после инициализации микроконтроллера, в бесконечном цикле опрашиваем датчие dallas и вызываем функцию output(). #asm("sei") - разрешает прерывания.

  1. while (1)

  2. {

  3. temperatura=ds1820_temperature_10(0);

  4. .#asm("sei")

  5. if (temperatura!=-9999)

  6. {

  7. output(temperatura);

  8. }

  9. }

Функцию, отвечающую за дробление числа по чифрам приводить не буду, так как там нету ничего сложного, да и вид у нее достаточно однообразный и громоздкий.

P.S. Удачи Вам! Если возникли вопросы, задавайте их в комментариях, обязательно разберемся..

Необходимо зарегистрироваться чтобы прочитать текст

Рейтинг:

Просмотров: 54903

Комментарии:

Автор: grave (2012-09-06, 9:36)

Привет! Решил немного изменить схемку: Поставил индикатор с общим катодом и датчик ds18b20. Все поменял. Индикатор пашет, а вот температуру не высвечивает, только нули. [Ответить]

Автор: Гришаня Рудаков (2011-10-25, 1:03)

RE: grave. Смотрим новые материалы: http://www.3e-club.ru/view_full.php?id=35&name=dallas_2 [Ответить]

Автор: grave (2011-10-19, 14:22)

Постараюсь))) У меня возникли вопросы. Почему при подключении индикатора не использованы токоограничивающие резисторы? Повлияет ли изменение таймера с 62,5 кГц до 500 кГц на работу процессора? Дело в том, что в протеусе на частоте 62,5 кГц отображение температуры мелькает, поэтому я ее повысил до 500. [Ответить]

Автор: Гришаня Рудаков (2011-10-06, 18:45)

RE: grave.Здорово! Публикуйте статейку как в протеусе тестировали;-) [Ответить]

Автор: grave (2011-10-06, 17:58)

Привет! Разобрался, ошибки нашел, устранил. Тестировал в Proteus. [Ответить]

Автор: Гришаня Рудаков (2011-09-20, 19:51)

RE: grave.Добрый вечер! Я натворил уже вторую версию термометра, уже полгода выложить материалы не могу.. в нем два датчика и зарядка аккумулятора от USB. [Ответить]

Автор: grave (2011-09-20, 15:01)

Привет! Забрал схемку с прошивкой, буду разбираться.))) [Ответить]

Автор: Kazemir (2009-12-19, 18:59)

Спасибо. Но берут большие сомнения , что это поможет. Честно говоря некоторое время назад я отказался от CVAVR v2.03.4 по причине его глючности и вернулся к проверенной многими пользователями CVAVR v1.25.9. Но все равно спасибо, может быть попробую. Если появятся какие либо мысли на этот счет, буду рад. Успехов! [Ответить]

Автор: Гришаня Рудаков (2009-12-19, 17:43)

Честно говоря, не помню, на сколько МГц выставлены фузы на МК который сейчас стоит в девайсе, проверить тоже пока не получится, так как термометр остался в саду.. Выслал Вам на почту CodeVision которым я пользовался при написании прошивки, быть может дело в различие библиотек.. [Ответить]

Автор: Kazemir (2009-12-19, 16:50)

#asm("cli") перед temperatura=ds1820_temperature_10(0) в цикле while(1) я пробовал. Температура на индикаторе обновляется, но частота обновления крайне низкая. Разряды индикатора засвечиваются поочереди с частотой смещения засветки разрядов примерно 1 сек. Может быть частота прерывания не дает возможности второго и последующих считываний температуры с датчика? С Фузами я пробовал, но сравнить можно конечно. [Ответить]

Автор: Гришаня Рудаков (2009-12-19, 16:16)

Да Вы правы! Еще ошибка в номере управляющего бита порта "D" - вместо PD0 в прошивке указан PD4. Что касается запрета прерываний, то здесь у меня сомнения.. Но, все же, попробуйте добавить строчку #asm("cli") перед temperatura=ds1820_temperature_10(0) в цикле while(1). Если результата не будет, будем сравнивать фузы. Код программы в архиве обновлен. [Ответить]

Автор: Kazemir (2009-12-19, 15:35)

И еще в догонку, несоответствие КОДА и схемной реализации по PORTD- по КОДУ от младшего разряда индикатора к старшему - PD1, PD4, PD2, PD3, по схеме- PD3, PD2, PD1, PD0. [Ответить]

Автор: Kazemir (2009-12-19, 13:29)

Добрый день! Спасибо что откликнулись, давайте разбираться. По портам ввода/вывода- согласно раскладке в самом коде сегмент "с" должен быть подключен к PB5 (нога17), по монтажке идет к PB6 (нога 18), сегмент "d" - должен идти к PB7 (19 нога), реально идет к PB4 (16 нога), сегмент"g" к PB4, а идет к PB7, сегмент "dp" - к PB6, а идет к PB5. Насчет показаний наверно Вы правы, что после первого удачного измерения происходит ошибка и далее .... . Датчик на 100% исправный, проверялся в других девайсах. Вот что на нем написано в четыре строчки "Dallas ds1820 0705C3 +368AE". Насчет корректности - все Ок, отображается значение градусов две цифры значок градуса в последнем разряде. И последнее - в коде затерется в принципе ничего не могло, при разархивации этого произойти тоже не могло, смущает то , что в бесконечном цикле имеется #asm("sei")-разрешение прерывания глобально, а вот нигде по коду нет запрета прерывания глобально [Ответить]

Автор: Гришаня Рудаков (2009-12-19, 1:54)

Давайте вместе разбиратся! Прошу указать несоответствие каких портов Вы нашли.. За обновление на дисплее отвечает таймер. Новое значение температуры микроконтроллер получает с датчика бесконечном цикле программы while(1), поэтому переменная "temperatura" здесь постоянно обновляется. Первое что приходит мне на ум, это что с датчика после первого удачного измерения в дальнейшем приходит код ошибки "-9999", поэтому функция output() не принимает новое значение температуры и содержимое массива digit_out[] не обновляется. Проверьте не затерли ли Вы какие-либо строки случайно, потому как девайс исправно работает.. Также меня интересует корректно ли отображается то единственно полученное значение, и, если нет, то с каким буквенным индексами датчик Вы применили? [Ответить]

Автор: Kazemir (2009-12-17, 2:05)

Доброго времени суток! Сей девайс меня заинтересовал своей практичностью и простотой. Решил реализовать, но не тут то было. На поверку оказалось , что схема, печатная плата и сам код не соответствуют друг другу в части использавания портов ввода/вывода, короче сплошная путаница. Все это я привел в соответствие, но основная проблема в том, что сей девайс единожды измерив температуру, обновлять показания не желает. Весьма печально, что такой именитый "клуб трех инженеров" опубликовал такой сырой материал. Благодарю за внимание. [Ответить]

Гости не имеют права добавлять комментарии и проставлять рейтинг.