- Wymagane materiały:
- Obliczanie prędkości i pokonanego dystansu:
- Schemat obwodu i konfiguracja sprzętu:
- Symulacja:
- Programowanie twojego PIC16F877A:
- Objaśnienie robocze:
Pomiar prędkości / obrotów Pojazdu lub silnika zawsze był dla nas fascynującym projektem. Tak więc w tym projekcie zamierzamy zbudować taki przy użyciu mikrokontrolerów PIC Industrial ready. Do pomiaru prędkości użyjemy magnesu i czujnika Halla. Istnieją inne sposoby / czujniki do pomiaru prędkości, ale użycie czujnika Halla jest tanie i może być również używane w każdym typie silnika / pojazdu. Wykonując ten projekt, poprawimy również nasze umiejętności w nauce PIC16F877A, ponieważ projekt obejmuje użycie przerwań i timerów. Pod koniec tego projektu będziesz w stanie obliczyć prędkość i odległości pokonywane przez dowolny obracający się obiekt i wyświetlić je na ekranie LCD 16x2. Zacznijmy od tego cyfrowego prędkościomierza i obwodu licznika kilometrów z PIC.
Wymagane materiały:
- PIC16F877A
- 7805 Regulator napięcia
- Czujnik Halla (US1881 / 04E)
- Wyświetlacz LCD 16 * 2
- Mały kawałek magnesu
- Przewody łączące
- Kondensatory
- Płytka prototypowa.
- Zasilacz
Obliczanie prędkości i pokonanego dystansu:
Zanim faktycznie zaczniemy budować obwód, zrozummy, w jaki sposób będziemy używać czujnika Halla i magnesu do obliczania prędkości koła. Wcześniej używaliśmy tej samej techniki do budowy prędkościomierza Arduino, który wyświetla odczyty na smartfonie z systemem Android.
Czujnik Halla to urządzenie, które może wykryć obecność magnesu na podstawie jego polaryzacji. Przyklejamy mały kawałek magnesu do koła i umieszczamy obok niego czujnik halla w taki sposób, aby za każdym razem, gdy koło się obróci, czujnik halla to wykrył. Następnie używamy timerów i przerwań na naszym mikrokontrolerze PIC, aby obliczyć czas potrzebny na jeden pełny obrót koła.
Gdy znany jest czas, możemy obliczyć RPM za pomocą poniższych wzorów, gdzie 1000 / czas da nam RPS, a dalsze pomnożenie go przez 60 da obroty
rpm = (1000 / czas) * 60;
Gdzie (1000 / timaken) daje obroty na sekundę (obroty na sekundę) i jest mnożone przez 60, aby zamienić obroty na obroty (obroty na minutę).
Teraz, aby obliczyć prędkość pojazdu, musimy znać promień koła. W naszym projekcie zastosowaliśmy małe kółko zabawkowe o promieniu zaledwie 3cm. Ale założyliśmy, że promień koła ma wynosić 30 cm (0,3 m), abyśmy mogli wizualizować odczyty.
Wartość jest również mnożona przez 0,37699, ponieważ wiemy, że prędkość = (obr / min (średnica * Pi) / 60). Formuły są uproszczone do
v = promień_koła * obr / min * 0,37699;
Po obliczeniu prędkości możemy również obliczyć pokonaną odległość za pomocą podobnej metody. Dzięki naszemu układowi hali i magnesu wiemy, ile razy koło się obróciło. Znamy również promień koła, za pomocą którego możemy obliczyć obwód koła, przyjmując promień koła równy 0,3 m (R), wartości obwodu Pi * R * R wyniosą 0,2827. Oznacza to, że za każdym razem, gdy czujnik halla napotyka magnes, koło pokonuje odległość 0,2827 metra.
Pokonana_odległość = pokonana_odległość + obwód_z_okręgu
Ponieważ teraz wiemy, jak ten projekt będzie działał, przejdźmy do naszego schematu obwodu i zacznijmy go budować.
Schemat obwodu i konfiguracja sprzętu:
Schemat obwodu tego projektu prędkościomierza i licznika kilometrów jest bardzo prosty i można go zbudować na płytce prototypowej. Jeśli korzystałeś z samouczków PIC, możesz również ponownie użyć sprzętu, którego używaliśmy do nauki mikrokontrolerów PIC. Tutaj użyliśmy tej samej płytki perf, którą zbudowaliśmy do migania diod LED z mikrokontrolerem PIC, jak pokazano poniżej:
W poniższej tabeli przedstawiono połączenia pinów MCU PIC16F877A.
S.No: |
Kod PIN |
Nazwa pinu |
Połączony z |
1 |
21 |
RD2 |
RS LCD |
2 |
22 |
RD3 |
E z LCD |
3 |
27 |
RD4 |
D4 wyświetlacza LCD |
4 |
28 |
RD5 |
D5 wyświetlacza LCD |
5 |
29 |
RD6 |
D6 wyświetlacza LCD |
6 |
30 |
RD7 |
D7 wyświetlacza LCD |
7 |
33 |
RB0 / INT |
3 rd kołek czujnika Halla |
Po zbudowaniu projektu powinien on wyglądać mniej więcej tak na poniższym obrazku
Jak widać, użyłem dwóch pudełek do umieszczenia silnika i czujnika halla w pobliżu. Możesz zamocować magnes na obracającym się obiekcie i nienaruszać czujnika Halla blisko niego w taki sposób, aby mógł wykryć magnes.
Uwaga: czujnik Halla ma polaryzację, więc upewnij się, który biegun wykrywa i odpowiednio go umieść.
Upewnij się również, że używasz rezystora pull-up z pinem wyjściowym czujnika Halla.
Symulacja:
Symulacja dla tego projektu odbywa się za pomocą Proteusa. Ponieważ projekt obejmuje poruszające się obiekty, nie jest możliwe zademonstrowanie całego projektu za pomocą symulacji, ale można zweryfikować działanie LCD. Po prostu załaduj plik hex do symulacji i wykonaj symulację. Będziesz mógł zauważyć, że wyświetlacz LCD działa, jak pokazano poniżej.
Aby sprawdzić, czy prędkościomierz i licznik kilometrów działają, wymieniłem czujnik Halla na urządzenie stanu logicznego. Podczas symulacji możesz kliknąć przycisk stanu logicznego, aby wywołać przerwanie i sprawdzić, czy prędkość i pokonana odległość są aktualizowane, jak pokazano powyżej.
Programowanie twojego PIC16F877A:
Jak wspomniano wcześniej, będziemy używać timerów i przerwań mikrokontrolera PIC16F877A do obliczenia czasu potrzebnego na jeden pełny obrót koła. Dowiedzieliśmy się już, jak używać timerów w naszym poprzednim samouczku. Pełny kod projektu podałem na końcu tego artykułu. Dalej wyjaśniłem kilka ważnych kwestii poniżej.
Poniższe wiersze kodu inicjują Port D jako styki wyjściowe dla interfejsu LCD i RB0 jako styk wejściowy do używania go jako styku zewnętrznego. Ponadto włączyliśmy wewnętrzny rezystor podciągający za pomocą OPTION_REG i ustawiliśmy również 64 jako przedsprzedaż. Następnie włączamy przerwanie globalne i peryferyjne, aby włączyć zegar i przerwanie zewnętrzne. Aby zdefiniować RB0 jako zewnętrzne przerwanie, należy ustawić bit INTE w stan wysoki. Wartość przepełnienia jest ustawiona na 100, tak aby co 1 milisekundę wyzwalana była flaga przerwania timera TMR0IF. Pomoże to w uruchomieniu licznika milisekundowego, aby określić czas w milisekundach:
TRISD = 0x00; // PORTD zadeklarowany jako wyjście dla interfejsu LCD TRISB0 = 1; // Zdefiniuj pin RB0 jako wejście do użycia jako pin przerwania OPTION_REG = 0b00000101; // Timer0 64 jako prescalar // Włącza również PULL UPs TMR0 = 100; // Załaduj wartość czasu przez 1 ms; delayValue może zawierać się w przedziale 0-256 tylko TMR0IE = 1; // Włącz bit przerwania timera w rejestrze PIE1 GIE = 1; // Włącz globalne przerwanie PEIE = 1; // Włącz przerwanie peryferyjne INTE = 1; // Włącz RB0 jako zewnętrzny pin przerwania
Poniższa funkcja zostanie wykonana za każdym razem, gdy zostanie wykryte przerwanie. Możemy nazwać funkcję zgodnie z naszym życzeniem, więc nazwałem ją jako speed_isr (). Ten program zajmuje się dwoma przerwaniami, jednym jest Przerwanie czasowe, a drugim Przerwanie zewnętrzne. Ilekroć wystąpi przerwanie timera, flaga TMR0IF staje się wysoka, aby wyczyścić i zresetować przerwanie, musimy ustawić je na niskim poziomie, definiując TMR0IF = 0, jak pokazano w kodzie poniżej.
void breaking speed_isr () {if (TMR0IF == 1) // Licznik czasu się przepełnił {TMR0IF = 0; // Wyczyść flagę przerwania licznika milli_sec ++; } if (INTF == 1) {rpm = (1000 / milli_sec) * 60; prędkość = 0,3 * obr / min * 0,37699; // (Zakładając, że promień koła wynosi 30 cm) INTF = 0; // wyczyść flagę przerwania milli_sec = 0; odległość = odległość + 028,2; }}
Podobnie, gdy wystąpi zewnętrzne przerwanie, flaga INTF stanie się wysoka, to również powinno zostać wyczyszczone przez zdefiniowanie INTF = 0. Wymagany czas jest kontrolowany przez przerwanie timera, a przerwanie zewnętrzne określa, kiedy koło wykonało jeden pełny obrót. Na podstawie tych danych prędkość i odległość pokonana przez koło jest obliczana podczas każdego zewnętrznego przerwania.
Po obliczeniu prędkości i odległości można je po prostu wyświetlić na ekranie LCD za pomocą naszych funkcji LCD. Jeśli nie masz doświadczenia z wyświetlaczami LCD, zapoznaj się z naszym samouczkiem dotyczącym interfejsu LCD z PIC16F877A MCU.
Objaśnienie robocze:
Po przygotowaniu sprzętu i oprogramowania po prostu prześlij kod do swojego PIC16F877A. Jeśli jesteś zupełnie nowy w PIC, powinieneś przeczytać kilka samouczków, aby wiedzieć, jak załadować program do mikrokontrolera PIC16F877A.
Użyłem zmiennej POT do regulacji prędkości silnika w celach demonstracyjnych. Możesz również użyć tego samego, aby znaleźć aplikację czasu rzeczywistego. Jeśli wszystko działa zgodnie z oczekiwaniami, powinieneś być w stanie uzyskać prędkość w km / h i pokonaną odległość w metrach, jak pokazano na poniższym filmie.
Mam nadzieję, że projekt Ci się podobał i udało Ci się go uruchomić Jeśli nie, możesz skorzystać z sekcji komentarzy poniżej lub forum, aby zamieścić swoje wątpliwości.