- Erforderliche Materialien:
- Berechnung der zurückgelegten Geschwindigkeit und Entfernung:
- Schaltplan und Hardware-Setup:
- Simulation:
- Programmieren Ihres PIC16F877A:
- Arbeitserklärung:
Das Messen der Drehzahl eines Fahrzeugs oder eines Motors war für uns schon immer ein faszinierendes Projekt. In diesem Projekt werden wir also einen mit den industrietauglichen PIC-Mikrocontrollern bauen. Wir werden ein Stück Magnet und einen Hallsensor verwenden, um die Geschwindigkeit zu messen. Es gibt andere Möglichkeiten / Sensoren, um die Geschwindigkeit zu messen, aber die Verwendung eines Hallsensors ist billig und kann auch für jeden Motortyp / jedes Fahrzeug verwendet werden. Durch dieses Projekt werden wir auch unsere Fähigkeiten beim Erlernen von PIC16F877A verbessern, da das Projekt die Verwendung von Interrupts und Timern beinhaltet. Am Ende dieses Projekts können Sie die Geschwindigkeit und die Entfernungen berechnen, die von einem rotierenden Objekt zurückgelegt werden, und diese auf einem 16x2-LCD-Bildschirm anzeigen. Beginnen wir mit diesem digitalen Tachometer- und Kilometerzähler-Schaltkreis mit PIC.
Erforderliche Materialien:
- PIC16F877A
- 7805 Spannungsregler
- Hall-Effekt-Sensor (US1881 / 04E)
- 16 * 2 LCD-Anzeige
- Ein kleines Stück Magnet
- Kabel anschließen
- Kondensatoren
- Steckbrett.
- Energieversorgung
Berechnung der zurückgelegten Geschwindigkeit und Entfernung:
Bevor wir mit dem Aufbau der Schaltung beginnen, lassen Sie uns verstehen, wie wir einen Hallsensor und einen Magneten verwenden, um die Geschwindigkeit eines Rades zu berechnen. Zuvor haben wir dieselbe Technik verwendet, um einen Arduino-Tachometer zu erstellen, der Messwerte auf einem Android-Smartphone anzeigt.
Ein Hallsensor ist ein Gerät, das das Vorhandensein eines Magneten anhand seiner Polarität erfassen kann. Wir kleben ein kleines Stück Magnet auf das Rad und platzieren den Hallsensor so in der Nähe, dass der Hallsensor ihn jedes Mal erkennt, wenn sich das Rad dreht. Wir verwenden dann die Hilfe von Timern und Interrupts auf unserem PIC-Mikrocontroller, um die Zeit zu berechnen, die für eine vollständige Umdrehung des Rads benötigt wird.
Sobald die benötigte Zeit bekannt ist, können wir die Drehzahl mithilfe der folgenden Formeln berechnen. Wenn 1000 / Zeit benötigt wird, erhalten wir die RPS, und wenn Sie sie weiter mit 60 multiplizieren, erhalten Sie die Drehzahl
U / min = (1000 / Zeitplan) * 60;
Wobei (1000 / Zeitplan) die U / min (Umdrehungen pro Sekunde) angibt und mit 60 multipliziert wird, um die U / min in U / min (Umdrehungen pro Minute) umzuwandeln.
Um nun die Geschwindigkeit des Fahrzeugs zu berechnen, müssen wir den Radius des Rades kennen. In unserem Projekt haben wir ein kleines Spielzeugrad mit einem Radius von nur 3 cm verwendet. Aber angenommen, wir der Radius des Rades ist 30cm sein (0,3 m), so dass wir die Messwerte visualisieren.
Der Wert wird auch mit 0,37699 multipliziert, da wir wissen, dass Geschwindigkeit = (U / min (Durchmesser * Pi) / 60). Die Formeln sind bis auf vereinfacht
v = Radius des Rades * U / min * 0,37699;
Sobald wir die Geschwindigkeit berechnet haben, können wir auch die zurückgelegte Strecke mit einer ähnlichen Methode berechnen. Mit unserer Hall- und Magnetanordnung wissen wir, wie oft sich das Rad gedreht hat. Wir kennen auch den Radius des Rades, anhand dessen wir den Umfang des Rades ermitteln können, wobei angenommen wird, dass der Radius des Rades 0,3 m (R) beträgt und die Werte des Umfangs Pi * R * R 0,2827 betragen. Dies bedeutet, dass jedes Mal, wenn der Hallsensor auf den Magneten trifft, eine Entfernung von 0,2827 Metern vom Rad zurückgelegt wird.
Distance_covered = distance_covered + Umfang des Kreises
Da wir jetzt wissen, wie dieses Projekt funktionieren wird, können wir mit unserem Schaltplan fortfahren und mit dem Aufbau beginnen.
Schaltplan und Hardware-Setup:
Das Schaltbild dieses Tacho- und Kilometerzählerprojekts ist sehr einfach und kann auf einem Steckbrett aufgebaut werden. Wenn Sie den PIC-Tutorials gefolgt sind, können Sie auch die Hardware wiederverwenden, die wir zum Erlernen von PIC-Mikrocontrollern verwendet haben. Hier haben wir das gleiche Perf-Board verwendet, das wir für das LED-Blinken mit PIC-Mikrocontroller gebaut haben, wie unten gezeigt:
Die Pin-Verbindungen für die PIC16F877A-MCU sind in der folgenden Tabelle angegeben.
S.No: |
PIN Nummer |
Pin Name |
Verbunden |
1 |
21 |
RD2 |
RS des LCD |
2 |
22 |
RD3 |
E des LCD |
3 |
27 |
RD4 |
D4 des LCD |
4 |
28 |
RD5 |
D5 des LCD |
5 |
29 |
RD6 |
D6 des LCD |
6 |
30 |
RD7 |
D7 des LCD |
7 |
33 |
RB0 / INT |
3 rd Stift des Hall - Sensor |
Sobald Sie Ihr Projekt erstellt haben, sollte es im Bild unten ungefähr so aussehen
Wie Sie sehen können, habe ich zwei Boxen verwendet, um den Motor und einen Hallsensor in der Nähe zu platzieren. Sie können den Magneten an Ihrem rotierenden Objekt befestigen und den Hallsensor in der Nähe so intakt halten, dass er den Magneten erkennen kann.
Hinweis: Hallsensoren haben Polaritäten. Stellen Sie daher sicher, welchen Pol er erkennt, und platzieren Sie ihn entsprechend.
Stellen Sie außerdem sicher, dass Sie einen Pull-up-Widerstand mit dem Ausgangsstift des Hallsensors verwenden.
Simulation:
Die Simulation für dieses Projekt erfolgt mit Proteus. Da es sich bei dem Projekt um bewegte Objekte handelt, ist es nicht möglich, das gesamte Projekt mithilfe einer Simulation zu demonstrieren, aber die Funktionsweise des LCD kann überprüft werden. Laden Sie einfach die Hex-Datei in die Simulation und simulieren Sie sie. Sie werden feststellen, dass das LCD wie unten gezeigt funktioniert.
Um zu überprüfen, ob Tachometer und Kilometerzähler funktionieren, habe ich den Hallsensor durch ein Logic-Statusgerät ersetzt. Während der Simulation können Sie auf die Schaltfläche für den Logikstatus klicken, um den Interrupt auszulösen und zu überprüfen, ob die zurückgelegte Geschwindigkeit und Entfernung wie oben gezeigt aktualisiert werden.
Programmieren Ihres PIC16F877A:
Wie bereits erwähnt, verwenden wir die Hilfe von Timern und Interrupts im PIC16F877A-Mikrocontroller, um die Zeit zu berechnen, die für eine vollständige Umdrehung des Rads benötigt wird. In unserem vorherigen Tutorial haben wir bereits gelernt, wie man Timer verwendet. Ich habe den vollständigen Code des Projekts am Ende dieses Artikels angegeben. Weiter habe ich einige wichtige Zeilen unten erklärt.
Die folgenden Codezeilen initialisieren den Port D als Ausgangspins für die LCD-Schnittstelle und RB0 als Eingangspin für die Verwendung als externen Pin. Außerdem haben wir den internen Pull-up-Widerstand mit OPTION_REG aktiviert und 64 als Vorverkauf festgelegt. Wir aktivieren dann den globalen und peripheren Interrupt, um den Timer und den externen Interrupt zu aktivieren. Um RB0 als externes Interrupt-Bit zu definieren, sollte INTE hoch gesetzt werden. Der Wert für Überlauf ist auf 100 eingestellt, sodass für jede 1 Millisekunde das Timer-Interrupt-Flag TMR0IF ausgelöst wird. Dies hilft dabei, einen Millisekunden-Timer auszuführen, um die in Millisekunden benötigte Zeit zu bestimmen:
TRISD = 0x00; // PORTD als Ausgang für die Schnittstelle zum LCD deklariert TRISB0 = 1; // Definiere den RB0-Pin als Eingang zur Verwendung als Interrupt-Pin OPTION_REG = 0b00000101; // Timer0 64 als Prescalar // Aktiviert auch PULL-UPs TMR0 = 100; // Lade den Zeitwert für 1ms; delayValue kann nur zwischen 0 und 256 liegen. TMR0IE = 1; // Timer-Interrupt-Bit im PIE1-Register aktivieren GIE = 1; // Global Interrupt aktivieren PEIE = 1; // Peripheral Interrupt aktivieren INTE = 1; // RB0 als externen Interrupt-Pin aktivieren
Die folgende Funktion wird jedes Mal ausgeführt, wenn ein Interrupt erkannt wird. Wir können die Funktion nach unserem Wunsch benennen, daher habe ich sie als speed_isr () bezeichnet. Dieses Programm behandelt zwei Interrupts, einen Timer-Interrupt und einen externen Interrupt. Immer wenn ein Timer-Interrupt auftritt, geht das Flag TMR0IF hoch. Um den Interrupt zu löschen und zurückzusetzen, müssen Sie ihn niedrig setzen, indem Sie TMR0IF = 0 definieren, wie im folgenden Code gezeigt.
void Interrupt speed_isr () {if (TMR0IF == 1) // Timer ist abgelaufen {TMR0IF = 0; // Timer Interrupt Flag löschen milli_sec ++; } if (INTF == 1) {rpm = (1000 / milli_sec) * 60; Geschwindigkeit = 0,3 * U / min * 0,37699; // (Angenommen, der Radius beträgt 30 cm) INTF = 0; // lösche das Interrupt-Flag milli_sec = 0; Entfernung = Entfernung + 028,2; }}
In ähnlicher Weise wird das Flag INTF hoch gesetzt, wenn ein externer Interrupt auftritt. Dies sollte auch durch Definieren von INTF = 0 gelöscht werden. Die benötigte Zeit wird vom Timer-Interrupt verfolgt, und der externe Interrupt bestimmt, wann das Rad eine volle Umdrehung ausgeführt hat. Mit diesen Daten werden die Geschwindigkeit und die vom Rad zurückgelegte Strecke bei jedem externen Interrupt berechnet.
Sobald die Geschwindigkeit und Entfernung berechnet wurden, können sie mit unseren LCD-Funktionen einfach auf dem LCD-Bildschirm angezeigt werden. Wenn Sie mit LCDs noch nicht vertraut sind, lesen Sie unser Tutorial zur Schnittstelle zwischen LCD und PIC16F877A MCU.
Arbeitserklärung:
Nachdem Sie die Hardware und Software vorbereitet haben, laden Sie einfach den Code auf Ihren PIC16F877A hoch. Wenn Sie mit PIC noch nicht vertraut sind, sollten Sie einige Tutorials lesen müssen, um zu wissen, wie Sie das Programm auf einen PIC16F877A-Mikrocontroller hochladen.
Ich habe zu Demonstrationszwecken einen variablen POT verwendet, um die Drehzahl des Motors anzupassen. Sie können das gleiche auch verwenden, um eine Echtzeitanwendung zu finden. Wenn alles wie erwartet funktioniert, sollten Sie in der Lage sein, die Geschwindigkeit in km / h und die zurückgelegte Entfernung in Metern zu ermitteln, wie im folgenden Video gezeigt.
Ich hoffe, Ihnen hat das Projekt gefallen und Sie haben es zum Laufen gebracht. Wenn nicht, können Sie den Kommentarbereich unten oder das Forum verwenden, um Ihre Zweifel zu posten.