Цифровой измеритель абсолютного давления (барометр) MPL115A2

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

MPL115A2

Прочитав статьюПришли семплы от Freescale решил и я заказать себе сэмплы датчика абсолютного (барометрического) давления MPL115A. Ниже рассмотрим подробнее характеристики, особенности и пример работы с датчиком MPL115A2. Данный датчик имеет интерфейс I2C. Впрочем, почти все нижесказанное действительно и для MPL115A1 с интерфейсом SPI.




Основные характеристики

  • Цифровое представление абсолютного давления и температуры
  • Заводская калибровка (необходимо отметить, что калибровано только значение давления, значение температуры в этом датчике не калибровано!)
  • Диапазон измерения давления – от 50 кПа до 115кПа абсолютного давления
  • Диапазон измерения температуры – от -40 ºС до 105 ºС
  • Точность измерения давления (-20 ºС – 85 ºС) – ±1 кПа
  • Время преобразования давления и температуры (Both Convert) – не более 1 мс
  • Напряжение питания – от 2.375В до 5.5В
  • Интерфейс — I2C (MPL115A2) или SPI (MPL115A1)
  • Средний ток потребления (при одном измерении в секунду) – 6 мкА максимум
  • Максимальная частота работы I2C – 400 кГц
  • Размеры – 5.0х3.0х1.2 мм
  • Корпус – LGA8

Расположение выводов

Расположение выводов
MPL115A2 - расположение выводов

Размеры датчика довольно малы, но, при большом желании, можно подпаяться к нему и тонкими проволочками. И все же лучше изготовить печатную плату, но в этом случае без фена уже не обойтись, сбоку выводы практически не видны. Хотя можно просто установить все элементы на паяльную пасту и нагреть всю плату, например, в духовке. Короче говоря, припаять микросхему сложно, но все-таки можно.





Структурная схема
Структурная схема

Встроенный АЦП производит преобразование температуры и выходного напряжения MEMS сенсора давления в цифровую форму. Полученные значения совместно с калибровочными коэффициентами из внутренней ROM могут быть считаны по I2C или SPI шине. Используя полученные необработанные данные, микроконтроллер может рассчитать по компенсационному алгоритму значение абсолютного давления с точностью 1 кПа.
Из схемы видно, что для работы микросхемы требуется наличие внешнего конденсатора, емкостью 1 мкФ. В остальном подключение микросхемы является стандартным для I2C шины плюс еще возможно задействовать два дополнительных управляющих входа:

  • SHDN – shutdown (sleep), при подключении к логическому «0» переводит микросхему в режим пониженного потребления (максимум 1 мкА), все коммуникационные выводы (RST/CS, SCL/SCLK, SDA/DOUT, NC/DIN) переводятся в состояние высокого импеданса;
  • RST – reset, при подключении к логическому «0» запрещается работа I2C интерфейса, SCL и SDA переводятся в состояние высокого импеданса, остальные узлы микросхемы остаются работоспособными.

Схема подключения

Для проведения экспериментов была изготовлена вот такая небольшая платка:
Схема подключения
Выводы SHDN и RST «подтянуты» к питанию через резисторы R7, R8, установлен требуемый для работы датчика конденсатор C3, номиналом 1 мкФ, а также блокировочный конденсатор C2.

«Общение» с датчиком

Если с физическим подключением микросхемы к микроконтроллеру особых проблем не возникло, то программная обработка вызвала некоторые затруднения.
MPL115A2 поддерживает I2C шину с максимальной скоростью 400 кбит/с (Fast mode). 7 битный I2C адрес, заявленный в Datasheet и Application note №3785 — 0х60. На самом деле датчик упорно молчал при обращении по данному адресу. На каком-то из зарубежных сайтов удалось выяснить реальный адрес датчика — 0xC0. На этом «особенности» Datasheet не закончились.
Краткий алгоритм «общения» с датчиком:

  1. Чтение калибровочных коэффициентов, запоминание коэффициентов в памяти микроконтроллера;
  2. Запуск преобразования;
  3. Чтение полученных необработанных данных. В Datasheet указано, что максимальное время одновременного преобразования давления и температуры (Both Convert) — 1 мс, однако в Application note №3785 говорится, что типичное время ожидания данных – 3мс, причем для каждого из измерений, следовательно, разумнее подождать не менее 5 мс, тем более что это не так уж и много;
  4. Расчет компенсированного абсолютного давления, используя полученные необработанные данные о давлении и температуре;
  5. Перевод полученного значения давления в общеизвестные единицы измерения.
MPL115A2 поддерживает следующий набор команд:

  1. Start Pressure Conversion – запуск преобразования давления;
  2. Start Temperature Conversion – запуск преобразования температуры;
  3. Start both Conversions – запуск преобразования давления и температуры;
  4. Read Pressure Hi byte – чтение Hi (старшего) байта значения давления;
  5. Read Pressure Lo byte – чтение Lo (младшего) байта значения давления;
  6. Read Temperature Hi byte — чтение Hi (старшего) байта значения температуры;
  7. Read Temperature Lo byte — чтение Lo (младшего) байта значения температуры;
  8. Read Coefficient data byte 1 – чтение первого байта компенсационных коэффициентов

Так как для расчета (рассмотрим позже) скомпенсированного давления необходимо и значение температуры, то не совсем понятно, зачем существуют отдельные команды для запуска преобразования давления и температуры, для работы достаточно одной команды — Start both Conversions, т.е. запуск преобразования давления и температуры.
Чтение калибровочных коэффициентов не имеет каких-либо особенностей, необходимо просто прочитать их как из обычной I2C памяти. А вот для запуска преобразования недостаточно просто записать в датчик команду запуска, необходимо после команды записать еще любой байт и только после этого выполнить последовательность [Stop]. Причем про это абсолютно ничего не сказано в Datasheet, в Application note №3785 также нет упоминания в тексте, но в примере работы после команды запуска преобразования в датчик записывают еще и байт 0х01. На официальном форуме Freescale, представитель Freescale сообщил, что это известная проблема и действительно решается записью любого дополнительного байта после записи команды начала преобразования.
Чтение необработанных данных о давлении и температуре особенностей не представляет.

Расчет компенсированного абсолютного давления

Расчет компенсированного абсолютного давления производится с использованием полинома второй степени, в котором переменными являются измеренные значения давления и температуры:

Pcomp = a0 + (b1 + c11*Padc + c12*Tadc) * Padc + (b2 + c22*Tadc) * Tadc,

Где,
Pcomp – компенсированное абсолютное давление;
Padc – 10-битное, необработанное значение давления;
Tadc – 10-битное, необработанное значение температуры;
a0, b1, c11, c12, b2, c22 – компенсационные коэффициенты.

К сожалению, компенсационные коэффициенты представляют собой знаковые числа с дробной частью, поэтому для вычисления компенсированного абсолютного давления, вообще говоря, необходимо использовать арифметику с плавающей точкой. Однако, применяя методику, приведенную в Application note №3785, возможно провести вычисления, используя целочисленную арифметику. Суть методики состоит в последовательном вычислении, так называемых Multiply Accumulates (MACs) y = a + b*x:
MAC
Т. е. выражение для вычисления Pcomp разбивается на следующую последовательность вычислений:
c11x1 = c11 * Padc
a11 = b1 + c11x1
c12x2 = c12 * Tadc
a1 = a11 + c12x2
c22x2 = c22 * Tadc
a2 = b2 + c22x2
a1x1 = a1 * Padc
y1 = a0 + a1x1
a2x2 = a2 * Tadc
Pcomp = y1 + a2x2

Таким образом, получаем окончательный алгоритм вычисления Pcomp:
Full MAC
Непосредственное вычисление компенсированного давления довольно сложная процедура с многочисленными сдвигами, сложениями, умножениями. Желающие могут попробовать вникнуть в каждое из действий. Мы же отметим только наиболее важные моменты. В Application note №3785 при расчетах используется сдвиг вправо на определенное количество бит. Всё бы хорошо, да вот только для отрицательных чисел (а некоторые коэффициенты имеют отрицательный знак) в стандарте языка C не определено как должен производиться этот сдвиг – с учетом знака или без. Поэтому эта операция является зависимой от компилятора. Так, например, компилятор C18 для микроконтроллеров PIC производит этот сдвиг без учета знака, т.е. сдвигает число так как если бы оно было положительным — «the value is shifted as if it were an unsigned integral type of the same size (i.e., the sign bit is not propagated)». Таким образом, для исключения зависимости от компилятора, сдвиг вправо целесообразно заменить операцией деления на соответствующий коэффициент. Например, операцию lt3>>14 заменить операцией lt3/((int32_t)16384).

Расчет давления в кПа и миллиметрах ртутного столба

После проведения расчета компенсированного абсолютного давления необходимо преобразовать его в общеизвестные единицы измерения. Так как полученное значение является 10-битным, то мы будем получать от датчика значения в пределах от 0 до 1023. В спецификации датчика говорится, что датчик измеряет значения давления в диапазоне от 50 кПа до 115 кПа, поэтому получаем:

PкПа = ((115-50)/1023)* Pcomp + 50 = 65* Pcomp /1023 + 50

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

PкПа = (65*65636*100/1023)*Pcomp + 50*65636*100 = 416406*Pcomp + 327680000

Умножение на 65636 избавляет нас от операции деления, обратно делить не будет необходимости – можно будет просто отбросить два младших байта. К сожалению, это приведет к округлению полученного результата не по правилам математики, но, в данном случае, это не существенно. Умножение на 100 избавит нас от дробного числа, необходимо будет только поставить запятую в третьем знаке с конца полученной строки. Естественно эти преобразования вносят какую-то погрешность в конечный результат, но, учитывая точность самого датчика, данной погрешностью можно пренебречь.
В результате получим 16-битное целое число. Преобразование этого числа в текстовую строку можно осуществить различными способами. Применим для этого функцию itoa. В компиляторе C18 она выполнена на ассемблере, поэтому является довольно оптимальной по размеру кода и скорости выполнения.
Давление в кПа и миллиметрах ртутного столба связаны соотношением:

PммРтСт = PкПа* 7,50062.

Применив подобные описанным преобразования получим:

PммРтСт = (65*65636*7,50062/1023)*Pcomp + 50*65636*7,50062 = 31233*siPcomp+24578031

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

Расчет температуры

В документации на датчик сказано, что 25 ºС соответствует 472 отсчета АЦП. Каждому градусу соответствует "-5.35" отсчетов АЦП. Отсюда получаем формулу для расчета температуры:

T = 25 + ((Tadc — 472.0) / -5.35)

Однако, как уже было сказано, значение температуры в данном датчике является не калиброванным – это официальный ответ от Freescale. Да и сам датчик позиционируется как барометр, а не как измеритель давления и температуры, поэтому, если есть необходимость в точном значении температуры, то необходимо заменить датчик на более совершенный или же применить отдельный датчик температуры. Можно, конечно, попробовать откалибровать датчик, изменяя значение начального отсчета для 25 ºС, но никакой гарантии в линейности датчика никто не дает, да и количество отсчетов на градус Цельсия не гарантируется.

Результаты

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

Формула для расчета температуры немного подкорректирована. Исследования на линейность датчика температуры не проводились из-за отсутствия необходимости.
Необходимые для работы с датчиком файлы приведены в приложении. Программа написана на языке C и оптимизирована для компилятора C18 для микроконтроллеров PIC18.

Update
Оптимизирована по размеру кода процедура расчета температуры. Расчет теперь ведется в 32-битной арифметике, а не в 24-битной. Это приводит к повторному использованию процедур умножения, деления и вычитания, что, в свою очередь, уменьшает объем кода более, чем на 100 байт.
Добавлен заголовочный файл «stdint.h», который отсутствует в компиляторе С18.

Update 1
Добавлена реализация общения с датчиком от MS2401 для codevisionavr. Краткое описание можно найти в комментариях к статье.
  • +4
  • 14 декабря 2011, 14:24
  • kvm
  • 2
Файлы в топике: MPL115A2.zip, MPL115A1_atmega8.zip

Комментарии (80)

RSS свернуть / развернуть
Спасибо ;) Вы избавили меня от многих головных болей )))

P.S. А что за плата, на которой эксперементировали? что за PIC стоит?
0
Покажите плату)
0
К сожалению, сейчас у меня нет фотографии платы в полностью собранном виде. Есть только «рабочий» вариант: Макетная плата. PIC, часы и преобразователь 3.3В установлены с обратной стороны. Плату разрабатывал, что называется, «под себя» для изготовления по ЛУТ технологии. На момент сборки у меня еще не было программатора, поэтому изначально был задуман и реализован USB bootloader. Первоначальную прошивку сделал с использованием простейшего программатора — немного доработанного ART2003 (добавил к нему источник +12В). Без 12В микроконтроллер отказывался прошиваться.
0
Пожалуйста!

Плата самодельная, микроконтроллер PIC18F4550.
0
Как вы, наверное, заметили, у I2C адрес устройства семибитный, но передаётся в старших семи битах байта. Вот и получается 0xC0 = 0х60 << 1.
0
Да, я понял это уже после написания статьи. Но все-таки для меня привычней записывать сразу «настоящий» адрес 0xC0, к которому затем уже добавлять бит R/W. Может быть это просто из-за недостатка опыта работы с I2C или привычка такая.
0
Может кто еще статью напишет о том как прикрутить этот сенсор к STM32F4?
0
Да и вот вопрос, коэффиценты для вычислений считываются с самого сенсора?
p.s. статья понравилась 8)
0
Да, считываются с сенсора. Т.е. порядок работы с ним такой:

int8_t ASCII_Str[10];
int8_t ASCII_Str1[9];
uint16_t Padc;
uint16_t Tadc;

I2C_Init();
    MPL115A2_Init();
    MPL115A2_MeasurementStart();
    delay(5);
    MPL115A2_MeasureDataRead(&Padc, &Tadc);
    MPL115A2_CalcPressure(Padc, Tadc, ASCII_Str, ASCII_Str1);
I2C_Stop();

После этого в ASCII_Str и ASCII_Str1 у Вас будут строки со значением давления в кПа и мм Рт ст.
0
Для вычисления давления обязательно нужно значение температуры? Зачем?
0
  • avatar
  • Bonio
  • 15 декабря 2011, 10:34
Обязательно нужно, так как MEMS сенсор давления выдает значения, зависящие от температуры самого сенсора. Посмотрите на расчетную формула:
Pcomp = a0 + (b1 + c11*Padc + c12*Tadc) * Padc + (b2 + c22*Tadc) * Tadc

Tadc — это, фактически, температура сенсора давления
0
Поместив такую игрушку с платкой и обвесом в корпус со штуцером, можно получить аналог дорогостоящих датчиков.
0
  • avatar
  • DVF
  • 21 декабря 2011, 16:11
херовенький аналог выйдет… относительная погрешность +-15%, барометрическое давление нужно мерять редко, измерять может только чистые газы, врятли есть защита от резких скачков давления. Плюс погрешности при пересчете, плюс индивидуальная калибровка по температуре. Для домашних извращений — пойдет, но для промышленных применений — очень врятли.
это как предостережение от безсмысленной работы)
0
Высоту им можно измерять? Похоже получается +/- 5 метров в лучшем случае, или я ошибаюсь?
0
В стандартной атмосфере (15 град.С, 760 мм.рт.ст.) у Земли перепад в 1 мм.рт.ст. примерно соответствует 11 метрам высоты.
0
Есть апноут от Freescale AN3914 «Modern Altimeter and Barometer System
using the MPL115A». Там есть таблица высот, также сказано про точность измерения. Плюс ко всему описан алгоритм «Weather Station»
В английском не могучь, поэтому уточняйте про точность измерения сами :)))
0
В русском, похоже тоже не очень «могучь». :) Я выше уже написал про барометрическую ступень.

Высота, на которую надо подняться или опуститься, чтобы давление изменилось на 1 гПа (гектопаскаль), называется барической (барометрической) ступенью. У земной поверхности при давлении 1000 гПа и температуре 0 °С она равна 8 м/гПа.

Взято отсюда ru.wikipedia.org/wiki/Атмосферное_давление
Там же есть ссылка «Зависимость давления от высоты описывается т. н. барометрической формулой»
0
Если Вы будете чуть менее высокомерны, возможно заметите, что я ответил не на Ваш коментарий
Ктому же, в апноуте описана особенности измерения ДАННЫМ датчиком, а не об измерении высоты/давления вообще.
0
Всем спасибо :) нашел более точный (+/- 0.25 м) барометр BMP085 для измерения высоты.
0
непременно ждем статьи от Вас по данному девайсу :)))
0
В даташите пишут, что на датчик плохо влияет прямой солнечный свет

The sensor die is sensitive to light exposure. Direct light exposure through the port hole can lead to varied accuracy of pressure
measurement. Avoid such exposure to the port during normal operation.
0
А никто сабжем по SPI не общался?

Что-то похожее на калибровочные коэффициенты у меня читается:
Выбран ведомый №1
Передано 0x88; Получено 0x00
Передано 0x00; Получено 0x3F
Передано 0x8A; Получено 0x00
Передано 0x00; Получено 0x43
Передано 0x8C; Получено 0x00
Передано 0x00; Получено 0xB3
Передано 0x8E; Получено 0x00
Передано 0x00; Получено 0xFE
Передано 0x90; Получено 0x00
Передано 0x00; Получено 0xC0
Передано 0x92; Получено 0x00
Передано 0x00; Получено 0x6A
Передано 0x94; Получено 0x00
Передано 0x00; Получено 0x35
Передано 0x96; Получено 0x00
Передано 0x00; Получено 0x3C
Ведомый отключен

А вот при попытке провести измерение и прочитать результат, следуя схеме из ДШ — фейл:
Выбран ведомый №1
Передано 0x24; Получено 0x00
Передано 0x00; Получено 0x00
Ведомый отключен
Пауза 10ms
Выбран ведомый №1
Передано 0x80; Получено 0x00
Передано 0x00; Получено 0x00
Передано 0x82; Получено 0x00
Передано 0x00; Получено 0x00
Передано 0x84; Получено 0x00
Передано 0x00; Получено 0x00
Передано 0x86; Получено 0x00
Передано 0x00; Получено 0x00
Передано 0x00; Получено 0x00
Ведомый отключен

Хотя если сделать вот так:
(CS держится на земле все время работы)
Выбран ведомый №1
Передано 0x24; Получено 0x00
Передано 0x00; Получено 0x00
Пауза 10ms
Передано 0x80; Получено 0x00
Передано 0x00; Получено 0x52
Передано 0x82; Получено 0x00
Передано 0x00; Получено 0x40
Передано 0x84; Получено 0x00
Передано 0x00; Получено 0x85
Передано 0x86; Получено 0x00
Передано 0x00; Получено 0x80
Передано 0x00; Получено 0x00
Ведомый отключен

Получаем что-то похожее на правду.
У всех так?
0
Оказывается если оставить вывод SHDN болтаться в воздухе, то барометр пошлет вас на йух и разговаривать с вами не захочет. Довольно неочевиднй момент.
0
А что в нем неочевидного? Как раз таки наоборот.
Вообще, висящие входы оставлять не рекомендуется. Разве что если у них подтяжки в нужном направлении.
0
Ну вот про подтяжки и речь. Обычно вход типа shutdown, enable или вход задающий адрес снабжен подтяжкой и таки может невозбранно болтаться в воздухе… WAIT… Какой тогда к черту shutdown если через подтяжку будет ток течь?! Логично да. Но в статью не мешало бы добавить про то что вход нельзя оставлять в воздухе
0
Но в статью не мешало бы добавить про то что вход нельзя оставлять в воздухе
Это оно по дефолту так. Вообще лучше любые входы сажать на жесткий уровень )
0
Правильно! Все управляющие входы всегда должны иметь жесткий уровень ибо наводки никто не отменял, поэтому я никогда их не оставляю весящими в воздухе.
0
Докладываю!

Запустил MPL115A1 (это SPI) на STM8L дискавери:


Правда температура врет на десять градусов (меньше), и давление видимо тоже — смотри пикрелейтед.

Процесс отладки занял сотни времени и не обощелся без Вуду. Но что самое страшное — Вуду до сих пор там, в коде то есть.
0
а код «на посмотреть» можно? :)))
0
Если это не срочно, то я пожалуй пока зажму код :)
Его еще надо привести в порядок и выгнать оттуда вуду
0
Тяжелый в освоении датчик, но побежден.
Состав: MPL115A1, PIC24, дисплей Nokia 1660. Осталась маленькая проблема, постоянно
плавают на 1-2 единицы показания. Сами показания довольно точные и по давлению и по температуре.
+1
  • avatar
  • INN
  • 29 февраля 2012, 20:52
красочная платка..))
а в банке что ??) туда вроде провода подходят и трубочка какая-то

p.s. а что именно за pic24? интересно потому, что сам выше pic16 не мучал…
0
PIC24HJ128GP502. Банка — «барокамера» (надо было график проверить), в ней датчик и
выведена трубка, клеем загермитизировано.
0
Ну вот, почти законченное изделие.
Если, кого заинтересует могу поделится прошивкой и печатной платой.
+3
  • avatar
  • INN
  • 06 марта 2012, 20:59
ну почему бы и не выложить Вам статью в личном блоге? :)
0
Действительно! Почему бы не выложить статью с описанием законченного устройства на этом датчике?! Я думаю, многим будет интересно.
0
А какая здесь может быть статья? Датчик описан выше, подключение дисплея отлично описал angel5a в разделе LCD. Я только собрал вместе, немного упростил и перевел на другой контроллер.
0
  • avatar
  • INN
  • 06 марта 2012, 23:27
да хотя бы с той же прошивкой и платой) впрочем, Ваше дело
0
Собрать все вместе это тоже искусство. Чем по сути занимаются программисты встроенных систем, особенно любители? Этим и занимаются — собирают в единую систему разрозненные алгоритмы и приемы работы. А в конечном итоге получают какое-то новое устройство, с новыми функциями и новыми возможностями.
+2
Не знаю как вставить здесь файл, попробую так Барометр Схемы пока нет, все делалось быстро. Нарисую добавлю. Пока прошивки (их две — контроллер и ST25p512 для крупных цифр) и плата.
+1
  • avatar
  • INN
  • 08 марта 2012, 00:24
А с графикой как работали — библиотеки GUI микрочипа юзали или своими силами?
0
Примитивно картинками, крупные цифры в ST25P512, остальные в флеши контроллера. По идеи все должно было поместиться в контроллер, но компилятор после 32кб констант начал ругаться на нехватку памяти. Разбираться не было времени, да и от предыдущего проекта было все готовое. Флешки брал с негодных видеокарт. Схему в архив добавил.
0
А два последние калибровочные коэффициенты (с11, с22) у всех равняются нулю?
0
Вопрос к автору. kvm, не совсем понятно как после выполнения расчета по конечной формуле, например для давления в миллиметрах ртутного столба, PmmHg = 31233 * (uint32_t)siPcomp + 24578031; все это перевести к реальному значению. Вот вы пользуетесь функцией itoa((uint16_t)(PmmHg >> 16), (int8_t *)PressureStrPtrHg);
А если я сделаю только сдвиг PmmHg=PmmHg >> 16; то вот это уже будет правильное значение или еще что-то надо сделать? После сдвига выходит 710, но это как то маловато…
0
После сдвига PmmHg=PmmHg >> 16 в PmmHg Вы, естестсвенно, уже получите значение измеренного давления в миллиметрах ртутного столба. Функция itoa используется только для преобразования целочисленного значения, представленного двумя байтами в PmmHg, в строку символов, соответствующую данному числу для того, чтобы вывести значение давления на индикатор.
Полученное Вами значение 710 мм.рт.ст. действительно «маловато». Проверьте все этапы вычисления — возможно где-то вкралась ошибка. Удобнее всего это делать в пошаговом режиме вотладчике или в программном эмуляторе. Я обычно, в таких случаях, пользуюсь отладчиком в Proteus.
Ну, а некоторые коэффициенты действительно могут равняться нулю, все зависит от конкретного сенсора.
0
Очень нужен такой датчик… Но у меня нет возможности заказать из-за бугра… Кто может помочь?
Заплачу, в разумных пределах… Не коммерческий проект.
0
Не осталось ли у вас таких датчиков случайно? один…
0
kvm, подскажите, а может ли такое быть, что бы все коэффициенты, кроме а0 были равны нулю??? И что ж тогда получается — Pcomp=a0? Или я неправильно понимаю математику этого расчёта?
0
Честно говоря, очень странно, что все коэффициенты равны нулю. Хотя может быть такое возможно. Просто рассчитайте давление и сравните с тем, что, например показывает Яндекс для Вашей местности. Если получится похожее значение, значит все нормально. Хотя, повторюсь, очень странно! MEMS датчик по своей природе не линейный.
И что ж тогда получается — Pcomp=a0? Или я неправильно понимаю математику этого расчёта?
Получается именно так, но я бы не рекомендовал Вам изменять рассчетную формулу, так как при смене датчика (сгорел, например) коэффициенты могут быть не нулевыми.
0
Спасибо, сейчас попробую проверить.
А вообще всё происходит следующим образом — считываю по два байта давления и температуры, затем по 2 байта каждого коэффициента (непрерывно). Преобразовываю эти данные в десятиричное значение и вывожу на дисплей. Получаются следующие результаты:
Давление — 23360
Температура — 33344
а0 — 36863
А вот все остальные пять коэффициентов — 65535 т.е. hFFFF
Думал, что возможно каким-то образом прерывается чтение, попробовал читать с адреса 0х06 вместо 0x04 — сразу считывается 65535. т.е такое вроде бы по логике считывается правильно.
0
Не, что-то похоже я не то делаю, сейчас попробую отдельно выводить старший и младший биты без всяких преобразований.
0
В общем, попробовал считать все байты коэффициентов, в ячеке 0х04 — 0x8F, во всех остальных (0х05-0х10)=0xFF.
Для давления MS_Byte =0x5B
Для температуры MS_Byte =0x80

Кстати, а ведь в младших байтах (LS_Byte)только 2 бита задействовано, может для упрощения расчётов их можно отбросить? Как это повлияет на точность?
0
Вроде бы понял, что у меня ошибка в преобразовании 10 разрядного числа. Я его пытался преобразовывать как 16-ти разрядное, из-за того и такие значения :)
0
В общем, со считыванием/преобразованием разобрался, но итоговый результат не радует. Температура по формуле соотвествует реальной — считанное значение Tadc = 500 (здесь и далее имеется ввиду значение в десятичной системе), что соотвествует температуре 23,5 градуса — по контрольному термометру приблизительно так и есть.
А вот с давлением в итоге ничего не выходит:
Padc = 368
a0 = 572
все остальные коэффициенты = 23
Когда подставляю всё это в итоговую формулу, получается полная хрень.
Видимо, всё из-за этих коэффициентов, очень странно что они после а0 имеют абсолютно одинаковое значение. Что я не так делаю? Я так понимаю, что при чтении коэффициентов нужно указать их первый адрес — 0х04, а далее идёт приращение на один адрес больше — т.е как при чтении обычной памяти по I2C. По даташиту так ведь?
0
Кажется я понял почему у Вас так получается — вы считаете коэфиициенты целыми числами?! Это дробные числа и работать с ними надо так как это сделано в примере!
0
Извините за мою тупость, немного не понял. Допустим, 572 может быть 57,2 или 23=2,3?
0
Я же писал в статье: «К сожалению, компенсационные коэффициенты представляют собой знаковые числа с дробной частью, поэтому для вычисления компенсированного абсолютного давления, вообще говоря, необходимо использовать арифметику с плавающей точкой.»
Почитайте в Datasheet раздел «Coefficient Bit-Width Specs». Например, для коэффициента a0: общее количество бит — 16, знаковый бит, целое значение — 12, дробная часть — 4 бита. Т.е. получим: a0=SI11I10I9I8I7I6I5I4I3I2I1I0.F3F2F1F0! Вообще я немного не понимаю почему Вы не пользуетесь примером программы? Там все отлажено и работает!
0
ОК, спасибо, займусь более плотно изучением даташита.
А почему не пользуюсь готовыми примерами, так на то причина очень простая — я пишу на Ассемблере :)
0
А куда DOUT цеплять???
0
А Можете платку кинуть сюда…
0
Если юзать 2 датчика показания улучшатся?
0
А может проще будет усреднить, например, 8 измерений? Ведь измерения проводятся довольно быстро не более 1мс.
0
Извините за глупый вопрос :).
А как собственно представляются числа
в Datasheet написано b1: 16 бит: 1 знак: 2 целая: 13 дробная
к примеру там же b1 = B3F9 = 1011 0011 1111 1001 = -2.37585 никак не могу понять как получить это число. Как ни плюнь у меня выходит -1.624145508 ('-' (1) в знаке, '1' — (01) целая часть, (1001111111001) — 0.64145508 считал 2^-1 + 2^-4 + 2^-5…
0
Тема жива еще? А никто не может поделится рабочим кодом для AVR?
0
Вон же, к топику архив приаттачен.
0
Ну он для пика вроде бы как. А как я понимаю, следуя алгоритму, нам вообще не нужно работать с десятичными числами? Т.е. значения, которые мы получили с датчика, мы просто подставляем в эти формулы и из них рассчитываем?
0
Да, код был проверен на PIC, но написан по максимуму на классическом C, поэтому практически (ли же вообще) без изменений может быть использован на любом контроллере. Просто откомпилируйте его для своего AVR — всё должно работать. Ну или потребуются минимальные изменения для конкретного компилятора.
0
Посмотрел код, извиняюсь, спокойно переносится на АВР, вот только еще один вопрос, как я понял рассчитать конечное значение давления можно двумя способами:

1)Это перевести коэффициенты в десятичный формат и подставить их в формулу
Pcomp = a0 + (b1 + c12 * Tadc)* Padc + b2 * Tadc

2)Использовать Multiply Accumulates и высчитывать с помощью алгоритма приведенного в коде
c11x1 = c11 * Padc
a11 = b1 + c11x1
c12x2 = c12 * Tadc
a1 = a11 + c12x2
c22x2 = c22 * Tadc
a2 = b2 + c22x2
a1x1 = a1 * Padc
y1 = a0 + a1x1
a2x2 = a2 * Tadc
Pcomp = y1 + a2x2
Скажите пожалуйста, правильно ли я понял?
0
Правильно всё! Только первый метод потребует арифметики с плавающей точкой, а во втором всё вычисляется в целочисленной арифметике, поэтому и код быстрей работает и по размеру меньше.:)
0
Ой спасибо большое!!! Скоро датчики приедут, надеюсь готовым буду к работе с ними! -)
0
Пожалуйста! Удачи! Ждем отчет об успешном запуске!:)
0
А в даташите ничего не указанно об коэффициентах С11 и С22 их откуда брать-то? или это тоже ошибка даташита?
0
Я не читал даташит для MPL115A1, но в даташите на MPL115A2 эти коэффициенты есть (стр. 4):

$0C c11 MS Byte
$0D c11 LS Byte
$0E c22 MS Byte
$0F c22 LS Byte
0
Здравствуйте. Может кому-нибудь пригодится реализация работы MPL115A1 с ATtiny2313.
0
  • avatar
  • akl
  • 08 апреля 2013, 16:28
Еще раз всех приветствую! Вообщем с бубном поплясать пришлось, но в итоге получилось -)
Датчик подключал к atmega8, все как в даташите + повесил блокировочный конденсатор на 0,1 uF. В начале датчик долго и упорно не хотел отвечать на команды, но потом я сделал все как написанно в официальной (как я понял, потому, что я натыкался и на какие-то другие непонятные документы ) документации Your text to link... на странице 9 и начал получать пакеты.
Multiply Accumulates алгоритм мне не очень понравился, так как велика погрешность, поэтому его я не использовал.
Писал на codevisionavr
Для общения с датчиком, объявляем структуру: Pressure_struct, что внутри я думаю сразу ясно будет.
внутри 3 функции:
void MPL115A1_init (Pressure_struct* p_struc) Вызываем ее для инициализации один раз, она принимает нашу структуру, в которую записывает поправочные коэффициенты.
void MPL115A1_get_raw_pressure(Pressure_struct* p_struc) Ее нужно вызывать что бы получить «Сырые» значения температуры и давления.
float MPL115A1_calc_pressure (Pressure_struct* p_struc) Эта функция производит расчет и возвращает нам измеренное давление уже в мм рт. ст.
Не стал объединять все в одну, по сколько в моем устройстве обращение к датчику будет идти в прерывании, и с каждым заходом я их буду по очереди вызывать.

Погрешность датчика оказалось на самом деле достаточно большой, среднее отклонение от нормы около 1% что на самом деле много. На складе лежит еще 50 штук, на днях может быть постараюсь организовать серийное производство, там и посмотрим, все они одинаково врут или мой оказался не таким как все.
0
P.S чето я не понял, а как тут файлы прикреплять?
0
Высылайте мне на kvm@mail.ru, добавлю к статье как альтернативный вариант работы с датчиком.
0
Опробовали на других датчиках — результат одинаков. Т.е погрешность около одного процента(
0
Спасибо за информацию!
0
Теперь пришли MPL115A2, даташит просто ужас, одни несоответствия! Если интересно, могу прислать свой вариант реализации.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.