Датчики давления

Использование датчика давления MPL115A2

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

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

Схема вычислений давления достаточно хорошо описана в англоязычной документации на датчик, например можно использовать Freescale Semiconductor Application Note AN3785, How to Implement the Freescale MPL115ADigital Barometer, by: John Young.

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

Вычисление скомпенсированного давления по формуле:

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

Здесь Pcomp – скомпенсированное давление, Padc – выходной код АЦП по давлению, Tadc – выходной код АЦП по температуре, a0,b1,b2,c12 – калибровочные коэффициенты.

Приведение к диапазону измерений можно сделать по формуле:

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

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

Обмен с MPL115A2 производится по шине I2C. Используются стандартные алгоритмы обмена. Адрес датчика на шине равен 0xC0. Вся работа с MPL115A2 может быть разбита на несколько этапов. На первом этапе производится получение калибровочных коэффициентов, из памяти датчика. Так как эти значения постоянны, то данный этап можно выполнить только один раз после включения питания. Следует только учесть, что все коэффициенты закодированы 16-разрядными двоичными числами (кроме с12, с разрядностью 14). Получение коэффициентов выполняется в виде чтения памяти, начиная с адреса 0x04. Всего следует прочитать 8 байт.

Второй этап - подача команды датчику на проведение измерения. Для этого по адресу 0x12 записывается значение 0х00. Ноль обязательно должен быть передан, иначе измерение не будет выполнено.  Через 5мсек после подачи команды, можно приступать к считыванию кода АЦП. Выполняется это путем чтения 4 байт, начиная с адреса 0x00. Первые два байта – давление, вторые – температура. Разрядность кода АЦП – 10, соответственно младшие 6 разрядов вторых байтов – незначащие.

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

 

Приведение коэффициентов к дробному виду.

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

Коэффициент a0

Двоичное представление коэффициента a0 содержит знаковый бит, 12 бит целой части и 3 бита дробной. Для получения дробного числа, исходное значение следует поделить на 2 в степени количества дробных бит, в данном случае 23=8.

Пример:

a0=3BE616=111011111001102

Старший бит равен 0, соответственно коэффициент положителен. Дробное значение равно: a0f = a0 / 23 = a0 / 8 = 1916.75

Коэффициент b1

Двоичное представление коэффициента b1 содержит знаковый бит, 2 бита целой части и 13 бит дробной.

Пример:

b1=B74516=1011 0111 0100 01012

Старший бит равен 1, соответственно коэффициент отрицателен. Дробное значение равно: b1f = (b1 –6553610) / 213 = ( –1861910) / 819210  =  - 2.273. Операцию определения дополнения в виде вычитания 65536, можно заменить на более привычную not b1 +1. 

Коэффициент b2

Двоичное представление коэффициента b2 содержит знаковый бит, 1 бит целой части и 14 бит дробной.

Пример:

B2=C93016=1100 1001 0011 00002

Старший бит равен 1, соответственно коэффициент отрицателен. Дробное значение равно: b2f = (b2 –6553610) / 214 =  - 0.856. 

Коэффициент c12

Двоичное представление коэффициента c12 содержит знаковый бит и 13 бит дробной части. Младшие два бита не используются. При этом перед значащими битами дробной части имеется еще 9 нулевых битов. Столь сложная форма записи преобразуется также просто, как и в предыдущих случаях. Единственное что коэффициент деления формируется из трех частей. В степени двойки, в данном случае, должна быть сумма нулевых битов, значащих битов и неиспользуемых битов. Итого 9+13+2 =24. 

Пример:

c12=318416=11 0001 1000 01002

Старший бит равен 0, соответственно коэффициент положителен. Дробное значение равно: с12f = с12 / 224 = с12 / 1677721610 =  0.000755. 

 

Вычисление давления.

Вычисление давления далее выполняется по имеющейся формуле.

Пример

Пусть получены коды АЦП:Tadc=838016, Padc=5C8016 (Коэффициенты принимаются равными вышеописанным)

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

TadcR = Tadc / 64 = Tadc >> 6 = 20E16=52610

PadcR = Padc / 64 =  Padc >> 6 = 17216=37010 

Скомпенсированное давление равно:

Pcomp = 1916.75 + (-2.273 + 0.000755 * 526)*370 + (-0.856)*526 = 772.4221 

Давление, приведенное к диапазону измерения:

P= 772.4221*(115-50)/1023 + 50 = 99.078 кПа 

Для удобства его можно перевести в мм ртутного столба:

P[мм.рт.ст]=P *7.5 = 99.078 *7.5 = 743.085 мм рт.ст 

 

Реализация в микроконтроллере.

Производитель MPL115A2 предлагает пример программы (AN3785), позволяющей реализовать вычисления в микроконтроллере, без использования операций с плавающей точкой. При этом потребуется возможность обработки 32 разрядных чисел. В примере не используются операции с плавающей точкой, все необходимые действия сведены к двоичной арифметике. Ниже приведен упрощенный вариант, в котором убраны лишние действия. Примере кода не показаны преобразования коэффициентов, посмотреть которые можно в апноуте.

В примере производятся операции с дробными двоичными числами. Для сложения и вычитания необходимо, чтобы в дробной части обеих операндов, количество бит было равным. Достигается это сдвигом на необходимое количество бит. Обозначение состава операнда выполнено в форме s(n,f). Где n – количество значащих бит со знаком, f – количество бит дробной части, с учетом всех 0 перед значением. Например, операнд a0 имеет знак, 12 бит целой и 3 дробной части, что будет обозначено как s(16,3). Еще пример  с12 - s(16,24).

uiPadc=PressCntdec>>6; //Удаление незначащих нулей.в коде АЦП давления

uiTadc=TempCntdec>>6; //Удаление незначащих нулей в коде АЦП температуры 

//******* Шаг 1 c12x2= c12 * Tadc

lt1 = (S32)sic12;    // Запись коэффициента c12 в 32-разрядную переменную. Результат s(16,24)

lt2 = (S32)uiTadc; // Запись кода АЦП в 32-разрядную переменную. Результат s(10,0)

lt3 = lt1 * lt2;          // Перемножение. Результат s(26,24) 

//******* Шаг 2 a11= b1 + c11x1

lt1 = ((S32)sib1<<11); // Приведение коэффициента b1 к нужной форме. Исходный коэффициент B1=s(16,13). Для сложения необходимо, чтобы дробная часть имела 24 бита. Соответственно сдвиг влево на 11 бит. Результат s(27,24)

lt2 = lt3 + lt1; // Сложение. Результат s(27,24) /b1+c11x1 

//******* Шаг 3 a12=a11*uiPadc

lt1 = ((S32)uiPadc); // Запись кода АЦП по давлению в 32-разрядную переменную. Результат s(10,0)

lt2 = It2>>11); // Приведение результата It2 к нужной форме. Исходное значение s(27,24), что при умножении приведет к переполнению 32-разрядного регистра. Соответственно сдвиг вправо на 11 бит. Результат s(17,13)

a12x = (lt2 * lt1)<<1; // Умножение Результат s(28,14) 

//******* Шаг 4 b12 = b2 * Tadc

lt1 = (S32)sib2;    // Запись коэффициента b2 в 32-разрядную переменную. Результат s(16,14)

lt2 = (S32)uiTadc; // Запись кода АЦП в 32-разрядную переменную. Результат s(10,0)

lt3 = lt1 * lt2;          // Перемножение. Результат s(26,14) 

//******* Шаг 5 Pcomp= a0 + a12x + b2 * Tadc

lt1 = ((S32)si_a11<<11); // Запись коэффициента a0 в 32-разрядную переменную. Результат s(27,14)

It3= (It1 + a12x + It2);  // s(28,14)

Pcomp= (S16)It3 >> 14; // Преобразование кода АЦП в целое число

decPcomp = ((65.0/1023.0)*siPcomp)+50; // Окончательный результат

 Еще по теме:

Практическое использование датчиков атмосферного давления

Цифровой барометр

 

You have no rights to post comments