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

[ATmega328p + ADXL345, C] - Pomiar pochylenia, niepełny zakres

krzyssw 13 Wrz 2016 19:03 885 2
  • #1 13 Wrz 2016 19:03
    krzyssw
    Poziom 2  

    Witam, stworzyłem projekt pomiaru pochylenia z wykorzystaniem akcelerometru ADXL345, ATmegi328p, wyświetlacz LCD.

    Co do schematu:
    Zasilanie atmegi filtrowane, akcelerometr podpięty do zasilania 3,3V(stabilizator LF33CV) zasilanie również filtrowane.
    ADXL (VCC i CS do 3,3V, SDA i SCL podłączone do rezystorów podciągających (7,5k), oraz do ATmegi PC4(SDA), PC5(SCL).
    Port D podpięty pod wyświetlacz.
    Komunikacja za pomocą i2c


    Problem polega na tym, że nie widzę pełnego zakresu, w spoczynku, płytka leży płasko na stole P(itch)= 12, R(oll) = 2, natomiast odczyt z osi Z = 511. Patrząc na płytkę oś X idzie w prawo, oś Y ode mnie. przechylając w prawo kąt P zmienia się do ok 86 (przy kącie prostym) przy 180stopniach znów mam P =11/12. Jeśli odchylam w lewo P= 12 -> 0 ->89stopni i na 89 się zatrzymuje, nie pokazuje wartości w drugą stronę, tak samo ma się w przypadku Roll. Czy ma ktoś jakiś pomysł jak to poprawić?

    Wyliczam kąty pitch, roll w ten sposób:

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Sam program odpowiedzialny za obsługę akcelerometru wygląda następująco:
    ADXL.c
    Kod: c
    Zaloguj się, aby zobaczyć kod


    ADXL.h
    Kod: c
    Zaloguj się, aby zobaczyć kod


    main.c:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 2
  • Pomocny post
    #2 13 Wrz 2016 20:34
    grko
    Poziom 33  

    Masz parę błędów w programie. Na pierwszy rzut oka:
    1. Operacja y*y+z*z może doprowadzić do przepełnienia typu int.
    2. Deklarujesz typy o tych samych nazwach w nagłówku i w implementacji => czytaj strzał w stopę.
    3. Tego typu deklaracja:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    nie rezrwuje żadnej pamięci na bufor poza jednym bajtem. W związku z tym operacja:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    najprawdopodobniej nadpisuje inne zmienne globalne.

    0
  • #3 15 Wrz 2016 19:58
    krzyssw
    Poziom 2  

    Tablicy zdeklarowałem konkretny rozmiar tab1[10], problem z zakresem po stronie - był spowodowany tym że korzystałem z uint, zmieniłem na int i jest tak jak należy.

    Deklaracje o których wspomniałeś, chodzi o to że deklaruje to samo np w pliku .h i w pliku .c? Czy coś jeszcze? Mógłbyś wskazać w którym miejscu?
    Jeśli zmieniam pitch, roll na int16 - > int32 to w ogóle wyskakuje wartość -36k.

    Mam jeszcze taki problem, jeśli Z = 512 tp czy po odwróceniu o 180stopni, powinno się zmienić na -512? Po odwróceniu o 180stopni dostaje wartość +200. w czym może być problem?

    0