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

6- kanałowy układ do pomiaru przyspieszenia z bluetoothem

karol p 17 Lis 2010 13:14 2372 13
REKLAMA
  • #1 8754633
    karol p
    Poziom 10  
    Witam,
    przymierzam się do powyższego projektu. Na samym początku pojawiło się parę pytań (fundamentalnych), i chciałbym prosić o dobrą radę. Problem polega na mierzeniu sygnału z dwóch analogowych czujników przyspieszenia (3- osiowe) i przesłania tej informacji na komputer. Każdy kanał musi być próbkowany z częstością około 200- 300 Hz, rozdzielczość na poziomie 10 bit będzie wystarczająca... Otrzymane wartości mają być wysłane przez bluetooth (BTM222) do komputera. Teraz pytanie: czy zwykła atmega8 wystarczy, i czy wbudowany przetwornik A/C się nada? Z tego co czytałem to te przetworniki mogą pracować do 200 kHz, przy czym pomiar zajmuje 65 mikrosekund (13 taktów), więc chyba trochę braknie do interesującej mnie szybkości próbkowania, więc rodzi się pytanie jaki zewnętrzny przetwornik byłby odpowiedni... No i czy atmega poradzi sobie ze zbieraniem sygnału, przeliczeniem na przyspieszenie i wysłaniem informacji przez bluetooth? Z góry dzięki za każdą pomoc.
  • REKLAMA
  • #2 8754646
    Konto nie istnieje
    Poziom 1  
  • #3 8754702
    MirekCz
    Poziom 35  
    Atmega się nada, ale najlepiej zamiast analogowych czujników jak np. ADXL325 polecam cyfrowe typu ADXL345. Spełniają Twoje wymagania, są proste do użycia i odpada cały problem z pomiarami przetwornikiem ADC, zakłóceniami toru analogowego itd. Z czujnikiem się łączysz po I2C lub SPI - oba protokoły są obsługiwane przez ATmega8, a SPI można też w banalnie prosty sposób napisać softwareowo.
    Akcelerometry te można dostać u mnie także wlutowane jako gotowe moduły z ADXL345.

    W razie dalszych pytań służę pomocą.
  • REKLAMA
  • #5 8755698
    karol p
    Poziom 10  
    Dzięki za radę, chciałem czujniki analogowe bo jeden już mam z innego projektu... Zastanowię się teraz nad cyfrówkami...
  • #6 8783112
    karol p
    Poziom 10  
    A mam jeszcze pytanie... Chcę zasilanie zrobić z 3,6 wolt baterii z telefonu, bo jest poręczna, niewielka i łatwo ją naładować (max155x). Ale spadek napięcia na baterii bardzo źle będzie wpływał na akcelerometry i zastanawiam się nad jakimś stabilizatorem na 3V ale wtedy potrzebna mi bateria o wyższym napięciu... Myślałem o dwóch bat. 3,6v ale wtedy max1551 nie naładuje...
  • REKLAMA
  • #7 8783282
    Konto nie istnieje
    Poziom 1  
  • #8 8783809
    MirekCz
    Poziom 35  
    1.Możesz puścić na 2,7V tak jak poleca kolega atom

    2.Jak z jakiegoś powodu jest to niemożliwe (np. procesor lub inne komponenty nie działają dobrze z tak niskiego napięcia) to możesz zastosować stabilizator LDO na 3,0V + pomiar napięcia baterii na procesorze i po prostu wyłączać układ (lub alarmować odbiorcę) gdy napięcie spadnie poniżej 3,1V. Przyjmij przy tym, że akumulatory li-ion/li-poly stosowane w telefonach ~90% energii oddają tak do 3,3V a potem to już jest naprawdę resztka i dużej straty w czasie działania układu nie będziesz miał jak układ wyłączysz przy trochę większym napięciu niż 2,7V. Pamiętaj też, że zejście poniżej 2,7V jest bardzo niebezpieczne i grozi uszkodzeniem baterii.

    3.Możesz skorzystać z przetwornicy step up/down, ale to trochę wyższa szkoła jazdy i cena.
  • #9 8785972
    karol p
    Poziom 10  
    Chyba znalazłem rozwiązanie- czyli pasujący mi stabilizator LDO: LP2951ACM-3NOPB...
    @MirekCz dzięki za podpowiedź
  • #10 8950920
    karol p
    Poziom 10  
    Ponownie po krótkiej przerwie mam pewien problem... A właściwie nie wiem dlaczego kod działa inaczej niż ja sobie to założyłem.
    Ta funkcja odpowiedzialna jest za odczyt danych z ADXL 345. Działa poprawnie.

    void read_ADXL_data (char * databuffer, uint8_t ADXL_SELECT){ //bufor,  wybieramy ktory czujnik
    	uint8_t Xh, Xl, Yh, Yl, Zh, Zl;
    	int16_t x1,y1,z1;
    	char c='a';
    	char c2='b';
    	
    	
    	Xh = ADXL_read(DATAX1, ADXL_SELECT);
    	Xl = ADXL_read(DATAX0, ADXL_SELECT);
    	Yh = ADXL_read(DATAY1, ADXL_SELECT);
    	Yl = ADXL_read(DATAY0, ADXL_SELECT);
    	Zh = ADXL_read(DATAZ1, ADXL_SELECT);
    	Zl = ADXL_read(DATAZ0, ADXL_SELECT);
    
    //rozdzielczosc osi to 11bit (przychodzi w 2 bajtach). najpierw najmniej znaczacy bit
    //konwersja na liczbe int
    	x1 = (((int)Xh) << 8) | Xl;
    	y1 = (((int)Yh) << 8) | Yl;
    	z1 = (((int)Zh) << 8) | Zl;
       
    // przerabiamy dane na string
    	if (1 == ADXL_SELECT) 
    		sprintf(databuffer, " %c ; %d ; %d ; %d ", c, x1, y1, z1);
    	else 
    		sprintf(databuffer, " %c ; %d ; %d ; %d ", c2, x1, y1, z1);
    }


    A to są jej wywołania w programie głównym i wysłanie przez uart:
    
    char databuffer1[20];
    char databuffer2[20];
    read_ADXL_data (databuffer1, 1);
    read_ADXL_data (databuffer2, 2);
    
    uart_puts(databuffer1);
    //uart_puts(databuffer2);
    _delay_us(10);


    Problem w tym, że przy zakomentowaniu uart_puts(databuffer2) dane z czujnika 2 są wysyłane... Wygląda to tak jakby były one dopisane do databuffer1... Ale dlaczego? Dodam, że w databuffer2 też są dane z czujnika 2 ale to jest akurat prawidłowe działanie:D Pewnie problem lezy po stronie wskaźników, ale nie wiem jaka jest przyczyna...
  • REKLAMA
  • #11 8952039
    MirekCz
    Poziom 35  
    Bufor ma 20 znaków, a z tego co widzę sprintf zapisujesz więcej znaków. To spowoduje, ze funkcja uart_puts pewnie je "polaczy", bo nigdzie nie będzie wartości 0x00 co by oznaczało koniec danych do wysłania.
    Zmień bufory na 40bajtów to powinno działać tak jak chcesz.
  • #12 8952586
    karol p
    Poziom 10  
    Rzeczywiście pomogło, ale powiem szczerze, że wg moich wyliczeń bufor na 20 znaków powinien być nawet zbyt duży :D
  • #13 9092549
    karol p
    Poziom 10  
    Projekt zakończony, działa fajnie :) Niestety nie mogę napisać nic więcej bo to moja inżynierka była...
    Dziękuję wszystkim za pomoc, bez niej i bez forum byłoby ciężko,

    Karol
  • #14 10883001
    rafkins22
    Poziom 9  
    Witam. Jestem nowy na forum

    Chciałbym odswieżyc wątek. Tematem mojej pracy inżynierskiej jest "projekt i budowa urządzenia rejestrującego zmiany oddechowe". Osobiście myślałem o czujniku przyspieszenia ADXL345 + Atmega8. Dane mają byc wyświetlane na telefonie (trudniejsza wersja) lub odbiorniku sygnalizującym np. wstrzymanie oddychania poprzez sygnał dźwiękowy lub świetlny ( łatwiejsza wersja). Do przesyłania bezprzewodowego myślałem o użyciu BTM222. Co sądzicie o takim zestawieniu? Jakieś sugestie?

    Z góry dziękuje za pomoc
REKLAMA