Цифровой измеритель температуры

Автор sanya9827, Четверг, марта 28, 2019, 00:21:14

« предыдущая тема - следующая тема »
Вниз

sanya9827

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


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

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

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

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

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

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




                                                                                                   Рисунок 1 - Датчик температуры DS18B20

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

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

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

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

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

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

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

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

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

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


                                                                                                   Рисунок - Блок схема

На рисунке блок-схема датчика 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 показаны примеры соответствия цифровых кодов значению температуры.





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

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

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


                                                                                                   Рисунок - Вид сверху


                                                                                                   Рисунок - Вид спереди

RVL

Александр! Где текст?

ran

Мне тоже кажется, что-то он не договаривает...

Михаил

Краткость - сестра таланта!

Andrey7

Хороший Доклад, все кратко и понятно, но первый вариант доклада мне понравился тоже! ;D

RVL

Приведите структурно-функциональную схему цифрового измерителя!

ran

Такой вопрос: я читал про сеть 1wire, и говорится, что есть некий advanced режим, в котором возможна технология вроде plug and play (автоматическое распознавание). Вам известно что-нибудь про это?

sanya9827

#7
Воскресенье, марта 31, 2019, 18:20:28 Последнее редактирование: Воскресенье, марта 31, 2019, 18:24:24 от sanya9827
Извините, что так затянул с ответом. Не хотел отвечать просто "Нет" и решил ознакомится с вопросом получше. Каждое устройство, поддерживающее 1-wire, имеет уникальный 64-битный номер-адреса устройства 1-Wire. Он состоит из 8 отдельный байт: одного идентификатора семейства, шести байт (48 бит) собственно уникального адреса и одного байта контрольной суммы всех предыдущих байтов. Команда SEARCH ROM (Поиск адресов - используется при определении количества и адресов подключенных устройств. Но требующий довольно сложного программно-реализуемого алгоритма. И если я все правильно понял, то с помощью этой команды можно определить не только количество и адрес подключенных устройств, но и  семейство этого устройства. Про режим advanced ничего не нашел. Спасибо за вопрос.

ran

Да это я так назвал, advanced. Мне не нужны подробности, интересна сама технология. Как в сети без коллизий удается сделать "широковещательные" запросы и, главное, умудриться получить на них ответы с нескольких узлов?

sanya9827

Если мы берем микроконтроллер и один датчик, то алгоритм работы будет следующим:
1. Микроконтроллер отсылает импульс сброса
2. Датчик отвечает импульсом приветствия
3. МК отсылает адресную команду "Skip ROM" - если датчиков несколько, то мы используем адреса так как у каждого устройства он индивидуальный.
4. МК отсылает функциональную команду "Convert T" - по этой команде датчик начнёт однократное температурное преобразование; результат этого преобразования будет записан в память датчика
5. МК ждёт, пока датчик закончит преобразование (ведомое устройство не может само сообщить, что оно "освободилось", поэтому МК просто ждёт время, указанное в даташите)
6. МК отсылает импульс сброса
7. Датчик отвечает импульсом приветствия
8. МК отсылает адресную команду "Skip ROM Scratchpad"
9. МК отсылает функциональную команду "Read Scratchpad" - по этой команде датчик отсылает 9 байт своей памяти
10. МК считывает нужное количество байт (значение температуры содержится в первых двух)
11. При необходимости МК завершает сеанс связи, отсылая импульс сброса

ran

Это все прекрасно, но как при этом устроить автоматическое распознавание устройств?

sanya9827

Получив команду SEARCH ROM, КАЖДОЕ устройство передает первый бит своего кода ПЗУ и дополнение этого бита (грубо говоря -его инверсию). Приняв от устройства первый бит и его дополнение, мы должны в подтверждение отправить этот первый бит назад, в шину. Но! Все устройства делают это одновременно, так что контроллер получает логическое «И» первых битов кодов и логическое «И» их дополнений.
На основании бита и его дополнения производится анализ:
Если бит = дополнение = 1, это значит, что на линии нет готовых устройств, т.е. никто не ответил. В этом случае поиск прекращается.
Если биты не равны, т.е. бит = 0, а дополнение = 1 или наоборот - это значит, что у всех устройств этот бит совпадает. Этот случай простой - мы просто записываем к себе этот бит и переходим к следующим операциям.
Если бит = дополнение = 0 - это значит, что у устройства первый бит кода ПЗУ не совпадает, т.е. у кого-то 1 а у кого-то 0, это сложный случай.
Первый случай, когда бит/дополнение = 1 рассматривать нет смысла - активных устройств больше нет, поиск прекащаем.
Когда бит/дополнение не равны - тут тоже все просто, этот бит одинаков у всех устройств, так что просто запоминаем его в качестве первого бита кода ПЗУ.

ran

Спасибо, конечно, но я ничего не понял. А Вы (которые "мы") поняли?
Пришлите лучше ссылку.

RVL


RVL

Похожий материал в более сжатой форме.
https://www.radiokot.ru/articles/13/

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

Разберитесь в простом способе, команда - READ ROM 0x33 Чтение адреса устройства - используется для определения адреса единственного устройства на шине. Этот способ нужно модифицировать, чтобы адрес устройства сохранялся не в программе, а во флэш памяти МК. 
   
Не лезьте в низкоуровневое программирование, ищите библиотеку с нужной функцией, изменяйте её!

Вверх