- Szükséges anyagok:
- A megtett sebesség és távolság kiszámítása:
- Áramkör és hardver beállítása:
- Szimuláció:
- A PIC16F877A programozása:
- Munka magyarázat:
A jármű vagy motor sebességének / fordulatszámának mérése mindig is érdekes projekt volt számunkra. Tehát ebben a projektben építünk egyet az ipari kész PIC mikrovezérlők segítségével. Egy darab mágnest és egy Hall szenzort fogunk használni a sebesség mérésére. Vannak más módszerek / érzékelők is a sebesség mérésére, de a hall-érzékelő használata olcsó, és bármilyen típusú motorra / járműre is használható. A projekt végrehajtásával a PIC16F877A elsajátításával kapcsolatos képességeinket is továbbfejlesztjük, mivel a projekt megszakítások és időzítők használatát foglalja magában. A projekt végén kiszámíthatja a forgó tárgyak által megtett sebességet és távolságokat, és megjelenítheti azokat egy 16x2 LCD-képernyőn. Kezdjük ezzel a PIC-vel ellátott digitális sebességmérővel és kilométer-számlálóval.
Szükséges anyagok:
- PIC16F877A
- 7805 feszültségszabályozó
- Hall-effekt érzékelő (US1881 / 04E)
- 16 * 2 LCD kijelző
- Egy kis darab mágnes
- Csatlakozó vezetékek
- Kondenzátorok
- Kenyérlemez.
- Tápegység
A megtett sebesség és távolság kiszámítása:
Mielőtt elkezdenénk valóban megépíteni az áramkört, értsük meg, hogyan fogjuk használni a Hall szenzort és egy mágnest a kerék sebességének kiszámításához. Korábban ugyanazt a technikát használtuk az Arduino sebességmérő felépítéséhez, amely az Android okostelefonon jeleníti meg a leolvasott értékeket.
A Hall-érzékelő olyan eszköz, amely polaritása alapján képes felismerni a mágnes jelenlétét. Ragaszunk egy kis mágnesdarabot a kerékre, és a hall érzékelőt úgy helyezzük a közelébe, hogy minden alkalommal, amikor a kerék elfordul, a hall érzékelő észleli. Ezután a PIC mikrovezérlőnk időzítőinek és megszakításainak segítségével kiszámoljuk a kerék egy teljes forgatásához szükséges időt.
Amint az elvárt idő ismeretes, az alábbi képletek segítségével kiszámíthatjuk az RPM-et: Ahol 1000 / elvett idő megadja az RPS-t, és további 60-zal szorozva megkapja az RPM-et
fordulat / perc = (1000 / bevett) * 60;
Ahol (1000 / timetaken) adja meg az fordulatszámot (fordulat / másodperc), és ezt megszorozzuk 60-mal, hogy az fordulatszámot fordulatszámra fordítsuk (fordulat / perc).
A jármű sebességének kiszámításához meg kell ismernünk a kerék sugarát. Projektünk során egy kis játékkereket használtunk, amelynek sugara mindössze 3 cm. Feltételeztük azonban, hogy a kerék sugara 30 cm (0,3 m) legyen, hogy megjeleníthessük a leolvasott értékeket.
Az értéket szorozzuk 0,37699-re is, mivel tudjuk, hogy a sebesség = (RPM (átmérő * Pi) / 60). A képletek leegyszerűsítik
v = a kerék sugara * fordulat / perc * 0,37699;
Miután kiszámítottuk a sebességet, hasonló módszerrel kiszámíthatjuk a megtett távolságot is. Hall és mágneses elrendezésünkkel tudjuk, hogy a kerék hányszor forog. Ismerjük a kerék sugarát is, amelynek segítségével meg tudjuk találni a kerék kerületét, feltételezve, hogy a kerék sugara 0,3 m (R), a Pi * R * R kerületi érték 0,2827 lesz. Ez azt jelenti, hogy minden alkalommal, amikor a hall-érzékelő találkozik a mágnessel, a kerék 0,2827 méteres távolságot tesz meg.
Fedett távolság = lefedett távolság + a kör kerülete
Mivel most már tudjuk, hogyan fog működni ez a projekt, továbbléphetünk kapcsolási rajzunkra és elkezdhetjük annak felépítését.
Áramkör és hardver beállítása:
A sebességmérő és a kilométeróra projekt áramköre nagyon egyszerű, és kenyérlapra építhető. Ha követte a PIC oktatóanyagokat, akkor újból felhasználhatja azt a hardvert, amelyet a PIC mikrovezérlők megtanulásához használtunk. Itt ugyanazt a perf táblát használtuk, amelyet a PIC mikrovezérlővel villogó LED-hez építettünk, az alábbiak szerint:
A PIC16F877A MCU csatlakozóit az alábbi táblázat tartalmazza.
S. Nem: |
Pinkód |
PIN neve |
Csatlakozva valamihez |
1 |
21 |
RD2 |
Az LCD RS-je |
2 |
22. |
RD3 |
E az LCD |
3 |
27. |
RD4 |
Az LCD D4 |
4 |
28. |
RD5 |
D5 LCD |
5. |
29. |
RD6 |
Az LCD D6-ja |
6. |
30 |
RD7 |
D7 LCD |
7 |
33 |
RB0 / INT |
3 rd pin Hall-érzékelő |
Miután elkészítette a projektjét, valami ilyennek kell kinéznie az alábbi képen
Mint látható, két dobozt használtam a Motor és egy hall érzékelő közeli helyzetbe helyezéséhez. Rögzítheti a mágnest a forgó tárgyra, és érintse meg a hozzá közeli hall-érzékelőt oly módon, hogy az felismerje a mágnest.
Megjegyzés: A Hall-érzékelő polaritással rendelkezik, ezért ellenőrizze, hogy melyik pólust érzékeli, és ennek megfelelően helyezze el.
Ügyeljen arra is, hogy felhúzható ellenállást használjon a hall-érzékelő kimeneti tűjével.
Szimuláció:
A projekt szimulációja a Proteus segítségével történik. Mivel a projekt mozgó objektumokat tartalmaz, a teljes projektet nem lehet szimulációval bemutatni, de az LCD működése ellenőrizhető. Egyszerűen töltse be a hex fájlt a Szimulációba, és szimulálja azt. Észre fogja venni, hogy az LCD az alábbiak szerint működik.
A sebességmérő és a kilométer-számláló működésének ellenőrzéséhez kicseréltem a Hall érzékelőt egy Logic állapot eszközre. A szimuláció során a logikai állapot gombra kattintva aktiválhatja a megszakítást, és ellenőrizheti, hogy a megtett sebesség és távolság frissül-e a fentiek szerint.
A PIC16F877A programozása:
Mint korábban említettük, időzítők és megszakítások segítségével fogjuk használni a PIC16F877A mikrovezérlőt a kerék egy teljes forgatásához szükséges idő kiszámításához. Az Időzítők használatát már megtanultuk az átfogó oktatóanyagunkban. A cikk végén megadtam a projekt teljes kódját. Az alábbiakban néhány fontos sort elmagyaráztam.
Az alábbi kódsorok inicializálják a D portot az LCD interfész kimeneti tüskéiként és az RB0-t bemeneti tűként annak külső pólusként való használatához. Továbbá engedélyeztük a belső felhúzási ellenállást az OPTION_REG használatával, és a 64-et is előértékként állítottuk be. Ezután engedélyezzük a globális és perifériás megszakítást az időzítő és a külső megszakítás engedélyezéséhez. Az RB0 meghatározása külső megszakítási bitként az INTE-t magasra kell tenni. A Túlcsordulás értéke 100, így minden 1 ezredmásodpercnél a TMR0IF időzítő megszakítás jelző aktiválódik. Ez segít egy milliszekundumos időzítő futtatásában az ezredmásodpercben eltöltött idő meghatározásához:
TRISD = 0x00; // PORTD az interfész LCD TRISB0 = 1 kimeneteként deklarálva; // DE Határozza meg az RB0 tűt bemenetként, hogy megszakítási tűként használhassa OPTION_REG = 0b00000101; // Timer0 64 prescalarként // Engedélyezi a PULL UPs TMR0 = 100 értéket is; // Töltse be az időértéket 1 ms-ig; a delayValue csak 0-256 között lehet, TMR0IE = 1; // Időzítő megszakítási bit engedélyezése a GIE = 1 PIE1 regiszterben; // Globális megszakítás engedélyezése PEIE = 1; // Engedélyezze a perifériás megszakítást INTE = 1; // Engedélyezze az RB0-t külső megszakító tűként
Az alábbi függvény minden alkalommal végrehajtásra kerül, amikor egy megszakítást észlel. Nevezhetjük a függvényt kívánságunknak megfelelően, ezért Speed_isr () néven neveztem el. Ez a program két megszakítással foglalkozik, az egyik időzítő megszakítással, a másik pedig a külső megszakítással. Ha időzítő megszakítás történik, a TMR0IF jelző magasra megy, a megszakítás törléséhez és alaphelyzetbe állításához alacsonyra kell tennünk a TMR0IF = 0 meghatározásával, amint az az alábbi kódban látható.
void megszakítás speed_isr () {if (TMR0IF == 1) // Az időzítő túlcsordult {TMR0IF = 0; // Az időzítő megszakításának törlése milli_sec ++; } if (INTF == 1) {rpm = (1000 / milli_sec) * 60; sebesség = 0,3 * fordulat / perc * 0,37699; // (feltételezve, hogy a kerék sugara 30 cm) INTF = 0; // törli a megszakítási jelzőt milli_sec = 0; távolság = távolság + 028,2; }}
Hasonlóképpen, amikor a külső megszakítás bekövetkezik, az INTF jelző magasra megy, ezt is ki kell törölni az INTF = 0 meghatározásával. Az időzítést az időzítő megszakítás tartja nyomon, és a külső megszakítás határozza meg, hogy a kerék mikor hajtott végre egy teljes forgást. Ezekkel az adatokkal a kerék által megtett sebesség és távolság minden külső megszakítás során kiszámításra kerül.
A sebesség és a távolság kiszámítása után egyszerűen megjeleníthetők az LCD képernyőn az LCD funkcióink segítségével. Ha még nem ismeri az LCD-ket, olvassa el az interfész LCD-t a PIC16F877A MCU oktatóanyaggal.
Munka magyarázat:
Miután elkészítette a hardvert és szoftvert, egyszerűen töltse fel a kódot a PIC16F877A készülékre. Ha Ön még teljesen új a PIC-ben, akkor el kell olvasnia néhány oktatóanyagot arról, hogy miként lehet feltölteni a programot egy PIC16F877A mikrovezérlőre.
A motor fordulatszámának bemutatására változó POT értéket használtam. Használhatja ugyanazt a valós idejű alkalmazás megtalálásához is. Ha minden a várakozásoknak megfelelően működik, akkor képesnek kell lennie arra, hogy megkapja a sebességet km-ben / órában és megtett távolságot méterben, ahogy az alábbi videó mutatja.
Remélem, hogy tetszett a projekt és működőképes volt. Ha nem, akkor használhatja az alábbi megjegyzések részt vagy a fórumot kétségeinek feltüntetéséhez.