MPL115A2 представляет собой миниатюрный цифровой барометрический датчик давления с интерфейсом I2С. Сразу отмечу, что помимо MPL115A2 существует аналогичный датчик MPL115A1, который отличается только способом управления – для него используется интерфейс SPI, во всём остальном оба датчика абсолютно идентичны. Мы будем рассматривать вариант датчика с управлением по шине I2C - MPL115A2. Заказать этот датчик можно на сайте производителя компании Freescale в виде бесплатного образца (сэмпла).
Основные характеристики MPL115A2:
Диапазон измерения давления – от 50 кПа до 115 кПа
Диапазон измерения температуры – от -40 ºС до 105 ºС
Точность измерения давления (-20 ºС – 85 ºС) – ±1 кПа
Время преобразования давления и температуры – не более 1 мс
Напряжение питания – от 2.375В до 5.5В
Средний ток потребления – до 6 мкА
Максимальная частота работы I2C – 400 кГц
Размеры – 5.0х3.0х1.2 мм
Корпус – LGA8
Датчик давления выполнен в корпусе LGA8, который имеет выводы в качестве площадок, расположенных снизу. Поэтому для экспериментов с датчиком имеет смысл разместить его на небольшой переходной плате (рис. 1).
Рис. 1
Распиновка выводов датчика показана в таблице на рис.2:
Рис. 2
Схема подключения датчика к микроконтроллеру показана на рис. 3.
Рис. 3
Из внешних элементов необходимо добавить конденсатор на 1 мкФ, подключенный ко второму выводу датчика и подтягивающие резисторы 4,7 кОм для работы шины I2C. Для экспериментов была собрана тестовая схема с микроконтроллером 16F628А и жки-индикатором WH0802 (рис. 4). К показанным на индикаторе значениям мы вернемся немного ниже.
Рис. 4
Адрес датчика MPL115A2 (адрес устройства) по спецификации I2C имеет значение 1100000Х. Последний бит равен 0 в режиме записи, и 1 в режиме чтения. В даташите указан 7-битный адрес (без учета последнего бита) в связи с чем, зачастую возникает путаница, какой же реальный адрес -0х60 или 0хС0? Я обычно считаю адресом устройства, работающего по шине I2C, 8-битный адрес в режиме записи – т.е. в нашем случае - 0хС0.
Датчик MPL115A2 имеет довольно сложный алгоритм вычисления атмосферного давления. Для того, что бы получить конечное значение давления, необходимо считать с датчика восемь параметров – необработанные значения давления и температуры, а так же шесть калибровочных коэффициентов. Необработанные значения давления и температуры являются переменными величинами, а калибровочные коэффициенты являются постоянной величиной, но разной для конкретного экземпляра датчика. Адреса, по которым считываются эти параметры, приведены в таблице на рис. 5
Рис. 5
В даташите рекомендуется отдельно считывать значение давления и температуры, а затем калибровочных коэффициентов. Я же читал значения из датчика одним блоком, сделав две задержки 5 мс после считывания давления и температуры.
Может сразу возникнуть вопрос – так этим датчиком можно измерять и температуру? На самом деле здесь температура служит одним из параметров для расчета давления. Значение температуры является некалиброванным, и использовать этот датчик в качестве датчика температуры очень нежелательно.
Итак, для расчёта компенсированного (обработанного значения) давления необходимо выполнить преобразование:
Хочу сразу сказать, что все вычисления пока мы будем рассматривать с точки зрения обычной математики, а не в контексте вычислений микроконтроллером. Т.е. будем использовать и дробные, и отрицательные числа (при проведения вычислений микроконтроллером отрицательные числа представляют в виде положительных в так называемом дополнительном коде).
Значения Padc и Tadc представляют собой 10-битные числа, которые сохранятся в двух регистрах. Старшие 8 бит хранятся в старшем регистре (МSB), а младшие два - в 2-х старших битах младшего регистра (LSB). На рис.1 в верхней строке индикатора показаны считанные и преобразованные в десятичный вид значения необработанного давления (361) и необработанные значения температуры (502)
Если со значениями Padc и Tadc всё понятно, то с компенсационными коэффициентами далеко не все так просто. Дело в том, что эти коэффициенты представляют собой числа с дробной частью и, кроме того, могут иметь отрицательное значение. Формат значений компенсационных коэффициентов приведен в таблице на рис. 6
Рис. 6
Для примера рассмотрим коэффициент а0, который является 16-ти битным числом и в десятичной системе имеет значение 15614 (рис.1). Но это не значение самого коэффициента! Его необходимо разложить в соответствии с алгоритмом даташита по таблице на рис. 6. Для этого представим это число в бинарном (двоичном) виде:
11110011111110
т.к. значение этого коэффициента должно быть 16-битным (см. рис.6), то дописываем впереди два нуля:
0011110011111110
Согласно таблице на рис.6 старший разряд этого числа Sing Bits является знаком (0-положительное значение, 1 - отрицательное). Следующие 12 бит являются значениями целой части (Integer Bits), а последние 3 бита – значениями дробной части числа (Fractional Bits).
0(+) — 011110011111(1951) — 110(6)
В итоге получаем реальное значение коэффициента а0 в десятичной системе: +1951,6
Следующий коэффициент (b1) для нашего датчика равен 47011. Представляем его в двоичном виде:
1011011110100011
Старший бит равен 1, следовательно, коэффициент b1 имеет отрицательное значение и представлен в дополнительном коде. Т.к. мы говорили, что будем оперировать и отрицательными числами, то преобразуем это число из дополнительного в прямой код. Для этого оставшиеся 15 бит необходимо инвертировать и добавить единицу к младшему биту:
(1)100100001011101
Согласно таблице на рис.6 коэффициент b1имеет 2 бита целого числа и 13 бит дробного:
1(-) — 10(2) — 0100001011101(2141)
Получили реальное значение коэффициента b1 в десятичной системе: -2,2141
Аналогично преобразовав коэффициент b2, который в «сыром» виде имеет десятичное значение 49045, получим его реальное значение -1,107. Кому интересно, может выполнить данное преобразование самостоятельно на основе выше приведенных примеров.
А дальше начинается самое интересное. Следующий коэффициент с12 имеет в отличие от предыдущих размерность не 16, а 14 бит. Кроме того, в таблице на рис.6 у этого коэффициента появляется такой параметр, как «dec pt zero pad» - количество нулей после запятой, в нашем случае - 9. Следовательно, коэффициент с12 в двоичном виде имеет вид:
Coef c12 = (S) — 0,000000000xxxxxxxxxxxxx
«Сырой» результат коэффициента с12, считанный с датчика, у меня получился 3115 (00110000101011). Поставляем это значение вместо (S) и xxxxxxxxxxxxx.
Coef c12 = 0(+) — 0,000000000—0110000101011 .
Преобразовываем полученный результат в десятичную систему. Получаем:
Согласно документации, датчик измеряет давление от 50 до 115 кПа и полученное значение Pcomp необходимо привести к величине в кПа. Т.к. значение Pcomp является 10-битным числом, можно выполнить следующее преобразование:
Как уже упоминалось, датчик давления MPL115A2 измеряет и температуру окружающей среды. Несмотря на то, что данные показания являются некалиброванным значением, но, тем не менее, приведём формулу расчёта и температуры. В соответствии с документацией на датчик, температура 25 ºС соответствует 472 отсчетам АЦП. Каждому градусу соответствует -5.35 отсчетов АЦП. В результате получаем формулу:
Исходники программы вычисления давления микроконтроллером на языке Си, а так же методику последовательного вычисления (Multiply Accumulates), использующего целочисленную математику, можно найти в Application Note 3785. Кроме того, для датчика MPL115A2 производителем разработаны ещё два «апноута» – AN3956 и AN3914. Первый подробно описывает работу с демонстрационной платой Demo Apex Sensor, во втором размещена подробная информация, как использовать датчик в качестве альтиметра (высотомера). Всю эту документацию, вы можете скачать по следующим ссылкам: