W tym samouczku omówimy i zaprojektujemy obwód do pomiaru odległości. Obwód ten został opracowany poprzez połączenie czujnika ultradźwiękowego „HC-SR04” z mikrokontrolerem AVR. Ten czujnik wykorzystuje technikę zwaną „ECHO”, którą można uzyskać, gdy dźwięk odbija się z powrotem po uderzeniu w powierzchnię.
Wiemy, że wibracje dźwięku nie mogą przenikać przez ciała stałe. Tak więc, kiedy źródło dźwięku generuje wibracje, przemieszcza się w powietrzu z prędkością 220 metrów na sekundę. Te wibracje, kiedy docierają do naszego ucha, opisujemy je jako dźwięk. Jak wspomniano wcześniej, wibracje te nie mogą przechodzić przez ciało stałe, więc kiedy uderzają w powierzchnię taką jak ściana, są odbijane z tą samą prędkością do źródła, które nazywa się echem.
Czujnik ultradźwiękowy „HC-SR04” dostarcza na podstawie echa sygnał wyjściowy proporcjonalny do odległości. Czujnik tutaj generuje wibrację dźwiękową w zakresie ultradźwiękowym po uruchomieniu wyzwalacza, po czym czeka na powrót wibracji dźwiękowej. Teraz w oparciu o parametry, prędkość dźwięku (220 m / s) i czas potrzebny, aby echo dotarło do źródła, dostarcza impuls wyjściowy proporcjonalny do odległości.
Jak pokazano na rysunku, najpierw musimy zainicjować czujnik do pomiaru odległości, czyli sygnał logiczny WYSOKI na pinie wyzwalacza czujnika przez ponad 10uS, po czym czujnik wysyła wibrację dźwiękową, po echu czujnik zapewnia sygnał na pinie wyjściowym, którego szerokość jest proporcjonalna do odległości między źródłem a przeszkodą.
Odległość ta jest obliczana jako, odległość (w cm) = szerokość wyjścia impulsowego (w uS) / 58.
Tutaj szerokość sygnału należy przyjąć jako wielokrotność uS (mikro sekunda lub 10 ^ -6).
Wymagane składniki
Sprzęt: ATMEGA32, zasilacz (5v), programator AVR-ISP, JHD_162ALCD (16x2LCD), kondensator 1000uF, rezystor 10KΩ (2 sztuki), czujnik HC-SR04.
Oprogramowanie: Atmel studio 6.1, progisp lub flash magic.
Schemat obwodu i objaśnienie robocze
Tutaj używamy PORTB do połączenia z portem danych LCD (D0-D7). Każdy, kto nie chce pracować z FUSE BITS ATMEGA32A, nie może korzystać z PORTC, ponieważ PORTC zawiera specjalny typ komunikacji, który można wyłączyć tylko poprzez zmianę FUSEBITS.
Zauważasz, że w obwodzie wziąłem tylko dwa piny sterujące, co daje elastyczność lepszego zrozumienia. Bit kontrastu i odczyt / zapis nie są często używane, więc można je zwierać do masy. Dzięki temu wyświetlacz LCD ma najwyższy kontrast i tryb odczytu. Musimy tylko sterować pinami ENABLE i RS, aby odpowiednio wysyłać znaki i dane.
Poniżej przedstawiono połączenia wykonane dla LCD:
PIN1 lub VSS do masy
PIN2 lub VDD lub VCC do + 5 V.
PIN3 lub VEE do ziemi (daje maksymalny kontrast najlepszy dla początkującego)
PIN4 lub RS (wybór rejestru) do PD6 uC
PIN5 lub RW (odczyt / zapis) do masy (przełącza wyświetlacz LCD w tryb odczytu, ułatwiając komunikację użytkownikowi)
PIN6 lub E (Włącz) do PD5 uC
PIN7 lub D0 do PB0 z uC
PIN8 lub D1 do PB1 uC
PIN9 lub D2 do PB2 uC
PIN10 lub D3 do PB3 uC
PIN11 lub D4 do PB4 uC
PIN12 lub D5 do PB5 uC
PIN13 lub D6 do PB6 uC
PIN14 lub D7 do PB7 uC
W układzie widać, że użyliśmy komunikacji 8-bitowej (D0-D7), jednak nie jest to obowiązkowe i możemy używać komunikacji 4-bitowej (D4-D7), ale przy 4-bitowej komunikacji program staje się nieco skomplikowany. Tak więc, jak pokazano w powyższej tabeli, podłączamy 10 pinów LCD do kontrolera, w których 8 pinów jest pinami danych i 2 pinami do sterowania.
Czujnik ultradźwiękowy to urządzenie czterostykowe, PIN1- VCC lub + 5V; PIN2-TRIGGER; PIN3- ECHO; PIN4- UZIEMIENIE. Trzpień wyzwalający to miejsce, w którym podajemy wyzwalacz, aby nakazać czujnikowi zmierzenie odległości. Echo jest pinem wyjściowym, na którym otrzymujemy odległość w postaci szerokości impulsu. Pin echa jest tutaj podłączony do kontrolera jako zewnętrzne źródło przerwań. Aby uzyskać szerokość sygnału wyjściowego, pin echa czujnika jest podłączony do INT0 (przerwanie 0) lub PD2.
1. Wyzwalanie czujnika przez pociągnięcie do góry sworznia wyzwalającego na co najmniej 12uS.
2. Gdy echo osiągnie wysoki poziom, otrzymujemy zewnętrzne przerwanie i zamierzamy uruchomić licznik (włączający licznik) w ISR (Interrupt Service Routine), który jest wykonywany zaraz po wyzwoleniu przerwania.
3. Gdy echo ponownie spadnie na niski poziom, generowane jest przerwanie, tym razem zatrzymamy licznik (wyłączając licznik).
4. Więc dla impulsu od wysokiego do niskiego na pinie echa, uruchomiliśmy licznik i zatrzymaliśmy go. Ta liczba jest aktualizowana do pamięci w celu uzyskania odległości, ponieważ mamy teraz szerokość echa.
5. W pamięci wykonamy dalsze obliczenia, aby uzyskać odległość w cm
6. Odległość jest wyświetlana na wyświetlaczu LCD 16x2.
Aby skonfigurować powyższe funkcje, ustawimy następujące rejestry:
Powyższe trzy rejestry należy odpowiednio ustawić, aby konfiguracja działała i omówimy je pokrótce, NIEBIESKI (INT0): ten bit musi być ustawiony w stanie wysokim, aby umożliwić zewnętrzne przerwanie0, po ustawieniu tego pinu możemy wyczuć zmiany logiczne na pinie PIND2.
BRĄZOWY (ISC00, ISC01): te dwa bity są dostosowywane do odpowiedniej zmiany logicznej w PD2, którą należy traktować jako przerwanie.
Tak więc, jak wspomniano wcześniej, potrzebujemy przerwania, aby rozpocząć liczenie i zatrzymać je. Więc ustawiamy ISC00 jako jeden i otrzymujemy przerwanie, gdy jest logika LOW do HIGH w INT0; kolejne przerwanie, gdy jest logika WYSOKA do NISKA.
CZERWONY (CS10): Ten bit służy po prostu do włączania i wyłączania licznika. Chociaż działa razem z innymi bitami CS10, CS12. Nie robimy tutaj żadnego przeskalowania, więc nie musimy się o nie martwić.
Oto kilka ważnych rzeczy, o których należy pamiętać:
Używamy wewnętrznego zegara ATMEGA32A 1MHz. Bez preskalowania tutaj, nie robimy porównania procedury generowania przerwania dopasowania, więc nie ma złożonych ustawień rejestrów.
Wartość zliczenia po zliczeniu jest przechowywana w 16-bitowym rejestrze TCNT1.
Sprawdź również ten projekt z arduino: Pomiar odległości za pomocą Arduino
Objaśnienie programowania
Działanie czujnika pomiaru odległości jest wyjaśnione krok po kroku w poniższym programie C.
#include // nagłówek umożliwiający kontrolę przepływu danych przez piny # zdefiniować F_CPU 1000000 // informowanie o częstotliwości kryształu kontrolera #include