Кафедра АППиЭ

КОНФЕРЕНЦИИ => Дни науки АмГУ 2019 Секция Автоматика, управление и моделирование => Тема начата: sanya9827 от Четверг, марта 28, 2019, 00:21:14

Название: Цифровой измеритель температуры
Отправлено: sanya9827 от Четверг, марта 28, 2019, 00:21:14
                                                                                         ЦИФРОВОЙ ИЗМЕРИТЕЛЬ ТЕМПЕРАТУРЫ
Исполнитель: Ильин Александр, 641 об
Научный руководитель: Русинов Владислав Леонидович


                                                                                                          Оборудование
ARDUINO NANO
Датчики температуры: DS18B20
                                                                                                          Описание

DS18B20 это цифровой измеритель температуры, с  разрешением преобразования 9 - 12 разрядов и функцией тревожного сигнала контроля за температурой. Параметры контроля могут быть заданы пользователем и сохранены в энергонезависимой памяти датчика.

DS18B20 обменивается данными с микроконтроллером по однопроводной линии связи, используя протокол интерфейса 1-Wire.

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

Диапазон измерения температуры составляет от -55 до +125 °C. Для диапазона от -10 до +85 °C погрешность не превышает 0,5 °C.

У каждой микросхемы DS18B20 есть уникальный серийный код длиной 64 разряда, который позволяет нескольким датчикам подключаться на одну общую линию связи. Т.е. через один порт микроконтроллера можно обмениваться данными с несколькими датчиками, распределенными на значительном расстоянии. Режим крайне удобен для использования в системах экологического контроля, мониторинга температуры в зданиях, узлах оборудования.

(https://b.radikal.ru/b09/1903/6c/0d6c5f0a8e2b.jpg) (https://radikal.ru)

(https://a.radikal.ru/a18/1903/f1/c77e4e80599e.jpg) (https://radikal.ru)
                                                                                                   Рисунок 1 - Датчик температуры DS18B20

Об особенностях DS18B20:

Для однопроводного интерфейса 1-Wire достаточно одного порта связи с контроллером.

Каждое устройство имеет  уникальный серийный код длиной 64 разряда.

Возможность подключения нескольких датчиков через одну линию связи.

Нет необходимости во внешних компонентах.

Возможность получать питание непосредственно от линии связи. Напряжение питания в пределах 3,0 В … 5,5 В.

Диапазон измерения температуры -55 ... +125 °C.

Погрешность не превышает 0,5 °C в диапазоне -10 ... +85 °C.

Разрешение преобразования 9 … 12 бит. Задается пользователем.

Время измерения, не превышает 750 мс, при максимально возможном разрешении 12 бит.

(https://a.radikal.ru/a05/1903/39/231c38982608.jpg) (https://radikal.ru)
                                                                                                   Рисунок - Блок схема

На рисунке блок-схема датчика DS18B20. 64-битное ПЗУ (ROM) хранит уникальный серийный код устройства.

Оперативная память содержит:

значение измеренной температуры (2 байта);

верхний и нижний пороговые значения срабатывания тревожного сигнала (Th, Tl);

регистр конфигурации (1 байт).

Через регистр конфигурации можно установить разрешение преобразования термодатчика. Разрешение может быть задано 9, 10, 11 или 12 бит. Регистр конфигурации и пороги тревожного сигнала содержатся в энергонезависимой памяти (EEPROM).

В микросхеме DS18B20 для обмена данными использует специализированный протокол 1-Wire корпорации Dallas. Для линии связи требуется слабый подтягивающий резистор т.к. все устройства физически подключены к одной общей шине и используют выход с тремя состояниями или выход типа открытый сток.  В этой системе с одной шиной, микроконтроллер (мастер) определяет наличие устройств на шине и обменивается с ними, используя уникальный адрес для каждого устройства - 64-разрядный код. Т.к. каждый термодатчик имеет уникальный код, то число устройств, подключенных к шине, практически ни чем не ограничено.

Другая особенность DS18B20 - работать без внешнего источника питания. Питание происходит через подтягивающий резистор шины и вывод DQ, во время высокого уровня шины. Сигнал высокого уровня заряжает через вывод DQ  внутренний конденсатор (Cpp), энергией которого и питается микросхема при низком уровне линии связи. Этот метод в спецификации протокола 1-Wire называется "паразитное питание". Ничего не мешает использовать и внешнее питание для DS18B20. Подается оно на вывод Vdd.

                                                                                            Режим - измерение температуры.

Основная функция DS18B20 - преобразование температуры датчика в цифровой код. Разрешение преобразования задается 9, 10, 11 или 12 бит. Это соответствует разрешающей способность - 0,5 (1/2) °C, 0,25 (1/4) °C, 0,125 (1/8) °C и 0,0625 (1/16) °C. При включении питания, состояние регистра конфигурации устанавливается на разрешение 12 бит.

После включения питания DS18B20 находится в низко-потребляющем состоянии покоя.  Чтобы инициировать измерение температуры мастер (микроконтроллер) должен выполнить команду ПРЕОБРАЗОВАНИЯ ТЕМПЕРАТУРЫ. После завершения преобразования, результат измерения температуры будет находиться в 2 байтах регистра температуры, и датчик опять перейдет в состояние покоя.

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

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

DS18B20 измеряет температуру в градусах по шкале Цельсия.  Результат измерения представляется как 16-разрядное, знаковое число в дополнительном коде. Бит знака (S) равен 0 для положительных чисел и равен 1 для отрицательных. При разрешении 12 бит, у регистра температуры все биты значащие, т.е. имеют достоверные значения. Для разрешения 11 бит, не определен бит 0. Для 10-битного разрешения не определены биты 0, 1. При разрешении 9 бит, не достоверное значение имеют биты 0, 1 и 2. В таблице 2 показаны примеры соответствия цифровых кодов значению температуры.

(https://b.radikal.ru/b13/1903/75/2f3ba8efced0.jpg) (https://radikal.ru)

(https://d.radikal.ru/d41/1903/27/af25815147d7.jpg) (https://radikal.ru)

Для вычисления температуры надо:

При положительном значении ( S=0 ) код перевести в десятичный и умножить на 0,0625 °C.

При отрицательном значении ( S=1 ) сначала необходимо перевести дополнительный код в прямой. Для этого надо инвертировать каждый разряд двоичного кода и прибавить 1. А затем перевести в десятичный и умножить на 0,0625 °C.

(https://c.radikal.ru/c36/1903/c5/5996cb3db867.jpg) (https://radikal.ru)
                                                                                                   Рисунок - Вид сверху

(https://b.radikal.ru/b05/1903/66/90bfeec62879.jpg) (https://radikal.ru)
                                                                                                   Рисунок - Вид спереди
Название: Re: Цифровой измеритель температуры
Отправлено: RVL от Четверг, марта 28, 2019, 22:17:25
Александр! Где текст?
Название: Re: Цифровой измеритель температуры
Отправлено: ran от Пятница, марта 29, 2019, 06:37:16
Мне тоже кажется, что-то он не договаривает...
Название: Re: Цифровой измеритель температуры
Отправлено: Михаил от Пятница, марта 29, 2019, 06:57:30
Краткость - сестра таланта!
Название: Re: Цифровой измеритель температуры
Отправлено: Andrey7 от Пятница, марта 29, 2019, 17:29:47
Хороший Доклад, все кратко и понятно, но первый вариант доклада мне понравился тоже! ;D
Название: Re: Цифровой измеритель температуры
Отправлено: RVL от Суббота, марта 30, 2019, 03:02:13
Приведите структурно-функциональную схему цифрового измерителя!
Название: Re: Цифровой измеритель температуры
Отправлено: ran от Суббота, марта 30, 2019, 07:53:49
Такой вопрос: я читал про сеть 1wire, и говорится, что есть некий advanced режим, в котором возможна технология вроде plug and play (автоматическое распознавание). Вам известно что-нибудь про это?
Название: Re: Цифровой измеритель температуры
Отправлено: sanya9827 от Воскресенье, марта 31, 2019, 18:20:28
Извините, что так затянул с ответом. Не хотел отвечать просто "Нет" и решил ознакомится с вопросом получше. Каждое устройство, поддерживающее 1-wire, имеет уникальный 64-битный номер-адреса устройства 1-Wire. Он состоит из 8 отдельный байт: одного идентификатора семейства, шести байт (48 бит) собственно уникального адреса и одного байта контрольной суммы всех предыдущих байтов. Команда SEARCH ROM (Поиск адресов - используется при определении количества и адресов подключенных устройств. Но требующий довольно сложного программно-реализуемого алгоритма. И если я все правильно понял, то с помощью этой команды можно определить не только количество и адрес подключенных устройств, но и  семейство этого устройства. Про режим advanced ничего не нашел. Спасибо за вопрос.
Название: Re: Цифровой измеритель температуры
Отправлено: ran от Воскресенье, марта 31, 2019, 23:16:10
Да это я так назвал, advanced. Мне не нужны подробности, интересна сама технология. Как в сети без коллизий удается сделать "широковещательные" запросы и, главное, умудриться получить на них ответы с нескольких узлов?
Название: Re: Цифровой измеритель температуры
Отправлено: sanya9827 от Понедельник, апреля 01, 2019, 03:37:06
Если мы берем микроконтроллер и один датчик, то алгоритм работы будет следующим:
1. Микроконтроллер отсылает импульс сброса
2. Датчик отвечает импульсом приветствия
3. МК отсылает адресную команду "Skip ROM" - если датчиков несколько, то мы используем адреса так как у каждого устройства он индивидуальный.
4. МК отсылает функциональную команду "Convert T" - по этой команде датчик начнёт однократное температурное преобразование; результат этого преобразования будет записан в память датчика
5. МК ждёт, пока датчик закончит преобразование (ведомое устройство не может само сообщить, что оно "освободилось", поэтому МК просто ждёт время, указанное в даташите)
6. МК отсылает импульс сброса
7. Датчик отвечает импульсом приветствия
8. МК отсылает адресную команду "Skip ROM Scratchpad"
9. МК отсылает функциональную команду "Read Scratchpad" - по этой команде датчик отсылает 9 байт своей памяти
10. МК считывает нужное количество байт (значение температуры содержится в первых двух)
11. При необходимости МК завершает сеанс связи, отсылая импульс сброса
Название: Re: Цифровой измеритель температуры
Отправлено: ran от Понедельник, апреля 01, 2019, 03:39:50
Это все прекрасно, но как при этом устроить автоматическое распознавание устройств?
Название: Re: Цифровой измеритель температуры
Отправлено: sanya9827 от Понедельник, апреля 01, 2019, 03:54:48
Получив команду SEARCH ROM, КАЖДОЕ устройство передает первый бит своего кода ПЗУ и дополнение этого бита (грубо говоря -его инверсию). Приняв от устройства первый бит и его дополнение, мы должны в подтверждение отправить этот первый бит назад, в шину. Но! Все устройства делают это одновременно, так что контроллер получает логическое «И» первых битов кодов и логическое «И» их дополнений.
На основании бита и его дополнения производится анализ:
Если бит = дополнение = 1, это значит, что на линии нет готовых устройств, т.е. никто не ответил. В этом случае поиск прекращается.
Если биты не равны, т.е. бит = 0, а дополнение = 1 или наоборот - это значит, что у всех устройств этот бит совпадает. Этот случай простой - мы просто записываем к себе этот бит и переходим к следующим операциям.
Если бит = дополнение = 0 - это значит, что у устройства первый бит кода ПЗУ не совпадает, т.е. у кого-то 1 а у кого-то 0, это сложный случай.
Первый случай, когда бит/дополнение = 1 рассматривать нет смысла - активных устройств больше нет, поиск прекащаем.
Когда бит/дополнение не равны - тут тоже все просто, этот бит одинаков у всех устройств, так что просто запоминаем его в качестве первого бита кода ПЗУ.
Название: Re: Цифровой измеритель температуры
Отправлено: ran от Понедельник, апреля 01, 2019, 05:55:39
Спасибо, конечно, но я ничего не понял. А Вы (которые "мы") поняли?
Пришлите лучше ссылку.
Название: Re: Цифровой измеритель температуры
Отправлено: RVL от Вторник, апреля 02, 2019, 22:33:09
Здесь хорошее описание протокола 1-Wire
http://mypractic.ru/ds18b20-datchik-temperatury-s-interfejsom-1-wire-opisanie-na-russkom-yazyke.html (http://mypractic.ru/ds18b20-datchik-temperatury-s-interfejsom-1-wire-opisanie-na-russkom-yazyke.html)
Название: Re: Цифровой измеритель температуры
Отправлено: RVL от Вторник, апреля 02, 2019, 22:56:08
Похожий материал в более сжатой форме.
https://www.radiokot.ru/articles/13/ (https://www.radiokot.ru/articles/13/)

Причем автор указывает на две возможности, определения новых устройств.
"...При рассмотрении протокола обмена мы будем исходить из принципа, что на шине 1-Wire имеется более одного устройства. В этом случае перед МК встают 2 проблемы: определение количества имеющихся устройств и выбор (адресация) одного конкретного из них для обмена данными. Решение первой проблемы осуществляется двумя путями: универсальным и гибким, но требующим довольно сложного программно-реализуемого алгоритма, и простым, но с большими ограничениями. Универсальный алгоритм мы рассматривать не будем, т.к. это требует отдельной статьи. А более простой заключается в том, что номера всех используемых в вашей схеме 1-Wire-устройств вы должны знать заранее, и просто использовать их как константы в вашей программе".

Разберитесь в простом способе, команда - READ ROM 0x33 Чтение адреса устройства - используется для определения адреса единственного устройства на шине. Этот способ нужно модифицировать, чтобы адрес устройства сохранялся не в программе, а во флэш памяти МК. 
   
Не лезьте в низкоуровневое программирование, ищите библиотеку с нужной функцией, изменяйте её!
Название: Re: Цифровой измеритель температуры
Отправлено: ran от Среда, апреля 03, 2019, 05:30:56
Здесь хорошее описание протокола 1-Wire
http://mypractic.ru/ds18b20-datchik-temperatury-s-interfejsom-1-wire-opisanie-na-russkom-yazyke.html (http://mypractic.ru/ds18b20-datchik-temperatury-s-interfejsom-1-wire-opisanie-na-russkom-yazyke.html)
Не совсем хорошее.
По-моему, здесь применено решение типа"неразрушающий шинный арбитраж". Если ответ на каждый бит адреса одинаков от нескольких ведомых, ведущее устройство продолжает думать, что его кто-то слышит, и процесс запроса продолжается. В какой-то момент (если в сети действительно есть такой адрес)  отвечать будет только один узел, он и ответит в итоге "за все". У ведущего есть возможность контролировать ответ на каждый бит, и если ответа нет, значит в сети нет таких адресов. Тогда он просто начинает опрос сначала, сразу выставляя "пройденный путь", а тот бит, при котором связь потерялась, инвертирует, чтобы изменить пространство поиска.
Алгоритм достаточно сложный, но вполне реализуемый. Если все так и обстоит на самом деле, готов помочь с отладкой, но на уровне С++.
Название: Re: Цифровой измеритель температуры
Отправлено: RVL от Четверг, апреля 04, 2019, 19:47:11
РАН, по-видимому выражением "неразрушающий шинный арбитраж", Вы "разрушили" у Александра все нейронные связи! :-)
Название: Re: Цифровой измеритель температуры
Отправлено: RVL от Четверг, апреля 04, 2019, 19:50:26
Александр, уже накопилось три задачи!
1) Структурно-функциональная схема.
2) Схема в протеусе.
3) Алгоритм программы микроконтроллера.
Начните с любой.
Название: Re: Цифровой измеритель температуры
Отправлено: knoppix от Четверг, апреля 04, 2019, 19:58:47
Для общения по 1Wire сами писали библиотеку, воспользовались некой готовой, или воспользовались тем что предлагает Arduino?
Название: Re: Цифровой измеритель температуры
Отправлено: ran от Пятница, апреля 05, 2019, 03:06:03
РАН, по-видимому выражением "неразрушающий шинный арбитраж", Вы "разрушили" у Александра все нейронные связи! :-)
Да нет, мы совсем недавно это проходили!