[Home] [Donate!] [Контакты]

Измерение температуры. Аналоговые и цифровые датчики. Цифровой датчик DS18B20

Оглавление
Измерение температуры. Аналоговые и цифровые датчики. Цифровой датчик DS18B20
Способы измерения температуры
Цифровые датчики
Датчик DS18B20: обзор
Питание DS18B20
Протокол шины 1-Wire
Команды DS18B20
ROM-команды
Функциональные команды

Способы измерения температуры

Физические свойства тел (объём, давление, электрическое сопротивление, термоэдс, интенсивность излучения и др.) зависят от температуры, что позволяет измерять температуру, используя эти зависимости. Выбор метода измерения определяется диапазоном измеряемых температур, требуемой точностью, чувствительностью, допустимой инерционностью, условиями измерений.

Существует две группы методов: контактные и бесконтактные. Бесконтактные методы основываются на определении температуры по тепловому излучению тел. Ценность методов этой группы заключается в том, что они позволяют измерять температуру дистанционно. Кроме того, они применимы для измерения очень высоких температур, когда другие методы не могут быть использованы. Есть и недостатки: неприменимость для измерения низких температур, трудности получения высокой точности, влияние на результат коэффициента поглощения исследуемого тела (отклонение от показателей абсолютно чёрного тела).

Контактные методы требуют наличия теплового равновесия между объектом, температуру которого определяют и чувствительным элементом прибора, это необходимо для выравнивания их температур. В качестве датчика применяются термопары, терморезисторы, датчики на основе p-n перехода.

Термопары могут использоваться в очень широком диапазоне температур, от нескольких градусов выше абсолютного нуля до температуры порядка 3000ºC. Правда, термопара измеряет не саму температуру, а разность температур между двумя спаями. Так что для измерения температуры второго спая потребуется использовать ещё какой-то метод. Величина термоэдс небольшая, для термопар из металлических проводников обычно лежит в пределах от единиц до нескольких десятков мкВ/ºC. Это требует использования усилителя с чувствительным входом. Коэффициент термоэдс зависит не только от материала проводников, но и от наличия примесей, от способа обработки материалов, зависит от температуры и для некоторых материалов с изменением температуры может даже менять знак. Это создаёт определённые проблемы с точностью метода.

Терморезисторы используются металлические проволочные (платиновые, медные) и полупроводниковые.

Металлические имеют небольшой температурный коэффициент (порядка 0.4%/ºC) и малое сопротивление, но они имеют стабильные характеристики, высокую точность, зависимость сопротивления от температуры близка к линейной и хорошо изучена. Платиновые терморезисторы используют для измерения температур от -263 до 1064ºC, медные - от -50 до 180ºC.

Полупроводниковые терморезисторы имеют гораздо больший температурный коэффициент сопротивления (и высокую разрешающую способность), что упрощает схему подключения. Их зависимость сопротивления от температуры нелинейная, имеет вид: R=A*exp(B/T); A, B - коэффициенты, T - абсолютная температура. В рабочем диапазоне температур сопротивление изменяется очень сильно, на несколько порядков.

Однако, высокая чувствительность полупроводниковых терморезисторов к изменению температуры ещё не гарантирует высокой точности. Они подвержены "старению", с течением времени возможен существенный дрейф характеристик. По стабильности параметров значительно уступают металлическим. Диапазон рабочих температур меньше, чем у платиновых.

Кроме простейших датчиков типа терморезисторов и термопар существует датчики в виде микросхем, включающие кроме чувствительного элемента схему формирования выходного сигнала. Такие датчики могут быть аналоговыми (напряжение на их выходе с изменением температуры изменяется по известному закону, обычно имеет место линейная зависимость) или цифровыми (содержат аналоговый датчик температуры, аналого-цифровой преобразователь и схему управления). Некоторые микроконтроллеры, включающие в себя ADC, имеют встроенные датчики температуры, программный доступ к которым реализуется как один из режимов работы аналого-цифрового преобразователя.

Подключение аналоговых или цифровых датчиков к микроконтроллеру оказывается предельно простым - аналоговые подключаются к ADC микроконтроллера, а цифровые имеют какой-либо из популярных интерфейсов, часто это I2C. Такие датчики недороги, в то же время достаточно точны. Так что использование датчиков в интегральном исполнении - хороший вариант во многих случаях. Конечно, есть и свои недостатки: они требуют питания; имеют больше выводов (3 или более) и для подключения требуется больше проводников; разогреваются питающим током, что снижает точность; размеры не могут быть меньше определённой величины (а размеры влияют на тепловую инерционность); область рабочих температур ограничивается наличием полупроводниковой схемы в устройстве (обычно рассчитаны на диапазон -55..+125ºC, но для увеличения срока службы и повышения надёжности, использовать вблизи границ диапазона длительное время не рекомендуется).

Но в любом случае, имеется большое разнообразие средств для измерения температуры, есть из чего выбрать с учётом существующих требований.

Цифровые датчики

Если нет каких-то особых требований к датчику температуры по параметрам, условиям работы, цене, то самым очевидным решением является выбор цифрового датчика для совместной работы с микроконтроллером. Цифровые датчики могут подключаться через достаточно длинные проводные линии; в отличие от слабых аналоговых сигналов, получаемых с других типов датчиков, цифровой сигнал устойчив к воздействию помех. Используемые интерфейсы позволяют к одной линии подключить сразу несколько цифровых датчиков (может быть целая  гирлянда  датчиков). Цифровая форма передачи данных позволяет использовать цифровые датчики температуры совместно с совсем простыми микроконтроллерами, не имеющими ADC и даже не имеющими нужного цифрового интерфейса - используемые интерфейсы достаточно просты и легко реализуются программно.

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

У всех датчиков из таблицы один и тот же рабочий диапазон температур. Разрешение находится в пределах 9..12 бит (может настраиваться у некоторых устройств, у некоторых разрешение фиксированное), что соответствует разрешающей способности от 0.5ºC (9 бит) до 0.0625ºC (12 бит). Время, которое требуется аналого-цифровому преобразователю датчика для преобразования сигнала от термочувствительного элемента в цифровую форму, достаточно велико и может достигать примерно 1 секунды в режимах с высоким разрешением. Но зато низкоскоростной преобразователь потребляет малый ток. Кроме того, высокая скорость здесь и не требуется - тепловая инерционность устройства достаточна велика. Точность датчика зависит от интервала температур, в котором он работает. В полном рабочем диапазоне температур обеспечивается точность не хуже ±2..3ºC, а в "районе комнатных" достигает ±0.5ºС (может быть даже лучше).

Устройство Диапазон рабочих температур, ºC Разрешение, бит (ºC) Время преобразования, мс Точность Интерфейс Напряжение питания, В Потребляемый ток Корпус
DS18B20 -55..+125 9..12
(0.5..0.0625)
9-бит режим: 94 (max)
12-бит режим: 750 (max)
±0.5ºС (max, диапазон -10..+85ºС)
±2ºС (max, диапазон -55..+125ºС)
1-Wire 3.0..5.5 1.5 мА (max, рабочий режим)
1 мкА (max, спящий режим)
TO-92
SO8
MSOP8
LM75A -55..+125 11
(0.125)
100 ±2ºС (max, диапазон -25..+100ºС)
±3ºС (max, диапазон -55..+125ºС)
I2C (до 8 устройств на шине) 2.8..5.5 100 мкА (типичное значение в нормальном режиме)
1 мА (максимальное значение при активной I2C шине)
3.5 мкА (спящий режим)
SO8
TSSOP8
STTS75 -55..+125 9..12
(0.5..0.0625)
9-бит режим: 45 (typ), 85 (max)
12-бит режим: 360 (typ), 680 (max)
±0.5ºС (типичное значение)
±2ºС (max, диапазон -25..+100ºС)
±3ºС (max, диапазон -55..+125ºС)
I2C/SMBus (до 8 устройств на шине) 2.7..5.5 75 мкА (typ, рабочий режим при напряжении питания 3.3 В) SO8
MSOP8

Датчик DS18B20: обзор

DS18B20 среди других цифровых датчиков температуры не является самым дешёвым или самым быстрым и экономичным. У него довольно хорошая точность, но нельзя сказать, что он рекордсмен и по этому параметру. Чем он наиболее интересен, так это используемый для подключения интерфейс 1-Wire, который позволяет подключать датчики с помощью трёхпроводной линии, если используется отдельный провод питания или даже через двухпроводную при питании от линии данных.

Ещё он интересен в том плане, что можно продемонстрировать пример программной реализации интерфейсов, которые не реализованы в микроконтроллере аппаратно. Если интерфейс I2C имеют аппаратную реализацию во многих микроконтроллерах, то о 1-Wire этого сказать нельзя!

Варианты корпусов датчика температуры DS18B20.
Рис. %img:pck

NC - No Connection (не подключено).
VDD - питание (опционально); вывод должен быть подключён к общему проводу (GND), если используется питание от линии данных.
DQ - ввод/вывод данных, выход по схеме с открытым стоком. Также обеспечивает питание устройства в режиме с паразитным питанием (от линии данных).
GND - общий провод.

Назначение выводов датчика DS18B20 в корпусе TO-92:
1 - GND;
2 - DQ;
3 - VDD.
Для корпуса TO-92 принята нумерация выводов слева направо, если смотреть с плоской стороны корпуса (на которую обычно наносится буквенно-цифровая маркировка, смотрите рисунок выше).

Функциональная схема цифрового датчика температуры DS18B20.
Рис. %img:bd

Датчик имеет ROM объёмом 64 бита для хранения уникального кода устройства. Этот код используется для адресации устройств в том случае, когда к одной линии подключено несколько (более одного) датчиков. Младшие 8 бит содержат код семейства (0x28), затем следует 48-битный уникальный серийный номер устройства, а старшие 8 бит содержат CRC код для первых 56 бит ROM-кода.

Рабочая RAM память (scratchpad в руководстве) содержит 2 байта с результатами последнего измерения температуры, также через RAM обеспечивается доступ к трём однобайтовым EEPROM регистрам датчика: регистры верхнего (TH) и нижнего T(L) уровней сигнализации при выходе измеренной температуры за заданные пределы; регистр конфигурации, с помощью которого выбирают разрешение датчика (от 9 до 12 бит, чем меньше разрешение, тем больше скорость преобразования ADC).

Для подключения датчика используется однопроводная шина для передачи данных с одним сигналом, которая требует наличия подтягивающего резистора (к высокому уровню). Все подключаемые к шине устройства имеют выход с Z-состоянием или выход с открытым стоком.

Питание DS18B20

DS18B20 может получать питание как от внешнего источника, для чего требуется отдельная линия питания, так и питаться от линии данных - через подтягивающий резистор (режим с паразитным питанием, в этом случае нужно только два провода для подключения датчика). Во втором случае, при наличии в линии данных сигнала с высоким уровнем, заряжается внутренний конденсатор Cpp. В те моменты, когда в линии устанавливается низкий уровень, заряженный конденсатор Cpp обеспечивает питание устройства. При использовании режима паразитного питания требуется подключать вывод питания VDD к общему проводу - это позволяет датчику определить, какой вариант питания используется.

Варианты подключения цифрового датчика температуры DS18B20.
Рис. %img:pow

Некоторые операции, а именно, цикл преобразования ADC и операция копирования данных из рабочей памяти в EEPROM являются достаточно длительными (до 10 мс на запись EEPROM и до 750 мс на преобразование - в зависимости от выбранного разрешения) и требуют достаточно большого, до 1.5 мА, тока от источника питания. Внутренний конденсатор не имеет достаточно большой ёмкости для питания датчика во время этих операций, и большой потребляемый ток вызовет недопустимое по величине падение напряжения на подтягивающем резисторе.

Поэтому, на время выполнения любой из этих и только этих двух команд (0x44 - выполнить преобразование; 0x48 - скопировать данные из RAM в EEPROM), не позднее чем через 10 мкс после подачи команды требуется включить "сильное подтягивание" шины в случае использования паразитного питания.

"Сильное подтягивание" осуществляется подключением шины данных непосредственно к источнику питания через дополнительный MOSFET транзистор. Или переключением выхода микроконтроллера, управляющего шиной, из режима с открытым стоком в двухтактный режим.

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

Схема подключения с внешним источником требует наличия дополнительного провода питания, но она имеет свои преимущества. Она может использоваться во всём диапазоне температур. 1-Wire шина в этом случае выполняет только функцию передачи данных. Дополнительных манипуляций с сильным подтягиванием не требуется и во время длительного процесса аналого-цифрового преобразования может осуществляться передача данных по шине. В случае DS18B20 с внешним питанием, во время цикла преобразования ведущее устройство может делать запросы на чтение. Датчик на запросы будет отвечать битом 0 во время цикла преобразования и битом 1 после завершения цикла. Это может использоваться для определения момента завершения процесса измерения температуры.

Протокол шины 1-Wire

Процедура инициализации. Обмен информацией с устройством DS18B20 начинается с процедуры инициализации, которая выводит датчик из состояния сна и подготавливает его к операциям адресации и получения команды от ведущего устройства.

Процедура инициализации (импульс сброса, импульс присутствия) для 1-Wire шины.
Рис. %img:rst

Процедура инициализации включает в себя две фазы: сначала ведущее устройство формирует импульс сброса - устанавливает на шине лог. 0 на время не менее 480 мкс (но не более 960 мкс при паразитном питании во избежание сброса по включению питания с потерей данных в RAM). После этого ведущее устройство освобождает шину на время не менее 480 мкс.

Когда ведущее устройство освободит шину, за счёт подтягивающего резистора на шине установится уровень лог. 1; ведомые устройства, обнаружив после импульса сброса переход сигнала на шине от 0 к 1, ждут в течение 15..60 мкс, после чего формируют импульс присутствия - устанавливают на шине лог. 0 на время от 60 до 240 мкс. Тем самым они сообщают ведущему устройству, что подключены к шине, работают и готовы к выполнению команд.

Импульс сброса на шине, в отличие от сброса при включении питания, не приводит к инициализации внутренней RAM датчика DS18B20. Содержимое памяти остаётся таким же, каким оно было до сброса.

Чтение/запись. Естественно, что обмен данными по однопроводной шине происходит по одному биту за один раз. Обмен осуществляется с помощью так называемых тайм-слотов. Инициатором, как записи, так и чтения, является ведущее устройство. В отличие от UART, где синхронизируется передача сразу целого байта, здесь синхронизируется передача каждого бита. Это позволяет сделать требования к временным параметрам импульсов очень мягкими.

Тайм-слоты записи и чтения для 1-Wire шины.
Рис. %img:slts

Тайм-слоты записи. Длительность тайм-слотов записи должна составлять 60..120 мкс. Между соседними тайм-слотами должен быть интервал не менее 1 мкс (время восстановления), когда на шине за счёт подтягивающего резистора установлена лог. 1. Максимальная величина времени восстановления не ограничивается.

Для записи 0-бита, ведущее устройство должно установить на шине уровень лог. 0 в течение всего слота записи.

Для записи 1-бита, ведущее устройство должно установить на шине уровень лог. 0 на время не менее 1 мкс. Затем, оно должно освободить шину, чтобы к моменту времени 15 мкс от начала тайм-слота, подтягивающий резистор установил на шине уровень лог. 1.

Ведомые устройства, обнаружив начало тайм-слота по переходу шины из состояния лог. 1 в лог. 0, ждут в течение некоторого времени, затем считывают состояние шины. Уровень сигнала в шине в этот момент и будет битом, принятым ведомым устройством. Время ожидания может быть от 15 мкс (минимальное значение) до 60 мкс (максимальное значение), типичное значение 30 мкс. Возможен разброс значений у разных устройств, значение может зависеть от температуры, питающего напряжения и других факторов.

Параметры "окна" для считывания состояния шины ведомым устройством определяют такие временные параметры тайм слота как его минимальная длительность в 60 мкс и освобождение шины к моменту 15 мкс при передаче ведущим устройством 1-бита.

Тайм-слоты чтения. Датчик DS18B20 передаёт данные только в том случае, если это предполагается полученной перед этим командой. Инициатором чтения данных является ведущее устройство, оно генерирует тайм-слот для чтения каждого бита. Длительность тайм-слотов чтения должна быть не менее 60 мкс со временем восстановления между слотами не менее 1 мкс.

Ведущее устройство инициирует тайм-слот чтения переводом шины в состояние с уровнем лог. 0 на время не менее 1 мкс, после чего освобождает шину.

Для передачи 0, ведомое устройство, обнаружив начало тайм-слота, удерживает на шине уровень лог. 0 в течение всего тайм-слота. Для передачи 1, ведомое устройство оставляет шину свободной и она переходит в состояние с уровнем лог. 1 под действием подтягивающего резистора, после того как её освободит ведущее устройство.

Гарантируется, что передаваемые DS18B20 данные действительны в течение 15 мкс от начала тайм-слота. Так что, ведущее устройство за этот интервал времени должно успеть освободить шину, выждать время, необходимое для завершения перехода шины в состояние лог. 1 под действием подтягивающего резистора (на тот случай, если ведомое устройство передаёт 1) и успеть считать состояние шины. Считанное значение и будет полученным битом. Переходные процессы при переключении шины в состояние с уровнем лог. 1 связаны с зарядом через подтягивающий резистор ёмкости линии связи и паразитных ёмкостей всех подключённых к линии устройств, т.е. являются переходными процессами в RC-цепи. Для оценки времени переходных процессов учитываем, что ёмкость входа/выхода DS18B20 не превышает 25 пФ.

Детализированная диаграмма тайм-слота чтения 1.
Рис. %img:r1

Команды DS18B20

Каждый раз, когда требуется получить доступ к датчику DS18B20, выполняется следующая последовательность шагов.

  1. Инициализация.
  2. ROM-команда (с последующим обменом данными, если команда это предусматривает).
  3. Функциональная команда (с последующим обменом данными).

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

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

ROM-команды используются для выбора устройства, которому будет адресована функциональная команда (все остальные, невыбранные устройства переходят в режим сна до следующей инициализации); а также для перечисления устройств, подключённых к шине. Если адресация не требуется, например, имеется только одно ведомое устройство на шине или следующая команда адресована одновременно всем устройствам, может использоваться команда "пропустить ROM-команду" с кодом 0xCC.

Функциональные команды используется для выполнения полезной работы: запустить цикл преобразования аналого-цифрового преобразователя, считать или записать данные в RAM, считать или записать данные в EEPROM, определить способ питания датчика (от отдельного источника или от шины данных).

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

Это означает, что для одного измерения температуры потребуется, как минимум, два цикла взаимодействия с датчиком: 1) для того, чтобы дать команду на преобразование; 2) для того, чтобы прочитать результат из RAM. Каждый из циклов требует инициализации, ROM-команды и команды.

ROM-команды

ROM-команды датчика DS18B20
Название Код Назначение
SEARCH ROM 0xF0 Используется для определения ROM-кодов всех подключённых к шине устройств через процесс элиминации при циклическом выполнении команды.
READ ROM 0x33 Прочитать 64-битный ROM-код устройства. Используется только в случае наличия одного ведомого устройства на шине.
MATCH ROM 0x55 Сопоставление ROM. После команды ведущее устройство передаёт 64-битный ROM-код того устройства, которому предназначена следующая команда. Остальные устройства уходят в режим сна.
SKIP ROM 0xCC Следующая команда предназначена для всех ведомых устройств на шине.
ALARM SEARCH 0xEC Аналогична команде SEARCH ROM, за исключением того, что на эту команду отвечают только устройства с установленным флагом сигнализации о выходе измеренной температуры за заданные пределы.

SEARCH ROM (0xF0)
Самая сложная из всех команд датчика. Используется в том случае, если к общей шине подключено несколько ведомых устройств. Если используется один датчик на шине, следует использовать более простые команды READ ROM (0x33) или SKIP ROM (0xCC). Подробно работа команды и её использование описывается в статье "Переходник RS-232 (COM-порт) - 1-Wire. SEARCH ROM". Там же приводится пример программы с её использованием.

Если говорить кратко, то команда SEARCH ROM используется для перечисления ROM-кодов всех подключённых к шине ведомых устройств. В ответ на команду каждое ведомое устройство сначала передаёт бит с индексом [0] своего ROM-кода, затем отрицание этого бита, после чего ведущее устройство должно подтвердить получение бита, отправив его значение ведомым устройствам. Ведомые устройства, получив этот эхо-бит от мастера, сравнивают его со своим битом [0]. Если значения битов совпадают, аналогичная процедура выполняется для бита с индексом [1], затем [2] и т.д. до [63] - для всех 64 битов. Если на каком-то бите устройство обнаруживает расхождение, оно переходит в состояние сна до следующей инициализации.

Пока у всех устройств на шине все младшие биты ROM-кода будут совпадать, мастер будет считывать сначала бит ai, затем его отрицание ~ai (последовательность 0, 1 либо 1, 0) и отправлять устройствам назад значение ai. Как только дело дойдёт до некоторого разряда с индексом [j], в котором имеется расхождение, часть устройств отправит сначала 0, потом 1, другая часть отправит сначала 1, потом 0. Это вызовет коллизию, в результате которой тайм-слоты чтения 0 поглотят тайм-слоты чтения 1. Мастер получит два бита 0, 0, это будет говорить ему о том, что имеются, как устройства с ROM-кодами, где младшие биты равны 0...a2a1a0, так и такие, где младшие биты равны 1...a2a1a0. Мастер должен запомнить место "развилки" и продолжить исследование кодов, сделав какой-то выбор, например, отправив в ответе 0 (тем самым он отправит спать все те устройства, ROM-код которых в этом разряде содержит 1). Делая тот или иной выбор, добравшись до последнего бита, мы получим первый ROM-код устройства, все остальные будут элиминированы.

Затем, если остались ещё не исследованные "развилки", производим инициализацию и снова даём команду SEARCH ROM. Только в этот раз на последней "развилке" делаем другой выбор - если в прошлый раз выбирали значение бита равным 0, то в этот раз выбираем 1. После получения очередного ROM-кода, исключаем из рассмотрения все последние, полностью исследованные "развилки", пройденные как с выбором значения бита 0, так и 1. Если ещё остаются неисследованные варианты, то имеются устройства для перечисления, иначе перечисление завершено.

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

Такую процедуру выполняют только один раз после включения системы для исследования её конфигурации. Полученные ROM-коды затем используются для адресации устройств с помощью команды MATCH ROM.

READ ROM (0x33)
Эта команда используется только в том случае, если к шине подключено единственное ведомое устройство. Позволяет считать 64-битный ROM-код устройства, не прибегая к трудоёмкой процедуре перечисления командой SEARCH ROM. Если к шине подключено более одного ведомого устройства, при чтении возникнут коллизии из-за одновременного ответа нескольких устройств, что делает использование команды в такой конфигурации бессмысленным. Данные передаются, начиная с младшего бита.

MATCH ROM (0x55h)
Команда для сопоставления ROM-кода. После команды требуется передать 64-битный код устройства, которому будет адресована следующая функциональная команда. Все устройства, для которых сопоставление ROM-кода не будет успешным, перейдут в режим сна до следующей инициализации. Данные передаются, начиная с младшего бита.

SKIP ROM (0xCC)
Пропуск сопоставления ROM-кода; следующая функциональная команда будет адресована одновременно всем устройствам. Например, это может быть команда CONVERT T. Если функциональная команда предполагает возврат данных от ведомых устройств, использовать SKIP ROM имеет смысл только при наличии единственного ведомого устройства на шине.

ALARM SEARCH (0xEC)
Команда для перечисления устройств с установленным флагом сигнализации о выходе измеренной температуры за установленные регистрами TH и TL пределы. Принцип процесса перечисления полностью аналогичен используемому с командой SEARCH ROM, за исключением того, что в перечислении участвуют только устройства с установленным флагом сигнализации. Состояние флага обновляется после каждого измерения температуры, выполняемого командой CONVERT T. Полученное в результате измерения значение T сравнивается со значениями в регистрах TH и TL. Если T>TH или T<TL, флаг устанавливается. Если выхода за пределы диапазона нет, флаг сбрасывается. TH и TL - знаковые целые однобайтные значения; сравнение производится с учётом только целой части измеренного значения температуры, дробная часть T не учитывается.

Функциональные команды

Большинство функциональных команд использует внутреннюю RAM датчика. Объём памяти составляет 9 байт. Вся память доступна ведущему устройству для чтения, 3 байта доступны также и для записи.

Карта памяти DS18B20
Адрес Назначение байта Значение после включения    
0 Температура, младший байт 0x50 85ºC
1 Температура, старший байт 0x05   EEPROM
2 TH или байт пользователя 1 * <===> TH или байт пользователя 1
3 TL или байт пользователя 2 * <===> TL или байт пользователя 2
4 Регистр конфигурации * <===> Регистр конфигурации
5 Зарезервировано 0xFF
6 Зарезервировано -
7 Зарезервировано 0x10
8 CRC *

* Значение после включения зависит от содержимого EEPROM.

Байты 0 и 1 содержат результат последнего измерения температуры, которое выполняется функциональной командой CONVERT T.

  Бит 7 Бит 6 Бит 5 Бит 4 Бит 3 Бит 2 Бит 1 Бит 0
Младший байт (0) 23 22 21 20 2-1 2-2 2-3 2-4
  Бит 15 Бит 14 Бит 13 Бит 12 Бит 11 Бит 10 Бит 9 Бит 8
Старший байт (1) S S S S S 26 25 24

S - знаковые биты.

В результате измерения определяется температура в ºC. Хранится в RAM температура в виде двухбайтового числа со знаком с фиксированной точкой с четырьмя двоичными цифрами после точки (их весовые коэффициенты 2-1, 2-2, 2-3, 2-4). Если используется разрешение 12 бит, все биты числа действительные. При меньшем разрешении соответствующее количество младших битов будет иметь неопределённое значение (эти биты в считанном числе следует обнулить).

Примеры представления температуры в DS18B20
Температура, ºC Двоичный формат HEX
+125 0000 0111 1101 0000 0x07D0
+85* 0000 0101 0101 0000 0x0550
+25.0625 0000 0001 1001 0001 0x0191
+10.125 0000 0000 1010 0010 0x00A2
+0.5 0000 0000 0000 1000 0x0008
0 0000 0000 0000 0000 0x0000
-0.5 1111 1111 1111 1000 0xFFF8
-10.125 1111 1111 0101 1110 0xFF5E
-25.0625 1111 1110 0110 1111 0xFE6F
-55 1111 1100 1001 0000 0xFC90

* После включения питания RAM содержит в байтах 0, 1 значения, соответствующие температуре +85ºC.

Не слишком углубляясь в такой всеми хорошо изученный вопрос, как форматы представления числовых данных, просто скажем, что если рассматривать полученное от датчика значение как целое со знаком размером 2 байта (тип /*signed*/ short int или int16_t), то температура может быть выражена так:

// Преобразование числа с фиксированной точкой с 4 цифрами после точки
// в число с плавающей точкой (работает в т.ч. для отрицательных чисел).
// Если младшие биты недействительные, дополнительно выполняем value&=mask;

int16_t value=read_device();
float t=value/16.0;

Байты 2 и 3 задают верхнюю и нижнюю границы температуры. Являются целыми знаковыми однобайтовыми числами. Если при измерении температуры происходит выход результата за заданные границы, то устанавливается внутренний флаг сигнализации. Если результат находится в заданных пределах, флаг сбрасывается. После включения питания эти байты инициализируются соответствующими значениями из EEPROM. Если функции сигнализации не используются, эти два байта могут использоваться как память общего назначения, на усмотрение пользователя.

Байт 4 - регистр конфигурации, задаёт разрешение датчика DS18B20. После включения инициализируется соответствующим значением из EEPROM. Изготовителем задаётся значение по умолчанию, соответствующее максимальному разрешению 12 бит.

Формат регистра конфигурации
Номер бита 7 6 5 4 3 2 1 0
Значение 0 R1 R0 1 1 1 1 1

Если рассматривать R1, R0 как битовое поле R, которое может принимать значения от 0 до 3, то разрешение B в битах связано с R соотношением:
B=9+R
Время преобразования увеличивается вдвое при увеличении разрешения на 1 бит и достигает 750 мс при разрешении 12 бит:
tconvert=750 мс/(2**(3-R))

Байты 5,6 и 7 зарезервированы для внутреннего использования устройством.

Байт 8 содержит CRC код для области памяти с 0 по 7 байты.

Функциональные команды датчика DS18B20
Название Код Назначение
CONVERT T 0x44 Выполнить преобразование температуры и сохранить результат во внутренней RAM.
WRITE SCRATCHPAD 0x4E Записать три байта в RAM: TH, TL и байт регистра конфигурации.
READ SCRATCHPAD 0xBE Прочитать все 9 байт из RAM (в том числе, результат последнего измерения температуры); ведущее устройство может прочитать только необходимую ему часть данных с последующим сбросом.
COPY SCRATCHPAD 0x48 Скопировать данные из RAM для TH, TL и регистра конфигурации в EEPROM.
RECALL E2 0xB8 Поместить в ячейки RAM для TH, TL и регистра конфигурации значения из EEPROM. Эта операция выполняется автоматически при включении питания.
READ POWER SUPPLY 0xB4 Определить тип питания устройства. В ответ на команду устройство возвращает бит 0 при паразитном питании и бит 1 при внешнем питании.

CONVERT T (0x44h)
Команда на выполнение одного цикла преобразования аналого-цифрового преобразователя (ADC), на вход которого поступает сигнал со встроенного аналогового датчика температуры. Полученный результат - измеренная температура помещается во внутреннюю RAM память датчика в виде двухбайтового числа. После завершения выполнения команды, датчик переходит в режим с пониженным энергопотреблением. Для считывания результата измерения используется функциональная команда READ SCRATCHPAD.

Время преобразования зависит от выбранной разрешающей способности. При выборе 12-битного режима оно составляет не более 750 мс. Уменьшение разрядности на 1 бит уменьшает максимальное время преобразования в 2 раза (11 бит - 375 мс; 10 бит - 187.5 мс; 9 бит - 93.75 мс).

Если используется вариант питания DS18B20 от внешнего источника, то во время цикла преобразования ведущее устройство может генерировать тайм-слоты чтения, на которые датчик будет отвечать возвратом бита 0. После завершения преобразования и ухода в режим пониженного потребления, датчик, естественно, перестаёт реагировать на тайм-слоты чтения, что воспринимается ведущим устройством как возврат 1. Эта техника может использоваться для определения момента завершения преобразования.

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

WRITE SCRATCHPAD (0x4Eh)
Команда даёт возможность записать ведущему устройству 3 байта в RAM память DS18B20, байты последовательно записываются по адресам 2, 3 и 4 внутренней RAM. Эти байты задают соответственно значения TH, TL и содержимое регистра конфигурации. Передача, как и обычно, осуществляется, начиная с младшего бита.

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

READ SCRATCHPAD (0xBE)
Команда позволяет прочитать ведущему устройству содержимое внутренней памяти датчика. Данные передаются, начиная с байта 0 до тех пор, пока не будут получены все 9 байт памяти. Каждый байт передаётся, начиная с младшего бита. Ведущее устройство может считать только интересующую его часть данных и прервать чтение с помощью сброса.

COPY SCRATCHPAD (0x48)
Команда копирует содержимое байтов 2, 3 и 4 (регистры TH, TL и регистр конфигурации) из RAM в соответствующие ячейки энергонезависимой памяти EEPROM. В режиме паразитного питания, не позже чем через 10 мкс после подачи команды, ведущее устройство должно включить сильное подтягивание шины данных на время не меньше, чем 10 мс (максимальное время, необходимое для выполнения операции). В режиме питания от внешнего источника, ведущее устройство может генерировать тайм-слоты чтения. В процессе выполнения команды датчик будет возвращать бит 0, после завершения будет возвращаться бит 1.

RECALL E2 (0xB8)
Команда восстанавливает значения байтов 2, 3 и 4 в RAM из энергонезависимой памяти EEPROM (регистры TH, TL и регистр конфигурации). Ведущее устройство может генерировать тайм-слоты чтения после подачи этой команды. Пока датчик будет находиться в процессе выполнения, он будет возвращать бит 0, после завершения будет возвращаться бит 1.

READ POWER SUPPLY (0xB4h)
После подачи этой команды ведущее устройство генерирует один тайм-слот чтения. В случае использования паразитного питания датчик DS18B20 отвечает битом 0, а при питании от внешнего источника, возвращает бит 1. Информация об используемом варианте питания необходима ведущему устройству для правильной организации взаимодействия с датчиком.

Далее: Пример использования цифрового датчика температуры DS18B20.

Смотрите также: Использование UART для реализации 1-Wire. (Простой способ подключения устройств с интерфейсом 1-Wire к микроконтроллеру путём использования его UART).

author: hamper; date: 2016-01-30; modified: 2020-04-20
  Рейтинг@Mail.ru