- Nødvendige materialer:
- Beregning av hastighet og tilbakelagt avstand:
- Kretsdiagram og maskinvareoppsett:
- Simulering:
- Programmering av PIC16F877A:
- Arbeidsforklaring:
Å måle hastigheten / o / min til et kjøretøy eller en motor har alltid vært et fascinerende prosjekt for oss å prøve. Så, i dette prosjektet skal vi bygge en med industrielle PIC-mikrokontrollere. Vi vil bruke et magnetstykke og en Hall-sensor for å måle hastigheten. Det er andre måter / sensorer for å måle hastigheten, men det er billig å bruke en hallsensor og kan også brukes på alle typer motorer / kjøretøy. Ved å gjøre dette prosjektet vil vi også forbedre ferdighetene våre i å lære PIC16F877A siden prosjektet innebærer bruk av Interrupts and Timers. På slutten av dette prosjektet vil du kunne beregne hastigheten og avstandene dekket av et roterende objekt og vise dem på en 16x2 LCD-skjerm. La oss starte med dette digitale hastighetsmåleren og kilometertellerkretsen med PIC.
Nødvendige materialer:
- PIC16F877A
- 7805 Spenningsregulator
- Hall-effekt sensor (US1881 / 04E)
- 16 * 2 LCD-skjerm
- Et lite stykke magnet
- Koble ledninger
- Kondensatorer
- Brettbrett.
- Strømforsyning
Beregning av hastighet og tilbakelagt avstand:
Før vi begynner å bygge kretsen, la oss forstå hvordan vi skal bruke en Hall-sensor og en magnet for å beregne hastigheten på et hjul. Tidligere har vi brukt samme teknikk for å bygge Arduino Speedometer som viser målinger på Android Smart Phone.
En Hall-sensor er en enhet som kan oppdage tilstedeværelsen av en magnet basert på polariteten. Vi stikker et lite stykke magnet på hjulet og plasserer hallføleren i nærheten av den på en slik måte at hallføleren oppdager den hver gang hjulet roterer. Vi bruker deretter hjelp av tidtakere og avbrudd på PIC-mikrokontrolleren vår for å beregne tiden det tar for en fullstendig rotasjon av hjulet.
Når tiden det tar er kjent, kan vi beregne RPM ved å bruke nedenstående formler. Hvor 1000 / tid det tar vil gi oss RPS og videre multiplisere det med 60 vil gi deg RPM
rpm = (1000 / tidsplan) * 60;
Hvor (1000 / timetaken) gir rps (revolusjoner per sekund) og det multipliseres med 60 for å konvertere rps til rpm (revolusjoner per minutt).
For å beregne hastigheten på kjøretøyet, må vi kjenne hjulets radius. I prosjektet vårt har vi brukt et lite leketøyhjul som har en radius på bare 3 cm. Men vi antok at hjulets radius skal være 30 cm (0,3 m) slik at vi kan visualisere avlesningene.
Verdien multipliseres også med 0.37699 siden vi vet at Velocity = (RPM (diameter * Pi) / 60). Formlene er forenklet ned til
v = radius_hjul * o / min * 0,37699;
Når vi har beregnet hastigheten, kan vi også beregne avstanden dekket ved å bruke en lignende metode. Med vårt Hall- og magnetarrangement vet vi at hvor mange ganger hjulet har rotert. Vi kjenner også hjulets radius, ved hjelp av hvilken vi kan finne omkretsen av hjulet, forutsatt at radiusen på hjulet er 0,3 m (R), vil verdiene til omkrets Pi * R * R være 0,2827. Dette betyr at for hver gang hallføleren møter magneten dekkes en avstand på 0,2827 meter av hjulet.
Distance_covered = distance_covered + omkrets_av_circle
Siden vi nå vet hvordan dette prosjektet vil fungere, kan vi fortsette til kretsskjemaet vårt og begynne å bygge det.
Kretsdiagram og maskinvareoppsett:
Kretsdiagrammet til dette speedometer- og kilometertellerprosjektet er veldig enkelt og kan bygges på et brødbrett. Hvis du har fulgt PIC-opplæringen, kan du også bruke maskinvaren som vi brukte til å lære PIC-mikrokontrollere. Her har vi brukt samme perf Board som vi har bygget for LED Blinking med PIC Microcontroller, som vist nedenfor:
Pin-tilkoblingene for PIC16F877A MCU er gitt i tabellen nedenfor.
S. nei: |
PIN-kode |
Pin-navn |
Koblet til |
1 |
21 |
RD2 |
RS på LCD |
2 |
22 |
RD3 |
E av LCD |
3 |
27 |
RD4 |
D4 av LCD |
4 |
28 |
RD5 |
D5 av LCD |
5 |
29 |
RD6 |
D6 av LCD |
6 |
30 |
RD7 |
D7 av LCD |
7 |
33 |
RB0 / INT |
3 rd pin av Hall-sensor |
Når du har bygget prosjektet ditt, bør det se ut slik på bildet nedenfor
Som du ser har jeg brukt to bokser for å plassere motoren og en hallsensor i nærliggende posisjon. Du kan feste magneten på det roterende objektet og intakte hall-sensoren i nærheten av den på en slik måte at den kan oppdage magneten.
Merk: Hall-sensoren har polariteter, så sørg for hvilken stolpe den oppdager, og plasser den deretter.
Forsikre deg også om at du bruker en opptrekksmotstand med utgangspinnen til hallføleren.
Simulering:
Simuleringen for dette prosjektet er gjort ved hjelp av Proteus. Siden prosjektet involverer flytting av objekter, er det ikke mulig å demonstrere hele prosjektet ved hjelp av simulering, men LCD-skjermen kan verifiseres. Bare last inn hex-filen til simuleringen og simuler den. Du vil kunne legge merke til at LCD-skjermen fungerer som vist nedenfor.
For å sjekke at speedometeret og kilometertelleren fungerer, har jeg byttet ut Hall-sensoren med en Logic state-enhet. Under simuleringen kan du klikke på logikk-tilstandsknappen for å utløse Avbryt og kontrollere om hastigheten og avstanden som dekkes blir oppdatert som vist ovenfor.
Programmering av PIC16F877A:
Som sagt tidligere, vil vi bruke hjelp av tidtakere og avbrudd i PIC16F877A Microcontroller for å beregne tiden det tar for en fullstendig rotasjon av hjulet. Vi har allerede lært hvordan du bruker timere i vår gjennomtrengende opplæring. Jeg har gitt den komplette koden til prosjektet på slutten av denne artikkelen. Videre har jeg forklart noen viktige linjer nedenfor.
Kodelinjene nedenfor initialiserer Port D som utgangspinner for LCD-grensesnitt og RB0 som inngangspinne for bruk av den som ekstern pin. Videre har vi aktivert intern opptrekksmotstand ved å bruke OPTION_REG og har også satt 64 som forhånds salg. VI aktiverer deretter global og perifer avbrudd for å aktivere tidtaker og ekstern avbrudd. Å definere RB0 som ekstern avbrytningsbit INTE, bør gjøres høyt. Verdien overflyt er satt til å være 100 slik at tidsavbruddsflagget TMR0IF utløses for hvert 1 millisekund. Dette vil bidra til å kjøre en millisekundtimer for å bestemme tiden det tar i millisekund:
TRISD = 0x00; // PORTD erklært som utgang for grensesnitt LCD TRISB0 = 1; // DEFiner RB0-pinnen som inngang for å bruke den som avbryterpinne OPTION_REG = 0b00000101; // Timer0 64 som prescalar // Aktiverer også PULL UPs TMR0 = 100; // Last tidsverdien for 1ms; delayValue kan være mellom 0-256 bare TMR0IE = 1; // Aktiver tidsavbruddsbit i PIE1-registeret GIE = 1; // Aktiver Global Interrupt PEIE = 1; // Aktiver perifer interrupt INTE = 1; // Aktiver RB0 som ekstern avbrytingspinne
Funksjonen nedenfor blir utført hver gang et avbrudd oppdages. Vi kan navngi funksjonen i henhold til vårt ønske, så jeg har kalt den som speed_isr (). Dette programmet tar for seg to avbrudd, den ene er Timer Interrupt og den andre er External Interrupt. Når en timeravbrudd oppstår, blir flagget TMR0IF høyt, for å fjerne og tilbakestille avbruddet, må vi gjøre det lavt ved å definere TMR0IF = 0 som vist i koden nedenfor.
ugyldig interrupt speed_isr () {if (TMR0IF == 1) // Timer har overflyttet {TMR0IF = 0; // Clear timer interrupt flag milli_sec ++; } hvis (INTF == 1) {rpm = (1000 / milli_sec) * 60; hastighet = 0,3 * o / min * 0,37699; // (Forutsatt at hjulradiusen er 30 cm) INTF = 0; // tøm avbruddsflagget milli_sec = 0; avstand = avstand + 028,2; }}
På samme måte når ekstern interrupt oppstår, vil flagget INTF gå høyt, dette bør også fjernes ved å definere INTF = 0. Tiden tatt holdes i sporet av Timer Interrupt, og den eksterne avbruddet bestemmer når hjulet har fullført en full rotasjon. Med disse dataene beregnes hastigheten og avstanden dekket av hjulet under hvert eksternt avbrudd.
Når hastighet og avstand er beregnet, kan de ganske enkelt vises på LCD-skjermen ved hjelp av LCD-funksjonene våre. Hvis du ikke er kjent med LCD-skjermer, kan du se vår grensesnitt-LCD med PIC16F877A MCU-opplæringen.
Arbeidsforklaring:
Etter at du har gjort maskinvare og programvare klar, laster du bare opp koden til PIC16F877A. Hvis du er helt ny på PIC, må du lese noen veiledninger om hvordan du kan laste opp programmet til en PIC16F877A mikrokontroller.
Jeg har brukt en variabel POT for å justere motorens hastighet for demonstrasjonsformål. Du kan også bruke det samme for å finne en sanntidsapplikasjon. Hvis alt fungerer som forventet, bør du kunne få dekket hastigheten i km / t og avstand målt i meter som vist i videoen nedenfor.
Håper du likte prosjektet og fikk det til å fungere. Hvis ikke kan du bruke kommentarseksjonen nedenfor eller forumet til å legge inn tvil.