Ответственный подход к измерению относительной влажности
Этой статьей мы продолжаем рассказывать о датчиках от швейцарской компании IST. Не так давно были опубликованы посты о датчиках электрической проводимости воды и датчиках скорости потока жидкостей и газов, сегодня очередь дошла до относительной влажности.
Статья посвящена высокоточным датчикам серии HYT. Приводится описание устройства датчика и чувствительного элемента, подробно разбирается порядок сопряжения датчика с микроконтроллером, приводится пример разработки.
1. Обзор
Стандартные модели HYT — это три датчика для измерения температуры и относительной влажности, построенные на базе одного и того же чувствительного элемента, но выполненные в разных корпусах.
О других вариантах корпусировки поговорим ниже, а пока приведем основные характеристики датчиков HYT.
Относительная влажность | Температура | |
Диапазон измерений | от 0 до 100% RH | от -40 до +125 °C |
Точность (максимальная погрешность) | ± 1.8% RH (в диапазоне 0… 80% RH) | ± 0.2 °C (в диапазоне 0… 60 °C) |
Время отклика | HYT 271 < 4 сек HYT 221 < 12 сек HYT 939 < 10 сек |
HYT 271 < 5 сек HYT 221 < 12 сек HYT 939 < 10 сек |
Повторяемость | ± 0.2% RH | ± 0.1 °C |
Гистерезис | < ± 1 % RH | |
Долговременный дрейф характеристик | < ± 0.5 % RH / год | < ± 0.05 °C / год |
Напряжение питания | 2,7 — 5,5 В | |
Потребляемый ток | < 22 мкА при частоте опроса 1 Гц, <1 мкА в режиме сна |
Понятно, что столь высокие точность и стабильность не пригодятся в домашней метеостанциитм. Датчики HYT используются в промышленности — в бытовой технике, в процессах, которые связаны с сушкой, испарением и перегонкой, в анализаторах остаточной влажности различных материалов, в медицинской технике, в системах вентиляции и в других «ответственных приложениях».
2. Чувствительный элемент
Как и большинство современных датчиков относительной влажности, датчики HYT имеют емкостный чувствительный элемент. Принципы работы преобразователей «влажность-емкость» и их преимущества описаны в огромном количестве источников, напомню главное.
- Чувствительный элемент представляет собой конденсатор, емкость которого изменяется пропорционально относительной влажности окружающей среды.
- В качестве диэлектрика используется слой полимера, диэлектрическая проницаемость которого зависит от количества абсорбированной им влаги.
- Зависимость влажность-емкость носит линейный характер и позволяет проводить измерения в диапазоне от 0 до 100% RH.
Емкостный датчик представляет собой керамическую подложку, на которой последовательно располагаются нижний проводящий электрод, абсорбирующий влагу полимер и верхний электрод. Выходная характеристика преобразователя определяется типом полимера, а также его толщиной и площадью:
εo — Электрическая постоянная. Мне лень даже приводить её значение, суть в том что это константное значение
εr — Диэлектрическая проницаемость полимера, изменяющаяся пропорционально количеству поглощенной влаги
A — Площадь полимера
d — Толщина полимера
В зависимости от назначения чувствительного элемента выпускаются элементы с различными характеристиками, выполененные на базе полимеров с различными параметрами.
Например, для метеозондов и некоторых других приложений важным требованием является высокое быстродействие. Сокращение времени отклика чувствительного элемента достигается за счет уменьшения толщины полимера, таким образом у датчика P14 Rapid обеспечивается время отклика менее 1.5 сек. Другой пример — датчики MK33, предназначенные для работы с маслами. Здесь за счет увеличения площади чувствительного элемента увеличивается крутизна выходной характеристики, а значит и разрешение датчика.
IST выпускает около десятка различных емкостных преобразователей. Интересующихся приглашаю пройти по ссылке, а мы возвращаемся к цифровым датчикам HYT.
3. Структура датчиков HYT
Использование «голого» чувствительного элемента оправдано в очень немногих случаях. Как правило, проще и выгоднее использовать интегральный модуль, в котором помимо емкостного преобразователя уже предусмотрены датчик температуры, схемы термокомпенсации и обработки сигнала, а также цифровой или аналоговый интерфейс. Такие цифровые датчики имеют заводскую калибровку и не требуют дополнительной настройки.
Цифровые датчики температуры и относительной влажности производятся в разных ценовых сегментах. Датчик, подходящий под описание из предыдущего абзаца, может стоить и 2 доллара, и 150 долларов. Такая разница между дорогими и дешевыми датчиками объясняется тем, что цифровые датчики различаются не только точностью, быстродействием и повторяемостью результатов измерений, но и другими характеристиками, обеспечить которые не так просто. Это долговременная стабильность работы, возможность применения датчика при очень низкой или очень высокой влажности и устойчивость к воздействиям внешней среды. Чтобы понять, почему перечисленные характеристики оказывают большое влияние на стоимость компонента, обратимся к особенностям производства.
Одной из главных сложностей производства цифровых датчиков относительной влажности является несовместимость некоторых процессов производства емкостного чувствительного элемента и полупроводникового производства (создания КМОП-структуры, содержащей датчик температуры, схему обработки сигнала и т.п). Технологии не позволяют полностью сохранить характеристики емкостного преобразователя, если он выполнен не отдельно, а на той же подложке, что и полупроводниковая структура. Поэтому изготовление датчика, совмещающего емкостный элемент и цифровую схему, всегда подразумевает компромисс между стоимостью производства и характеристиками конечного изделия.
При производстве датчиков HYT емкостный SMD-преобразователь и интегральная схема изготавливаются отдельно друг от друга, отдельно тестируются, и только после этого устанавливаются на общей подложке и соединяются проводами.
За счет уменьшения взаимного влияния ИС и емкостного датчика, использования почти не поглощающих влагу материалов, золотых проводников, а также применения других мер по повышению качества, на цифровом модуле удается добиться точности, близкой к точности отдельного преобразователя «влажность-емкость».
4. Калибровка датчиков HYT
Стандартная заводская калибровка проводится по девяти точкам при трех значениях температуры:
- 0% и 85% RH при 5°C
- 0%, 15%, 30%, 50%, 85% RH при 30 °C
- 0% и 85% RH при 45°C
После калибровки проводятся контрольные измерения. Стандартные контрольные точки:
- 85% RH при 5°C
- 20% и 75% RH при 25°C
Здесь самое время напомнить об одной из главных фишек IST: по запросу заказчика производитель изготавливает самые разные модификации своих датчиков. Поставляются датчики с измененными характеристиками, изделия в нестандартных корпусах и, конечно, датчики с нестандартной калибровкой. Зная специфику условий применения конечного изделия, можно, к примеру, заказать датчик HYT с калибровкой от 0 до 50% RH со сдвигом +2% RH на всем диапазоне.
Подобные модификации мало влияют на цену и сроки поставки и, что особенно приятно, доступны для малотиражных изделий.
5. Корпус датчиков HYT
Приведем описание датчиков серии HYT.
Самый простой модуль — HYT 271 — имеет размер 5 на 10 мм и состоит из емкостного преобразователя, залитой «кляксой» интегральной схемы и дополнительных конденсаторов. В отсутствии защитного фильтра достигаются максимальное быстродействие и минимальная цена.
Цифровой датчик HYT 221 имеет ту же начинку, что и HYT 271, но покрыт защитным фильтром, который позволяет использовать датчик в том числе при наличии брызг воды.
Датчик HYT 939 также отличается только типом защитного фильтра — компоненты помещаются под круглый металлический корпус, на верхней стороне которого расположено закрытое мембраной отверстие. Для заказа доступен модуль HYT 939, устойчивый к давлению до 16 бар.
В соответствии с требованиями заказчика могут быть изменены и структура, и габаритные размеры датчика. Вместо стандартного интерфейса I2C датчик может быть оснащен 5-выводным SPI, а дополнительно к цифровому интерфейсу могут быть добавлены дополнительные квазианалоговые линии. Выводы датчика могут быть удлинены, оснащены коннектором. Производятся датчики в специализированных корпусах, например как на фото.
Заказ датчиков с модифицированными размерами или нестандартной конфигурацией возможен в том числе для мелкосерийного производства.
4. Порядок сопряжения датчика и управляющего контроллера
Стандартным интерфейсом подключения датчика HYT к управляющему микроконтроллеру является шина I2C. Контроллер является мастером, датчик — ведомым узлом.
В аппаратных характеристиках интерфейса датчика нет ничего примечательного — поддерживаются скорости от 100 до 400 кГц и стандартный 7-битный адрес на шине. Адрес датчика по умолчанию — 0×28, адрес может быть изменен на значение от 0×00 до 0×7F. Данные передаются в режиме MSB, т.е. сначала идут старшие биты.
Не вижу смысла приводить описание порядка работы самой шины I2C. Также упускаю описание типовой схемы включения, требований модуля HYT по таймированию на I2C, описание процедуры смены адреса датчика. Всё это можно найти в википедии и документации.
Остановимся на процедуре сбора данных с датчика HYT — последовательности из двух команд для управления модулем.
В отсутствии запросов от микроконтроллера, датчик находится в режиме сна. По приходу команды ‚Measuring Request» (MR) он просыпается, начинает цикл измерений и формирует посылку с данными для управляющего контроллера. Подготовка данных занимает от 60 до 100 мс, после этого на датчик должна поступить команда ‚Data Fetch» (DF), по которой данные из выходного регистра датчика передаются на микроконтроллер.
Команда ‚Measuring Request» не подразумевает ни чтения, ни записи данных. Команда содержит только из заголовочного пакета — адреса ведомого узла и бита RW, выставленного в »0», т.е. на запись.
Команда ‚Data Fetch» (DF) служит для чтения данных. В заголовочном файле содержится адрес датчика и бит RW, установленный в »1», т.е. на чтение.
Максимальное количество байт, которые должны быть приняты на микроконтроллере — четыре. Первые два байта содержат данные об относительной влажности, третий и четвертый — о температуре.
Микроконтроллер может запросить только два первых байта (только данные о влажности) или три первых байта (данные о влажности и старшие биты значения температуры).
И на влажность, и на температуру приходится по 14 бит. Посылка Data Fetch также содержит два бита состояния:
- CMode Bit. Если установлена »1», то датчик находится в command mode — в служебном режиме, который используется для изменения адреса датчика на I2C
- Stale bit. Если установлена »1», значит после выполнения очередного цикла измерений получены те же значения температуры и влажности, что и после предыдущего цикла
Обработка принятой посылки состоит в вычислении значений температуры и относительной влажности из входных данных. Сначала маскируются статусные биты, далее из полученных данных вычисляются абсолютные значения температуры и относительной влажности:
RH [%] = (100 / (214 — 1)) * RHвх
T [°C] = (165 / (214 — 1)) * Tвх — 40
5. Пример включения датчика HYT
От теории к практике. На сайте производителя доступны уже готовые примеры программ для AVR-ок, а мы рассмотрим совместную работу датчика HYT 221 и отладочной платы EFM32ZG-STK3200 от Silicon Labs, подробнейшее описание которой приводилось в одной из предыдущих статей.
В этот раз на отладочной плате нам понадобятся встроенный ЖК-дисплей, механическая кнопка и 20-контактный разъем, на котором доступны сигналы I2C, питание и земля.
Подключение
Подключаем линии в соответствии с распиновкой датчика и разъема платы.
Для работы шины I2C на обеих её линиях должны быть предусмотрены подтягивающие резисторы. В документации на датчик HYT указаны номиналы около 2.2 кОм, и превоначально схема была собрана с использованием двух отдельных сопротивлений.
Однако в процессе отладки выяснилось, что достаточно использовать встроенные подтягивающие резисторы микроконтроллера EFM32. Их номинал значительно больше — 40 кОм, фронты, конечно, довольно сильно завалены, но оно работает. Для демонстрации работы датчика этого достаточно.
В данном случае датчик питается от линии питания МК (3.3 В), но допустимы и пятивольтовые уровни.
Программирование микроконтроллера
Для работы с отладочной платой EFM32ZG-STK3200 используется среда Simplicity Studio — платформа, содержащая IDE, примеры программ, документацию и различные утилиты для разработки приложения. Её описание также можно найти в предыдущих статьях, здесь я просто скажу что это бесплатная программа, которую SiLabs распространяет для работы с SiLabs-овскими же контроллерами.
При создании программы используются готовые библиотеки от SiLabs — драйвер I2C для связи с датчиком и драйвер RTC для его периодического опроса. Также используются библиотеки glib и готовые примеры работы с ЖКИ. Для коммуникации с дисплеем используются интерфейс SPI и часы реального времени. С возможностями встроенного на плате дисплея проще всего познакомиться через демо-примеры для платы EFM32ZG-STK3200.
Программа предусматривает два режима работы:
- Отображение температуры и относительной влажности на термометрах
- изменения относительной влажности на графике
Переключение режима происходит по прерыванию от кнопки PB0, порядок взаимодействия контроллера с датчиком остается неизменным.
Неканоничная схема алгоритма программы:
Полные исходники программы доступны здесь. Ниже разберем лишь ту часть программы, которая имеет отношение к опросу датчика, т.е. к коммуникации по I2C.
В основном используются стандартные функции библиотек от Silicon Labs — основной пакет em_i2c и его надстройка i2cspm.
При инициализации интерфейса определяется режим его работы и используемые порты ввода-вывода. Здесь же задается режим
PullUp для линий D6 и D7.
void setupI2C(void)
{
CMU_ClockEnable(cmuClock_I2C0, true);
CMU_ClockEnable(cmuClock_CORELE, true);
I2C_Init_TypeDef i2cInit = {
true,
true,
0,
I2C_FREQ_STANDARD_MAX,
i2cClockHLRStandard
};
GPIO_PinModeSet(gpioPortE, 13, gpioModeWiredAndPullUpFilter, 1);
GPIO_PinModeSet(gpioPortE, 12, gpioModeWiredAndPullUpFilter, 1);
I2C0->ROUTE = (I2C0->ROUTE & ~_I2C_ROUTE_LOCATION_MASK) | I2C_ROUTE_LOCATION_LOC6;
I2C0->ROUTE |= I2C_ROUTE_SCLPEN | I2C_ROUTE_SDAPEN;
I2C_Init(I2C0, &i2cInit);
}
Для коммуникации с датчиком, т.е. реализации команд Measuring Request и Data Fetch, служат одноименные функции.
Каждая из них содержит операции по формированию пакета для I2C и команду отправки пакета. Для формирования пакета используется структура типа I2C_TransferSeq_TypeDef, содержащая адрес датчика, значение бита RW, и формат регистров для приема (buf[0]) и передачи (buf[1]) данных по I2C.
static void performMRCommand(void)
{
I2C_TransferSeq_TypeDef seq;
seq.addr = HYT_ADDR;
seq.flags = I2C_FLAG_WRITE;
seq.buf[0].len = 0;
seq.buf[1].len = 0;
I2CSPM_Transfer(I2C0, &seq);
}
Функция performDFCommand, помимо указания на прием четырехбайтного пакета с записью данных в массив i2c_read_data, содержит алгоритм обработки принятой посылки. В результате преобразования в переменные HYT_temperature и HYT_humidity записываются искомые значения.
static void performDFCommand(void)
{
I2C_TransferSeq_TypeDef seq;
uint8_t i2c_read_data[4];
unsigned int temp_raw_value;
unsigned int humidity_raw_value;
seq.addr = HYT_ADDR;
seq.flags = I2C_FLAG_READ;
seq.buf[0].data = i2c_read_data;
seq.buf[0].len = 4;
seq.buf[1].len = 0;
I2CSPM_Transfer(I2C0, &seq);
HYT_state_bit = (i2c_read_data[0] & 0x40) >> 6;
if (HYT_state_bit == 0)
{
// получены новые данные (Stale bit = 0)
// преобразование первых двух принятых байт, получаем 14-разрядное значение отн. влажности
humidity_raw_value = ((i2c_read_data[0] & 0x3F) << 8) | i2c_read_data[1];
// получены новые данные (Stale bit = 0)
// преобразование третьего и четвертого байта, получаем 14-разрядное значение температуры
temp_raw_value = ((i2c_read_data[2] << 8) | i2c_read_data[3]) >> 2;
if (temp_raw_value < 0x3FFF && humidity_raw_value < 0x3FFF)
{
// расчет искомых значений
HYT_temperature = ((float)(temp_raw_value) * 165.0F / 16383.0F) - 40.0F;
HYT_humidity = (float)humidity_raw_value * 100.0F / 16383.0F;
}
else
{
// все 14 разрядов температуры или отн. влажности = "1", значит что-то идет не так
}
}
else
{
// новых данных не получено (Stale bit = 0)
}
}
Семибитный адрес датчика — это 010 1000. Ставим старшим битом »0» и получаем 0010 1000, т.е. 0×28. Логично.
Однако библиотечная функция считает, что адресом являются не младшие, а старшие 7 бит. Таки образом, вместо
#define HYT_ADDR 0x28
следует указывать
#define HYT_ADDR 0x50
или
#define HYT_ADDR 0x51
Способ 2: Посчитать, что I2C_FLAG_READ — это »0», а I2C_FLAG_WRITE — это »1». То есть на самом деле всё так и есть, в заголовочном байте посылки I2C предусмотрен один-единственный бит RW, который выставляется в »0» для записи данных и в »1» для чтения данных. Однако в недрах библиотеки em_lib прячутся вот такие коварные дефайны:
#define I2C_FLAG_WRITE 0x0001
#define I2C_FLAG_READ 0x0002
Так что не стоит при формировании структуры I2C_TransferSeq_TypeDef выставлять нули и единицы самостоятельно.В остальном претензий к em_i2c и другим пакетам em_*** не возникало.
Функция main состоит из процедур инициализации и цикла опроса датчика, после исполнения которого данные отображаются на дисплее в одном из двух режимов.
// инициализация МК и периферии, настройка режимов работы периферийных устройств
...
performMRCommand();
Delay(100);
performDFCommand();
...
// отображение данных
Результат
Режим отображения температуры и относительной влажности на термометрах выглядит вот так:
Но измерять с приемлемым качеством постоянные температуру и влажность в помещении может любой датчик. Качественные характеристики серии HYT лучше иллюстрируются в динамике: на видео с помощью чашечки горячего чая показывается быстродействие датчика HYT-221.
Если вы имели честь когда-нибудь наблюдать с какой скоростью реагирует на изменения влажности условный DHT22, то, конечно, почувствуете разницу. Также стоит учесть, что используется самый медленный из HYT-ов — модель с защитным фильтром.
6. Заключение
В заключении традиционно благодарю читателя за внимание и напоминаю, что вопросы по применению продукции, о которой мы пишем на хабре, можно также задавать на email, указанный в моем профиле.