Skocz do zawartości

lorner

Użytkownicy
  • Zawartość

    3
  • Rejestracja

  • Ostatnio

Wszystko napisane przez lorner

  1. Cześć, chciałbym przedstawić projekt, który wykonałem jako pracę inżynierską. Jej celem było skonstruowanie inklinometru (miernika służącego do pomiaru kąta przechyłu), w którym kąt wyznaczany był przy pomocy akcelerometru typu MEMS. Uzyskane wartości przyspieszenia i kąt przechyłu wyświetlane są na wyświetlaczu LCD. Jednym z założeń było wykorzystanie czujnika z wyjściem analogowym oraz czujnika z wyjściem cyfrowym. Dlatego do projektu wybrałem model MMA7361 oraz ADXL345. Innymi czynnikami wyboru tych elementów była m.in. dostępność, cena, nieduży zakres pomiarowy (aby uzyskać jak największą czułość) ale przynajmniej 1g (co odpowiada kątowi przechyłu 90°). Spis treści: Założenia Projekt struktury sprzętowej Projekt obwodu drukowanego Wykonanie i uruchomienie miernika przechyłu Wyznaczenie kąta, algorytm działania miernika i oprogramowanie Wyniki testów miernika ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 1. Założenia Koncepcja modułu inklinometru zakładała użycie mikrokontrolera, do którego podłączone zostały akcelerometry. Czujnik cyfrowy ADXL345 komunikuje się za pomocą magistrali I2C lub SPI, natomiast czujnik MMA7361 posiada wyłącznie wyjścia analogowe, dlatego konieczne było wykorzystanie przetwornika analogowo-cyfrowego. Dodatkowo mikrokontroler odpowiadał za obsługę przycisków, portu szeregowego i sterowanie wyświetlaczem. Działanie układu inklinometru oparto na popularnym mikrokontrolerze ATmega328 zaimplementowanym w module Uno Plus firmy WaveShare, który jest w pełni kompatybilny z Arduino Uno R3. Zdecydowałem się na wykorzystanie klonu Arduino z powodu zdecydowanie niższej ceny układu (w promocji zapłaciłem ok. 45 zł) i jednocześnie pewnych przydatnych rozwiązań w nim zastosowanych, m.in. popularniejsze złącze micro USB, przycisk reset naciskany z boku, przetwornik ADC, itd. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 2. Projekt struktury sprzętowej Na rysunkach poniżej przedstawiono wykorzystane wyprowadzenia platformy Uno Plus wraz ze złączami służącymi do podłączenia zaprojektowanych modułów. Do podłączenia wyświetlacza LCD ze sterownikiem HD44780 wykorzystano wyprowadzenia na listwę typu goldpin (złącza JP3 i JP4). W celu regulacji kontrastu użyto potencjometr o wartości 10kΩ (R2). Wyświetlacz zasilany jest napięciem 5V. Przyciski – podłączone do złącza JP5 zostały programowo „podciągnięte” do stanu wysokiego poprzez wyprowadzenia I/O mikrokontrolera. Rozpoznanie wciśnięcia przycisku występuje w chwili wykrycia stanu niskiego na linii portu, który występuje po zwarciu do masy. Czujnik ADXL345 zasilany jest napięciem 3,3V. Napięcie zasilające jest filtrowane przez kondensator tantalowy o wartości 10µF i dwa kondensatory 0,1µF. W celu uruchomienia komunikacji za pomocą magistrali I2C należało wybrać układ przez podanie stanu wysokiego na wejście CS oraz zapewnić stan wysoki na liniach SCL i SDA, co zrealizowano przez zastosowanie rezystorów podciągających o wartości 10kΩ. Podłączając pin SDO do masy (stan logiczny niski) wskazano, że układ posiada na magistrali I2C adres o wartości 0x53 (alternatywnie podając stan wysoki adres miałby wartość 0x1D). W układzie połączeń czujnika MMA7361 wejście Sleep jest wewnętrznie ustawione w stan niski, co wprowadza płytkę w stan uśpienia i niski pobór energii. Aby uruchomić czujnik należy do tego wejścia podać stan wysoki, np. za pomocą podłączenia do napięcia zasilania 3,3V, jak zostało zrobione to w projekcie. W przypadku potrzeby kontroli nad trybem Sleep należałoby podłączyć to wejście do mikrokontrolera za pomocą wyprowadzeń I/O i odpowiednio sterować (pamiętając o poziomach napięć, gdyż UNO PLUS pracuje z napięciem +5V). Podłączenie wejść g-Select i 0g-Detect jest opcjonalnie. Wejście g-Select jest wewnętrznie ustawione w stan niski, który odpowiada ustawieniu czułości na zakres ±1.5g (800 mV/g). Wejście 0g-Detect wystawia napięcie na poziom wysoki gdy wszystkie osie wskazują przyspieszenie równe 0g. Dzieje się tak kiedy płytka znajduje się w stanie spadku swobodnego. Z powodu braku potrzeby użycia tych funkcji (jak najmniejszy zakres pomiarowy jest bardziej odpowiedni w projekcie inklinometru) wejścia te pozostawiono niepodłączone. Wyjścia X, Y i Z akcelerometru zostały podłączone odpowiednio przez złącze JP2, do wejść A0, A1 i A2 mikrokontrolera, które są wejściami przetwornika A/C. Uwzględniając napięcie zasilania akcelerometrów (3,3V) oraz zakres analogowych sygnałów wyjściowych, dla przetwornika analogowo – cyfrowego wybrano zewnętrzne napięcie referencyjne o wartości 3,3 V (wejście AREF podłączono do napięcia 3,3V), a w oprogramowaniu mikrokontrolera wybrano zewnętrzne napięcie referencyjne. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 3. Projekt obwodu drukowanego Dla wybranych czujników przyspieszenia zaprojektowano i wykonano dwie osobne płytki PCB, o jednakowych wymiarach 40x30 mm. Wymiary płytek wynikały z potrzeby ich dopasowania do stanowiska testowego w laboratorium. Oba układy przetworników posiadają 14 wyprowadzeń i zamknięte są w obudowie LGA-14.W projekcie zastosowano elementy pasywne SMD. Z uwagi na małe rozmiary układów scalonych minimalna odległość między ścieżkami wynosi 10 mils. Ścieżki zasilające mają szerokość 24 mils, a ścieżki sygnałowe 20 mils. Na niewykorzystanej powierzchni płytka została wypełniona masą. Z płytki czujnika ADXL wyprowadzone są 4 sygnały: VCC (zasilanie układu), GND (masa układu), SCL (linia zegarowa) i SDA (linia danych). Z płytki czujnika MMA wyprowadzonych jest 5 sygnałów: VCC (zasilanie układu), GND (masa układu), A0 (wyjście napięciowe osi X), A1 (wyjście napięciowe osi Y) i A2 (wyjście napięciowe osi Z). ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 4. Wykonanie i uruchomienie miernika przechyłu Płytki PCB z czujnikami wykonano metodą termotransferu. Dodatkowo zostały umieszczone napisy na warstwie ścieżek w postaci nazwy wykorzystanego czujnika na danej płytce. Montaż elementów wykonano wykorzystując stację lutowniczą typu HotAir. Z powodu projektu płytki jednowarstwowej, dodatkowo dokonano potrzebne połączenia za pomocą przewodów. Do połączenia płytek czujników z układem mikrokontrolera zastosowano przewody ze złączami 6-pinowymi i gniazdami kątowymi typu goldpin przymocowanymi do nakładki prototypowej. Na nakładce prototypowej znalazły się również klawiatura, listwy służące do montażu wyświetlacza LCD i badania napięć wyjściowych czujnika analogowego oraz potencjometr do regulacji kontrastu wyświetlacza LCD. Rysunek poniżej przedstawia zmontowany i uruchomiony miernik przechyłu z podłączonymi czujnikami zasilany poprzez port micro USB. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 5. Wyznaczenie kąta, algorytm działania miernika i oprogramowanie Funkcja wyboru odczytu danych wykorzystuje trzy przyciski. Algorytm jest trochę ubogi ale do projektu wystarczył. Pomiar przyspieszenia z wykorzystaniem czujnika analogowego MMA7361 polega na wyznaczeniu wartości napięcia na wyjściach osi akcelerometru za pomocą 10-bitowego przetwornika analogowo-cyfrowego, a następnie wykonywane są obliczenia realizujące skalowanie czujnika. Wyznaczenie napięcia polega na pomnożeniu wyniku bitowego i napięcia referencyjnego, a następnie podzielenie przez 1023 (10-bitowy przetwornik, 210) xV_analog=(float(xADC)*3.3/1023); yV_analog=(float(yADC)*3.3/1023); zV_analog=(float(zADC)*3.3/1023); W celu otrzymania wartości przyspieszenia w jednostkach „g” dokonano odpowiedniego skalowania. Od zmierzonej wartości napięcia odjęto wartość 1,65 V, która jest połową wartości napięcia zasilania czujnika i odpowiada wartości napięcia przy przyspieszeniu wynoszącym zero. W następnym kroku uwzględniono czułość czujnika (800mV/g). Wartość przyspieszenia wyliczono posługując się wzorami: xG_analog=(xV_analog-1.65)/0.800; yG_analog=(yV_analog-1.65)/0.800; zG_analog=(zV_analog-1.65)/0.800; Czujnik cyfrowy ADXL345 do poprawnego działania, przed bezpośrednim odczytem danych, wymaga pewnych ustawień, które realizowane są na podstawie dostępnych w dokumentacji technicznej mapie i definicji rejestrów. Ustawienie to odbywa się poprzez zapis do rejestrów czujnika odpowiednich wartości bitowych i w programie przyjmował następujący format: ustawI2C(adres_czujnika, adres_rejestru, wartość); Adres akcelerometru ADXL345 to 0x53 i może dzielić magistralę z innymi urządzeniami dopóki ma unikalny adres. Wszystkie wartości liczbowe podawane są w systemie szesnastkowym: ustawI2C(0x53, 0x2D, 0x08); // do rejestru POWER_CTL, o adresie 0x2D, wpisano wartość 0x08, która inicjalizuje tryb gotowości do pomiaru, ustawI2C(0x53, 0x31, 0x08); // do rejestru DATA_FORMAT (adres 0x31) wpisano wartość 0x08 ustawiając wybrane parametry takie jak rozdzielczość i czułość czujnika, ustawI2C(0x53, 0x2C, 0x08); // do rejestru BW_RATE (adres 0x2C) wpisano wartość 0x08 ustawiając częstotliwość pomiaru na 50Hz. Dane wyjściowe z czujnika odczytywane są z sześciu 8-bitowych rejestrów, po dwa dla każdej osi. Każdy wynik jest reprezentowany za pomocą dwóch bajtów. Funkcja odczytu danych przez magistralę I2C ma postać: odczytI2C(0x53, 0x32, buffer, 6); - odczyt danych z czujnika zaczynając od rejestru DATAX0 (adres 0x32) i kończąc na rejestrze DATAZ1 (adres 0x37). Następnie za pomocą odpowiednich funkcji, dwa odczytane bajty dla danej osi czujnika łączone są w jedną zmienną. Uzyskana w ten sposób wartość bitowa mnożona jest przez współczynnik skali, wynoszący w tym przypadku 3,9 mg/LSB, i otrzymywana jest wartość przyspieszenia w jednostkach „g”. xG_digital = xBit_digital * 0.0039; // -256=-1g, 0=0g, 256=1g yG_digital = yBit_digital * 0.0039; zG_digital = zBit_digital * 0.0039; Na podstawie otrzymanych wartości przyspieszeń z czujników wyliczany jest kąt przechyłu wykorzystując odpowiednie wzory. Dokładny kąt nachylenia może być mierzony tylko wtedy, gdy na przyspieszeniomierz działa wyłączenie siła grawitacji. Działanie innych sił, np. ruchu, powoduje dodatkowe przeciążenia, uniemożliwiając prawidłowe ustalenie nachylenia. Pomiar przechyłu można dokonać wykorzystując nawet jedną oś, lecz wyniki naznaczone są pewnymi ograniczeniami, których opis może pominę. Wykorzystując trzy osie, do ustalenia orientacji czujnika względem ziemi, kąt nachylenia wektora siły grawitacji może być w pełni określony. Czułość jest stała dlatego kąty mogą być dokładnie zmierzone bez względu na położenie czujnika. Dane przesyłane pomiędzy interfejsem UART i USB przyjmują format opisany w tabeli. Wybierając polecenie uruchomienia transmisji pomiędzy urządzeniami aktualne wartości z czujników wysyłane są na bieżąco do momentu przerwania transmisji przez użytkownika. Wysyłane dane są w postaci znakowej i posiadają 4- znakowy nagłówek i pole danych. ASTY (ASensorTYpe) – oznaczający typ czujnika, BACC (BACCeleration) – oznaczający przyspieszenie, CANG (CANGle) – oznaczający kąt przechyłu. Po nagłówku wysyłany jest separator w postaci znaku „ ; ”, a następnie pole danych zakończone znakiem „ ; ”. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 6. Wyniki testów miernika Badania przeprowadzono na stanowisku przeznaczonym do badania czujników przechyłu – bazując na równi pochyłej. Wartości kąta przechyłu wyznaczone zostały na podstawie zależności trygonometrycznych w trójkącie prostokątnym. W skrócie. Dwie deski połączone zawiasem. Na jednej desce przyklejona miarka. Na drugiej desce na nitce o stałej długości zawieszony pion murarski. Podnosząc jedną deskę pion dzięki sile grawitacji tworzył kąt prosty, a z miarki odczytywano wartość wyznaczoną przez nić. Z otrzymanych proporcji wyliczano dokładny kąt. Z racji już długiego tekstu może pominę szczegółowy fragment kalibracji. Więc tak w skrócie: Akcelerometry MEMS w swojej strukturze zawierają elementy, które mogą swobodnie się poruszać, dlatego są o wiele bardziej wrażliwe na powstałe naprężenia mechaniczne niż inne elementy półprzewodnikowe. Naprężenia mogą powstawać m.in. podczas montażu czujnika i komponentów na obwodzie drukowanym. W celu wyeliminowania błędów w pomiarze należy wykonać kalibrację czujników. Dzięki rejestrom OFSX, OFSY i OFSZ możliwe jest wprowadzenie korekty wyników w czujniku cyfrowym ADXL345. Wartość przechowywana w tych rejestrach jest automatycznie dodawana do mierzonego przyspieszenia i kompensuje błędy pomiaru. Kalibracja czujnika analogowego polega na wyznaczeniu maksymalnych i minimalnych napięć pojawiających się na wyjściach osi pomiarowych poprzez obrót wokół ich płaszczyzn. Wartość maksymalna pojawi się gdy na oś będzie działać przyspieszenie +1g, natomiast wartość minimalna w przypadku działania przyspieszenia wynoszącego -1g. Zakładając, że czułość zmienia się symetrycznie, od 0 do +1g oraz od 0 do -1g, można wyznaczyć jej dokładną wartość dodając do siebie wartości napięcia maksymalnego i minimalnego, a następnie dzieląc je przez 2. Pomiary wykonano laboratoryjnym multimetrem cyfrowym. Wykonane badania wykazały, że maksymalna różnica pomiędzy kątami rzeczywistymi, a kątami wskazanymi przez inklinometr wynoszą maksymalnie 1°. Błąd pomiędzy wskazaniami miernika może wynikać m.in. z braku wykonania urządzenia w pełni profesjonalnych warunkach, a otrzymany wynik błędu jest satysfakcjonującym rezultatem. Dodatkowo do pełnego, stabilnego badania położenia i wyeliminowania błędów pomiaru należy zastosować połączenie akcelerometru, żyroskopu i magnetometru. Ostatnie zdjęcia prezentują działanie inklinometru. Na pierwszym zdjęciu pomiar dokonywany jest za pomocą czujnika MMA7361. Można zauważyć, że płytka leży prawie poziomo - kąt 6,8°. Z kolei na drugim zdjęciu płytka z czujnikiem ADXL345 ustawiona jest prawie pod kątem 45°. Dzięki za doczytanie do końca. Pozdrawiam :)
×
×
  • Utwórz nowe...