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

Czujnik ciśnienia HP02S - czy ktoś się kiedyś nim bawił

04 Sty 2010 18:55 14285 46
  • Poziom 9  
    Szukam osoby która kiedykolwiek miała do czynienia z czujnikiem ciśnienia HP02S firmy HopeRF. Mam problem z jego obsługą i raczej tylko osoba wtajemniczona będzie wiedziała o co chodzi.
  • Admin grupy Projektowanie
    Witam,
    nie ty jeden masz problemy z obsługą tego modułu HP02S (BAROMETER MODULE from Hope RF).

    Zapewne występuje problem z obliczeniem poprawnych wartości ciśnienia,
    na podstawie odczytanych D1 i T1.

    Proszę napisać więcej szczegółów na temat występującego problemu,
    oraz warunków pracy modułu,
    (napięcie zasilania, częstotliwość MCLK, opóźnienie dla konwersji)
    oraz odczytane parametry
    D0 T0 P0 S C,
    oraz odczytane wartości
    D1 i T1.
  • Poziom 9  
    O miło że ktoś jeszcze bawił się tym czujnikiem, bo na elektrodzie nic na ten temat nie umiałem znaleźć.

    Problem u mnie jest w samym podłączeniem, a konkretnie z pinem MCLK. W dokumentacji pisze że trzeba go podłączyć do rezonatora układu master i ma to być 32kHz. Problem w tym że moja ATmega32 chodzi na zegarze 3.57MHz. Nie chce w ciemno podłączać tego czujnika żeby go nie zepsuć.

    Napięcie zasilające cały układ to 3.3V.

    Wymiana rezonatora na 32kHz raczej nie wchodzi w grę, ponieważ potrzebuje mocy obliczeniowej. Mój projekt to taka stacja meteorologiczna. Ma czujnik temp ds18b20, wilgotności sht11 oraz rtc PCF8583 i do tego wyświetlacz z nokii.
    Wszystko już mi działa, tylko z tym nieszczęsnym czujnikiem mam problem.

    Próbowałem podpiąć ten czujnik pod rezonator kwarcowy PCF8583 który właśnie chodzi na tej częstotliwości ale gdy dochodzi do obsługi przez i2c to czujnik nic nie odpowiada, np wysyłam mu bajt danych (np adres) a on nie potwierdza tego sygnałem ack.

    W załączniku schemat mojego układu
  • Admin grupy Projektowanie
    W czym piszesz oprogramowanie ?

    Na początek odczytaj wartości D0 T0 P0 S C,
    to zwykła pamięć eeprom (zgodna z AT24C02)
    XCLR stan niski.
    zgodnie z pdf:
    HP02S
    wartości siedzą pod adresami:
    D0(MSB:LSB) (02:03)
    T0(MSB:LSB) (04:05)
    P0(MSB:LSB) (06:07)
    S(MSB:LSB) (08:09)
    C(MSB:LSB) (0A:0B)

    Jeżeli to się uda będzie można przeprowadzić próbę
    z odczytem D1 T1 (str. 4 pdf)

    Dla odczytu wartości z EEPROM
    i2cstart
    i2cwrite 160
    i2cwrite adres
    i2sctart
    i2cwrite 161
    i2cread MSB ack
    i2cread LSB nonack
    i2cstop
    zgodnie z
    AT24C02

    HP02S jest dobrze podłączony ?
    (patrząc od góry gdy kopuła czujnika skierowana do patrzącego,
    a wyprowadzenia po prawej stronie,
    górny pin to masa)
  • Poziom 9  
    Ok, dane współczynników z EEPROMu odczytałem i wartości są podobne do tych z przykładu. Także chyba to jest ok.

    Jeśli chodzi o odczyt temperatury/ciśnienia to cała sekwencja działa jak w datasheecie (xCLR trzeba było zmienić na stan wysoki), jednak odczytana wartość to 0x00 w obu przypadkach. Poniżej kod:

    Code:

       LcdInit();
       i2c_init();
       LcdClear();

               // xCLR -> PC4
       DDRC |= _BV(4);   
       PORTC |= _BV(4);   // xCLR ustawiony na wysoki

       unsigned char msb, lsb;

       i2c_start();
       i2c_sendData( 0xEE );
       i2c_sendData( 0xFF );
       i2c_sendData( 0xE8 );
       i2c_stop();

       _delay_ms(50);   // conamniej 38ms

       i2c_start();
       i2c_sendData( 0xEE );
       i2c_sendData( 0xFD );
       i2c_start();
       i2c_sendData( 0xEF );
       msb = i2c_readData( ACK );
       lsb = i2c_readData( NACK );
       i2c_stop();

       LcdClear();
       LcdPrintBinary(msb);
       LcdPrintBinary(lsb);


    Aha, programuje w AVRStudio 4.16 (winavr), oczywiście w C.

    Co do kwestii tej wartości zerowej ciśnienia to tak to wygląda jakby w ogóle czujnik nie przeprowadzał konwersji. Może ten sygnał MCLK który podłączyłem do rezonatora RTC nie działa tak jak powinien. W ogóle na Twoje oko to podłączenie wygląda dobrze?
    Generalnie zastanawia mnie po co ten MCLK jest. Czy tylko jest potrzebny do konwersji A/D?
  • Poziom 9  
    D0 = 24611
    T0 = 33456
    P0 = 10077
    S = 192
    C = 275
  • Admin grupy Projektowanie
    Spróbuj dać większe opóźnienie na konwersję,
    czujnik zwraca zero gdy nie ma taktowania lub
    amplituda sygnału zegarowego jest zbyt mała.

    32khz możnaby pozyskać z generatora uP 3.5Mhz,
    możnaby wykorzystać timer pracujący w trybie porównywania,
    i sterującego końcówką portu (np. OC1A).

    Ew, możnaby jakąś bramkę shmita włączyć po między zegar
    32KHz z RTC a HP02S,
    masz oscyloskop ?

    W moim przypadku współczynniki podczas testów wynosiły:
    D0 24856
    T0 32666
    Po 10060
    S198
    C 256
    Czyli całkiem zbliżone jednak nieco odległe od pdf.
    W efekcie po odczytaniu D1 i T1 po wyliczeniu ciśnienia,
    wychodziły jakieś niewiarygodne wartości.

    Komercyjny projekt obył się naszczęście bez tego czujnika,
    i został mi on do testów.

    Jestem w kontakcie z inżynierami z Chin,
    (swoją drogą doskonały support)
    pracują nad rozwiązaniem.

    Jestem ciekaw jakie wartości D1 i T1 otrzymasz,
    w zasadzie do testu możnaby podać taktowanie,
    z generatora RC np. na bramce NAND.
  • Poziom 9  
    Dobra coś jest :)
    Podłączyłem ten MCLK po prostu do portu i w momencie kiedy tam jest to opóźnienie odpalam funkcję która generuje na tym pinie sygnał ok 30kHz. Sygnał ten trwa gdzieś 300ms.

    Wartości które otrzymałem to:
    D1 = 24063
    T1 = 33182

    Po podstawieniu do wzoru i wyliczeniu otrzymuję że ciśnienie wynosi 985hPa.
    Nie mam barometru żeby to sprawdzić ale na ICMie dla mojej miejscowości niby jest ok 1010hPa. Te Twoje rozbieżności były podobne czy dużo większe?

    Aha, jeszcze jedno te współczynniki D0, T0, P0, S, C to są stałe charakterystyczne dla danego czujnika?
  • Poziom 9  
    Problem teraz mam taki że gdy z powrotem podepnę RTC PCF8583 to chyba jakaś kolizja występuje bo wartość ciśnienia wtedy jest kompletnie nieprawdziwa. RTC jest w tej chwili tylko podpięty do lini i2c, powyłączałem wszelkie funkcje które z tego czujnika korzystają.
    Podobna sytuacja była kiedy pierwszy raz podpiąłem czujnik ciśnienia, wtedy problem był z odczytaniem danych z RTC.
    Nie bardzo wiem czy to problem z obsługą i2c, czy coś z tymi scalakami.
  • Admin grupy Projektowanie
    Współczynniki są zapisane na stałe i są wpisane
    na etapie produkcji.

    Odchyłki w ciśnieniu wynosiły 20-30hpa.

    Sposób obliczania ciśnienia jest dość skomplikowany,
    jak na możliwości 8bit.

    Co do zakłóceń, może czujnik generuje jakieś nie kontolowane ACK,
    podczas pisania na RTC.
  • Poziom 9  
    Dobra wszystko już działa jak należy. Co do problemów z i2c to zapomniałem że przecież RTC PCF8583 ma taki sam adres jak EEPROM z HP02S. Wystarczyło zmienić adres RTC i śmiga aż miło.

    Jeśli chodzi o dokładność pomiarów to rozwiązanie problemu (przynajmniej u mnie) jest dość śmieszne.

    Na początku zdefiniowałem te współczynniki jako unsigned int i źle mierzył.

    W sumie przez przypadek zamieniłem je później na:
    Code:

    #define D0 24611
    #define T0 33456
    #define P0 10077
    #define S 192
    #define C 275

    i czujnik nagle zaczął pokazywać poprawne ciśnienie (pokrywa się z tym na ICMie).
    Inna ciekawa sprawa jest taka, że dwa pierwsze współczynniki nagle pokazują inną wartość niż poprzednio, tak jakby eeprom szlag trafil. Zostawiłem jednak stare wartości.
    Wczoraj sprawdziłem jeszcze raz różnice pomiędzy tymi sposobami definiowania współczynników i faktycznie jest różnica.
  • Poziom 9  
    Witam,
    ja także mierze się z budową prostej stacji pogodowej i w swoim projekcie stosuje czujnik HP03S. Jeśli chodzi o uzyskiwany wynik pomiaru ciśnienia to jest on faktycznie około 20 hpa mniejszy od tego w serwisach pogodowych jednak jest to moim zdaniem związane z tym, że czujnik mierzy ciśnienie absolutne w określonej lokalizacji zaś na serwisach pogodowych zazwyczaj jest podawane ciśnienie uśrednione do poziomu morza. Po zastosowaniu odpowiedniego wzoru przeliczeniowego moje pomiary są w miarę prawidłowe. Drugą sprawą o której warto wspomnieć to to, że ciśnienie powiązane w obliczeniach jest z temperaturą zatem jeśli mierzymy je przy temperaturze pokojowej to będzie ono inne niż na dworze przy temperaturze 0 stopni C.
    Pozdrawiam Andrzej.
  • Poziom 9  
    No właśnie u mnie był taki problem że pokazywał pomiar o ok 20hPa wiekszy od tego na ICM, co oczywiście jest bzdurą. A teraz właśnie pokazuje o kilka hPa mniejsze, więc wydaje się być poprawne. Niestety nie mam barometru żeby to zweryfikować.
  • Admin grupy Projektowanie
  • Poziom 2  
    Jako, że moj post zostal usuniety, a komentarz do niego nie pozwolil mi rozwiazac problemu zwracam sie z prosba o mozliwość podania wzoru na obliczenie temperatury z czujnika HP02S. W dokumentacji podany jest tylko krok 1, gdzie obliczamy tylko wartosc dUP, dUT oraz P, a nie jest nic wspomniane na temat temperatury a jest to dla mnie bardzo wazne. Z gory dziekuje za pomoc
  • Poziom 11  
    Z not katalogowych wynika, że czujnik HP02S nie ma możliwości pomiaru temperatury. Możliwość tą dają czujniki HP03.
    Czy komuś udało się uzyskać za pomocą tego układu jakieś sensowne - w miarę dokładne pomiary ciśnienia?
  • Poziom 2  
    Hmm no wlasnie zakupilem ten czujnik w sklepie internetowym Seguro http://www.seguro.pl/sklep/?zobacz=5112&producent= i na ich stronie w opisie znajdowalo sie, że umożliwia pomiar temperatury dlatego bylem bardzo zdziwiony, gdy nie znalazlem zadnej wzmianki o tym w karcie katalogowej... no trudno w takim razie, dzieki za informacje

    ps. tylko dziwne jest to, że odczytujac wspolczynnik T1, reaguje on na zmiany temperatury... rowniez dziwne jest to ze w pamieci EPROM czujnika znajduja sie wspolczynniki dla HP02s oraz HP03S...
  • Admin grupy Projektowanie
    Temperatura bierze udział w kompensacji ciśnienia lecz wygląda na to że nie jest jawnie wyprowadzona w wynikach pomiaru.

    Wyniki pomiarów HP02S są stabilne i zmieniają się wraz ze zmieniającym się ciśnieniem,
    występują przesunięcia omówione wcześniej, ostatecznie doszliśmy do wniosku że odpowiada za nie wysokość.

    Po współpracy z HopeRF pojawił się pdf z stycznia tego roku, poprawione w nim zostały drobne literówki.
  • Poziom 14  
    Witam.
    Czy ktoś z szanownych kolegów mógłby podzielić się "kawałkiem" kodu umożliwiającym przeliczanie T1 i D1 na P?

    Męczę się już trochę i na razie same bzdury wychodzą. Wartości odczytane są mniej więcej ok, excel liczy relatywnie dobrze (wynik porównuję z odczytem z taniego cyfrowego kompasu z barometrem), jednak kiedy próbuję "wyprintować" przeliczoną wartość z procka na uart nijak się to ma do rzeczywistej wartości.

    Być może mam problem w samym kodzie?.
    Proszę o pomoc.
    Code:

    unsigned int D1=0;
    unsigned int T1=0;
    int P0=0;
    float DUT, DUP;

      DUP=D1-27104;
      DUT=(29*(T1-33090)/50-(T1-33090)^2/76666)*201/285;
     
     

      P0=(unsigned int)(10077+100*(DUP+DUT)/285);

      sprintf(txt, "p=0x%x\r\n", P0);
      Tx(txt);
  • Poziom 1  
    Witam,
    Sam to napisałem na podstawie noty katalogowej, nie chce mi się wygładzać( bo działa)
    Code:


    int liczPT(float C1,float C2,float C3,float C4,float C5,float C6,float C7,char A, char B, char C,char D,unsigned int D1,unsigned int D2)

    // Funkcja liczPT oblicza cisnienie(P) i temperaturę (T)  pomnożone przez 10,

    {char j;
    int T;
    long int OFF,SENS;
    float fdUT;
    float p1, p2;
    float p3=1;
    long int X, dUT;
    //D2>=C5 dUT= D2-C5 - ((D2-C5)/2^7) * ((D2-C5)/2^7) * A / 2^C
    //D2 < C5 dUT= D2-C5 - ((D2-C5)/2^7) * ((D2-C5)/2^7) * B / 2^C

    //fdUT=D2-C5-((D2-C5)/128)*((D2-C5)/128)*B/2^C;
    if(D2>=C5) fdUT=((D2-C5)/128)*((D2-C5)/128)*A;
    else       fdUT=((D2-C5)/128)*((D2-C5)/128)*B;

    for(j=1;j<=C;j++)
    fdUT=fdUT/2;

    fdUT=D2-C5-fdUT;
    dUT=fdUT;
    OFF=(C2+((C4-1024)*dUT)/16384)*4;
    SENS=C1+C3*dUT/1024;
    X=SENS*(D1-7168)/16384-OFF;

    P=(X*10)/32+C7;
    p1=fdUT/256;
    p2=C6/256;
    for(j=1;j<=D;j++)
    p3=p3*2;
    p3=fdUT/p3;

    T = 250+(p1*p2-p3);
    return(T); // int P trzeba zadeklarować jako zmienną globalną
  • Poziom 11  
    Witam,
    Mam czujnik HP03A, który zakupiłem w sklepie internetowym seguro.pl. Odczytałem wartości współczynników kalibracji z pamięci eeprom czujnika i otrzymałem następujące wartości:

    #define C1 20596
    #define C2 3086
    #define C3 339
    #define C4 531
    #define C5 24134
    #define C6 6237
    #define C7 2372
    #define A 7
    #define B 21
    #define C 6
    #define D 9

    Są to zbliżone wartości podane w nocie katalogowej.
    Problem polega na odczytaniu wartości z przetwornika ADC czujnika:
    D1= 24461
    D2=-29590

    Współczynnik D1 wykorzystywany jest do obliczania wartości ciśnienia, a D2 do obliczenia temperatury. Szczególnie dziwna jest minusowa wartość D1. Ktoś może wie z czego to wynika?? Czy długość przewodów łączących czujnik z up ma wpływ na odebraną wartość?


    P.S. Czujnik podłączony jest do Atmega8 i zasilany jest napięciem 3,3V, kwarc zewnętrzny 8MHz. Sygnał 32kHz na nóżkę MCLK czujnika podaję z uP przy ustawieniach Timera2:
    TCCR2= 1<<WGM21 | 1<<COM20 | 1<<CS20;
    OCR2=128;
  • Admin grupy Projektowanie
    Czy zostawiasz czas na zakończenie konwersji ?
    Czy ujemne wartości nie są błędem interpretacji odczytanych danych ?

    Skoro wartości odczytane z eeprom są zgodne z notą,
    problem jest pewnie na etapie konwersji A/D,
    lub ew. interpretacji odczytanych danych.

    Przewody nie mają raczej wpływu skoro wartości z eeprom są ok,
    wpływ mogłoby mieć zasilanie o bardzo kiepskich parametrach (zakłócenia).
  • Poziom 9  
    Wrzucam moje kody do obsługi czujnika hp02s. Generalnie czujnik mierzy dość dokładnie ciśnienie. Na czujniku mam 1013 hPa, a wg lotniska w Pyrzowicach (niedaleko) 1015 hPa.
    Jedyny problem jest taki (ale to nie wina czujnika), że chyba obliczenia są zbyt spore jak na atmege32. Procek wylicza poprawny pomiar w przedziale 990hPa - 1024hPa. Gdy jest juz 1025 to pomiar 'przekręca' się na 990. Gdy ma być 989 to znowu to samo, przeskok jest na 1025. Jak w liczniku samochodowym ;)
    Jak komuś uda się to poprawić to może wrzucić kody na forum dla potomnych :)
  • Poziom 17  
    Jak chcecie prawdziwe czujniki cisnienia a nie zabawki to polecam czujniki firmy Sensortechnics z serii HDI. Link

    Używam obecnie 2 takie czujniki, sterowane są przez magistrale I2C. Odczyt ciśnienia sprowadza się do pobrania 2 bajtów z czujnika i to wszystko. Ciśnienie to po prostu złożenie obu bajtów w słowo typu int. Programowo dosłownie kilka linijek. Możliwy jest zakup przez internet. Po zamówieniu miałem te czujniki u siebie na biurku po 2-3 dniach, byłem w szoku że tak szybko, liczyłem na tydzień albo dwa.
  • Poziom 14  
    Witam
    wszystko pięknie fajnie, link godny zapamiętania tylko trochę szkoda mi zwielokrotniać koszt całości 1 czujnikiem.

    Wszystko zależy do czego kto potrzebuje, jeśli dokładność i stabilność jest krytyczna to oczywiście, ale w moim przypadku amatorskiej stacji meteo gdzie istotne są głównie różnice ciśnienia jego zmiany chyba nie ma sensu aż tak inwestować

    pozdrawiam
  • Poziom 10  
    Witam Wszystkich
    Obecnie bawię się HP02s i muszę powiedzieć, że trochę się namęczyłem.
    Pierwszym problemem był opis podłączeń w opisach. Brak rezystorów polaryzujących zwieszał komunikację - jednak są potrzebne!

    Kolejną zagadką były typy danych, ja mam:
    Dim D As Word (0-65535)
    Dim T As Word
    Dim D0 As Word
    Dim T0 As Word
    Dim P0 As Word
    Dim S As Word
    Dim C As Word
    Dim dUP As Single
    Dim dUT As Single
    Dim Tt1 As Single - zmienne pomocnicze
    Dim Tt2 As Single - zmienne pomocnicze
    Dim Cisnienie As Single

    [W końcu po bojach odpaliłem i chodzi.]
    Wreszcie układ uruchomiłem i działa.
    Co do dokładności, to [różnice] wskazania mam o jakieś 3 - 6hPa zaniżone.
    Jak sprawdziłem? Proste - zadzwoniłem do stacji metrologicznej i poprosiłem o aktualne dane (ciśnienie bezwzględne - to, które wskazuje barometr i wysokość npm, na jakiej jest stacja). Ponieważ mój czujnik jest na innej wysokości, musiałem przeliczyć wskazanie: 192m (stacja) - 162m (ja - średnie wskazanie z GPS) = 30m niżej, wiec poprawkę dodaję, a poprawka to jakieś 1hPa na 8,5m.
    Niestety, GPS [daje] wprowadza błędy, sam czujnik ma [błędy] określoną dokładność i stąd [to pływanie] różnice.

    [To tyle z moich wypocin na temat barometru.] Takie są dotychczasowe efekty mojej pracy. Teraz myślę [jak to pozbierać i zrobić coś fajnego] nad ostateczną wersją urządzenia (jakiś wyświetlacz graficzny itd.).

    Czekam na krytyczne uwagi.
    Pozdrawiam
    Sławek.

    Moderowany przez prezeswal:

    Poprawki autora były niewystarczające, swoje - pogrubiłem.
    W przyszłości proszę nie usuwać uwag moderatora, w odpowiednim momencie on sam to uczyni.

  • Poziom 10  
    Witam kolegow
    Czy mieliscie problemy z komunikacja I2C tego przetwornika?

    Odczyt pamieci u mnie przebiega bez problemu natomiast mam problem z uzyskaniem potwierdzenia (ACK) z samego przetwornika.
    Wysylam:
    Start (I2C)
    0xEE (przetwornik potwierdza ACK)
    0xFF (przetwornik nie wysyla potwierdzenia)
    0xF0 (przetwornik potwierdza ACK)
    Stop (I2C)
    Start (I2C)
    0xEE (przetwornik potwierdza ACK)
    0xFD (przetwornik nie wysyla potwierdzenia)
    Start(I2C)
    0xEF (przetwornik nie wysyla potwierdzenia

    Czy brak potwierdzenia przy wysylaniu bajtu 0xFF oraz 0xFD jest normalny?
    Dlaczego po wyslaniu adresu ukladu do odczytu nie pojawia mi sie sygnal ACK?
    Czy mieliscie podobne problemy?
  • Admin grupy Projektowanie
  • Poziom 10  
    Witam
    Komunikacja z pamiecia sadze ze odbywa sie bez problemu, odczytane wartosci:
    HEX DEC
    C1 - 0x551C - 21788
    C2 - 0x0DC8 - 3528
    C3 - 0x0161 - 353
    C4 - 0x01D2 - 466
    C5 - 0x750E - 29966
    C6 - 0x19E1 - 6625
    C7 - 0x09C4 - 2500
    A - 0x07 - 7
    B - 0x15 - 21
    C - 0x06 - 6
    D - 0x09 - 9
    D1 - 0x89FF - 35327
    D2 - 0x7507 - 29959
    Odczyty z pamieci eeprom (C1 ... D) sa niezalezne od czestotliwosci lini SCL, nie ma roznicy czy linia jest taktowana 100 kHz czy np. mniejsza czestotliwoscia. Odczyt za kazdym razem jest poprawny. Natomiast odczyt D1 i D2 jest mozliwy tylko po zmniejszeniu zegara SCL do okolo 2,5 kHz. Pomimo zmniejszenia czestotliwosci zegara nie otrzymuje w odpowiednich miejscach sygnalow potwierdzenia (ACK) z przetwornika. Sprawdzalem recznie (wystawianie odpowiednich sygnalow na linie SCL i SDA z "reki"). Zwrocilem jeszcze uwage ze jesli zmniejsze czestotliwosc taktowania przetwornika ADC z 33kHz (wedlug producenta zakres od 30 do 35 kHz) na np 10kHz to musze rowniez zmniejszyc czestotliwosc lini SCL gdyz odczyt D1 i D2 jest nie poprawny tzn. na miejscu D1 pojawia sie odczyt z D2 i na odwrot. Jesli nie sprawdzam ACK to odczytuje wartosci D1 i D2 j/w.

    Pozdrawiam
    Grzegorz