Hehe ktoś powie kaktus zwariował przecież tym maleństwem dokonuje się pomiaru ciśnienia atmosferycznego … może i zwariował ale jednak jeszcze nie do końca. W tym wypadku dobrze wie co mówi.
Znając ciśnienie jakie panuje na poziomie morza p0 (np.: 1013.25 hPa) oraz wartość pomiaru p, możemy określić aktualną wysokość, wyliczając ją z wzoru przedstawionego niżej.
Istnieje ścisła zależność pomiędzy wysokością, a ciśnieniem. Została zobrazowana na poniższym wykresie, z którego wynika, że zmiana ciśnienia na Δp = 1 hPa odpowiada zmianie wysokości na Δh = 8,43 m. Natomiast zmiana wysokości o Δh = 10 m odpowiada zmianie ciśnienia o Δp = 1,2hPa.
Wszystkie te informacje znajdziemy w nocie katalogowej.
Więc nastąpiła pora by zacząć poznawać ten sensor dogłębnie.BMP180 jest potomkiem BMP085 (unowocześnionym i w pełni z nim zgodnym) i starszym braciszkiem mniejszego BMP280 stanowiąc produkt grupy czujników ciśnienia atmosferycznego (Barometric Pressure Sensors). Firma Bosh Sensortec opracowała jeszcze grupę czujników o szerszej funkcjonalności o nazwie Integrated Environmental Unit (zintegrowane jednostki do monitorowania środowiska). Potrafią one dokonywać nawet pomiaru zawartości lotnych związków organicznych w powietrzu (BME680), obok pomiaru ciśnienia 300…1100 hPa, temperatury -40…+85 °C i wilgotności 0…100 % rH (BME280).
Sensor stanowi cyfrowy czujnik (Piezo-resistive) ciśnienia atmosferycznego o bardzo wysokiej wydajności, dokładności i liniowości. Jak również długoterminowej stabilności i wysokiej odporności EMC. Liczne opcje pracy urządzenia oferują najwyższą elastyczność w zakresie optymalizacji zużycia energii urządzenia, rozdzielczości i filtra wydajności.
Niezwykle niski pobór mocy do 3 µA czyni BMP180 liderem w dziedzinie oszczędzania energii dla urządzeń mobilnych. BMP180 również wyróżnia bardzo stabilne zachowanie (wydajność) w odniesieniu do niezależności od napięcia zasilającego.
Sensor BMP180 otrzymamy jako w pełni skalibrowany, gotowy do użycia moduł czujnika bez konieczności stosowania dodatkowych układów zewnętrznych.
Dane ciśnienia i temperatury są przygotowywane w wartościach 16 bitowych, które wraz z przechowywanymi danymi indywidualnej kalibracji (176 bitów), powinny być wykorzystywane do kompensacji temperatury przez zewnętrzną jednostkę MPU. Transfer danych może odbywać się poprzez interfejsy I²C lub SPI.
Tak prezentuje ten sensor producent 🙂
Moduł z tym sensorem udało mi się zakupić 2014-09-10 w rewelacyjnej cenie na ówczesne czasy za jedyne 12,50pln u Wojciecha. I od tamtego czasu powstaje ten opis, chyba padł rekord.
Moduł został dodatkowo wyposażony w precyzyjny stabilizator małej mocy o oznaczeniu XC6206P w obudowie SOT23. Zawiera również rezystory PULL-UP dla magistrali TWI, oraz niezbędne kondensatory. Moduł został oznaczony przez producenta symbolem GY-68. Pamiętać należy o zastosowaniu translatora poziomów logicznych dla linii komunikacyjnych, gdy jednostka sterująca będzie zasilana napięciem 5,0V. Heh PCB posiada otwór montażowy Ø 3,00mm wydający się wielgaśną dziurą gdy patrzymy na te maciupkie elementy.
Sam układ scalony sensora posiada 7 wyprowadzeń, z ich funkcjonalnością możemy zapoznać się na powyższym rysunku. Piny CSB i SDO odpowiadają wariantowi z interfejsem SPI, i podłączane są na żądanie klienta. W przypadku komunikacji I²C (obudowa standardowa) wymienione wyprowadzenia nie są używane i pozostają nie podłączone. Producent nakazuje lutowanie wszystkich wyprowadzeń, nawet tych nie podłączonych wewnętrznie by uniknąć powstawaniu niepotrzebnych naprężeń.
Organizacja pamięci i rejestry funkcjonalne.
Poniższa mapa pamięci pokazuje wszystkie dostępne z zewnątrz rejestry danych, które są niezbędne do obsługi BMP180. Kolumny po lewej przedstawiają adresy pamięci. Kolumny w środku przedstawiają funkcjonalność każdego bitu rejestru. Kolory bitów wskazują, czy są one tylko do odczytu, tylko do zapisu lub do odczytu i do zapisu. Pamięć jest ulotna, więc zapisane nastawy, muszą być ponownie ustawione po każdym włączeniu zasilania. Ostatnia kolumna zawiera wartości rejestrów ustawione po załączeniu zasilania.
Nie wszystkie adresy rejestrów są dostępne. Wybrane rejestry są zarezerwowane dla dalszych badań w fabryce Boscha.
Measurement control (register F4h <bit 4:0>) Sterowanie pomiarami.
Sco (register F4h <bit 5>) Start konwersji. Wartość bitu wynosi „1” podczas konwersji i jest resetowana po jej zakończeniu (gdy rejestry danych są wypełnione).
Oss (register F4h <bit 7:6>) steruje współczynnikiem próbkowania pomiaru ciśnienia (00B: jednorazowo, 01b: 2 razy , 10b: 4 razy, 11b: 8 razy).
Soft reset (register E0h) rejestr tylko do zapisu. Jeśli ustawi się jego wartość na 0xB6, sensor wykona taką samą sekwencję jak po włączeniu zasilania (power on reset).
Chip-id (register D0h) ta wartość jest ustawiona na 0x55. Rejestr może być używany do sprawdzania, czy funkcjonuje komunikacja.
Po konwersji danych rejestry mogą być odczytane w dowolnej kolejności (to znaczy pierwszy MSB lub pierwszy jako LSB). Korzystanie z odczytów seryjnych nie jest obowiązkowe.
Procedura komunikacji i odczytu wyników pomiaru.
Adres odczytu sensora BMP180 na magistrali TWI wynosi &H EF (239), natomiast zapis wykonujemy pod adres &H EE.
Producent sugeruje następujący tok postępowania w celu ustalenia monitorowanych warunków otoczenia. Przed pierwszym odczytem danych z rejestrów sensora należy odczytać dane kalibracji indywidualne dla każdego czujnika z jego pamięci E²PROM (jednorazowo przy inicjalizacji oprogramowania – po załączeniu zasilania). Stanowi je 11 słów 16 bitowych, w rejestrze od adresu &H AA do &H BF. Dane te są niezbędne do przekształcenia „surowych” wartości ciśnienia i temperatury, na realne wartości, przez zawikłane i „ciężkie” dla AVR-ka obliczenia. Poprawność odczytu danych można skontrolować przez np dwukrotny ich odczyt i porównanie, a dodatkowo producent sugeruje, że żadna wartość nie powinna wynosić 0 lub 65535. Ponieważ sensor może dostarczyć wyników o różnych stopniach precyzji (dla ciśnienia), należy wybrać odpowiedni tryb konwersji z pośród 4 trybów sprzętowych i jednego programowego. Od tego zależy czas konwersji danych w pamięci sensora oraz zużycie energii przez jego logikę. Otrzymane wyniki dla ciśnienia (UP) mogą zawierać 16 – 19 bitów, dla temperatury (UT) 16 bitów. Wszystkie tryby mogą być wykonywane przy wyższych prędkościach, np do 128 razy na sekundę w trybie standardowym, a pobór prądu wzrasta proporcjonalnie do częstotliwości próbkowania. Tryb programowy realizowany jest przez podanie wyniku uśrednionego z kilkukrotnie przeprowadzonych konwersji. Stąd wydłużony czas przeprowadzanych operacji. Dla próbkowania z maksymalną prędkością temperaturę wystarczy odczytywać raz na sekundę i dla tej wartości dokonywać wyliczeń ciśnienia.
Po dokonaniu odczytu i weryfikacji danych kalibracyjnych można przystąpić do wydania polecenia konwersji temperatury. Po odczekaniu wymaganego czasu dane można odczytać z odpowiednich rejestrów sensora. Kolejno należy wydać polecenie konwersji danych dla ciśnienia, odczekać wymagany okres czasu i przystąpić do odczytu wartości z rejestrów. Wartości temperatury bądź ciśnienia atmosferycznego odczytamy pod adresami &H F6 (MSB), &H F7 (LSB), i dodatkowo dla trybu ultra hihg resolution kolejne dane pod adresem &H F8 (XLSB), tak by otrzymać łącznie 19 bitów
Postępując w ten sposób otrzymamy wszystkie niezbędne dane, z których będzie można wyliczyć aktualne wartości dla temperatury i ciśnienia atmosferycznego. Rozdzielczość uzyskanych wyników wynosi 0,01hPa (0.01mbar) dla ciśnienia i 0,1 °C dla temperatury. Przykładowy kod BMP180 Bascom dla odczytu wszystkich tych wartości może wyglądać następująco:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
'=============================================================================== ' Project: BMP180 Barometric Pressure Sensor test ' Created: 2012-01-18 ' Edited: ' By: Glen Aidukas ' Description: ' Test code to read the BMP180 Barometric Pressure Sensor temperature & pressure. ' NOTE: This code only reads the RAW, uncalibrated data. ' BMP180 breakout board tested on was from: ' http://www.dsscircuits.com/barometric-pressure-sensor-bmp180.html ' Datasheet for the BMA180 can be found here: ' http://www.dsscircuits.com/images/datasheets/BST-BMP180-DS000-07.pdf '------------------------------------------------------------------------------- '=====[ Compiler Directives ]=================================================== $crystal = 18432000 $regfile = "m1284pdef.dat" ' ATMEGA1284P on a BahBots.com controller $baud = 38400 $hwstack = 64 $swstack = 64 $framesize = 64 '------------------------------------------------------------------------------- '=====[ Global Vars & Constants ]=============================================== dim count as word dim BMP180_UTemp as integer ' RAW temperature data dim BMP180_UTempa as byte at BMP180_UTemp + 0 overlay dim BMP180_UTempb as byte at BMP180_UTemp + 1 overlay dim BMP180_UP as long ' RAW uncalibrated pressure data dim BMP180_UPa as byte at BMP180_UP + 0 overlay dim BMP180_UPb as byte at BMP180_UP + 1 overlay dim BMP180_UPc as byte at BMP180_UP + 2 overlay dim BMP180_UPstart as long dim BMP180_UPdelta as long dim BMP180_timeout as byte ' keep from locking up on failed I2C connections dim BMP180_status as byte Const BMP180_W = &HEE ' BMP180 Write address Const BMP180_R = &HEF ' BMP180 Read address '------------------------------------------------------------------------------- '=====[ Config misc stuff ]===================================================== $LIB "I2C_TWI.LBX" ' lib for using the hardware I2C. Comment out for soft I2C Config Scl = Portc.0 ' needed if using soft I2C Config Sda = Portc.1 ' needed if using soft I2C Config Twi = 400000 ' set the I2C bus to 'fast' speed I2cinit print "{027}[2J{027}[1;1H"; ' ansi clear screen print "Starting"; gosub BMP180_ReadTemp waitms 500 print "..." print gosub BMP180_ReadPressure BMP180_UPstart= BMP180_UP '------------------------------------------------------------------------------- '*****[ Start of main loop ]**************************************************** do gosub BMP180_ReadTemp gosub BMP180_ReadPressure BMP180_UPdelta= BMP180_UP - BMP180_UPstart ' get delta since starting print "{027}[3;1H"; ' ANSI command to move cursor to line 3, col 1 print "Count : "; count; "{027}[K" print "{027}[K" print "Raw Temp : "; BMP180_UTemp; "{027}[K" print "Raw Pressure : "; BMP180_UP; "{027}[K" print "Pressure Delta : "; BMP180_UPdelta; "{027}[K" print "{027}[K" waitms 250 incr count Loop End '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ '=====[ Read the raw temp from the BMP180 ]===================================== BMP180_ReadTemp: ' read the temp I2cstart I2cwbyte BMP180_W I2cwbyte &HF4 I2cwbyte &H2E I2cstop waitms 5 I2cstart I2cwbyte BMP180_W I2cwbyte &HF6 I2cstart I2cwbyte BMP180_R I2crbyte BMP180_UTempb, Ack I2crbyte BMP180_UTempa, Nack I2cstop return '------------------------------------------------------------------------------- '=====[ Read the raw pressure from the BMP180 ]================================= BMP180_ReadPressure: ' start the pressue measurement I2cstart I2cwbyte BMP180_W I2cwbyte &HF4 I2cwbyte &B11_110100 ' set to ultra high resolution: 8 time over sampling I2cstop ' check and wait for completion BMP180_timeout= 100 ' time out after about 100ms do waitms 1 I2cstart I2cwbyte BMP180_W I2cwbyte &HF4 I2cstart I2cwbyte BMP180_R I2crbyte BMP180_status, Nack decr BMP180_timeout loop until BMP180_status.5 = 0 or BMP180_timeout = 0 ' wait for completion if BMP180_timeout = 0 then BMP180_UP= -1 else ' now read the pressure data I2cstart I2cwbyte BMP180_W I2cwbyte &HF6 I2cstart I2cwbyte BMP180_R I2crbyte BMP180_UPc, Ack I2crbyte BMP180_UPb, Ack I2crbyte BMP180_UPa, Nack I2cstop shift BMP180_UP, right, 5, signed endif return '------------------------------------------------------------------------------- |
kod pochodzi z forum MCS.
Zwariowane obliczenia …
No to w tym miejscu nie przyznam się co powiedziałem gdy zobaczyłem zestaw obliczeń, gdyż było by to „nie smaczne” … Schemat obliczeń przedstawia poniższy wycinek z notki: Widząc te wszystkie wielobajtowe dzielenia i mnożenia , zastanawiałem się czy to wszystko musi być niezbędne … i jaki jest ich sens, pewno dało by się je uprościć czy coś z nimi zrobić by odciążyć nasze 8-bitowe AVR. Ale biorąc pod uwagę, że BMP180 jest zwykłym elementem, który może być używany w różnych systemach i platformach sprzętowych …
Tak, że przy doborze µC do takiego projektu na pewno trzeba wsiąść pod uwagę, z czym będzie musiał się zmierzyć, i że to wszystko wymaga czasu i wygeneruje obfity kod wynikowy. Z załącznikami do pobrania zamieszczam gotowy kod w dwóch wersjach zawierający te zwariowane obliczenia dla BMP180 Bascom. Tam gdzie się dało zastąpiłem dzielenia i mnożenia przez wielokrotność 2 stosowną funkcją 😉 Obie wersje kodu pochodzą z forum MCS do którego odnośnik umieściłem powyżej.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
Sub Bmp085_Calc_Temp() '----------------------------------------------- ' Calculate true Temperature 'X1 = X1 = U_Temperatur - Ac6 X1 = X1 * Ac5 Shift X1 , Right , 15 ' X1 = X1 \ 32768 ' X2 = X21 = X1 + Md X22 = 2 ^ 11 X22 = X22 * Mc X2 = X22 \ X21 'Integer division is denoted by the backslash (\). ' B5 = B5 = X1 + X2 ' T = T = B5 + 8 Shift T, right, 4 ' T = T \ 16 End Sub Sub Bmp085_Calc_Pressure() ' Calculate true pressure B6 = B5 - 4000 'X1 = X21 = 2 ^ 12 ': Print "X21 = " ; X21 X22 = B6 * B6 ' : Print "X22 = " ; X22 X1 = X22 \ X21 X1 = X1 * B2 Shift X1 , Right , 11 'X2 = X21 = 2 ^ 11 X22 = Ac2 * B6 X2 = X22 \ X21 'X3 = X3 = X1 + X2 'B3 = X21 = Ac1 * 4 X22 = X21 + X3 Shift X22 , Left , Oss X22 = X22 + 2 B3 = X22 \ 4 'X1 = X21 = 2 ^ 13 X22 = Ac3 * B6 X1 = X22 \ X21 'X2 = X21 = 2 ^ 12 X2 = B6 * B6 X2 = X2 \ X21 X2 = B1 * X2 Shift X2 , Right , 16 'X3 = X21 = 2 ^ 2 X3 = X1 + X2 X3 = X3 + 2 X3 = X3 \ X21 'B4 = B4 = X3 + 32768 B4 = Ac4 * B4 Shift B4 , Right , 15 'B7 = X21 = 50000 Shift X21 , Right , Oss B7 = U_Pressure - B3 B7 = B7 * X21 If B7 < &H80000000 Then P = B7 * 2 P = P \ B4 Else P = B7 \ B4 P = P * 2 End If 'X1 = X21 = 2 ^ 8 X1 = P \ X21 X1 = X1 * X1 'X1 = X21 = 2 ^ 16 X1 = X1 * 3038 X1 = X1 \ X21 'X2 = X21 = 2 ^ 16 X2 = -7357 * P X2 = X2 \ X21 'p = X21 = 2 ^ 4 X22 = X1 + X2 X22 = X22 + 3791 X22 = X22 \ X21 P = P + X22 Ph = P \ 100 End Sub Sub Bmp085_Absolute_Altitude() 'Calculating absolute altitude Altitude_var1 = 1 / 5.255 P_Single = P Altitude = P_Single / Pressure_at_See_Level Altitude = Altitude ^ Altitude_Var1 Altitude = 1 - Altitude Altitude = 44330 * ABS(Altitude) End Sub |
Wytyczne zasilnia i napięcia na pinach IO.
Heh … spotkałem się z opinią, że sensor można sterować liniami IO jednostki µC zasilanego 5V, 😆 z argumentacją „bo działa” …
Ja bym powiedział jeszcze działa … i skończę komentarz na tych słowach … Przedstawiam wytyczne z noty w postaci wycinków precyzujących te zagadnienie, i sensowny komentarz pozostawiam dla każdego z osobna …
Ciekawostką jest możliwość rozdzielenia napięcia zasilania głównego od napięcia zasilania linii IO, gdzie może wystąpić niewielka różnica w napięciu.
No i jeszcze jeden obrazek ale „na Boga” absolute maximum ratings oznacza graniczne napięcie przy jakim układ nie zostanie jeszcze zniszczony, a nie przy jakim będzie prawidłowo działał …
A.D. 2017-04-02 Jakiś czas temu podczas prywatnych rozmówek z zaznajomionym BARTkiem otrzymałem informację:
… w razie czego już mogę napisać Ci że obsługa BMP280 i BME280 pod względem temperatury i ciśnienia jest taka sama i układy są zamienne i jak podłączę to pokazują dokładnie to samo tyle, że BME ma dodatkowo wilgotność …
Dodatkowo zwrócił też uwagę na istotny fakt, że przy korzystaniu z polecenia SHIFT powinno stosować się parametr SIGNED. Jest to opcja, która działa tylko z przesunięciami w prawo. Zachowuje bit znaku, który w przeciwnym razie zostałby wyczyszczony przez pierwsze przesunięcie. Zatem prezentowane kody należy uzupełnić o ten parametr w instrukcjach używających przesunięcia w prawo, inaczej obliczenia w pewnych warunkach mogą być błędne.
ciekawe wiadomości o podobnych czujnikach łącznie z kodami do obsługi w Bascom AVR można przeczytać tu. 😉
nota katalogowa
BST-BMP180-DS000-09.pdf (1544 pobrania)
wersja 2.5 z 2013-04
nowa nota katalogowa
BST-BMP180-DS000-121-1.pdf (3275 pobrań)
wersja 2.8 z 2015-05
nota katalogowa stabilizatora
XC6206P332MR.pdf (1527 pobrań)
kod dla BMP180 Bascom AVR
BMP180.bas_.zip (277 pobrań)
dwa przykłady
Cześć,
Używając aplikacji w telefonie do pomiaru ciśnienia i wysokości otrzymałem 983,7 hPa i 204 m n.p.m..
Użyłem Twojego wzoru do obliczenia wysokości. Podstawiłem zmierzone ciśnienie 983,7 i ciśnienie p0. Wyliczyłem wysokość i wyszło 249 m. Czy możesz wytłumaczyć dlaczego te wysokości się nie zgadzają. W jaki sposób mam wyliczyć prawidłową wartość?
Witam.
Na wstępie polecę się zapoznać z notką katalogowa wersja 2.8 z 2015-05. Strona 16 prezentuje ten wzór i trochę wyjaśnień.