- Material som krävs:
- Beräkning av hastighet och täckt avstånd:
- Kretsschema och hårdvaruinstallation:
- Simulering:
- Programmering av din PIC16F877A:
- Arbetsförklaring:
Att mäta hastigheten / varvtalet för ett fordon eller en motor har alltid varit ett fascinerande projekt för oss att försöka. Så i det här projektet kommer vi att bygga en med hjälp av de industriella PIC-mikrokontrollerna. Vi använder en magnetbit och en Hall-sensor för att mäta hastigheten. Det finns andra sätt / sensorer för att mäta hastigheten, men det är billigt att använda en hallsensor och kan också användas på alla typer av motorer / fordon. Genom att göra detta projekt kommer vi också att förbättra våra färdigheter i att lära oss PIC16F877A eftersom projektet innebär användning av avbrott och timers. I slutet av detta projekt kommer du att kunna beräkna hastigheten och avstånden som täcks av alla roterande objekt och visa dem på en 16x2 LCD-skärm. Låt oss börja med denna digitala hastighetsmätare och vägmätarkrets med PIC.
Material som krävs:
- PIC16F877A
- 7805 Spänningsregulator
- Hall-effektsensor (US1881 / 04E)
- 16 * 2 LCD-skärm
- En liten bit magnet
- Anslutande ledningar
- Kondensatorer
- Bakbord.
- Strömförsörjning
Beräkning av hastighet och täckt avstånd:
Innan vi faktiskt börjar bygga kretsen, låt oss förstå hur vi kommer att använda en Hall-sensor och en magnet för att beräkna hastigheten på ett hjul. Tidigare har vi använt samma teknik för att bygga Arduino hastighetsmätare som visar avläsningar på Android Smart Phone.
En Hall-sensor är en enhet som kan detektera närvaron av en magnet baserat på dess polaritet. Vi sticker en liten magnetbit på hjulet och placerar hallsensorn nära den på ett sådant sätt att hallsensorn upptäcker den varje gång hjulet roterar. Vi använder sedan hjälp av timers och Interrupts på vår PIC Microcontroller för att beräkna den tid det tar för en fullständig rotation av hjulet.
När den tagna tiden är känd kan vi beräkna varvtalet med hjälp av nedanstående formler, där 1000 / tid som tas ger oss RPS och ytterligare multiplicering med 60 kommer att ge dig varvtal
rpm = (1000 / tidtabell) * 60;
Där (1000 / tidtabell) ger varvtalet (Varv per sekund) och det multipliceras med 60 för att omvandla varvtal till varvtal (Varv per minut).
För att beräkna hastigheten på fordonet måste vi känna till hjulets radie. I vårt projekt har vi använt ett litet leksakshjul som har en radie på bara 3 cm. Men vi antog att hjulets radie ska vara 30 cm (0,3 m) så att vi kan visualisera avläsningarna.
Värdet multipliceras också med 0.37699 eftersom vi vet att Velocity = (RPM (diameter * Pi) / 60). Formlerna förenklas ner till
v = radie_av_hjul * varv / min * 0.37699;
När vi väl har beräknat hastigheten kan vi också beräkna avståndet som täcks med en liknande metod. Med vårt Hall- och magnetarrangemang vet vi att hur många gånger hjulet har roterat. Vi känner också till hjulets radie, med vilken vi kan hitta hjulets omkrets, förutsatt att hjulets radie är 0,3 m (R) är omkretsens värden Pi * R * R 0,2827. Detta innebär att för varje gång hallsensorn möter magneten täcks 0,2827 meter av hjulet.
Distance_covered = avstånd_täckt + omkrets_ av_cirkeln
Eftersom vi nu vet hur detta projekt kommer att fungera kan vi gå vidare till vårt kretsschema och börja bygga det.
Kretsschema och hårdvaruinstallation:
Kretsschemat för detta hastighets- och vägmätarprojekt är väldigt enkelt och kan byggas på en bräda. Om du har följt PIC-självstudierna kan du också återanvända hårdvaran som vi använde för att lära oss PIC-mikrokontroller. Här har vi använt samma perf Board som vi har byggt för LED Blinking med PIC Microcontroller, som visas nedan:
Stiftanslutningarna för PIC16F877A MCU ges i tabellen nedan.
S. nej: |
Pinkod |
Pin-namn |
Anslutna till |
1 |
21 |
RD2 |
RS på LCD |
2 |
22 |
RD3 |
E av LCD |
3 |
27 |
RD4 |
D4 på LCD |
4 |
28 |
RD5 |
D5 på LCD |
5 |
29 |
RD6 |
D6 på LCD |
6 |
30 |
RD7 |
D7 på LCD |
7 |
33 |
RB0 / INT |
3 : e stift av hallsensor |
När du väl har byggt ditt projekt ska det se ut så här på bilden nedan
Som du ser har jag använt två lådor för att placera motorn och en hallsensor i närliggande läge. Du kan fästa magneten på ditt roterande objekt och intakta hallsensorn nära den på ett sådant sätt att den kan upptäcka magneten.
Obs! Hallsensorn har polariteter, så se till vilken pol den upptäcker och placera den därefter.
Se också till att du använder ett pull-up-motstånd med hallsensorns utgång.
Simulering:
Simuleringen för detta projekt görs med hjälp av Proteus. Eftersom projektet involverar rörliga objekt är det inte möjligt att visa hela projektet med simulering, men LCD-skärmens funktion kan verifieras. Ladda bara hex-filen till simuleringen och simulera den. Du kommer att kunna märka att LCD-skärmen fungerar som visas nedan.
För att kontrollera att hastighetsmätaren och vägmätaren fungerar har jag bytt ut Hall-sensorn med en Logic-tillståndsenhet. Under simuleringen kan du klicka på knappen för logiskt tillstånd för att utlösa avbrottet och kontrollera om hastigheten och sträckan som täcks uppdateras som visas ovan.
Programmering av din PIC16F877A:
Som sagt tidigare kommer vi att använda hjälp av timers och avbrott i PIC16F877A Microcontroller för att beräkna den tid det tar för en fullständig rotation av hjulet. Vi har redan lärt oss hur man använder timers i vår genomträngande handledning. Jag har gett den fullständiga koden för projektet i slutet av den här artikeln. Vidare har jag förklarat några viktiga rader nedan.
Nedanstående kodrader initialiserar Port D som utgångsstift för LCD-gränssnitt och RB0 som ingångsstift för att använda den som extern stift. Vidare har vi aktiverat internt uppdragningsmotstånd med OPTION_REG och har också ställt in 64 som förförsäljning. VI aktiverar sedan global och perifer avbrott för att aktivera timer och extern avbrott. Att definiera RB0 som extern avbrottsbit INTE bör göras hög. Värdet för överflödet är inställt på att vara 100 så att tidsavbrottsflaggan TMR0IF utlöses för varje 1 millisekund. Detta hjälper till att köra en millisekundtimer för att bestämma tiden som tas i millisekund:
TRISD = 0x00; // PORTD deklareras som utgång för gränssnitt mellan LCD TRISB0 = 1; // DE Definiera RB0-stiftet som ingång för att använda som avbrottsstift OPTION_REG = 0b00000101; // Timer0 64 som prescalar // Aktiverar även PULL UPs TMR0 = 100; // Ladda tidsvärdet för 1 ms; delayValue kan vara mellan 0-256 endast TMR0IE = 1; // Aktivera timeravbrottsbit i PIE1-registret GIE = 1; // Aktivera Global Interrupt PEIE = 1; // Enable the Peripheral Interrupt INTE = 1; // Aktivera RB0 som extern avbrottsstift
Funktionen nedan utförs varje gång ett avbrott upptäcks. Vi kan namnge funktionen enligt vår önskan så jag har namngett den som speed_isr (). Detta program handlar om två avbrott, en är Timer Interrupt och den andra är External Interrupt. Närhelst ett timeravbrott inträffar går flaggan TMR0IF högt, för att rensa och återställa avbrottet måste vi göra det lågt genom att definiera TMR0IF = 0 som visas i koden nedan.
ogiltig interrupt speed_isr () {if (TMR0IF == 1) // Timern har överflödat {TMR0IF = 0; // Rensa timeravbrottsflagga milli_sec ++; } om (INTF == 1) {rpm = (1000 / milli_sec) * 60; hastighet = 0,3 * rpm * 0,37699; // (förutsatt att hjulets radie är 30 cm) INTF = 0; // rensa avbrottsflaggan milli_sec = 0; avstånd = avstånd + 028,2; }}
På samma sätt när externt avbrott inträffar kommer flaggan INTF att bli hög, detta bör också rensas genom att definiera INTF = 0. Tiden som tas hålls i spår av Timer Interrupt och det externa Interrupt avgör när hjulet har slutfört en hel rotation. Med dessa data beräknas hastigheten och sträckan som täcks av hjulet vid varje externt avbrott.
När hastigheten och sträckan har beräknats kan de enkelt visas på LCD-skärmen med våra LCD-funktioner. Om du är ny på LCD-skärmar hänvisar du till vår gränssnitts-LCD med PIC16F877A MCU-handledning.
Arbetsförklaring:
När du har gjort hårdvaran och mjukvaran redo laddar du bara upp koden till din PIC16F877A. Om du är helt ny på PIC bör du behöva läsa några handledning om hur du kan ladda upp programmet till en PIC16F877A Microcontroller.
Jag har använt en variabel POT för att justera motorns hastighet för demonstrationsändamål. Du kan också använda samma för att hitta en applikation i realtid. Om allt fungerar som förväntat borde du kunna få hastigheten i km / hr och avstånd täckt i termer av meter som visas i videon nedan.
Hoppas du gillade projektet och fick det att fungera. Om inte kan du använda kommentarsektionen nedan eller forumet för att lägga upp ditt tvivel.