- Vereiste materialen:
- Berekening van snelheid en afgelegde afstand:
- Schakelschema en hardware-instellingen:
- Simulatie:
- Programmering van uw PIC16F877A:
- Werkende uitleg:
Het meten van de snelheid / rpm van een voertuig of een motor is voor ons altijd een fascinerend project geweest om te proberen. Dus in dit project gaan we er een bouwen met behulp van de Industrial Ready PIC-microcontrollers. We zullen een stuk magneet en een Hall-sensor gebruiken om de snelheid te meten. Er zijn andere manieren / sensoren om de snelheid te meten, maar het gebruik van een hall-sensor is goedkoop en kan ook op elk type motor / voertuig worden gebruikt. Door dit project te doen, zullen we ook onze vaardigheden bij het leren van PIC16F877A verbeteren, aangezien het project het gebruik van Interrupts en Timers omvat. Aan het einde van dit project kun je de snelheid en afstanden berekenen die door een roterend object worden afgelegd en deze weergeven op een 16x2 LCD-scherm. Laten we beginnen met deze digitale snelheidsmeter en kilometertellercircuit met PIC.
Vereiste materialen:
- PIC16F877A
- 7805 Spanningsregelaar
- Hall-effectsensor (US1881 / 04E)
- 16 * 2 LCD-scherm
- Een klein stukje magneet
- Draden aansluiten
- Condensatoren
- Breadboard.
- Stroomvoorziening
Berekening van snelheid en afgelegde afstand:
Voordat we daadwerkelijk beginnen met het bouwen van het circuit, moeten we eerst begrijpen hoe we een Hall-sensor en een magneet zullen gebruiken om de snelheid van een wiel te berekenen. Eerder hebben we dezelfde techniek gebruikt om een Arduino-snelheidsmeter te bouwen die metingen op Android Smart Phone weergeeft.
Een Hall-sensor is een apparaat dat de aanwezigheid van een magneet kan detecteren op basis van zijn polariteit. We plakken een klein stukje magneet op het wiel en plaatsen de Hall-sensor er zo naast dat elke keer dat het wiel draait, de Hall-sensor het detecteert. Vervolgens gebruiken we de hulp van timers en Interrupts op onze PIC Microcontroller om de tijd te berekenen die nodig is voor een volledige rotatie van het wiel.
Zodra de benodigde tijd bekend is, kunnen we de RPM berekenen met behulp van de onderstaande formules, waarbij 1000 / genomen tijd ons de RPS geeft en verder vermenigvuldigen met 60 geeft u de RPM
rpm = (1000 / dienstregeling) * 60;
Waar (1000 / timetaken) geeft de rps (omwentelingen per seconde) en het wordt vermenigvuldigd met 60 om rps om te rekenen naar rpm (omwentelingen per minuut).
Om de snelheid van het voertuig te berekenen, moeten we de straal van het wiel weten. In ons project hebben we een klein speelgoedwiel gebruikt met een straal van slechts 3 cm. Maar we gingen ervan uit dat de straal van het wiel 30 cm (0,3 m) moet zijn, zodat we de metingen kunnen visualiseren.
De waarde wordt ook vermenigvuldigd met 0,37699 omdat we weten dat Velocity = (RPM (diameter * Pi) / 60). De formules zijn vereenvoudigd tot
v = radius_of_wheel * rpm * 0,37699;
Zodra we de snelheid hebben berekend, kunnen we ook de afgelegde afstand berekenen met behulp van een vergelijkbare methode. Met onze Hall- en magneetopstelling weten we hoeveel keer het wiel heeft gedraaid. We kennen ook de straal van het wiel, waarmee we de omtrek van het wiel kunnen vinden, ervan uitgaande dat de straal van het wiel 0,3 m (R) is, zullen de waarden van de omtrek Pi * R * R 0,2827 zijn. Dit betekent dat voor elke keer dat de Hall-sensor de magneet ontmoet een afstand van 0.2827 meter wordt afgelegd door het wiel.
Distance_covered = distance_covered + circumference_of_the_circle
Omdat we nu weten hoe dit project zal werken, gaan we verder met ons schakelschema en beginnen we met het bouwen ervan.
Schakelschema en hardware-instellingen:
Het schakelschema van dit snelheidsmeter- en kilometertellerproject is heel eenvoudig en kan op een breadboard worden gebouwd. Als je de PIC-tutorials hebt gevolgd, kun je ook de hardware hergebruiken die we hebben gebruikt om PIC-microcontrollers te leren. Hier hebben we dezelfde perf Board gebruikt die we hebben gebouwd voor LED Blinking met PIC Microcontroller, zoals hieronder getoond:
De pinverbindingen voor de PIC16F877A MCU staan in de onderstaande tabel.
S.Nee: |
Pincode |
Pin Naam |
Verbonden met |
1 |
21 |
RD2 |
RS van LCD |
2 |
22 |
RD3 |
E van LCD |
3 |
27 |
RD4 |
D4 van LCD |
4 |
28 |
RD5 |
D5 van LCD |
5 |
29 |
RD6 |
D6 van LCD |
6 |
30 |
RD7 |
D7 van LCD |
7 |
33 |
RB0 / INT |
3 rd pin van Hallsensor |
Zodra u uw project heeft gebouwd, zou het er in de onderstaande afbeelding ongeveer zo uit moeten zien
Zoals je kunt zien heb ik twee dozen gebruikt om de motor te plaatsen en een hall-sensor in de nabije positie. U kunt de magneet op uw roterend object bevestigen en de Hall-sensor er dichtbij intact houden zodat deze de magneet kan detecteren.
Opmerking: Hall-sensor heeft polariteiten, dus zorg ervoor welke pool hij detecteert en plaats deze dienovereenkomstig.
Zorg er ook voor dat je een pull-up weerstand gebruikt met de output pin van de hall sensor.
Simulatie:
De simulatie voor dit project wordt gedaan met Proteus. Aangezien het project bewegende objecten omvat, is het niet mogelijk om het volledige project te demonstreren door middel van simulatie, maar de werking van het LCD-scherm kan worden gecontroleerd. Laad eenvoudig het hex-bestand naar de simulatie en simuleer het. U zult merken dat het LCD-scherm werkt zoals hieronder weergegeven.
Om te controleren of de snelheidsmeter en kilometerteller werken heb ik de Hall-sensor vervangen door een Logic state device. Tijdens de simulatie kunt u op de logische statusknop klikken om de onderbreking te activeren en controleren of de snelheid en de afgelegde afstand worden bijgewerkt zoals hierboven weergegeven.
Programmering van uw PIC16F877A:
Zoals eerder gezegd zullen we de hulp van timers en interrupts in de PIC16F877A Microcontroller gebruiken om de tijd te berekenen die nodig is voor een volledige rotatie van het wiel. We hebben al geleerd hoe we Timers kunnen gebruiken in onze vorige tutorial. Ik heb de volledige code van het project aan het einde van dit artikel gegeven. Verder heb ik hieronder enkele belangrijke regels uitgelegd.
De onderstaande coderegels initialiseren de poort D als uitgangspennen voor LCD-interfacing en RB0 als ingangspen voor gebruik als externe pen. Verder hebben we de interne pull-up-weerstand ingeschakeld met behulp van de OPTION_REG en hebben we ook 64 ingesteld als voorverkoop. WIJ schakelen vervolgens Globale en Perifere Onderbreking in om Timer en Externe Onderbreking in te schakelen. Om RB0 te definiëren als externe interruptbit, moet INTE hoog worden gemaakt. De waarde van Overflow is is ingesteld op 100, zodat voor elke milliseconde de timeronderbrekingsvlag TMR0IF wordt geactiveerd. Dit zal helpen om een milliseconde-timer uit te voeren om de tijd in milliseconden te bepalen:
TRISD = 0x00; // PORTD gedeclareerd als uitvoer voor interfacing LCD TRISB0 = 1; // Definieer de RB0-pin als invoer om te gebruiken als interrupt-pin OPTION_REG = 0b00000101; // Timer0 64 als prescalar // Schakelt ook PULL UPs TMR0 = 100 in; // Laad de tijdwaarde voor 1 ms; delayValue kan tussen 0-256 liggen alleen TMR0IE = 1; // Schakel timer-interruptbit in PIE1-register GIE = 1 in; // Schakel Global Interrupt PEIE = 1 in; // Schakel de perifere onderbreking INTE = 1 in; // Schakel RB0 in als externe onderbrekingspin
De onderstaande functie wordt uitgevoerd telkens wanneer een onderbreking wordt gedetecteerd. We kunnen de functie een naam geven volgens onze wens, dus ik heb het de naam speed_isr () genoemd. Dit programma behandelt twee interrupts, de ene is Timer Interrupt en de andere is External Interrupt. Telkens wanneer een timeronderbreking optreedt, wordt de vlag TMR0IF hoog, om de onderbreking te wissen en opnieuw in te stellen, moeten we deze laag maken door TMR0IF = 0 te definiëren zoals weergegeven in de onderstaande code.
void interrupt speed_isr () {if (TMR0IF == 1) // Timer is overgelopen {TMR0IF = 0; // Wis timer-interruptvlag milli_sec ++; } if (INTF == 1) {rpm = (1000 / milli_sec) * 60; snelheid = 0,3 * rpm * 0,37699; // (Aangenomen dat de wielstraal 30 cm is) INTF = 0; // wis de interruptvlag milli_sec = 0; afstand = afstand + 028,2; }}
Evenzo zal, wanneer External Interrupt optreedt, de vlag INTF hoog worden, dit moet ook worden gewist door INTF = 0 te definiëren. De benodigde tijd wordt bijgehouden door de timeronderbreking en de externe onderbreking bepaalt wanneer het wiel een volledige omwenteling heeft gemaakt. Met deze gegevens wordt bij elke externe onderbreking de snelheid en afstand berekend die het wiel aflegt.
Zodra de snelheid en afstand zijn berekend, kunnen ze eenvoudig op het LCD-scherm worden weergegeven met behulp van onze LCD-functies. Als u nieuw bent bij LCD's, raadpleegt u onze interactieve LCD met PIC16F877A MCU-zelfstudie.
Werkende uitleg:
Nadat u de hardware en software gereed heeft gemaakt, uploadt u eenvoudig de code naar uw PIC16F877A. Als je helemaal nieuw bent bij PIC, dan zou je enkele tutorials moeten lezen om te weten hoe je het programma moet uploaden naar een PIC16F877A Microcontroller.
Ik heb een variabele POT gebruikt om de snelheid van de motor aan te passen voor demonstratiedoeleinden. U kunt hetzelfde ook gebruiken om een real-time applicatie te vinden. Als alles werkt zoals verwacht, zou je de snelheid in km / uur en de afgelegde afstand in meters moeten kunnen krijgen, zoals in de onderstaande video wordt getoond.
Ik hoop dat je van het project hebt genoten en het hebt laten werken. Als dit niet het geval is, kunt u het commentaargedeelte hieronder of het forum gebruiken om uw twijfel te posten.