История началась, когда одна китайская компания по имени Hoperf прислала мне их новые датчики давления, на пробу. В статье описаны основные характеристики сенсоров, фичи, тесты ну и самое главное их результаты в виде графиков и словесных описаний к ним. В конце статьи выложены драйвера для этих датчиков, максимально абстрагированы от аппаратной части.
С лева на право: HP206C, HP203B и BMP085 от Bosch для сравнения (в тестах также участвует).
Содержание:
- Тестовая схема
- Основные характеристики
- Внутренние регистры
- Протокол I2C
- Тесты и результаты
- Драйвер
- Выводы
1. Тестовая схема
Для тестов была собрана схема:
Состоит она из:
- отладочной платы LPC Xpresso с LPC1769 целевым микроконтроллером на борту, с ARM Cortex-M3 ядром. Впрочем, с этой задачей мог запросто справиться любой 8-битный AVR, просто бредборды были заняты;
- HP203B и HP206C подключены к I2C0, а BMP085 к I2C1. Сделано так не потому что паять было впадло, а потому что адреса совпадают;
- экран от Nokia 3310, так, чисто для вывода текущей информации одного из датчиков;
- переходника UART-USB на CP2102 для вывода информации в PC;
2. Основные характеристики
В таблице ниже представлены основные характеристики датчиков из даташитов, для сравнения.
Характеристика | HP203B | HP206C | BMP085 |
Диапазон измеряемых давлений, mbar | 300 — 1200 | 700 — 1100 | 300 — 1100 |
Абсолютная точность, mbar (в лучшем/худшем случае) | ±1.5 / ±3.0 | ±1.5 / ±3.0 | ±2.5 / ±4.0 |
Относительная точность, mbar (в лучшем/худшем случае) | ±0.5/±1.5 | ±0.6/±1.5 | ±0.2/±0.5 |
Максимальное разрешение, mbar/m (давление/высота) | 0.01/0.1 | 0.01/0.01 | 0.01/- |
Диапазон измеряемых температур, °С | -20 — 60 | -20 — 60 | 0 — 65 |
Абсолютная точность, °С (в лучшем/худшем случае) | ±0.3/±1.0 | ±0.3/±1.5 | ±0.5/±2.0 |
Максимальное разрешение, °С | 0.01 | 0.01 | 0.1 |
Средний ток потребления (1 семпл/с), µA (min/max) | 2.4/91.8 | 2.2/85.2 | 3/12 |
В чем же главные отличия этих датчиков? HP206C water-proof, а значит может работать и в дождь/снег/туман, в составе какой-нибудь погодной станции или в качестве альтиметра на квадрокоптере. Его разрешение по высоте также больше чем у остальных. HP203B мельче, имеет больший диапазон измеряемых давлений. С ним хоть в горы. Поэтому он идеален в качестве альтиметра, в мобильных устройствах. Эти два датчика выдают результат в человеческом виде, причем не только для температуры и давления, но и для высоты, что уменьшает нагрузку на процессор. Алгоритм расчета высоты прям запатентован. Также они имеют внутренние регистры для настройки. Что касается BMP085, мне кажется он отжил свое. В нем больше недостатков, нежели преимуществ. Данные выходят в сыром виде, которые нужно еще обсчитать, ровно как и высоту. Причем алгоритм не самый легкий, да еще и с ошибками в даташите. Но по результатам тестов он, пожалуй, на втором месте.
В программном плане, HP203B и HP206C одно и то же, за исключением адреса устройства на I2C шине. У HP203B его можно менять аппаратно, в зависимости от уровня на ножке CSB. Система команд очень проста. Их всего 10 штук:
- SOFT_RST — программный сброс (затирает все настройки);
- ADC_CVT (010, 3‐bit OSR, 2‐bit CHNL) — запрос на конвертацию, где:
- OSR — оверсемплинг;
- CHNL — температура или температура и давление;
- READ_PT — читать температуру и давление;
- READ_AT — читать температуру и высоту;
- READ_P — читать только давление;
- READ_A — читать только высоту;
- READ_T — читать только температуру;
- ANA_CAL — внутренняя калибровка девайса (используется при резком изменении условий среды, выполняется при включении);
- READ_REG (10, 6-bit register address) — записать данные во внутренний регистр по адресу;
- WRITE_REG (11, 6-bit register address) — считать данные из внутреннего регистра с адресом;
Значение OSR говорит сколько выборок будет усредняться. Чем больше, тем точнее результат, но большее время конвертирования и энергопотребление.
3. Внутренние регистры
Внутренние регистры позволяют настроить нижние/верхние границы температуры/давления/высоты и включить/выключить прерывания на эти события, а также на события завершения конвертации температуры/давления/высоты. Есть бит который настраивает формат выходных данных: сырые/не сырые(человеческие). Что делать с сырыми данными и как их обрабатывать, в даташите не указано. Вот все регистры:
- ALT_OFF — относительное смещение по высоте в см;
- PA_H/M/L_TH — соответственно высшая, средняя и низшая граница давлений (1 бит = 0.02 мбар);
- T_H/M/L_TH — соответственно высшая, средняя, низшая границы температуры;
- INT_EN — включение/выключение соответствующего прерывания;
- INT_CFG — выход соответствующего прерывания на INT0 или INT1 пин;
- PA_MODE — 0 — событие касающееся давления, 1 — высоты;
- INT_SRC — флаги, которые показывают состояние прерываний (только для чтения), где:
- PA_RDY — давление или высота готовы для считывания;
- T_RDY — температура готова для считывания;
- PA_TRAV — давление или высота прошли среднюю границу;
- T_TRAV — температура прошла среднюю границу;
- PA_WIN — давление или высота вышли за порог указанного окна;
- T_WIN — температура вышла за порог указанного окна;
- INT_DIR — детали порогового события:
- T/P_WIN_DIR — 0 температура (давление) ниже, 1 — выше указанного окна;
- T/P_TRAV_DIR — 0 температура (давление) пересекли средний порог сверху-вниз, 1 — снизу-вверх;
- PARA — регистр в котором лишь один бит CMPS_EN отвечающий за формат: 0 — сырые данные, 1 — компенсированные (человеческие);
Глядя на эти регистры, можно сделать вывод что эти датчики просто созданы для квадрокоптеров. Действительно, можно задать порог высоты, выше/ниже которого аппарат подниматься не будет, давления, ниже которого подъемной силы будет не хватать, температуры при которой может случиться обледенение. Не нужно задумываться что из этого всего сработает раньше.
4. Протокол I2C
Протокол общения — стандартный I2C и прост как дважды два. Всего имеется 4 типа команд на все случаи жизни. Рассмотрим их:
- тип 1:
Используется для отсылки команды устройству. Например старт конвертирования температуры. - тип 2:
Используется для записи внутреннего регистра девайса, например для записи оффсета высоты. - тип 3:
Используется для чтения регистра из девайса. Например для чтения регистра флагов состояния. - тип 4:
Используется для чтения 3-х или 6-ти байт подряд. Используется для чтения значения температуры (3 байта) или давления и высоты (6 байт).
Ну и пояснения, которые и без того, думаю, понятны:
5. Тесты и результаты
Тесты проводились очень просто. Раз в секунду, данные считывались с датчиков и по UART передавались в PC. На PC, в Матлабе, запущен m-файл, который просто выводит значение температуры/давления/высоты для каждого из датчиков в виде графиков, с привязкой ко времени. Датчики HP203B и HP206С конвертировали давление с максимальной точностью (OSR = 4096), ровно как и BMP085 (oss = 3).
Одинокий HP203B лежащий в комнате на столе. Пояснения прямо на графике.
Самое интересное что за время пока я спал, с 2 до 7 температура изменилась лишь на 0.15 °С. Стоит только сесть рядом с ним, излучение от тела сразу дает о себе знать. Мелкие пики на верхнем графике как раз с эти и связаны (уходил/приходил).
Запускаем два датчика HP203B и HP206C. Оба лежат рядом в одних и тех же условиях:
В глаза сразу бросается уровень шума, который у HP206C заметно меньше. А вот разница в показаниях для особых ценителей розового:
Подключаем BMP085:
Выносим HP206C за окно, два других находятся на подоконнике. Окно закрыто.
Колебания температуры у HP206C связаны с солнцем, которое во второй половине дня достигает моего окна, и деревьями. Дальше просто пару графиков с нормальным поведением:
А теперь ненормальное поведение.
Увеличенный фрагмент одинокого HP203B. Медианный фильтр или Калмана не помешает.
Что произошло с HP206C в 6 утра для меня остается загадкой. Тут вновь что-то с HP206C:
Здесь вообще черт-возьми что:
Тут похожее поведение:
Опять странное поведение:
А теперь про интересное:
Резкий скачок температуры и давления связан с прохождением атмосферного фронта. Для обывателя это резкое поднятие ветра и дождь с грозой. А вот увеличенный фрагмент, где параметры среды менялись мало. Для сравнения шумов:
Видно что меньше всего он у HP206C, BMP085 идет практически в ногу, хуже всего у HP203B. Ну и последний тест. В нем я просто поднимал-опускал все это дело в пределах комнаты. Высоты: кровать-потолок-пол-потолок-кровать. Из-за меньшего собственного шума HP206C картина просматривается лучше. Забавны также перепады температур. Вверху действительно теплее:
На всех графиках, за исключением ненормального поведения, заметна корреляция между всеми 3-мя датчиками. Разница в показаниях составляет приблизительно 1.5 гПа, максимум 2 гПа, что укладывается в заявленную абсолютную погрешность каждого. Трудно сказать чьи показания наиболее правдивы. Для этого необходимо иметь эталонный ртутный барометр. Каждый может оценить дисперсию или собственные шумы каждого из датчиков, которые также коррелируют с заявленными показателями. Что касается странного поведения, они всегда касались только HP206C и возможной причиной тому было только то что он находился снаружи. Но чтобы это проверить, нужно поменять датчики местами и провести измерения. Этого я не делал.
6. Драйвер
Так как целевым устройством был ARM с Cortex-M3 ядром, проект писался с использованием CMSIS и драйверов. Впрочем, такие же драйвера шины I2C я встречал не только для NXP, но и для STM32, что дает возможность утверждать что они существуют на все ядра Cortex-M* для каждого семейства процессоров. Ниже даны ссылки на GitHub, где выложены библиотеки на C для рассмотренных датчиков. *.h файл для каждого одинаков. Различия лишь в *.c файлах и связанны они с аппаратной возможностью изменения адреса устройства на I2C шине в HP203B. Код максимально комментирован. В каждом *.c файле вы найдете функции:
- write1byte — послать 1 байт (тип 1);
- write2byte — послать 2 байта (тип 2);
- read1byte — считать 1 байт (тип 3);
- read3byte — считать 3 байта (тип 4);
- read6byte — считать 6 байт (тип 4);
Эти функции аппаратно-зависимы. Если вы используете другое ядро или драйвер I2C, Вам достаточно организовать эти функции как угодно по-своему, лишь бы они выполняли свою задачу (отрабатывали I2C посылку) согласно типу и протоколу передачи. Следующая функция инициализирует структуру, которая полностью определяет I2C посылку:
/************************************************************
* Configure I2C transfer structure for HP203B
* - this structure define the I2C transfer
* - this function exist because we are using certain I2C driver
***********************************************************/
static void HP203B_TrasferCfgInit(void) {
if(CSB_GPIO->FIOPIN & (1<<CSB_PIN))
TransferCfg.sl_addr7bit = 0x76; // Slave address of HP203B if CSB high
else
TransferCfg.sl_addr7bit = 0x77; // Slave address of HP203B if CSB low
TransferCfg.tx_data = I2CMasterBuffer; // Pointer to transmit buffer
// TransferCfg.tx_length = 0; // Number of bytes for write
TransferCfg.tx_count = 0; // Counter for writing bytes
TransferCfg.rx_data = I2CSlaveBuffer; // Pointer to receive buffer
// TransferCfg.rx_length = 0; // Number of bytes for read
TransferCfg.rx_count = 0; // Counter of reading bytes
TransferCfg.retransmissions_max = 5; // Number of attempts
TransferCfg.retransmissions_count = 0; // Counter of retransmissions
TransferCfg.status = 0xF8; // Current status of I2C bus
TransferCfg.callback = NULL; // Pointer to function that's executes after I2C transfer (NULL if none)
}
Главным в ней является адрес устройства на шине и количество переданных/принятых байт. Это количество мы определяем в выше-описанных функциях. Для датчика HP203B есть возможность выбрать 2 адреса: 0x76 или 0x77. Для HP206С он всегда равен 0x76, как и для BMP085, впрочем. Далее в функции HP203B_Init мы определяем уровень на ножке CSB и уже в зависимости от нашего выбора адрес вписывается автоматически.
7. Выводы
Рассмотренные датчики давления очень не плохи и найдут свою нишу в применении. Так HP206C водо- и пылезащищеный, что позволяет открыто использовать его в погодных станциях, например. HP203B имеет больший динамический диапазон и меньшие размеры, что позволяет встраивать его в мобильные устройства в качестве альтиметра для альпинистов, например. Оба датчика просто идеальны для квадрокоптеров, так как имеют аппаратные прерывания по выходу за пределы настраиваемых окон высоты, давления и температуры. Приятной особенностью является человеческий вид выходных данных, что не требует дополнительных процессорных затрат. Заявленных 10 см перепада зарегистрировать вряд ли удастся, разве что пройтись скользящим средним по достаточному количеству полученных значений. Отдельно стоит рассказать о технической поддержке. На сайте выложены коды по работе с этими датчиками для PICа, по всей видимости, да еще и с ассемблерными вставками, что напрочь отбивает желание разбираться в них. Даташит также очень сырой. Я даже не нашел в каком виде выходят данные для давления. Интуитивно было понятно что в mbar или гПа по нашему, но в документации об этом ни слова. Также нет информации о том как обрабатывать данные в сыром виде. Думаю что продукт будут развивать, а вместе с ним улучшать и качество документации. Но не смотря на это датчики мне очень понравились, возможно моя следующая погодная станция будет с их использованием.
Автор: viktorpanasiuk