- Nødvendige materialer:
- Beregning af hastighed og tilbagelagt afstand:
- Kredsløbsdiagram og hardwareopsætning:
- Simulation:
- Programmering af din PIC16F877A:
- Arbejdsforklaring:
Måling af hastighed / omdrejningstal for et køretøj eller en motor har altid været et fascinerende projekt for os at prøve. Så i dette projekt skal vi bygge en ved hjælp af PIC-mikrocontrollere, der er industrielle. Vi bruger et stykke magnet og en Hall-sensor til at måle hastigheden. Der er andre måder / sensorer til at måle hastigheden, men det er billigt at bruge en hallsensor og kan også bruges på enhver type motor / køretøj. Ved at gøre dette projekt vil vi også forbedre vores færdigheder i at lære PIC16F877A, da projektet involverer brugen af Interrupts og Timers. I slutningen af dette projekt vil du være i stand til at beregne hastigheden og afstandene, der er dækket af ethvert roterende objekt, og vise dem på en 16x2 LCD-skærm. Lad os starte med dette digitale hastighedsmåler og kilometertællerkredsløb med PIC.
Nødvendige materialer:
- PIC16F877A
- 7805 Spændingsregulator
- Hall-effektsensor (US1881 / 04E)
- 16 * 2 LCD-skærm
- Et lille stykke magnet
- Tilslutning af ledninger
- Kondensatorer
- Brødbræt.
- Strømforsyning
Beregning af hastighed og tilbagelagt afstand:
Før vi faktisk begynder at opbygge kredsløbet, lad os forstå, hvordan vi bruger en Hall-sensor og en magnet til at beregne hastigheden på et hjul. Tidligere har vi brugt samme teknik til at opbygge Arduino Speedometer, der viser aflæsninger på Android Smart Phone.
En Hall-sensor er en enhed, der kan registrere tilstedeværelsen af en magnet baseret på dens polaritet. Vi sætter et lille stykke magnet på hjulet og placerer hall-sensoren i nærheden af den på en sådan måde, at hall-sensoren registrerer den, hver gang hjulet roterer. Vi bruger derefter hjælp fra timere og afbrydelser på vores PIC Microcontroller til at beregne den tid, det tager for en fuldstændig rotation af hjulet.
Når den tid, der er taget, er kendt, kan vi beregne RPM ved hjælp af nedenstående formler, hvor 1000 / tid taget giver os RPS og yderligere multiplicering med 60 giver dig RPM
rpm = (1000 / tidsplan) * 60;
Hvor (1000 / timetaken) giver rps (omdrejninger pr. Sekund), og det ganges med 60 for at konvertere rps til rpm (omdrejninger pr. Minut).
For at beregne køretøjets hastighed skal vi kende hjulets radius. I vores projekt har vi brugt et lille legetøjshjul, der kun har en radius på 3 cm. Men vi antog, at hjulets radius skal være 30 cm (0,3 m), så vi kan visualisere aflæsningerne.
Værdien ganges også med 0.37699, da vi ved, at Velocity = (RPM (diameter * Pi) / 60). Formlerne er forenklet ned til
v = radius af hjul * omdrejninger pr. minut * 0,37699;
Når vi først har beregnet hastigheden, kan vi også beregne den tilbagelagte afstand ved hjælp af en lignende metode. Med vores Hall- og magnetarrangement ved vi, at hvor mange gange hjulet har roteret. Vi kender også hjulets radius, ved hjælp af hvilken vi kan finde hjulets omkreds, forudsat at hjulets radius er 0,3 m (R), vil værdierne for omkredsen Pi * R * R være 0,2827. Det betyder, at for hver gang hallføleren møder magneten, er en afstand på 0,2827 meter dækket af hjulet.
Distance_afdækket = afstand_afdækket + omkreds_af_cirklen
Siden vi nu ved, hvordan dette projekt fungerer, kan vi gå videre til vores kredsløbsdiagram og begynde at bygge det.
Kredsløbsdiagram og hardwareopsætning:
Kredsløbsdiagrammet for dette speedometer- og kilometertællerprojekt er meget simpelt og kan bygges på et brødbræt. Hvis du har fulgt PIC-vejledningerne, kan du også genbruge den hardware, som vi brugte til at lære PIC-mikrocontrollere. Her har vi brugt det samme perf Board, som vi har bygget til LED Blinking med PIC Microcontroller, som vist nedenfor:
Stikforbindelserne til PIC16F877A MCU er angivet i nedenstående tabel.
S. nej: |
Pinkode |
Pin-navn |
Forbundet til |
1 |
21 |
RD2 |
RS på LCD |
2 |
22 |
RD3 |
E af LCD |
3 |
27 |
RD4 |
D4 af LCD |
4 |
28 |
RD5 |
D5 af LCD |
5 |
29 |
RD6 |
D6 af LCD |
6 |
30 |
RD7 |
D7 af LCD |
7 |
33 |
RB0 / INT |
3 rd pin af Hall-sensor |
Når du har bygget dit projekt, skal det se sådan ud på billedet nedenfor
Som du kan se, har jeg brugt to kasser til at placere motoren og en hallsensor i nærliggende position. Du kan fastgøre magneten på din roterende genstand og intakte hall-sensoren tæt på den på en sådan måde, at den kan registrere magneten.
Bemærk: Hall-sensoren har polariteter, så sørg for, hvilken pol den registrerer, og placer den i overensstemmelse hermed.
Sørg også for at bruge en Pull-up-modstand med hall-sensorens udgangsstift.
Simulation:
Simuleringen til dette projekt udføres ved hjælp af Proteus. Da projektet involverer bevægelse af objekter, er det ikke muligt at demonstrere det komplette projekt ved hjælp af simulering, men LCD'ens funktion kan verificeres. Du skal blot indlæse hex-filen til simuleringen og simulere den. Du vil være i stand til at bemærke, at LCD'et fungerer som vist nedenfor.
For at kontrollere, om speedometeret og kilometertælleren fungerer, har jeg udskiftet Hall-sensoren med en Logic-tilstandsenhed. Under simuleringen kan du klikke på knappen for logisk tilstand for at udløse Interrupt og kontrollere, om hastigheden og den tilbagelagte afstand opdateres som vist ovenfor.
Programmering af din PIC16F877A:
Som nævnt tidligere bruger vi hjælp fra timere og afbrydelser i PIC16F877A Microcontroller til at beregne den tid, det tager for en fuldstændig rotation af hjulet. Vi har allerede lært at bruge timere i vores gennemgribende vejledning. Jeg har givet den komplette kode for projektet i slutningen af denne artikel. Yderligere har jeg forklaret nogle få vigtige linjer nedenfor.
Nedenstående kodelinjer initialiserer Port D som outputstifter til LCD-interface og RB0 som input pin til brug af den som ekstern pin. Desuden har vi aktiveret intern pull-up modstand ved hjælp af OPTION_REG og har også indstillet 64 som forsalg. Derefter aktiverer vi global og perifer afbrydelse for at aktivere timer og ekstern afbrydelse. At definere RB0 som ekstern interruptbit INTE skal gøres højt. Værdien af overløb er indstillet til at være 100, så timers afbrydelsesflag TMR0IF for hver 1 millisekund udløses. Dette hjælper med at køre en millisekundtimer for at bestemme den tid, der tager i millisekund:
TRISD = 0x00; // PORTD deklareret som output til grænseflade mellem LCD TRISB0 = 1; // DEfiner RB0-stiften som input til brug som afbrydestift OPTION_REG = 0b00000101; // Timer0 64 som prescalar // Aktiverer også PULL UPs TMR0 = 100; // Indlæs tidsværdien for 1 ms; delayValue kan være mellem 0-256 kun TMR0IE = 1; // Aktivér timerinterruptbit i PIE1-registeret GIE = 1; // Aktiver Global Interrupt PEIE = 1; // Aktivér den perifere afbrydelse INTE = 1; // Aktivér RB0 som ekstern Interrupt pin
Nedenstående funktion udføres hver gang en Afbrydelse registreres. Vi kan navngive funktionen efter vores ønske, så jeg har navngivet den som speed_isr (). Dette program beskæftiger sig med to afbrydelser, den ene er Timer Interrupt og den anden er Ekstern Interrupt. Hver gang der forekommer en Timer Interrupt, går flagget TMR0IF højt, for at rydde og nulstille interruptet skal vi gøre det lavt ved at definere TMR0IF = 0 som vist i koden nedenfor.
ugyldig afbrydelse speed_isr () {hvis (TMR0IF == 1) // Timer er overløb {TMR0IF = 0; // Clear timer interrupt flag milli_sec ++; } hvis (INTF == 1) {rpm = (1000 / milli_sec) * 60; hastighed = 0,3 * o / min * 0,37699; // (forudsat at hjulets radius er 30 cm) INTF = 0; // ryd afbrydelsesflaget milli_sec = 0; afstand = afstand + 028,2; }}
Tilsvarende når ekstern afbrydelse opstår, vil flag INTF gå højt, dette bør også ryddes ved at definere INTF = 0. Tiden holdes i sporet af Timer Interrupt, og den eksterne Interrupt bestemmer, hvornår hjulet har afsluttet en fuld rotation. Med disse data beregnes hjulets hastighed og afstand under hver ekstern afbrydelse.
Når hastighed og afstand er beregnet, kan de blot vises på LCD-skærmen ved hjælp af vores LCD-funktioner. Hvis du er ny på LCD-skærme, skal du henvise til vores interface-LCD med PIC16F877A MCU-vejledning.
Arbejdsforklaring:
Når du har gjort hardware og software klar, skal du blot uploade koden til din PIC16F877A. Hvis du er helt ny i PIC, skal du læse nogle få tutorials om at vide, hvordan du uploader programmet til en PIC16F877A Microcontroller.
Jeg har brugt en variabel POT til at justere motorens hastighed til demonstrationsformål. Du kan også bruge det samme til at finde en applikation i realtid. Hvis alt fungerer som forventet, skal du være i stand til at få hastigheden i km / t og afstand dækket målt i meter som vist i videoen nedenfor.
Håber du nød projektet og fik det til at fungere. Hvis ikke kan du bruge kommentarsektionen nedenfor eller forummet til at sende din tvivl.