Wizualizacja Danych Sensorycznych Pomiar przyspieszeń wzdłuŝwych i poprzeczwych. Wykował: Adam Jaszke NR 127782 Wrocław 2006
1 Wstęp. Celem projektu było zbudowanie urządzenia mierzącego przyspieszanie oraz wizualizacja jego za pomocą wyświetlacza LCD. Urządzenie umoŝliwia pomiar przyspieszeń wzdłuŝnych i poprzecznych. Komunikacja z akcelerometrem miała odbywać się poprzez port szeregowy 2 Idea układu. Rysuwek 1: Schemat blokowy układu. Schemat blokowy urządzenia pokazany na rysunku 1, umieszczono na nim główne elementy układu. Układ jest zasilany z baterii 9V, co ma umoŝliwić przenośność urządzenia. Napięcie 5V uzyskiwane jest za pomocą stabilizatora LM7805. Układ LM317 słuŝy do zasilania akcelerometru napięciem 3.3V. Mikrokontroler 8-bitowy Atmega8 firm Atmel. Akcelerometr MMA 6260 Freescale Semiconduktors, przyspieszenia w zakresie ±1.5g Wyświetlacz LCD dwu linijkowy po 16 znaków. Układ MAX232 do komunikacji szeregowej. 2
3 Budowa układu: 3.1 Układ zasilawia: Rysuwek 2: Schemat układu zasilającego. Jak juŝ wspomniałem układa zasilany jest z baterii 9V co umoŝliwia przenoszenie urządzenia. Napięcie jest obniŝane do 5V za pomocą układu IC2. Jest to stabilizator napięcia z serii LM78**. Napięcie 5V wykorzystywane jest do zasilania mikrokontrolera oraz układu max232. Dioda D1 sygnalizuje włączenie układu, a rezystor R5 ogranicz prąd diody. Układ IC7 jest to stabilizator LM317 o regulowanym napięciu wyjściowym. Regulacja napięcia odbywa się za pomocą potencjometru R4. 3.2 Główwy schemat układu. Główną cześć układu stanowi 8-bitowy mikrokontroler firmy Atmel Amega8 oznaczony na schemacie jako IC1. Posiada on: 1kB pamięci SRAM. 512 pamięci EEPROM. Wbudowany przetwornik analogowo-cyfrowy, wykorzystany do przetwarzania informacji z akcelerometru. Układ transmisji szeregowej UART, wykorzystany do komunikacji RS. Układ transmisji szeregowej SPI, wykorzystany do obsługi pamięci oraz do programowania mikro kontrolera. Mikrokontroler taktowany kwarcem 8MHz. 3.2.1 Napięcie referewcyjwe. Do mikrokontrolera podpięte jest napięcie referencyjne potrzebne do prawidłowego działania przetwornika A/C. Jest ono uzyskane za pomocą dzielnika rezystancyjnego (rezystory R7 i R8 oraz potencjometru R9, który umoŝliwia jego regulacje w małym zakresie). 3
Rysuwek 3: Główny schemat układu. 4
3.2.2 Akcelerometr. Realizując ten projekt uŝywałem akcelerometrów dwóch producentów. Pierwszy jak na układzie MMA6260 Freescale Semiconduktors oraz MXA2500A firmy MEMSIC. Akcelerometr MMA6260: Obudowa 6mm x 6mm x 1.98 mm Pomiar w dwóch osiach X i Y. Zakres pomiaru ±1.5g Zasilanie od 2.7V do 3.6V Wyjście analogowe Wyjscie selft test Dla przyspieszenia zero g napięcia wyjściowe 1.65V ±0.165V PoniewaŜ układ jest niewielkich gabarytów umieszczony został na osobnej płytce i połączony z układem za pomocą złączy SV1 i SV2. SV1 doprowadza zasilanie do akcelerometru, a za pomocą SV2 doprowadzone są sygnały wyjściowe do mikrokontrolera. Na wyjściach z czujnika zastosowane są filtry RC, dolno przepustowe (rezystory R1 i R2 oraz kondensatory C 10 i C8). Pin numer 4 jest to oś Y a pin numer 6 oś X. Odfiltrowane sygnały podłączone są do mikrokontrolera do portu C ( przetworniki A/C). Podłączenie jest następujące oś X do PC4 os Y do PC5. Rysuwek 4: Sposób podłączenia akcelerometru do mikrokontrolera. Układ MXA2500A: Obudowa 5mm x 5mm x 2 mm Pomiar w dwóch osiach X i Y. Zakres pomiaru ±1g Zasilanie od 2.7V do 5.25V Wyjście analogowe Dla przyspieszenia zero g napięcia wyjściowe 1.25V ±0.25V 5
Rysuwek 5: Fotografia akcelerometru MXA2500A Rysuwek 6: Sposób podłączenia akcelerometru. Akcelerometr ten jest trochę mniejszy, ale znacznie łatwiej go przylutować 3.2.3 Wyświetlacz LCD. Do wizualizacji pomiaru zastosowałem wyświetlacz LCD 2 linie po 16 znaków. Na ten wybór miał wpływ łatwość obsługi oraz niska cena takiego wyświetlacza. Podstawowy interfejs sterowania takim wyświetlaczem zawiera 8 linii sterujących, aby zaoszczędzić cenne pin-y mikrokontrolera magistrala danych została zredukowana do 4 linii. Przesyłane są najpierw 4 starsze bity, młodsze następnie 4 młodsze Zrezygnowałem równieŝ z odczytywania stanu wyświetlacza (linia R/W zawarta do masy), przyjmuje, Ŝe po określonym czasie od przesłania instrukcji jest on gotowy do dalszej pracy. Wyświetlacz podłączony jest do mikrokontrolera za pomocą złącza SV3. Magistrala danych do portu C od PC0 do PC3. linie sterujące Port B (do PB0 podpięte RS oraz do PB1 podpięte E). Na rysunku 3 potencjometr R6 słuŝy do regulacji kontrastu wyświetlacza. 6
3.2.4 Komuwikacja z PC. Komunikacja z komputerem stacjonarnym za pomocą interfejsu szeregowego. Układ max232 (na rysunku 3 IC4) słuŝy do konwersji poziomów logicznych mikrokontrolera na poziomy napiec zgodne ze standardem RS232 3.2.5 Pamięć. Podłączenie pamięci miało umoŝliwić rejestrowanie zmierzonych przyspieszeni i późniejszą ich obróbkę na komputerze. W układzie zastosowałem pamięć AT25F1024A firmy Atmel. Jest to pamięć typu Flesh o pojemności 1Mbit. Połączenie szeregowe typu Master-Slave za pomocą SPI. Na rysunku 5 pokazany jest sposób podłączenia. Rysuwek 7: Podłączenie pamięci AT25 7
4 Oprogramowawie. 4.1 Obsługa wyświetlacza. Jak juŝ wiadomo w układzie zastosowany jest wyświetlacz 2x16 znaków, z kontrolerem zgodnym z HD44780. 4.1.1 Iwicjalizacja wyświetlacza. Ustawiewie działawia portów: Magistrala danych jest cztero-liniowa port C pin-y 0,1,2,3 Porty zostały ustawione jako wejścia. Reszta portu wykorzystana jest jako wejścia do przetworników analogowo-cyfrowych. Pin-y sterujące to w porcie B pin-y 0 (RS wybór rejestru) oraz 1 (E sygnał zezwalający). Wszystkie wyjścia są ustawione w stan niski. DDRC = 0x0F; // ustwienie dzilania portow (1 = wyjscie): 0000 1111 DDRB = 0x03; // PORTB piny 0 i 1 - wyjscie PORTB=0x00; PORTC=0x00; // wszystkie linie stan niski Wysłanie komendy albo znaku na ekran, gdy RS w stanie niskim to wysyłana jest komenda, RS w stnie wysokim wysyłany jest znak. Ustawienie sposobu pracy wyswietlacza: Za pomocą funkcji write do wyświetlacza wysłane są komendy jak ma on pracować: Czyli, Ŝe: transmisja za pomocą 4 lin transmisyjnych. wyświetlacz ma pracować jako dwulinijkowy. wyświetlanie 5x7 zamiast 5x10 (nie jest wyświetlana ostania linia w segmencie. włączony. kursor wyłączony. write(0x28,0); // Function Set: 4Bit, dwuliniowy wyswietlacz, 5x7 kropek write(0x0c,0); // Display On/Off: Wyswietlacz wlaczony, Kursor wylaczony, Miganie wylaczone write(0x06,0); // DD-RAM autom. inkcrement., przemieszcza kursor 4.1.2 Fuwkcje obsługujące wyświetlacz. 8
Fuwkcja write: Wysłanie komendy albo znaku na ekran, gdy RS w stanie niskim to wysyłana jest komenda, RS w stanie wysokim wysyłany jest znak. Wiadomość wchodzi do funkcji jako data. Wysyłanie ośmiu bitów odbywa się przez podzielenie ich na dwie tury. Najpierw wysyłana jest część starsza, a następnie część młodsza. void write (uint8_t data, uint8_t rs) if (rs) // write data (RS=1, RW=0) else sbi(portb,pb0); // RS jest podpiety do Pinu 0 // write instruction (RS=0,) cbi(portb,pb0); PORTC = (data>>4); // output high nibble first flash_e (); PORTC = (data&0x0f); // output low nibble flash_e (); delay(2000); Fuwkcja czyszczewia ekrawu: Powrót kursora i wyczyszczenie wyświetlacza void cls () write(0x02,0); // Cursor Home delay(2000); // trwa to chwile (1,64ms) Wypisawie zwaku: Do funkcji wchodzi zmienna typu char, wyświetlacz zostaje ustawiony w tryb odbioru danej i wypisuje ja na matrycy void writechar ( char znak) write (znak, 1); Wypisawie tekstu: 9
Do funkcji wchodzi tablica znaków, wyświetlacz zostaje ustawiony w tryb odbioru danej i wypisuje je po kolei na matrycy: void writetext ( char *text) uint8_t i = 0; while (text[i]!=0) writechar(text[i]); i++; Wybór liwi: Funkcja umoŝliwia wybór linii wyświetlacza. Do funkcji wchodzi zmienna, która mówi, do której linii ma przejść kursor: void gotoline (uint8_t linia) if (linia == 1) write(0x80,0); if (linia == 2) write(0xc0,0); 4.2 Przetworwik awalogowo-cyfrowy. Przetwornik analogowo-cyfrowy w kontrolerach ATmega jest dziesięciobitowym przetwornikiem kompensacyjnym. Mikrokontroler posiada 6 takich przetworników dostępnych na porcie C. Ja do układu potrzebowałem dwóch przetworników, związku, Ŝe pin-y od 0 do3 były juŝ zajęte przez magistrale wyświetlacza, do przetwarzania sygnałów z czujnika uŝyłem wejść 4 i 5. Napięcie odwiesiewia: W moim projekcie napięcie odniesienia jest z zewnątrz, a zatem tak jak jest to domyślnie ustawione w procesorze. Fuwkcja Iwicjalizująca: void Inicjalizacja(void) //Wybranie sposobu zapisu wyniku z wyrownaniem do lewej //(osiem starszych bitow wyniku w rejestrze ADCH) ADMUX = _BV(ADLAR); // Zezwolenie na konwersje ADCSRA = _BV(ADEN); // Wybranie czestotliwosci dla taktowania przetwornika (1/16 czestotliwosci zegara kontrolera) ADCSRA = _BV(ADPS2); Opis poszczególnych bitów opisany jest poniŝej. Obsługa rejestrów przetworwika: 10
Rejestr ADMUX ADLAR - Bit wyboru sposobu zapisu wyniku w rejestrach ADCL i ADCH. Fabrycznie ustawiony, na 0 Wybór obrazuje Tabela2. MUX0 do MUX3 - Bity wyboru wejścia analogowego. Wejście wybrane kombinacją tych bitów jest dołączone do przetwornika. Tabela3 REFS0 i REFS1- Wybór źródła napięcia odniesienia. MoŜliwe ustawienia są podane w tabeli poniŝej. Tabela1 Tabela1: Ustawienia napięcia odniesienia. Bity ADLAR1 i ADLAR0: Dziesięciobitowy wynik przetwarzania jest zapisywany w rejestrach ADCL i ADCH. MoŜliwe są dwa sposoby zapisu wyniku. Pierwszy to osiem młodszych bitów (0 do 7) do rejestru ADCL i pozostałe dwa (8 i 9) do rejestru ADCH. Jest to domyślny sposób. Dla ADLAR0: Drugi to dwa najmłodsze bity do rejestru ADCL (0 i 1), a pozostałe osiem do rejestru ADCH Dla ADLAR1: 11
Wybrałem ten drugi sposób, bo do pomiaru wykorzystuje tylko osiem starszych bitów pomiaru. Bity wyboru piw-ów MUX0-MUX3: Tabela2: Ustawienia przetwornika dla portu C. W projekcie pin-y 4 i 5 a zatem: ADMUX = BV(MUX2); ADMUX = _ BV(MUX2) _BV(MUX0); Zezwolewie wa kowwersje: ADEN - Ustawienie go zezwala na pracę przetwornika, a wyzerowanie wyłącza go. Wyłączenie ADC podczas wykonywania konwersji przerywa ją. Wybrawie częstotliwości taktowawia przetworwika: 12
Do ustawienia częstotliwości słuŝą bity ADPS0, ADPS1, ADPS2 W tabeli widać jak naleŝy je skonfigurować dla Ŝądanego dzielnika: Fuwkcja realizująca pomiar: Tabela3: Ustawienia dzielnika częstotliwości. void odczytadc() ADMUX = _BV(ADLAR) _BV(MUX2); sbi(adcsra,adsc); while(adcsra&_bv(adsc)); pomiar1 = ADCH; ADMUX = _BV(ADLAR) _BV(MUX2) _BV(MUX0); sbi(adcsra,adsc); while(adcsra&_bv(adsc)); pomiar2 = ADCH; Rejestr ADMUX bit ADLAR. PoniewaŜ odczytuje osiem najstarszych bitów wyniku, oraz MUX2 Odczyt z 4 pin-u. Następnie ustawienie bitów ADSC ( wybranie konwersji ) w rejestrze ADCSRA i z czytanie pomiaru do zmiennej pomiar1 i tak samo z drugim pomiarem 4.3 Komuwikacja z komputerem. Do obsługi transmisji szeregowej skorzystałem z gotowej biblioteki dostępnej na stronie http://www.tkdami.net Wykorzystuje dwie funkcje: uart_getc() funkcja do odczytania z pomaca uart znaku jaki przysyła komputer(litere s ), czyli pomiary zastają wysyłane do komputera tak długo aŝ nie przyjdzie Ŝądanie zaprzestania nadawania (wysłanie litery t ). uart_puts() funkcja do wysyłania zapomoga uart danych pomiarowych do komputera. 13
Funkcja realizująca polaczenia z kompteram void do_compa() znak=uart_getc(); znacznik=znak; while(znacznik==115) //jesli znak= s 115w ascii 115 znak=uart_getc(); if (znak==116) znacznik=114; //pomiar w osi x gg=(pomiar1); sprintf(buffer_uart,"x:%i",gg); uart_puts(buffer_uart); uart_puts_p("\n"); //pomiar w osi Y gg=(pomiar2); sprintf(buffer_uart,"y:%i",gg); uart_puts(buffer_uart); uart_puts_p("\n"); // tak dlugo wysyla do komutera az nie dostanie 116 "t" // Konwersja liczby unsigned int do asci // Wysłanie do PC wyniku konwersji // Konwersja liczby unsigned int do asci // Wysłanie do PC wyniku konwersji 5 Podsumowawie. Urządzenie mierzy przyspieszanie w dwóch osiach, X i Y. Wyniki prezentowane są na wyświetlaczu LCD. Akcelerometr jest wyskalowany w m/s 2, zatem gdy ustawimy go pionowo to wskazuje odczyt 9,80 m/s 2 na osi X, a na osi Y 0,00 m/s 2. Przy realizacji projektu najwięcej problemu sprawiło mi uruchomienie czujnika. Małe wymiary oraz brak odpowiedniego sprzętu(lutownicy) wpłynęły na to ze dwa czujniki uszkodziłem podczas montaŝu. Przy projektowaniu układu na porządku wybrałem środkowe pin-y portu D jako magistrale danych, co przy programowaniu okazało się nie najlepszym pomysłem. Z tego powodu płytka, którą zaprojektowałem musiała ulec modyfikacji. Z braku czasu nie oprogramowałem pamięć, którą juŝ posiadam. W niedalekiej przyszłości spróbuje ja oprogramować, aby urządzenie było wyposaŝone w rejestrator. Załączwiki: 14
1. Zaprojektowawa płytka PCB 15