Dies ist unser 9. Tutorial zum Erlernen von PIC-Mikrocontrollern mit MPLAB und XC8. Bis jetzt haben wir viele grundlegende Tutorials behandelt, wie den Einstieg in MPLABX, das Blinken der LED mit PIC, Timer in PIC, die Schnittstelle zu LCD, die Schnittstelle zu 7-Segmenten usw. Wenn Sie ein absoluter Anfänger sind, besuchen Sie bitte die vollständige Liste der PIC-Tutorials hier und anfangen zu lernen.
In diesem Tutorial erfahren Sie, wie Sie ADC mit unserem PIC-Mikrocontroller PICF877A verwenden. Die meisten Mikrocontroller-Projekte enthalten einen ADC (Analog-Digital-Wandler), da dies eine der am häufigsten verwendeten Methoden zum Lesen von Daten aus der realen Welt ist. Fast alle Sensoren wie Temperatursensor, Flusssensor, Drucksensor, Stromsensoren, Spannungssensoren, Gyroskope, Beschleunigungsmesser, Abstandssensor und fast jeder bekannte Sensor oder Wandler erzeugen basierend auf den Sensorwerten eine analoge Spannung von 0 V bis 5 V. Ein Temperatursensor kann beispielsweise 2,1 V bei einer Temperatur von 25 ° C abgeben und bei einer Temperatur von 60 ° C auf 4,7 V ansteigen. Um die Temperatur der realen Welt zu kennen, muss die MCU nur die Ausgangsspannung dieses Temperatursensors ablesen und mit der realen Temperatur in Beziehung setzen. Daher ist ADC ein wichtiges Arbeitswerkzeug für MCU-Projekte und zeigt, wie wir es auf unserem PIC16F877A verwenden können.
Lesen Sie auch unsere vorherigen Artikel zur Verwendung von ADC in anderen Mikrocontrollern:
- Wie verwende ich ADC in Arduino Uno?
- Raspberry Pi ADC Tutorial
- Schnittstelle zwischen ADC0808 und 8051-Mikrocontroller
ADC im PIC-Mikrocontroller PIC16F877A:
Es gibt viele Arten von ADCs und jeder hat seine eigene Geschwindigkeit und Auflösung. Die häufigsten Arten von ADCs sind Flash, sukzessive Approximation und Sigma-Delta. Der in PIC16F877A verwendete ADC-Typ wird kurz als ADC oder SAR mit sukzessiver Approximation bezeichnet. Lassen Sie uns etwas über SAR ADC lernen, bevor wir es verwenden.
ADC mit sukzessiver Approximation: Der SAR-ADC arbeitet mit Hilfe eines Komparators und einiger logischer Konversationen. Dieser ADC-Typ verwendet eine Referenzspannung (die variabel ist) und vergleicht die Eingangsspannung mit der Referenzspannung unter Verwendung eines Komparators, und die Differenz, die ein digitaler Ausgang ist, wird aus dem höchstwertigen Bit (MSB) gespeichert. Die Geschwindigkeit des Vergleichs hängt von der Taktfrequenz (Fosc) ab, auf der der PIC arbeitet.
Nachdem wir einige Grundlagen zu ADC kennen, können Sie unser Datenblatt öffnen und lernen, wie Sie den ADC auf unserer PIC16F877A-MCU verwenden. Der von uns verwendete PIC verfügt über einen 10-Bit-8-Kanal-ADC. Dies bedeutet, dass der Ausgangswert unseres ADC 0-1024 (2 ^ 10) beträgt und auf unserer MCU 8 Pins (Kanäle) vorhanden sind, die die analoge Spannung lesen können. Der Wert 1024 wird durch 2 ^ 10 erhalten, da unser ADC 10 Bit ist. Die acht Pins, die die analoge Spannung lesen können, sind im Datenblatt aufgeführt. Schauen wir uns das Bild unten an.
Die analogen Kanäle AN0 bis AN7 sind für Sie hervorgehoben. Nur diese Pins können analoge Spannungen lesen. Bevor wir also eine Eingangsspannung lesen, müssen wir in unserem Code angeben, welcher Kanal zum Lesen der Eingangsspannung verwendet werden muss. In diesem Tutorial verwenden wir Kanal 4 mit einem Potentiometer, um die analoge Spannung an diesem Kanal abzulesen.
Das A / D-Modul verfügt über vier Register, die zum Lesen von Daten von den Eingangspins konfiguriert werden müssen. Diese Register sind:
• A / D-Ergebnis-Hochregister (ADRESH)
• Niedriges A / D-Ergebnisregister (ADRESL)
• A / D-Steuerregister 0 (ADCON0)
• A / D-Steuerregister 1 (ADCON1)
Programmierung für ADC:
Das Programm zur Verwendung von ADC mit PIC-Mikrocontroller ist sehr einfach. Wir müssen nur diese vier Register verstehen, und dann ist das Lesen einer analogen Spannung einfach. Initialisieren Sie wie gewohnt die Konfigurationsbits und beginnen Sie mit void main ().
Innerhalb der void main () müssen wir unseren ADC mithilfe des ADCON1-Registers und des ADCON0-Registers initialisieren. Das ADCON0-Register hat die folgenden Bits:
In diesem Register müssen wir das ADC-Modul einschalten, indem wir ADON = 1 machen, und den A / D-Wandlungstakt einschalten, indem wir die Bits ADCS1 und ADCS0 verwenden. Der Rest wird vorerst nicht gesetzt. In unserem Programm ist der A / D-Wandlungstakt als Fosc / 16 ausgewählt. Sie können Ihre eigenen Frequenzen ausprobieren und sehen, wie sich das Ergebnis ändert. Vollständige Details finden Sie auf Seite 127 des Datenblatts. Daher wird ADCON0 wie folgt initialisiert.
ADCON0 = 0b01000001;
Jetzt hat das ADCON1-Register die folgenden Bits:
In diesem Register müssen wir das A / D-Ergebnisformat auf AD hoch mit ADFM = 1 und ADCS2 = 1 einstellen, um Fosc / 16 erneut auszuwählen. Die anderen Bits bleiben Null, da wir die interne Referenzspannung verwenden möchten. Vollständige Details finden Sie auf Datenblatt Seite 128. Daher werden wir ADCON1 wie folgt einstellen.
ADCON1 = 0x11000000;
Nachdem Sie das ADC-Modul in unserer Hauptfunktion initialisiert haben, können Sie in die while-Schleife einsteigen und mit dem Lesen der ADC-Werte beginnen. Um einen ADC-Wert zu lesen, müssen die folgenden Schritte ausgeführt werden.
- Initialisieren Sie das ADC-Modul
- Wählen Sie den analogen Kanal
- Starten Sie ADC, indem Sie Go / Done etwas hoch einstellen
- Warten Sie, bis das Go / DONE-Bit niedrig ist
- Rufen Sie das ADC-Ergebnis aus dem ADRESH- und ADRESL-Register ab
1. Initialisieren des ADC-Moduls: Wir haben bereits gelernt, wie ein ADC initialisiert wird. Rufen Sie daher einfach die folgende Funktion auf, um den ADC zu initialisieren
Die Funktion void ADC_Initialize () lautet wie folgt.
void ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON und Fosc / 16 ist ausgewählt ADCON1 = 0b11000000; // Interne Referenzspannung ist ausgewählt}
2. Wählen Sie den analogen Kanal: Jetzt müssen wir auswählen, welchen Kanal wir zum Lesen des ADC-Werts verwenden möchten. Machen wir eine Funktion dafür, damit wir leicht zwischen den einzelnen Kanälen innerhalb der while- Schleife wechseln können.
unsigned int ADC_Read (unsigned char channel) {// **** Auswahl des Kanals ** /// ADCON0 & = 0x11000101; // Löschen der Kanalauswahlbits ADCON0 - = Kanal << 3; // Einstellen der erforderlichen Bits // ** Kanalauswahl abgeschlossen *** ///}
Der zu wählende Kanal wird dann innerhalb des variablen Kanals empfangen. In der Schlange
ADCON0 & = 0x1100101;
Die vorherige Kanalauswahl (falls vorhanden) wird gelöscht. Dies erfolgt mit dem bitweisen Operator "&". Die Bits 3, 4 und 5 werden gezwungen, 0 zu sein, während die anderen auf ihren vorherigen Werten belassen werden.
Dann wird der gewünschte Kanal ausgewählt, indem die Kanalnummer dreimal nach links verschoben und die Bits mit dem bitweisen oder Operator „-“ gesetzt werden.
ADCON0 - = Kanal << 3; // Einstellen der erforderlichen Bits
3. Starten Sie den ADC, indem Sie das Go / Done-Bit hoch setzen: Sobald der Kanal ausgewählt ist, müssen Sie die ADC-Konvertierung starten, indem Sie einfach das GO_nDONE- Bit hoch setzen:
GO_nDONE = 1; // Initialisiert die A / D-Konvertierung
4. Warten Sie, bis das Go / DONE-Bit niedrig wird: Das GO / DONE-Bit bleibt hoch, bis die ADC-Konvertierung abgeschlossen ist. Daher müssen wir warten, bis dieses Bit wieder niedrig wird. Dies kann mithilfe einer while- Schleife erfolgen.
while (GO_nDONE); // Warten Sie, bis die A / D-Konvertierung abgeschlossen ist
5. Holen Sie sich das ADC-Ergebnis aus dem ADRESH- und ADRESL-Register: Wenn das Go / DONE-Bit wieder niedrig wird, bedeutet dies, dass die ADC-Konvertierung abgeschlossen ist. Das Ergebnis des ADC ist ein 10-Bit-Wert. Da unsere MCU eine 8-Bit-MCU ist, wird das Ergebnis in obere 8-Bit- und untere 2-Bit-MCU aufgeteilt. Das obere 8-Bit-Ergebnis wird im Register ADRESH und das untere 2-Bit-Ergebnis im Register ADRESL gespeichert. Daher müssen wir diese zu Registern addieren, um unseren 10-Bit-ADC-Wert zu erhalten. Dieses Ergebnis wird von der folgenden Funktion zurückgegeben:
return ((ADRESH << 8) + ADRESL); // Gibt das Ergebnis zurück
Hier wird die vollständige Funktion gezeigt, mit der der ADC-Kanal ausgewählt, der ADC ausgelöst und das Ergebnis zurückgegeben wird.
unsigned int ADC_Read (vorzeichenloser Zeichenkanal) {ADCON0 & = 0x11000101; // Löschen der Kanalauswahlbits ADCON0 - = Kanal << 3; // Einstellen der erforderlichen Bits __delay_ms (2); // Erfassungszeit zum Laden des Haltekondensators GO_nDONE = 1; // Initialisiert die A / D-Konvertierung während (GO_nDONE); // Warten Sie, bis die A / D-Konvertierung abgeschlossen ist ((ADRESH << 8) + ADRESL); // Gibt das Ergebnis zurück}
Jetzt haben wir eine Funktion, die die Kanalauswahl als Eingabe verwendet und uns den ADC-Wert zurückgibt. Daher können wir diese Funktion direkt in unserer while- Schleife aufrufen, da wir in diesem Tutorial die analoge Spannung von Kanal 4 lesen. Der Funktionsaufruf lautet wie folgt.
i = (ADC_Read (4)); // speichere das Ergebnis von adc in "i".
Um die Ausgabe unseres ADC zu visualisieren, benötigen wir eine Art Anzeigemodul wie das LCD oder das 7-Segment. In diesem Tutorial verwenden wir eine 7-Segment-Anzeige, um die Ausgabe zu überprüfen. Wenn Sie wissen möchten, wie man 7-Segmente mit Bild verwendet, folgen Sie dem Tutorial hier.
Der vollständige Code ist unten angegeben und der Vorgang wird auch im Video am Ende erläutert.
Hardware-Setup und -Test:
Wie üblich simulieren Sie den Code mit Proteus, bevor Sie mit unserer Hardware arbeiten. Die Schaltpläne des Projekts sind nachstehend aufgeführt:
Die Anschlüsse des 4-stelligen 7-Segment-Anzeigemoduls mit dem PIC-Mikrocontroller sind die gleichen wie im vorherigen Projekt. Wir haben gerade ein Potentiometer an Pin 7 hinzugefügt, der der analoge Kanal 4 ist. Durch Variieren des Potis wird eine variable Spannung an die MCU gesendet Dies wird vom ADC-Modul gelesen und auf dem 7-Segment-Anzeigemodul angezeigt. Weitere Informationen zur 4-stelligen 7-Segment-Anzeige und ihrer Schnittstelle zur PIC-MCU finden Sie im vorherigen Lernprogramm.
Hier haben wir dieselbe PIC-Mikrocontroller-Karte verwendet, die wir im LED-Blink-Tutorial erstellt haben. Nachdem Sie die Verbindung sichergestellt haben, laden Sie das Programm in PIC hoch und Sie sollten eine Ausgabe wie diese sehen
Hier haben wir den ADC-Wert aus dem Topf gelesen und ihn in die tatsächliche Spannung umgewandelt, indem wir den 0-1024-Ausgang auf 0-5 Volt abgebildet haben (wie im Programm gezeigt). Der Wert wird dann auf dem 7-Segment angezeigt und mit dem Multimeter überprüft.
Jetzt können wir alle auf dem Markt erhältlichen analogen Sensoren verwenden. Probieren Sie dies aus. Wenn Sie wie gewohnt Probleme haben, verwenden Sie den Kommentarbereich. Wir helfen Ihnen gerne weiter.