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.

Jak porawić parametry żyroskopu L3G4200D

12 Lis 2011 14:01 3734 17
  • Poziom 12  
    Chcę zrobić czujnik mierzący przechylenia wykorzystując właśnie powyższy żyroskop. Jednakże mam Problem z "crosstalk-ami" pomiędzy dwoma osiami tego czujnika (X i Y). Ponieważ stworzyłem program który ma mi pomóc w uruchomieniu tego czujnika to wesprę się wykresami jakie udało mi się wygenerować.
    Testy robiłem nie profesjonalnie (ręką ;D) ale powrót do pozycji początkowej dla osi X i Y jest zagwarantowany z dokładnością do +/-1 stopnia (blat stołu). Z osią Z może być gorzej ale starałem się jak mogłem. Dodam że prędkość kątową całkuję w mikro-kontrolerze z częstotliwością 100hz. Nie z całkowane dane wysyłam żeby lepiej móc zaobserwować co się dzieje.

    Tak zmienia się kąt gdy obracam mój czujnik względem osi X:

    Jak porawić parametry żyroskopu L3G4200D

    Nie przetworzone dane podczas tego obrotu:

    Jak porawić parametry żyroskopu L3G4200D

    Tak zmienia się kąt gdy obracam mój czujnik względem osi Y:

    Jak porawić parametry żyroskopu L3G4200D

    Nie przetworzone dane podczas tego obrotu:

    Jak porawić parametry żyroskopu L3G4200D

    A tutaj podły efekt nie występuje(Oś X):

    Jak porawić parametry żyroskopu L3G4200D

    Nie przetworzone dane podczas tego obrotu:

    Jak porawić parametry żyroskopu L3G4200D


    Nie za bardzo wiem co powoduje te błędy. Domyślam się że osi pomiarowe tego czujnika mogą nie być ułożone dokładnie pod kątem 90 stopni.
    Proszę was o pomoc w identyfikacji problemu?
    I co ważniejsze proszę o zaproponowanie co mogę zrobić z tym fantem. Oczywiście nie liczę na gotowe rozwiązania ale na jakieś podpowiedzi czy linki.
  • VIP Zasłużony dla elektroda
    Kolega napisał pracę na ten temat: rab.ict.pwr.wroc.pl/~mw/Stud/Dypl/ltulacz/praca_naw_ins.pdf

    Generalnie - sam żyroskop to będzie mało.
  • Poziom 12  
    McRancor napisał:
    Kolega napisał pracę na ten temat: rab.ict.pwr.wroc.pl/~mw/Stud/Dypl/ltulacz/praca_naw_ins.pdf

    Generalnie - sam żyroskop to będzie mało.


    Dzięki za linka na pewno się przyda. Ale niestety nie mogę znaleźć w tej pracy odpowiedzi na pytanie jak poprawić właśnie taki błąd który chyba wynika z błędnej konstrukcji żyroskopu.
  • Poziom 35  
    Tam jest crosstalk, temperatura, wpływ przyśpieszenia itd. Na samym żyroskopie nie masz szans tego zrobić.
    Jak na ciało nie działają przyśpieszenia to idealnie sprawdzi się sam akcelerometr. Jak działają przyśpieszenia to fuzja akcelerometr/żyroskop.
    Bez akcelerometra zapomnij o sensownych wynikach.
  • Poziom 12  
    Mam Akcelerometr i Magnetometr ale tu chodzi mi o coś innego. Chodzi o to że dla osi Z uzyskuję bardzo dobre wyniki A Oś X i Y jakoś wpływa na siebie. I tu jest problem ja wiem że nie będę miał idealnie zera po jakimś czasie ale tutaj błąd jest ewidentnie za duży (po kilku obrotach na osi X pojawia się błąd rzędu 10 stopni na osi Y) sam ruch trwa mniej niż 10s a taki błąd po takim krótkim ruch w zasadzie stawia pod znakiem zapytania sens używania tego żyroskopu. Więc proszę powiedzcie jeśli używaliście innych żyroskopów trój osiowych czy natknęliście się na podobne problemy i ewentualnie czy wiecie jak można taki problem rozwiązać. Udało mi się znaleźć w internecie że chyba chodzi o "axis misalignment". Ale nie bardzo mogę znaleźć sposób poprawy odczytów.
  • Poziom 21  
    Do czujnika przechylenia sam żyroskop nie wystarczy - tanie żyroskopy pływają - musisz dodać akcelerometry jak koledzy pisali. Moim zdaniem całkowanie z f=100Hz to trochę za mało - ten żyroskop może chyba produkować dane z 800Hz.
    Bawiłem się kiedyś żyroskopami Analog Device i całkowałem z f=1kHz. Uzyskiwałem błąd ok 1stopień na kilkanaście sekund

    Powodzenia
  • Poziom 35  
    1. Można to poprawić przy odpowiedniej matrycy przeliczającej dane, ale do tego musisz mieć bardzo precyzyjną kalibrację.

    2. Pamiętaj, że zanim zrobisz 10 obrotów dookoła osi x to dane będą cały czas korygowane przez akcelerometr/magnetometr, więc wyjście innej osi będzie Tobie płynąć dużo mniej.
  • Poziom 12  
    Po pierwsze wydaje mi się ze jest tu coś nie tak i raczej nie możliwe że jest to problem z moim programem bo dane dla 3 osi odczytuje jednym ciągiem.
    Jeśli obracam czujnik względem osi Z to pozostałe zachowują się stabilnie jednak gdy zaczynam obracać wokół osi X czy Y to pojawia się tu bardzo duży dryf jak dla mnie nie jest to normalne.
    Więc może inaczej może ktoś kto korzystał z tego żyroskopu może mi powiedzieć czy miał podobny problem może posiadam wadliwą sztukę i powianiem reklamować to cacko.
    Naprawdę nie wydaje mi się to normalne że po 8 sekundach pracy w w miarę dogodnych warunkach (małe drgania obroty niezbyt szybkie) zero odjeżdża ponad 10 stopni ale niestety nie wiem za bardzo czym może być to spowodowane.
  • Poziom 21  
    A nie jest tak, że obracając wokół x i y trzymasz układ w ręku a wokół z szurasz po stole?
  • Poziom 12  
    Piotr Piechota napisał:
    A nie jest tak, że obracając wokół x i y trzymasz układ w ręku a wokół z szurasz po stole?


    Jest A coś to zmienia?
    Pozycja początkowa jest zawsze na stole równolegle do krawędzi więc powinno wracać do tego samego miejsca.
  • Poziom 35  
    Kuba, ale Ty skalibrowałeś ten żyroskop przed pomiarami czy nie?
    Jak nie skalibrowałeś to rozrzut produkcyjny jest ogromny, więc tak będzie zawsze.
    Jak skalibrowałeś to sprawdź jak się zachowuje po chwili. One też są czułe na temperaturę i chwilę po uruchomieniu będzie inny drift niż po chwili działania jak się układ ustabilizuje.

    Mam moduły z tymi układami w sprzedaży więc jak chcesz to mogę zrobić jakiś test na innym układzie i podesłać wyniki.
  • Poziom 21  
    Przymocuj żyroskop do ciężkiej 'kostki' i spróbuj obracać szurając bo bokach tej kostki. Myślę że żyroskop na lekkiej płytce trzymany w rękach drga na tyle szybko, że całkowanie prędkości kątowej z f=100Hz jest zbyt wolne (ma bardzo mały moment bezwładności).

    Powodzenia
  • Poziom 12  
    MirekCz napisał:
    Kuba, ale Ty skalibrowałeś ten żyroskop przed pomiarami czy nie?
    Jak nie skalibrowałeś to rozrzut produkcyjny jest ogromny, więc tak będzie zawsze.
    Jak skalibrowałeś to sprawdź jak się zachowuje po chwili. One też są czułe na temperaturę i chwilę po uruchomieniu będzie inny drift niż po chwili działania jak się układ ustabilizuje.

    Mam moduły z tymi układami w sprzedaży więc jak chcesz to mogę zrobić jakiś test na innym układzie i podesłać wyniki.


    Bardzo miła propozycja ale w sumie to nie za bardzo wiem jak mógłbyś te testy przeprowadzić. A i tak na razie muszę ujarzmić ten żyroskop może później będę się zastanawiał nad innymi.


    Piotr Piechota napisał:
    Przymocuj żyroskop do ciężkiej 'kostki' i spróbuj obracać szurając bo bokach tej kostki. Myślę że żyroskop na lekkiej płytce trzymany w rękach drga na tyle szybko, że całkowanie prędkości kątowej z f=100Hz jest zbyt wolne (ma bardzo mały moment bezwładności).

    Powodzenia


    Muszę powiedzieć że masz rację nie bardzo zrozumiałem motyw z ciężką kostką. Ale zrobiłem podobne testy dla osi X i Y jak dla z (przyłożyłem moduł do pionowej szafki heh) I one wyszły bardzo dobrze. Więc pewnie problemem jest właśnie to drganie ręki o którym mówiłeś lub całkowanie małych prędkości ponieważ na początku robiłem wszystko tylko w jednej płaszczyźnie i aby zmniejszyć wpływ szumów podzieliłem sobie wyjście żyroskopu przez 32 co tutaj chyba ma właśnie nie bagatelny wpływ. Teraz uważam że muszę obejść się bez dzielenia jednak gdy nie dzielę to kąt mi ucieka w miarę szybko więc na pewno będę musiał uruchomić filtry cyfrowe które ten żyroskop posiada.
    I tu mam pytanie.
    Jak dobrać filtr górno-przepustowy do żyroskopu bo zauważyłem że zbyt duża częstotliwość odcinająca(8Hz) psuje pomiary co jest jasne. Ale o dziwo mała częstotliwość odcinająca (0.01HZ)która powinna wpłynąć bardzo mało na wynik ma jakby efekt ładowania. Czyli po zaprzestaniu ruchu prędkość kątowa zmniejsza się w miarę powoli. Nie za bardzo znam się na filtrowaniu danych ale zawsze rozumiałem filtr górno-przepustowy jako obcinający stałą DC.
    Czemu pojawia się tu ten efekt ładowania?
    Jak dobrać tą częstotliwość na przykłąd do maksymalnej i minimalnej szybkości kątowej?
    Czy jest jakiś sposób na dobranie filtru dolno-przepustowego na podstawie obliczeń czy powinienem to zrobić doświadczalnie?
  • VIP Zasłużony dla elektroda
    Jest możliwość filtrowania i to trochę poprawi sytuację - wszystkie te informacje znajdziesz w pracy do której podałem linka w drugim poście.
  • Poziom 9  
    Prosiłbym autora tematu o udostępnienie fragmentu kodu gdzie nastepuje konwersja wynikow otrzymanych z żyroskopu. Sam zajmuje sie tym czujnikiem i od kilku dni nie moge znaleźć przyczyny błędnych pomiarów.
  • Poziom 12  
    dawidste napisał:
    Prosiłbym autora tematu o udostępnienie fragmentu kodu gdzie nastepuje konwersja wynikow otrzymanych z żyroskopu. Sam zajmuje sie tym czujnikiem i od kilku dni nie moge znaleźć przyczyny błędnych pomiarów.

    Odbierasz dwa bajty i żeby je skleić wystarczy zrobić coś takiego:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Nie wiem czy zmieniałeś zakres tego czujnika w rejestrze CTRL_REG4. Jeśli nie to to domyślna wartość to 2000dps. Czyli żeby otrzymać wartość w jednostkach fizycznych po prostu podziel przez to.
  • Poziom 9  
    Dziękuje za szybką odpowiedź.
    Wyniki jakie otrzymuję pochodza z kosmosu. Nie wiem co robię źle.
    Cytat:

    11 <-----temperatura
    155 76 -243 <---------X,Y,Z
    11
    -42 144 -18
    11
    200 201 -1554
    11
    648 11 1187
    11
    469 52 587
    11
    377 30 -496
    11
    -315 1009 -4494
    11
    153 213 -661
    11
    166 67 -6
    12
    587 -7 1298
    12
    232 -60 -10
    11
    -386 403 389
    11
    467 -184 183
    12


    Nie ważne czy ruszam czujnikiem czy tez nie wartości w żaden sposób tego nie odzwierciedlaja.

    Oto fragment kodu gdzie odczytuje dane z żyroskopu.
    Code:

       TWIstart();
       TWIwrite(ITGWriteAddress);
       TWIwrite(0xa8);
       TWIstart();
       TWIwrite(ITGReadAddress);
       unsigned char axh = i2c_read_byte();
       unsigned char axl = i2c_read_byte();
       unsigned char ayh = i2c_read_byte();
       unsigned char ayl = i2c_read_byte();
       unsigned char azh = i2c_read_byte();
       unsigned char azl = i2c_read_last_byte();

       TWIstop();

       
       TWIstart();
       TWIwrite(ITGWriteAddress);
       TWIwrite(0x26);
       TWIstart();
       TWIwrite(ITGReadAddress);

       unsigned char temperature=i2c_read_last_byte();

       TWIstop();

       int ax = axh << 8 | axl;
       int ay = ayh << 8 | ayl;
       int az = azh << 8 | azl;
       char buff[50];
          char buff1[20];
       sprintf(buff,"%i\t%i\t%i\r\n",ax,ay,az);
       
       sprintf(buff1,"%i\r\n",temperature);

       My_Print(buff);
       My_Print(buff1);


    Co jest dla mnie zagadką to odczyt temperatury nie "pływa". Zawiera się w przedziale 11-13. Odczyt z żyroskopu przyjmuje wszystkie możliwe wartości.
  • Poziom 12  
    Odczytaj jakiś register którego wartość znasz na przykład: Who_Am_I. Jeśli to Ci źle działa to musisz mieć coś zrypane w SPI lub nie działa żyroskop.