Ответственный подход к измерению относительной влажности

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

2573dd0ba14546ff88778ad7db064d4b.jpg

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

1. Обзор


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

872948da9b734f9eb8b2c9c75c7936b6.png

О других вариантах корпусировки поговорим ниже, а пока приведем основные характеристики датчиков 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. Чувствительный элемент


ac4352d84e4e463794a3421d4e9ef180.pngКак и большинство современных датчиков относительной влажности, датчики HYT имеют емкостный чувствительный элемент. Принципы работы преобразователей «влажность-емкость» и их преимущества описаны в огромном количестве источников, напомню главное.

  • Чувствительный элемент представляет собой конденсатор, емкость которого изменяется пропорционально относительной влажности окружающей среды.
  • В качестве диэлектрика используется слой полимера, диэлектрическая проницаемость которого зависит от количества абсорбированной им влаги.
  • Зависимость влажность-емкость носит линейный характер и позволяет проводить измерения в диапазоне от 0 до 100% RH.

4d381aa70ec24db7b15cf262de6cb814.png

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

12e5a62124b944bd9085060622fb27b0.png


εo — Электрическая постоянная. Мне лень даже приводить её значение, суть в том что это константное значение
εr — Диэлектрическая проницаемость полимера, изменяющаяся пропорционально количеству поглощенной влаги
A — Площадь полимера
d — Толщина полимера

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

0798f86db826444eb74dffc8cfcac67fНапример, для метеозондов и некоторых других приложений важным требованием является высокое быстродействие. Сокращение времени отклика чувствительного элемента достигается за счет уменьшения толщины полимера, таким образом у датчика P14 Rapid обеспечивается время отклика менее 1.5 сек. Другой пример — датчики MK33, предназначенные для работы с маслами. Здесь за счет увеличения площади чувствительного элемента увеличивается крутизна выходной характеристики, а значит и разрешение датчика.

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

3. Структура датчиков HYT


Использование «голого» чувствительного элемента оправдано в очень немногих случаях. Как правило, проще и выгоднее использовать интегральный модуль, в котором помимо емкостного преобразователя уже предусмотрены датчик температуры, схемы термокомпенсации и обработки сигнала, а также цифровой или аналоговый интерфейс. Такие цифровые датчики имеют заводскую калибровку и не требуют дополнительной настройки.

Цифровые датчики температуры и относительной влажности производятся в разных ценовых сегментах. Датчик, подходящий под описание из предыдущего абзаца, может стоить и 2 доллара, и 150 долларов. Такая разница между дорогими и дешевыми датчиками объясняется тем, что цифровые датчики различаются не только точностью, быстродействием и повторяемостью результатов измерений, но и другими характеристиками, обеспечить которые не так просто. Это долговременная стабильность работы, возможность применения датчика при очень низкой или очень высокой влажности и устойчивость к воздействиям внешней среды. Чтобы понять, почему перечисленные характеристики оказывают большое влияние на стоимость компонента, обратимся к особенностям производства.

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

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

ab7ffdc6c585459f82f5a16839ee7613.png

За счет уменьшения взаимного влияния ИС и емкостного датчика, использования почти не поглощающих влагу материалов, золотых проводников, а также применения других мер по повышению качества, на цифровом модуле удается добиться точности, близкой к точности отдельного преобразователя «влажность-емкость».

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.

ddfb5e8ed61c47f2845d7cbfe29bec80 Самый простой модуль — HYT 271 — имеет размер 5 на 10 мм и состоит из емкостного преобразователя, залитой «кляксой» интегральной схемы и дополнительных конденсаторов. В отсутствии защитного фильтра достигаются максимальное быстродействие и минимальная цена.
54e24a680548494883b2c02c35bd8e01
cfaa969261564f41be6f5a517035a58cЦифровой датчик HYT 221 имеет ту же начинку, что и HYT 271, но покрыт защитным фильтром, который позволяет использовать датчик в том числе при наличии брызг воды.
54e24a680548494883b2c02c35bd8e01

5c2cf0b20c144bb18a16b4f7e86d6bf2Датчик HYT 939 также отличается только типом защитного фильтра — компоненты помещаются под круглый металлический корпус, на верхней стороне которого расположено закрытое мембраной отверстие. Для заказа доступен модуль HYT 939, устойчивый к давлению до 16 бар.
bc062f202ecd47a5923059067001c42d
9b27ac513f724438acdfed5f3969c942 В соответствии с требованиями заказчика могут быть изменены и структура, и габаритные размеры датчика. Вместо стандартного интерфейса 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», т.е. на запись.

b0d8e28df6654b7291f318ec73b38c13.png

Команда ‚Data Fetch» (DF) служит для чтения данных. В заголовочном файле содержится адрес датчика и бит RW, установленный в »1», т.е. на чтение.

10e72aa13b694535baa3c11452a1cde9.png

Максимальное количество байт, которые должны быть приняты на микроконтроллере — четыре. Первые два байта содержат данные об относительной влажности, третий и четвертый — о температуре.

Микроконтроллер может запросить только два первых байта (только данные о влажности) или три первых байта (данные о влажности и старшие биты значения температуры).

И на влажность, и на температуру приходится по 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, питание и земля.

a6ddd61a24a045fb814388ba1c97dc89.png

Подключение

Подключаем линии в соответствии с распиновкой датчика и разъема платы.

64d517079b8741db9cfa17b67e55d30b.png

Для работы шины I2C на обеих её линиях должны быть предусмотрены подтягивающие резисторы. В документации на датчик HYT указаны номиналы около 2.2 кОм, и превоначально схема была собрана с использованием двух отдельных сопротивлений.
Однако в процессе отладки выяснилось, что достаточно использовать встроенные подтягивающие резисторы микроконтроллера EFM32. Их номинал значительно больше — 40 кОм, фронты, конечно, довольно сильно завалены, но оно работает. Для демонстрации работы датчика этого достаточно.

7f91d34c274b4508afc70dc388086a3b.png

В данном случае датчик питается от линии питания МК (3.3 В), но допустимы и пятивольтовые уровни.

Программирование микроконтроллера

Для работы с отладочной платой EFM32ZG-STK3200 используется среда Simplicity Studio — платформа, содержащая IDE, примеры программ, документацию и различные утилиты для разработки приложения. Её описание также можно найти в предыдущих статьях, здесь я просто скажу что это бесплатная программа, которую SiLabs распространяет для работы с SiLabs-овскими же контроллерами.

При создании программы используются готовые библиотеки от SiLabs — драйвер I2C для связи с датчиком и драйвер RTC для его периодического опроса. Также используются библиотеки glib и готовые примеры работы с ЖКИ. Для коммуникации с дисплеем используются интерфейс SPI и часы реального времени. С возможностями встроенного на плате дисплея проще всего познакомиться через демо-примеры для платы EFM32ZG-STK3200.

Программа предусматривает два режима работы:

  • Отображение температуры и относительной влажности на термометрах
  • изменения относительной влажности на графике


Переключение режима происходит по прерыванию от кнопки PB0, порядок взаимодействия контроллера с датчиком остается неизменным.

Неканоничная схема алгоритма программы:

00ade692e8d44754bc54b2bcbf9b988c.png

Полные исходники программы доступны здесь. Ниже разберем лишь ту часть программы, которая имеет отношение к опросу датчика, т.е. к коммуникации по 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)
                }
        }


При работе с готовыми библиотечными функциями для I2C от SiLabs существует два основных способа испортить себе жизнь
Способ 1: Посчитать, что в HYT_ADDR следует записывать 0×28, т.е. указанный в документации адрес датчика.
Семибитный адрес датчика — это 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();
...
// отображение данных

Результат

Режим отображения температуры и относительной влажности на термометрах выглядит вот так:

f14fa68b6580417abf22537533891fc8.png

Но измерять с приемлемым качеством постоянные температуру и влажность в помещении может любой датчик. Качественные характеристики серии HYT лучше иллюстрируются в динамике: на видео с помощью чашечки горячего чая показывается быстродействие датчика HYT-221.

Если вы имели честь когда-нибудь наблюдать с какой скоростью реагирует на изменения влажности условный DHT22, то, конечно, почувствуете разницу. Также стоит учесть, что используется самый медленный из HYT-ов — модель с защитным фильтром.

6. Заключение


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

© Habrahabr.ru