Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATmega8][C] - Brak prawidłowego odczytu ciśnienia z czujnika LPS331AP

hv222 06 Paź 2012 18:33 1341 0
  • #1
    hv222
    Poziom 16  
    Witam,
    Jeżeli napisałem w złym dziale, proszę moderatora o przeniesienie do właściwego.
    Od kilku dni próbuję odczytać ciśnienie z czujnika LPS331AP. Czujnik ten jest podłączony do ATmega8 przez sprzętowe SPI (4 przewody) - SCL/SPC z PB.5 , SDA/SDI/SDO z PB.3, SDO/SA0 z PB.4 i CS z PB.0. Napięcie prawidłowo podłączone do czujnika. Całość zasilana z 3.3V. ATmega pracuje na kwarcu 8MHz. Rejestry są poprawnie zapisywane i odczytywane w tym rejestr WHO_AM_I (adres 0Fh wartość BBh). Problem pojawia się kiedy chcę odczytać wartość rejestru PRESS_OUT i TEMP_OUT. Zawartość tego ostatniego jest cały czas stała(mimo ogrzewania) i wynosi 0xfc ldla 0x2B i 0x7f dla 0x2C , a PRESS_OUT po przeliczeniu daje wartości większe od 1200hPa (mBar)(maleje przy ogrzewaniu do ok. 1050hPa) . Przed odczytaniem ciśnienia i temperatury do układu zapisuję 0x7A w rejestrze 0x10 (ustawienia pomiaru) oraz 0x96 (lub 0x94 lub 0x82) w rejestrze 0x20 (konfiguracja układu i odświeżania danych). Datasheet układu jest dostępny tu : http://www.kamami.pl/dl/lpd331ap.pdf . Poniżej dane odczytane z czujnika, które otrzymałem przez terminal z Atmegi.
    Code:
    0x08 0 
    
    0x09 0
    0x0A 0
    0x0F bb
    0x10 7a
    0x20 96
    0x21 0
    0x22 0
    0x23 0
    0x24 0
    0x25 0
    0x26 0
    0x27 33
    0x28 19
    0x29 27
    0x2A 49
    0x2B fc
    0x2C 7f
    0x2D 0
    0x3C 0
    0x3D 0
    0x3E 0

    Program pochodzi z przerobionego przykładu dla czujnika MPL115A1. Zapisuję nim dwa rejestry konfiguracyjne, po czym odczytuję wszystkie oraz cyklicznie temperaturę i ciśnienie.
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Na chwilę obecną dane z czujnika przeliczam ręcznie wg. informacji z datasheet (str. 28 i 29.) otrzymane wartości zamieniam z zapisu szesnastkowego na dwójkowy i zapisuję w podanym ciągu PRESS_OUT_H PRESS_OUT_L PRESS_OUT_XL (kiedy to konieczne uzupełniam wartości z poszczególnych rejestrów zerami na początku, aby każdy element miał po 8 znaków), później całość przeliczam na zapis dziesiętny i dzielę przez 4096. Podobnie postępuję z temperaturą.
    Czy dobrze rozumiem, że dane o temp. wyrażone są w °C ? ( datasheet "T(degC) = 42.5 + (Temp_OUTH & TEMP_OUT_L)[dec]/480")

    Później planuję przeliczać to poniższym kodem:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Proszę o poradę w czym leży problem - w kodzie, w sposobie obsługi i konfiguracji czujnika, w błędnym sposobie przeliczania, czy też może jest prawdopodobieństwo, że czujnik jest uszkodzony.
    Za odpowiedź z góry dziękuję.
    Pozdrawiam,
    Michał