Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Fibaro Fibaro
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

czujnik ciśnienia BMP085 odczyt parametrów kalibracji

encore 05 Cze 2011 02:11 3498 17
  • #1 05 Cze 2011 02:11
    encore
    Poziom 17  

    Zrobiłem sobie na szybko układ do odczytu ciśnienia prze układ BMP085.
    Mam kłopot podczas odczytywania współczynników kalibracyjnych z pamięci czujnika. Jedna z wartości [B2] jest równa 0x0000 a zgodnie z dokumentacją jest to wadliwy odczyt, bo żadna wartość nie może być ani 0x0000 ani 0xFFFF.
    Nie mam pojęcia co jest źle. Tylko jeden odczyt jest niepoprawny, a wiec sama komunikacja I2C jest dobra.
    Podmieniłem czujnik na drugi polutowany na pająka i niestety jest to samo.

  • Fibaro
  • #2 05 Cze 2011 11:45
    MirekCz
    Poziom 35  

    Bez kodu, schematu itd jak wyobrażasz sobie pomoc?

    Mi moduły działają bez problemu. Na necie jest biblioteka do AVRa i na niej bazowałem swoją implementację. Mogę Tobie sprzedać sprawny i sprawdzony moduł.

  • #3 05 Cze 2011 11:54
    encore
    Poziom 17  

    Code:
    #define BMP085_ADDRESS 0x77  // I2C address of BMP085
    
    #define BMP085_R 0xEF
    #define BMP085_W 0xEE
    #define OSS 1   // Oversampling Setting (note: code is not set up to use other OSS values)

    //const unsigned char OSS = 0;  // Oversampling Setting

    // Calibration values
    int ac1;
    int ac2;
    int ac3;
    unsigned int ac4;
    unsigned int ac5;
    unsigned int ac6;
    int b1;
    int b2;
    int mb;
    int mc;
    int md;

    // b5 is calculated in bmp085GetTemperature(...), this variable is also used in bmp085GetPressure(...)
    // so ...Temperature(...) must be called before ...Pressure(...).
    long b5;

    short temperature;
    long pressure;

    typedef union {
        unsigned int wynik;
       struct {
           unsigned char uchar8H;
           unsigned char uchar8L;
       }skladowa;
    }data16;

    data16 data;


    ///////////////////////////////////////////////////////////////////////////

    short bmp085ReadShort(unsigned char address)
    {   
       unsigned char msb, lsb;
       unsigned short data;
       unsigned char potwierdzenie;

       Start();   
          WriteByte(BMP085_W);   // write 0xEE
          potwierdzenie = GetAck();
          WriteByte(address);   // write register address
          potwierdzenie = GetAck();
       //Stop();
       
       Start();
          WriteByte(BMP085_R);   // write 0xEF
          potwierdzenie = GetAck();
          msb = ReadByte();   // Get MSB result
          //data.skladowa.uchar8H = ReadByte();
          PutAck(TRUE);
          lsb = ReadByte();   // Get LSB result
          //data.skladowa.uchar8L = ReadByte();
          PutAck(FALSE);
       Stop();
       
       data = msb << 8;
       data |= lsb;
       
       return data;
    }

    //////////////////////////////////////////////////////////////////////////


    // odczyt wspolczynikow kalibracyjnych z czyjnika

    void BMP085_Calibration(void)
    {
       ac1 = bmp085ReadShort(0xAA);
       ac2 = bmp085ReadShort(0xAC);




       ac3 = bmp085ReadShort(0xAE);
       ac4 = bmp085ReadShort(0xB0);
       ac5 = bmp085ReadShort(0xB2);
       ac6 = bmp085ReadShort(0xB4);
       b1 = bmp085ReadShort(0xB6);
       b2 = bmp085ReadShort(0xB8);
       mb = bmp085ReadShort(0xBA);
       mc = bmp085ReadShort(0xBC);
       md = bmp085ReadShort(0xBE);
    }



    używam modułu kupionego w robodudes.pl

    Komunikacja I2C robiona jest programowo.


    Code:

    #include<ez8.h>
    #include "led.h"
    #include "spi.h"
    #include "watchdog.h"
    #include "I_O_gpio.h"
    #include "obroty.h"
    #include "czas.h"
    #include "BMP085.h"
    #include "I2C.h"

    void main(void)
    {
       long temperatura;
       long cisnienie;

       DI();
          //watchdog();
          init_gpio_spi();
          spi_config();

          init_gpio_timer0();
          init_Timer0();

          init_gpio_timer1();
          init_Timer1();

          init_gpio_I2C();

          config_MAX_7221();
          Zeroj_Wyswietlacze();
       EI();

       czekaj(200);
       BMP085_Calibration();
       while(1)
       {
          bmp085Convert( &temperatura, &cisnienie);
       };
    }

  • Fibaro
  • #4 05 Cze 2011 13:17
    MirekCz
    Poziom 35  

    Kod na pierwszy rzut oka wygląda ok.
    Co otrzymujesz z innych danych z eepromu i temperatury/ciśnienia czytanego bezpośrednio ze scalaka i po przeliczeniu poprawnych wartości?
    W moim kodzie nigdy nie sprawdzam co wychodzi z readshort, więc trudno mi się do tego akurat ustosunkować - chociaż rzeczywiście w dokumentacji jest napisane, że musi być !=0 i 0xFFFF.

    Skoro moduł kupowałeś u mnie to był on testowany i na pewno podaje poprawne wyniki. Na pierwszy rzut oka wygląda na to, że Twój softwareowy I2C nie do końca działa. Może z otrzymanych wyników z innych pól kalibracyjnych uda się spostrzec co może być nie tak.

  • #5 06 Cze 2011 01:15
    encore
    Poziom 17  

    Odczyt pozostałych wartości kalibracyjnych też budzi moje wątpliwości. Młodszy bajt w każdej zmiennej jest zawsze równy zero.
    Z drugiej strony komunikacja działa ponieważ jak dotknę palcem czujnik to odczyt temperatury wzrasta. A więc wygląda że komunikacja jakoś działa.

    Mały sukces jednak jest. Sprawdziłem że temperaturę czujnik podaje prawidłową.
    Po walce udało mi się odczytać w miarę sensowne wartości ciśnienia.

  • Fibaro
  • #6 06 Cze 2011 12:51
    encore
    Poziom 17  

    Niestety wygląda że jakość pomiaru ciśnienia jak podrzędnej jakości w tym czujniku.
    W tej chwili odczyt ze stacji meteo jest 999hPa a mój czujnik pokazuje 1022hPa.
    Za taką dokładność BMP085 to ja bardzo dziękuję.
    Być może to wpływ zerowego czynnika B2.
    Tak czy owak jestem bardzo rozczarowany tym czujnikiem.

  • #7 06 Cze 2011 14:55
    tmf
    Moderator Mikrokontrolery Projektowanie

    Skoro w nocie piszą, że jako kalibrator nie może być 0 ani 0xFFFF a ty odczytujesz takie wartości to znaczy, że coś jest nie tak. Dopóki nie dojedziesz co, to ja bym nie wyrokował o jakości tego przetwornika. Wg noty jest ona znacznie lepsza. Co do ciśnienia z meteo, to masz stację obok siebie?

  • #8 06 Cze 2011 15:13
    atom1477
    Poziom 43  

    To ja przy okazji o coś spytam.
    Czy po przeliczeniu otrzymujecie poprawne wartości ciśnienia?
    Bo ja mam kilka egzemplarzy takich czujników z rożnych źródeł (FutureElectronics, Robodudes) i każdy zachowuje się tak samo, czyli daje złe wyniki.
    Gdzieś naczytałem się na jakimś zagranicznym forum że winny jest algorytm przeliczający wartości. Że niby nie działa na prockach 8-mio bitowych z jakichś tam powodów (w co trudno mi uwierzyć, ale niby jak się źle napisze program (zasięgi zmiennych) to może tak być). Ale sprawdziłem to i na 32-bitowych prockach i jest to samo.
    Co więcej sprawdziłem obliczenia na piechotę na kartce i wychodzi mi taki sam (niepoprawny) wynik.
    Sprawdziłem też wartości zwracane przez czujnik i wydają mi się one poprawne (te kalibracyjne różnią się o max kilka % od tych podanych w przykładzie z datasheeta czujnika). Oczywiście żaden nie ma wartości 0x0000 czy 0xFFFF tylko tak jak piszę są równe mniej więcej tyle co ma przykładowy czujnik z datasheeta.
    Wyniki z tego co pamiętam są zaniżane o jakieś 70hPa czyli normalnie pokazuje mi około 930...940hPa.
    Na tym samym zagranicznym forum Bosch przyznał się do błędu w algorytmie i obiecał się tym zająć. Ale od tego czasu (czyli od kilku miesięcy) się nie odzywa a na stronie nie umieścił obiecanych poprawek.
    Temperatura jest obliczana poprawnie.
    Wiecie coś o tym?

  • #9 06 Cze 2011 15:34
    encore
    Poziom 17  

    tmf napisał:
    Skoro w nocie piszą, że jako kalibrator nie może być 0 ani 0xFFFF a ty odczytujesz takie wartości to znaczy, że coś jest nie tak. Dopóki nie dojedziesz co, to ja bym nie wyrokował o jakości tego przetwornika. Wg noty jest ona znacznie lepsza. Co do ciśnienia z meteo, to masz stację obok siebie?


    A co ja mogę dochodzić ?
    Moim zdaniem czujnik jest walnięty. innego wytłumaczenia nie widzę.

  • #10 06 Cze 2011 16:18
    tmf
    Moderator Mikrokontrolery Projektowanie

    Raczej walnięty jest twój protokół komunikacji.
    Atom: w którym miejscu jest ten błąd? Może samemu można dojść co i jak. Właśnie zamierzam z niego skorzystać przy okazji mini stacji meteo i trochę mnie zaniepokoiłeś. Co prawda mogę sobie go sam skalibrować, ale nie o to chodzi. Z kolei poczciwe MPX wymagają opampa i też cyrków z kalibracją z kolei toru analogowego, więc nie tędy droga. Próbowałeś wykorzystać gotowe kody, nie te z noty? Może ktoś już to poprawił w istniejących bibliotekach?

  • #11 06 Cze 2011 16:28
    MirekCz
    Poziom 35  

    Skoro we wszystkich danych niższa wartość jest zero to ewidentnie szwankuje Twoja komunikacja I2C. Zamiast odczytywać 2 bajty razem może przerób to na odczytywanie dwa razy pojedyńczego bajtu, bo to ewidentnie działa? Powinno rozwiązać problem.

  • #12 06 Cze 2011 17:20
    atom1477
    Poziom 43  

    Problem bardzo podobny do mojego (tutaj jest o wiele większy błąd) jest opisany tutaj:
    http://www.rcgroups.com/forums/showthread.php?t=1197534
    Niestety u mnie żadna z podanych metod obliczania wartości b3 nie działa (albo raczej działa, a błąd jest gdzie indziej).
    Stosowałem gotowe kody, kody napisane samodzielnie (również w innych językach, np. w Delphi), oraz ręczne obliczenia na kartce i zawsze dokładnie to samo. Więc błędy wynikające z błędów zaokrągleń odrzucam.
    "Bosch" (Dominik_Geisler) obiecał że się tym zajmie ale olali sobie to.
    Właśnie zauważyłem że wydali tylko jakiś dokument nawet zahaczający o ten temat:
    http://wmrx00.sourceforge.net/Arduino/BMP085-Calcs.pdf
    który jednak nie rozwiązuje problemu.

    PS. tmf: możesz zastosować MPXy z 5-tką albo 6-tką na początku (cyfrowego) oznaczenia: one mają już wbudowany wzmacniacz i kompensację temperaturową. Ale i tak będzie zabawa z kalibracją i wyjdzie to drożej jak BMP085 więc lepiej rozpracować temat z BMP085.

  • #13 06 Cze 2011 18:02
    tmf
    Moderator Mikrokontrolery Projektowanie

    No właśnie, takie MPXy mam, trochę swego czasu za to zapłaciłem, działają ok, ale wyjście analogowe mnie zniechęca. One są fajnie jeśli trzeba podłączyć np. wężyk z gazem, albo zrobić pomiar różnicowy. Natomiast do prostych pomiarów atmosferycznych to ten BMP mi bardzo pasuje. Jeśli błąd jest stały to można własny kalibrator wprowadzić. Bo jak rozumiem wyniki są powtarzalne, tylko różnią się o pewną wartość od prawidłowych? Ponieważ wg producenta te przetworniki są skalibrowane, więc taki własny kalibrator powinien być uniwersalny. No nic, nadejdzie na nie pora to powalczę.

  • #14 06 Cze 2011 18:19
    atom1477
    Poziom 43  

    W zasadzie to nie wiem czy jest stały.
    Przy około 1000hPa u mnie zaniża o około 70hPa. Ale jak będzie przy innych ciśnieniach, a co gorsza może i przy innych temperaturach, to nie wiem. Może to nie jest błąd przesunięcia tylko błąd skalowania. Albo jakiś nieliniowy błąd.
    W każdym razie ja nie mam siły do tego i czekam na gotowca :D
    I w żadnym wypadku nie jest to objaw mojego lenistwa. Po prostu samodzielne naprawianie błędnych wskazań czujnika amatorskimi protezami takimi jak dodawanie stałej do wyniku w moim dość odpowiedzialnym zastosowaniu nie może mieć miejsca. Muszę poczekać na oficjalne rozwiązanie twego problemu przez Boscha.

  • #15 06 Cze 2011 20:56
    encore
    Poziom 17  

    wychodzi na to że BMP085 to zwyczajny bubel.

    Znalazłem czujnik ciśnienia atmosferycznego firmy Sensortechnics czujnik serii HDI. Genialnie prosta obsługa.
    Niestety cena jest duża. BMP085 40zł a HDI 40 euro.

    Link

  • #16 06 Cze 2011 23:37
    MirekCz
    Poziom 35  

    hmm, jak składałem ostatnią partię (z której zresztą encore ma moduł) to wyniki były pomiędzy 1020 a 1024hPa (skrajnie, nie wiem jakie było rzeczywiste ciśnienie). To trochę większy błąd niż podaje producent, ale nie ma dramatu. Swoją drogą czujnik jest czuły na przegrzanie i jak ktoś nie uważa to całą kalibrację Boscha można wrzucić do kosza razem z czujnikiem.

    atom:Jak masz gotowy moduł z wyprowadzonymi liniami od BMP085 to możesz podrzucić. Podłącze pod moją płytkę i sprawdzę wyniki. Wiem, że tam są straszne "czary mary" ze zmiennymi (raz bez znaku, raz ze znakiem) i łatwo coś spieprzyć. W sumie mój moduł obliczeniowy w excelu nigdy nie robił tego poprawnie, bo gdzieś w 2/3 drogi miałem jakiś błąd, ale kod działa ok. Warto kod młócić tak długo aż przykład z datasheeta liczy poprawnie.

    encore: skoro nie czytasz połowy danych, bo niższy bajt z liczby 16bitowej jest zawsze zero, to może nie warto mówić o bublach u innych?

  • #17 07 Cze 2011 00:00
    encore
    Poziom 17  

    Może i młodszego bajtu nie czyta, ale czy to wina mojej komunikacji czy jednak producent coś niedorobił jak trzeba ?

    Mówisz że odczyty z partii są na poziomie 1020 i faktycznie mniej wiecej miałem na jednym czujniku taki odczyt. Tylko że jak sprawdzałem w wawie na stacji meteo politechniki warszawskiej to było w tym czasie 998hPa. To na prawdę źle świadczy o tych czujnikach. W dokumentacji wszystko wygląda znakomicie , doskonała dokładność, rozdzielczość, atrakcyjna cena. Rzeczywistość weryfikuje brutalnie papierowy marketing.
    Dla jasności nie zarzucam nikomu że sprzedaje kiepski towar. To jest moje starcie z tymi czujnikami, może źle coś robię, a może wszystko dobrze i wina nie jest po mojej stronie. Zostawiam na razie tą kwestie otwartą.
    Nie dziw się że jestem rozczarowany, kupiłem dwa czujniki i jeden moduł, parę ładnych złotych z kieszeni poszło i g.... z tego jest w tej chwili.
    Z wątku wynika że masa ludzi ma problem z tym czujnikiem. Popróbuję kombinacji z odczytem osobno bajtów, zobaczymy.

    nie rozumiem dlaczego podgrzanie miało by rozjeżdzać kalibrację. W tych obudowach w jakich jest czujnik pakowany podgrzewanie jest koniecznością żeby to przylutować.

  • #18 07 Cze 2011 00:18
    MirekCz
    Poziom 35  

    Nie mówiłem o podgrzaniu tylko przegrzaniu. Drobna acz ważna różnica ;)
    MEMSY składaj się z miniaturowej struktury, która pracuje. Nieodpowiednie podgrzanie (zbyt punktowe, zbyt gwałtowne lub zbyt duże) może odkształcić strukturę i koniec dokładnych pomiarów.

    Nie wiem kto i jakie ma problemy z tymi czujnikami. Z mojego doświadczenia dobrze traktowane czujniki działaja wg. specyfikacji. Twój przypadek jest dla mnie w tej chwili nieistotny, bo skoro komunikacja I2C nie działa to nie można mówić o problemach z czujnikiem, tylko najpierw trzeba poprawić komunikację i zrobić ponowne pomiary.

TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo