logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATmega8][C][MPU6050] - Brak reakcji układu MPU6050 na zmiany położenia

ulumulu 01 Paź 2013 17:12 3906 4
  • #1 12797723
    ulumulu
    Poziom 10  
    Witam.
    Kilka dni temu zakupiłem moduł 3-osiowy akcelerometr i 3-osiowy żyroskop MPU-6050 (6 DOF). Połączenie przez interfejs I2C działa, bo mogę zapisywać i odczytywać stany rejestrów z niego. Moim problemem jest inicjalizacja tego układu. Po przeczytaniu artykułu
    http://playground.arduino.cc/Main/MPU-6050
    oraz
    https://www.elektroda.pl/rtvforum/topic2602993.html#12492860
    wywnioskowałem że rejestr PWR_MGMT_1 wystarczy zapisać wartością 0x00 (wyzerować bit SLEEP). Po podłączeniu zasilania odczytałem wartość z tego rejestru i wynosił 0b01100000, więc wczytałem do niej 0x00, ale po tej czynności układ był cały czas w stanie RESET (0b10000000). Nie wiem czy coś jest z wewnętrznym oscylatorem 8MHz? Po wyborze innego zegara, układ już nie pozostawał w RESECIE, ale wartości z rejestrów ACCEL_XOUT... tak samo jak i GYRO_XOUT zawsze miały wartość 0x80, niezależnie od zmian położenia.
    W nocie katalogowej
    http://www.invensense.com/mems/gyro/documents/RM-MPU-6000A.pdf
    napisano:
    The reset value is 0x00 for all registers other than the registers below.
    • Register 107: 0x40.
    • Register 117: 0x68.
    Wiec skąd się biorą na innych rejestrach wartości 0x80?
    Poniżej przedstawiam krótki kod którym testowałem.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wartości rejestrów odczytuje na konsoli. Są one takie:
    0b01100000
    0b00000010
    I w pętli odczyt z żyroskopu z osi X:
    0b10000000

    Coś na pewno źle inicjalizuję, jakieś ustawienia ale nie mogę znaleźć co:/ Proszę o pomoc doświadczonych ludzi, którzy już mieli styczność z tym układem.
    Pozdrawiam.
  • Pomocny post
    #2 12800080
    mkaszub
    Poziom 2  
    Cześć,
    Nie korzystałem nigdy bezpośrednio z interfejsu I2C ale wykorzystywałem do tego biblioteke która miała już zaimplementowaną inicjalizację (wszystko działało ok). Możesz sobie zerknąć na kod i ewentualnie znaleźć różnicę.

    https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
  • #3 12807520
    ulumulu
    Poziom 10  
    Dzięki, link pomógł. Jednak rejestrom GYRO_CONFIG i ACCEL_CONFIG trzeba przypisać wartości, początkowe nic nie dają. Teraz wartości na wyjściu się zmieniają, tylko problem jest taki że odczyt jest pojedynczy, za drugim razem jest pustka, tak jakby się zawieszał. A przecież wgląd w nie powinien być bez ograniczeń. Próbowałem dać lekkie opóźnienia pomiędzy odczytami, ale to nie pomogło.
    Biblioteczkę do TWI pisałem na podstawie książki "Język C dla mikrokontrolerów AVR", wiec nie niej nie powinno być błędu.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Cały kod który odczytuje ACCEL_XOUT_H, ACCEL_XOUT_L. Pierwszy rejestr wypiszę, ale z następnym jest problem.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Pojedynczy odczyt działa, kolejny już nie:/ szukałem jakiegoś rejestru który określa że ta czynność może być wykonana kolejny raz czy nie, ale nic nie znalazłem.
  • #4 12807647
    kchpl
    Poziom 15  
    Witam
    Poniżej funkcje jakich ja używałem do obsługi MPU6050 (napisane pod Xmege ale może coś się przyda)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #5 12832249
    ulumulu
    Poziom 10  
    Dzięki Panowie.
    Uporałem się z tym w końcu. Błąd leżał w tym że dwa razy pod rząd odczytywałem funkcją I2C_ReceiveData_NACK. Teraz 6 rejestrów akcelerometra czytam: pięć pierwszych z ACK, a ostatni z NACK. Kod poprawiłem, podam go poniżej, może się komuś przydać.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
REKLAMA