Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 12 kwi 2026, o 00:30


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 6 gru 2015, o 20:52 
Offline
Nowy

Dołączył(a): 27 lis 2015
Posty: 4
Pomógł: 0

Witam wszystkich serdecznie. Jako że jestem tu na forum absolutnie nowy, kilka słów o sobie. Nazywam się Bartek, mam 23 lata. Pochodzę z okolic Żywca i obecnie studiuję Mechatronikę na Politechnice Wrocławskiej.
Zwracam się do Was drodzy forumowicze z problemem. Jakiś czas temu zakupiłem moduł akcelerometru firmy Pololu, oparty na memsie LSM303D. Komunikacja odbywa się po TWI/I2C. Udało mi się odczytać dane z akcelerometru, lecz są one bardzo niestabilne. Wartości skaczą, nie nadają się do dalszego wykorzystania. Wyniki wyświetlam na LCD. Wykorzystuję płytkę ATB.
Wykorzystuje gotowe biblioteki od Pana Mirosława Kardasia. Poniżej zamieszczam bibliotekę do LSM303D oraz main.c

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Poniżej biblioteka do obsługi LSM303D:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Kod ma za zadanie wyświetlenie przyspieszenie dla osi X, z tym że tak jak pisałem wartości bardzo szybko się zmieniają...
Zależy mi na pomiarze kierunku działania przyspieszenia ziemskiego, więc pomiar jest raczej statyczny.
Kod jest zlepkiem programów które znalazłem na forach internetowych.

Bym zapomniał, wykorzystuje uC ATmega 32A, akcelerometr znajduje się na płytce stykowej.

Z góry wszystkim dziękuję za pomoc.

Serdecznie pozdrawiam
Bartek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2015, o 21:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 208
Lokalizacja: Kraków
Pomógł: 16

Spróbuj uśredniać pomiary. Zbierz w tablicy kilka próbek a później uśrednij z nich pomiar. Wydłuży Ci się odpowiedź na zmianę przyspieszenia za to otrzymasz stabilniejszy pomiar.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2015, o 22:10 
Offline
Nowy

Dołączył(a): 27 lis 2015
Posty: 4
Pomógł: 0

Dodaje filmik który powinien zobrazować mój problem:

https://www.youtube.com/watch?v=laSASYZ ... e=youtu.be

Jeśli chodzi o uśrednianie, to próbowałem zaimplementować cyfrowy filtr dolnoprzepustowy (opisany w poradniku Pana Mirka na temat ADC). Ale spróbuje jeszcze z tablicą tak jak kolega wspomniał.
Dziękuję za odzew ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2015, o 10:24 
Offline
Nowy

Dołączył(a): 27 lis 2015
Posty: 4
Pomógł: 0

Cześć, próbowałem rozwiązania z uśrednianiem, lecz wyniki są mierne. Wydaje mi się że nie jest to dobre rozwiązanie ze względu na to że zmienia się praktycznie cała liczba (wszystkie cyfry). Gdyby się zmieniał 1 lub 2 LSB to może wtedy... Jak myślicie, może to być kwestia uszkodzonego akcelerometru ? Może z moim przetwarzaniem tych liczb jest coś nie tak? Może typy zmiennych są złe? A możliwe że chodzi o jakieś ustawienia rejestrów?
Proszę was o pomoc bo troszkę zależy mi na czasie... Ja staram się jak mogę, ale wydaje mi się że chyba za wąski w uszach jestem... :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2015, o 10:53 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Wydaje mi się, że wykonujesz błędnego przeliczenia w linii 55
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Wykonujesz działania zmiennoprzecinkowe, a nie zainkludowałeś biblioteki która na takie operacje pozwala.
No i poza tym typ zmiennej zlozenie to uint32_t.
Ale to tylko luźne uwagi odnośnie przeliczania a nie samych wyników.
Poza tym dziwnie składasz a i b
W dalszej części kodu to b jest starszym bajtem :?: Bo tam badasz znak
a do zmiennej zlozenie jako starszy ładujesz a

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 gru 2015, o 21:55 
Offline
Nowy

Dołączył(a): 27 lis 2015
Posty: 4
Pomógł: 0

Hmm w tym momencie wydaje mi się że chyba trochę źle rozumiem pewne rzeczy.

1) Z posta kolegi MirkoT rozumiem że dla zmiennej zlozenie typ uint32_t jest niepoprawny... Czy typ long double będzie odpowiedni (ma 16 bitów).
2) Do zmiennej a zapisuję liczbę odczytaną z X_A_H, natomiast b X_A_L. Cały czas wydawało mi się że jeżeli chcę złożyć te liczby w jedną 16 bitową, to robię to tak : zlozenie = (a<<8) | b;. W ten sposób bity liczby a odpowiadają za 8 bardziej znaczących bitów zmiennej zlozenie, natomiast b za 8 mniej znaczących bitow zmiennej zlozenie. Więc MSB zmiennej a jest również MSB zmiennej zlozenie, natomiast LSB zmiennej b jest LSB zmiennej zlozenie... Czy mój tok rozumowania jest błędny???
3) dołączyłem bibliotekę math.h teraz powinno być ok jeśli chodzi o operacje zmiennoprzecinkowe...

Niestety nie mogę dojść do ładu z tymi wskazaniami...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2015, o 03:26 
Offline
Użytkownik

Dołączył(a): 20 lip 2015
Posty: 83
Pomógł: 6

Jeżeli zmienna a jest typu char który jest 1bajtowy (8bitow) i przesuniesz go o 8 bitow to będzie kicha. Może tutaj jest problem?
Wydaje mi się ze musisz zrzutowac sobie a np na int16_t a dopiero potem przesunąć w lewo.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 5 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO