It is currently Thu Dec 13, 2018 2:45 am

НИЛ АСЭМ Научно - исследовательская лаборатория автоматизированных систем экологического мониторинга

Датчик давления BMP180 (280)

by Admin » Sun Aug 19, 2018 4:55 pm

Датчик атмосферного давления BMP180 (280), высотомер.
Image Image
Внешний вид датчика давления + PCB (GY-68)

BMP180 представляет собой датчик для измерения атмосферного давления и температуры окружающего воздуха. Поскольку между давлением и температурой существует взаимосвязь, то последняя учитывается при расчете давления. Пределы измеряемого давления составляют 300…1100 мбар, или 225…825 мм рт. ст. Датчик существует в виде модуля GY-68 и работает от напряжения 3.3В (!) , на плате предусмотрен стабилизатор напряжения XC6206P332MR4 в корпус SOT-23, который выдает на выходе напряжение в 3.3В, рядом установлена обвязка стабилизатора, состоящая из двух керамических конденсаторов на 1 мкФ. Подключение осуществляется по интерфейсу I2C, линии SCL и SDA выведены на группу контактов на другой стороне модуля, туда же выведено и питание.

BMP180 (Digital pressure sensor):
Image
Типичная схема включения датчика BMP180(280)

Технические характеристики BMP180:
• Питание датчика: (VDD ) 1,8 … 3,6 В постоянного тока.
• Питание шины I2C: (VDDIO) 1,62 … 3,6 В постоянного тока (подводимое к подтягивающим резисторам).
• Питание модуля: 3,3 или 5 В зависит от модуля (см. выше).
• Потребляемый ток: 3 … 32 мкА во время измерений (зависит от режима точности):

650 … 1 мА во время преобразований

0,1 … мкА в режиме ожидания.

• Рабочая температура -40 … 80 °C предельно допустимые значения.
• Рабочее давление 0 … 10 МПа предельно допустимые значения.
• Диапазон измеряемого давления: 300 … 1100 гПа разрешение 0,06 гПа точность ±0,12 гПа (на пределах ±1 гПа).
• Диапазон измеряемой температуры: 0 … 65 °C разрешение 0,1°C точность ±0,5 °C (на пределах ±2 °C ).
• Время преобразований 3 … 51 мс зависит от режима точности.
• Рабочая частота шины I2C … 3,4 МГц.
• Адрес датчика на шине I2C 0x77 HEX id адрес датчика (модуля) для обращения по шине I2C.
• Подготовка к запуску 10 … мс неустойчивое состояние после подачи питания на датчик.

Назначение контактов:
► SCL — линия тактирования (Serial CLock)
► SDA — линия данных (Serial Data)
► VCC — «+» питание
► GND — «-» питание

Принцип действия датчика BMP180:

В датчике имеется герметичная камера1, одна из стенок которой является гибкой мембраной с установленными на ней тензодатчиками. Мембрана прогибается пропорционально разности давлений внутри камеры и снаружи, что влияет на изменение сопротивления тензодатчиков электрическому току. Так же имеется термодатчик, сопротивление которого меняется пропорционально температуре. АЦП (аналого-цифровой преобразователь) переводит результаты изменений датчиков в цифровые данные «некомпенсированные результаты», которые доступны для чтения из регистров датчика: «Out MSB», «Out LSB» и «Out xLSB». Для компенсации указанных результатов (компенсации смещения, температурной зависимости, погрешностей при изготовлении, неоднородностей материалов и т.д.) каждый датчик калибруется на заводе, и в EEPROM записываются индивидуальные для каждого датчика 11 калибровочных коэффициентов (176 бит), которые доступны для чтения из регистров датчика: «AC1», «AC2», «AC3», «AC4», «AC5», «AC6», «B1», «B2», «MB», «MC», «MD».

Карта памяти датчика BMP180:
Image

Запись данных в регистры: отправляем 1й байт (адрес датчика 0x77 и бит «R/W»=«0»); отправляем 2ой байт (адрес нужного нам регистра); отправляем 3й байт (данные для записи); после каждого отправленного байта, получаем ответ от датчика в виде одного бита «ACK».
Image


Чтение данных из регистров: отправляем 1й байт, (адрес датчика 0x77 и бит «R/W»=«0»); отправляем 2ой байт (адрес нужного нам регистра); отправляем сигнал «RESTART»; отправляем 3й байт, (адрес датчика 0x77 и бит «R/W»=«1»); датчик ответит одним байтом данных из указанного регистра; если подать сигнал «ACK», то датчик передаст байт данных следующего регистра и т.д. пока мы не передадим сигнал «NACK».
Image

Если на шине только один ведущий, то после передачи двух первых байт (адреса датчика с битом «R/W» = «0» и адреса регистра) допустимо завершить пакет подачей сигнала «STOP» и начать новый пакет сигналом «START» передать адрес датчика с битом «R/W» после чего начать принимать или передавать данные. Такой вариант передачи данных позволяет использовать библиотеки в которых нет сигнала «RESTART».

«START» - начинает пакет переход из «1» в «0» на линии «SDA» при наличии «1» на линии «SCL».
«STOP» - завершает пакет переход из «0» в «1» на линии «SDA» при наличии «1» на линии«SCL».
«1» / «0» - биты данных передаваемый бит равен логическому состоянию линии «SDA» при наличии «1» на линии «SCL».
«ACK» - байт принят передача бита «0»
«NACK» - байт не принят передача бита «1»
«R/W» - приём/чтение последний бит первого байта. Если «0» - инициализирована запись, если «1» - инициализировано чтение, а первые 7 бит первого байта – это id-адрес устройства на шине I2C к которому направлена инициализация.
«RESTART» повторный старт сигнал нужен при наличии на шине двух ведущих и невозможности передачи инициативы второму. Изменения уровней на линии «SDA» происходят только при наличии «0» на линии «SCL» за исключением сигналов «START», «STOP», «RESTART».

Алгоритм получения данных с датчика:
Image

1) Чтение калибровочных коэффициентов (чтение значений из одноименных регистров):
AC1, AC2, AC3, B1, B2, MB, MC, MD; AC4, AC5, AC6;

2) Чтение температуры: (некомпенсированное значение)
Записываем в регистр «Measurement Control» значение: 0x2E;
Ожидаем спад флага состояния «CSO» в «0»;
Читаем результат из регистров «Out MSB» и «Out LSB»;
UT = «Out MSB»<<8 + «Out LSB»;

3) Чтение давления: (некомпенсированное значение)
Записываем в регистр «Measurement Control» значение: 0x34 + (OSS<<6);
Ожидаем спад флага состояния «CSO» в «0»;
Читаем результат из регистров «Out MSB», «Out LSB» и «Out xLSB»;
UP = («Out MSB»<<16 + «Out LSB»<<8 + «Out xLSB») >> (8-OSS);

4) Вычисление промежуточных переменных:
PP1=((UT-AC6)*AC5>>15)+(MC<<11)/(((UT-AC6)*AC5>>15)+MD);
PP2=((uint32_t)AC4*(uint32_t)(((((AC3*(PP1-4000))>>13)+((B_1*(((PP1-4000)*(PP1-4000))>>12))>>16)+2)>>2)+32768))>>15;
PP3=((uint32_t)UP-((((AC1*4+((B_2*(((PP1-4000)*(PP1-4000))>>12))>>11)+((AC2*(PP1-4000))>>11))<<OSS)+2)>>2))*(uint32_t)(50000UL>>OSS); PP4=PP3<0x80000000?PP3*2/PP2:PP3/PP2*2;

5) Вычисление действительных значений:
T=((float)PP1+8)/160;
P=((float)PP4+(((((PP4>>8)*(PP4>>8)*3038)>>16)+((-7357*PP4)>>16)+3791)>>4))/133.322;

Высота над уровнем моря: Зная текущее атмосферное давление «P» и давление на уровне моря «Po», можно рассчитать текущую высоту над уровнем моря по международной барометрической формуле:
Image
Image
График зависимости между измеренным давлением и высотой над уровнем моря

Пример управляющего кода для микроконтроллера (на Proton BASIC Compiler):
Code: Select all
'****************************************************************
'*  Name    : BMP180.BAS                                        *
'*  Version : 1.0                                               *
'*  Notes   : This program uses a BMP180 pressure sensor        *
'*          : to measure current pressure, temperature &        *
'*          : altitude.                                         *
'****************************************************************
 
  Declare Stack_Size = 48
  Declare All_Digital = true
 
  Declare Hserial_RCSTA  = 144 ; Enable continuous receive
  Declare Hserial_TXSTA  = 36  ; Enable transmit, BRGH = 1
  Declare Hserial_Clear  = On  ; Clear overflow automatically
  Declare Hserial_SPBRG  = 138 ; Baud Rate Generator Low Byte Value
  SPBRGH                 = 0   ; Baud Rate Generator High Byte Value
  BAUDCON.3              = 1   ; Enable the 16 bit Baud Rate Generator


;-------------------------------------------------------------------------------

  Symbol BMP180 = $EE
  Symbol InitConvReg = $F4
  Symbol PReadReg = $34

  Dim AC1 As SWord
  Dim AC2 As SWord
  Dim AC3 As SWord
  Dim AC4 As Word
  Dim AC5 As Word
  Dim AC6 As Word

  Dim B1 As SWord
  Dim B2 As SWord
  Dim B3 As SDword
  Dim B4 As Dword
  Dim B5 As SDword
  Dim B6 As SDword
  Dim B7 As Dword

  Dim MB As SWord
  Dim MC As SWord
  Dim MD As SWord

  Dim OSS As Byte
  Dim UP As  Word
  Dim UT As SWord
  Dim XLSB As Byte
  Dim UPLong As SDword

  Dim X1 As SDword
  Dim X2 As SDword
  Dim X3 As SDword

  Dim Temperature As SWord
  Dim TempOut As Float

  Dim P As SDword
  Dim POut As Float

  Dim Altitude As Float
  Dim Temp1 As Float

  Main:

  DelayMS 1000
  Clear
  OSS = 3 'Oversampling mode. Values of 0-3 acceptable.
  HSerOut [10,13,"Ready to Start",13,10]

'Read calibration data
  HBusIn BMP180,$AA,[AC1,AC2,AC3,AC4,AC5,AC6,B1,B2,MB,MC,MD]

  While

      HBusOut BMP180,InitConvReg,[$2E]  'Start temperature conversion.
      DelayMS 10   'wait for conversion to complete.
      HBusIn BMP180,$F6,[UT] 'UT has the uncompensated temperature value.

      X1 = ((UT-AC6)*AC5)/32768
      X2 = (MC<<11)/(X1+MD)
      B5 = X1+X2
      Temperature = (B5+8)/16
      TempOut = Temperature/10

      HSerOut ["Current temperature is: ",Dec1 TempOut,"C",13,10]

' Calculate the presure in Pascals

      HBusOut BMP180,InitConvReg,[$34]  'Start pressure conversion.
      DelayMS 100    'wait for conversion to complete.
      HBusIn BMP180,$F6,[UP,XLSB]  'UP + SLSB contain uncompensated pressure value.

      UPLong =  ((UP*256)+ XLSB) >> (8-OSS)
     
' Now lets have some fun with numbers!
      B6  = B5-4000
      X1  = (B2 * (B6 * B6 /4096))/2048
      X2  = (AC2 * B6)/2048
      X3  = X1+X2
      B3  = (((AC1*4+X3) << OSS)+2)/4
      X1  = ( AC3 * B6 )/8192
      X2  = (B1 * (B6 * B6/4096))/65536
      X3  = ((X1 + X2 ) + 2)/4
      B4  = (AC4* ( X3 + 32768))/32768
      B7  = (UPLong - B3) *(50000 >> OSS)
      If B7 <  $80000000 Then
          P=(B7 * 2)/B4
      Else
          P=( B7 / B4 ) * 2
      EndIf
      X1  = (P/256) * (P/256)
      X1  = (X1 * 3038)/65536
      X2  = (-7357 * P)
      X2 = X2/65536
      P   = P + ( ( X1 + X2 + 3791)/16 )
      POut = (P/100)

      HSerOut ["Current pressure: ",Dec2 POut,"hPa",13,10]

' Altitude = 443308*((1-(p/101325)) ^ (1/5.255))
' 1013225 represents the 'standard' pressure at sea level. Adjust to suit.

      Temp1 = pow ((P/101925),0.190295)
      Altitude =  44330 *(1-Temp1)
      HSerOut ["Current altitude: ",Dec2 Altitude ,"m",13,10,13,10]
      DelayMS 2000

  Wend

' End of program
; **** Added by Fuse Configurator ****
; Use the Fuse Configurator plug-in to change these settings


Code: Select all
'****************************************************************
'*  Name    : BMP280.BAS                                        *
'*  Version : 1.0                                               *
'*  Notes   : This program uses a BMP280 pressure sensor        *
'*          : to measure current pressure, temperature &        *
'*          : altitude.                                         *
'****************************************************************
  Include "Amicus18_Mk2.inc"

  Declare Float_Display_Type = Fast
  Declare Hbus_Bitrate 100

  Symbol BMP280 = $EC  'BMP280 I2C address
  Symbol CalDatStAd = $88 'Start address for cal. data.
  Symbol BMP280ContReg = $F4 'BMP280 control Register
  Symbol BMP280ConfigReg = $F5 'BMP280 configuration register
  Symbol BMP280PresReg = $F7 'Uncompensated pressure start register
  Symbol BMP280TempReg = $FA 'Uncompensated temperature start register

'Values of 0-3 acceptable but see data sheet. 3 = Normal Mode
  Symbol PowerMode = 3

'Values of 0-5 acceptable but see data sheet. 5 = 20 bit res.
  Symbol TempRes =  5

'Values of 0-5 acceptable but see data sheet. 5 = 20 bit res.
  Symbol PresRes = 5

'Values of 0-7 acceptable. See data sheet before changing.
  Symbol Filter = 4

'Values of 0-7 acceptable but see data sheet. 4 = 500ms.
  Symbol Standby =  4


'Temperature related variables.
  Dim T1 As Word
  Dim T2 As SWord
  Dim T3 As SWord

  Dim fT1 As Float
  Dim fT2 As Float
  Dim fT3 As Float

  Dim UT As Word  'Uncompensated temperature
  Dim UTLong As Dword
  Dim Temperature As Float
  Dim T_fine As Float


'Pressure related variables
  Dim P1 As Word
  Dim P2 As SWord
  Dim P3 As SWord
  Dim P4 As SWord
  Dim P5 As SWord
  Dim P6 As SWord
  Dim P7 As SWord
  Dim P8 As SWord
  Dim P9 As SWord

  Dim fP1 As Float
  Dim fP2 As Float
  Dim fP3 As Float
  Dim fP4 As Float
  Dim fP5 As Float
  Dim fP6 As Float
  Dim fP7 As Float
  Dim fP8 As Float
  Dim fP9 As Float

  Dim UP As Word 'Uncompensated pressure.
  Dim UPLong As Dword
  Dim P As Float


'BMP280 related variables.
  Dim BMP280Config As Byte
  Dim BMP280Control As Byte

'General variables
  Dim var1 As Float
  Dim var2 As Float
  Dim Altitude As Float
  Dim XLSB As Byte
  Dim ID As Byte
 
  Main:

  DelayMS 1000 'Let things settle down.
  Clear

  'Setup BMP280 Control and configuration registers.
  BMP280Config = (Standby <<5) + (Filter <<2) ' Combine configuration bits.
  HSerOut [Bin BMP280Config,13]
  HBusOut BMP280,BMP280ConfigReg,[BMP280Config]

  BMP280Control = (TempRes <<5) + (PresRes <<2) + PowerMode ' Combine BMP280Control bits.
  HSerOut [Bin BMP280Control,13,13]
  HBusOut BMP280,BMP280ContReg,[BMP280Control]


' Read calibration data
  HBusIn BMP280,CalDatStAd,[T1,T2,T3,P1,P2,P3,P4,P5,P6,P7,P8,P9]

  HSerOut [Dec T1," ",SDec T2," ",SDec T3," ",13,13,10]




  While

      HBusIn BMP280,BMP280TempReg,[UT,XLSB]
      UTLong = (UT * 16) +(XLSB >> 4)
      HSerOut [Hex UT,"  ",Hex XLSB," ", Hex UTLong ,13,13,10]

      HBusIn BMP280,BMP280PresReg,[UP,XLSB]
      UPLong = UP * 16 + (XLSB >> 4)

' Test data from the Bosch datasheet. Used to check calculations.

'         T1=27504  : T2=26435  : T3=-1000
'         P1=36477  : P2=-10685 : P3=3024
'         P4=2855   : P5=140    : P6=-7
'         P7=15500  : P8=-14600 : P9=6000
'         UTlong=519888 : UPlong=415148


' Convert integer variables to floating point in order to improve accracy.

      fT1 = T1 : fT2 = T2: fT3 = T3

      fP1  = P1 : fP2  = P2 : fP3  = P3
      fP4  = P4 : fP5  = P5 : fP6  = P6
      fP7  = P7 : fP8  = P8 : fP9  = P9
     
      HSerOut [Dec2 fT1," " ,Dec2 fT2," ",Dec2 fT3,13,13,10]


' Temperature calculations start here.

      var1=(UTLong/16384-fT1/1024)*fT2
      var2=(UTLong/131072-fT1/8192)*(UTLong/131072-fT1/8192)*fT3
      Temperature=(var1+var2)/5120
      T_fine=(var1+var2)


' $B0 is the hex value for the degree symbol. Not correctly displayed on some terminals.
      HSerOut ["Current temperature is: ",Dec2 Temperature,$B0,"C",13]


'
' Pressure calculations start here.

        var1=T_fine/2-64000
        var2=var1*var1*fP6/32768
        var2=var2+var1*fP5 * 2
        var2=(var2/4)+ fP4 * 65536
        var1=(fP3*var1*var1/524288+fP2*var1)/524288
        var1=(1+var1/32768)*fP1
        P=1048576-UPLong
        P=(P-var2/4096)*6250/var1
        var1=(fP9*P*P/2147483648)*-1
        var2=P*fP8/32768
        P=P+(var1+var2+fP7)/16

        HSerOut ["Current pressure: ",Dec P,"Pa",13]


' Note: The altitude calculation takes about 1.5k of program memory.
'     : Remove if not needed!

' Altitude = 44330*((1-(p/101325)) ^ (1/5.255))
' 101325 represents the 'standard' pressure at sea level. Adjust to suit.

      var1 = pow((P/102400),0.190295)
      Altitude =  44330 *(1-var1)
      HSerOut ["Current altitude: ",Dec2 Altitude ,"m",13,10,13]

      DelayMS 2000

  Wend

' End of program


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

В качестве управляющего микроконтроллера выбран PIC18F4525, к которому непосредственно подключается датчик давления BMP180, датчик влажности DHT11 и датчик освещенности BH17506. Для визуализации результатов измерения использован графический OLED дисплей 0.96" (128х64) на SSD1306, подключенный также по I2C - интерфейсу к микроконтроллеру. Таким образом, задействовано всего 7 портов микроконтроллера: по два порта на каждое подключаемое I2C устройство и один порт для шины данных датчика влажности DHT11. Ниже на рисунке показан макет созданного устройства:

Image
Макетная плата с подключенными датчиками освещенности, давления, температуры и влажности
(фото Моисеева Д.Н.)

В режиме реального времени устройство работает так:


(Видео Моисеева Д.Н.)


Литература:
1. Фирменная документация на BMP180 (Digital Pressure Sensor) на русском.
2. Data sheet BMP180 (Digital pressure sensor).
3. Фирменная документация на BMP280 (Digital Pressure Sensor).
4. XC6206 Series.
5. MCU PIC18F452.
6. Digital 16bit Serial Output Type Ambient Light Sensor IC BH1750.
7. Плата модуля BMP180 (PCB) - BMP180.lay6

На главную
Admin
Site Admin
 
Posts: 209
Joined: Wed Sep 20, 2017 9:55 am

Return to Промежуточные исследования и разработки

cron

User Menu

Login