- Was ist ADC?
- ADC in ARM7-LPC2148
- ADC-Pins in ARM7-LPC2148
- ADC-Register in ARM7-LPC2148
- ADxCR-Register in LPC2148
- ADxGDR: Globales ADC-Datenregister
- Erforderliche Komponenten
- Schaltplan
- Programmierung von ARM7-LPC2148 für ADC
In der Elektronik gibt es viele verschiedene analoge Sensoren auf dem Markt, die zur Messung von Temperatur, Geschwindigkeit, Verschiebung, Druck usw. verwendet werden. Analoge Sensoren werden verwendet, um eine Leistung zu erzeugen, die sich im Laufe der Zeit kontinuierlich ändert. Diese Signale von analogen Sensoren haben tendenziell einen sehr kleinen Wert von einigen Mikrovolt (uV) bis zu mehreren Millivolt (mV), so dass eine Form der Verstärkung erforderlich ist. Um diese analogen Signale im Mikrocontroller zu verwenden, müssen wir das analoge Signal in ein digitales Signal umwandeln, da der Mikrocontroller nur digitale Signale versteht und verarbeitet. Daher verfügt der größte Teil des Mikrocontrollers über eine integrierte wichtige Funktion namens ADC (Analog-Digital-Wandler). Unser Mikrocontroller ARM7-LPC2148 verfügt auch über eine ADC-Funktion.
In diesem Tutorial erfahren Sie, wie Sie ADC in ARM7-LPC2148 verwenden, indem Sie einen analogen Pin mit einer variierenden Spannung versorgen und diese nach der Analog-Digital-Wandlung auf dem 16x2-LCD-Bildschirm anzeigen. Beginnen wir also mit einer kurzen Einführung in ADC.
Was ist ADC?
Wie bereits erwähnt, steht ADC für Analog-Digital-Wandlung und wird verwendet, um analoge Werte aus der realen Welt in digitale Werte wie Einsen und Nullen umzuwandeln. Was sind diese analogen Werte? Dies sind diejenigen, die wir in unserem täglichen Leben sehen, wie Temperatur, Geschwindigkeit, Helligkeit usw. Diese Parameter werden von den jeweiligen Sensoren als analoge Spannungen gemessen und dann werden diese analogen Werte in digitale Werte für Mikrocontroller umgewandelt.
Nehmen wir an, unser ADC-Bereich reicht von 0 V bis 3,3 V und wir haben einen 10-Bit-ADC. Dies bedeutet, dass unsere Eingangsspannung 0-3,3 Volt in 1024 Pegel diskreter Analogwerte aufgeteilt wird (2 10 = 1024). Das heißt, 1024 ist die Auflösung für einen 10-Bit-ADC, ähnlich wie für eine 8-Bit-ADC-Auflösung 512 (28) und für eine 16-Bit-ADC-Auflösung 65.536 (216). Der LPC2148 verfügt über einen ADC mit einer Auflösung von 10 Bit.
Wenn die tatsächliche Eingangsspannung 0 V beträgt, liest der ADC der MCU diese als 0, und wenn sie 3,3 V beträgt, liest die MCU 1024, und wenn sie irgendwo dazwischen liegt, wie 1,65 V, zeigt die MCU 512 an Formeln zur Berechnung des digitalen Werts, der von der MCU basierend auf der Auflösung des ADC und der Betriebsspannung gelesen wird.
(ADC-Auflösung / Betriebsspannung) = (ADC-Digitalwert / Istspannungswert)
Wie zum Beispiel, wenn die Referenzspannung 3 V beträgt:
Wir haben ADC im vorherigen Artikel ausführlich erläutert.
ADC in ARM7-LPC2148
- Der LPC2148 enthält zwei Analog-Digital-Wandler.
- Diese Wandler sind einzelne 10-Bit- Analog-Digital-Wandler mit sukzessiver Approximation.
- Während ADC0 sechs Kanäle hat, hat ADC1 acht Kanäle.
- Daher beträgt die Gesamtzahl der verfügbaren ADC-Eingänge für LPC2148 14.
- Es wandelt die Eingangsspannung nur im Bereich von (0 bis 3,3 V) um. Die Spannungsreferenz darf 3,3 V nicht überschreiten. Da es den IC beschädigt und auch unsichere Werte liefert.
Einige wichtige Funktionen von ADC in LPC2148
- Jeder Konverter kann mehr als 400000 10-Bit-Abtastwerte pro Sekunde ausführen.
- Jeder Analogeingang verfügt über ein eigenes Ergebnisregister, um den Interrupt-Overhead zu reduzieren.
- Burst-Konvertierungsmodus für einzelne oder mehrere Eingänge.
- Optionale Umwandlung beim Übergang am Eingangspin oder Timer-Match-Signal.
- Globaler Startbefehl für beide Konverter.
Überprüfen Sie auch, wie ADC in anderen Mikrocontrollern verwendet wird:
- Wie verwende ich ADC in Arduino Uno?
- Schnittstelle zwischen ADC0808 und 8051-Mikrocontroller
- Verwenden des ADC-Moduls des PIC-Mikrocontrollers
- Raspberry Pi ADC Tutorial
- Verwendung des ADC in MSP430G2 - Messung der analogen Spannung
- Verwendung von ADC in STM32F103C8
ADC-Pins in ARM7-LPC2148
Wie bereits erwähnt, gibt es in ARM7-LPC2148 zwei Kanäle ADC0 mit 6 analogen Eingangspins und ADC1 mit 8 analogen Eingangspins. Insgesamt gibt es also 14 Pins für analoge Eingänge. Das folgende Diagramm zeigt die Pins, die für den Analogeingang verfügbar sind.
Da die ADC-Eingangspins mit anderen GPIO-Pins gemultiplext werden. Wir müssen sie aktivieren, indem wir das PINSEL-Register konfigurieren , um die ADC-Funktion auszuwählen.
Die folgende Tabelle zeigt die Pins des ADC und den respektierten ADC-Kanal Nr. In LPC2148. AD0 ist Kanal 0 und AD1 ist Kanal 1
LPC2148 Pin |
ADC-Kanal Nr |
P0.28 |
AD0.1 |
P0.29 |
AD0.2 |
P0.30 |
AD0.3 |
P0.25 |
AD0.4 |
P0.4 |
AD0.6 |
P0.5 |
AD0.7 |
P0.6 |
AD1.0 |
P0.8 |
AD1.1 |
P0.10 |
AD1.2 |
P0.12 |
AD1.3 |
P0.13 |
AD1.4 |
P0.15 |
AD1.5 |
P0.21 |
AD1.6 |
P0.22 |
AD1.7 |
ADC-Register in ARM7-LPC2148
Bei der Programmierung werden Register zur Verwendung der A / D-Wandlungsfunktion in LPC2148 verwendet.
Unten finden Sie eine Liste der Register, die in LPC2148 für die A / D-Wandlung verwendet werden
1. ADCR: Analog-Digital- Steuerregister
Verwendung: Dieses Register wird zur Konfiguration des A / D-Wandlers in LPC2148 verwendet
2. ADGDR: Analog zu Digital Global Data Register
Verwendung: Dieses Register hat das DONE-Bit für den A / D-Wandler und das ERGEBNIS der Wandlung wird hier gespeichert.
3. ADINTERN: Analog-Digital-Interrupt-Aktivierungsregister
Verwendung: Dies ist ein Interrupt Enable-Register.
4. ADDR0 - ADDR7: Analog-Digital- Kanaldatenregister
Verwendung: Dieses Register enthält den A / D-Wert für die jeweiligen Kanäle.
5. ADSTAT: Analog-Digital-Statusregister.
Verwendung: Dieses Register enthält das DONE-Flag für den jeweiligen ADC-Kanal sowie das OVERRUN-Flag für den jeweiligen ADC-Kanal.
In diesem Tutorial werden nur ADCR- und ADGDR-Register verwendet. Lassen Sie uns im Detail sehen
ADxCR-Register in LPC2148
AD0CR & AD1CR für Kanal 0 bzw. Kanal 1. Es ist ein 32-Bit-Register. Die folgende Tabelle zeigt die Bitfelder für das ADCR-Register.
31:28 |
27 |
26:24 |
23:22 |
21 |
20 |
19:17 |
16 |
15: 8 |
7: 0 |
RESERVIERT |
KANTE |
START |
RESERVIERT |
PDN |
RESERVIERT |
CLKS |
PLATZEN |
CLCKDIV |
SEL |
Lassen Sie uns sehen, wie einzelne Register konfiguriert werden
1. SEL: Die Bits von (0 bis 7) werden verwendet, um den Kanal für die ADC-Umwandlung auszuwählen. Jedem Kanal ist ein Bit zugeordnet. Wenn Sie beispielsweise Bit-0 einstellen, wird der ADC zur Konvertierung auf AD0.1 getestet. Wenn Sie das Bit -1 setzen, wird AD0.1 erstellt. In ähnlicher Weise wird durch Setzen von Bit-7 die Konvertierung für AD0.7 durchgeführt. Ein wichtiger Schritt ist, dass wir PINSEL entsprechend dem Port haben, den wir verwenden, zum Beispiel PINSEL0 für PORT0 in PLC2148.
2. CLCKDIV: Die Bits von (8 bis 15) sind für Clock Divisor. Hier wird der APB-Takt (ARM-Peripheriebus-Takt) durch diesen Wert plus eins geteilt, um den für den A / D-Wandler erforderlichen Takt zu erzeugen, der kleiner oder gleich 4,5 MHz sein sollte, da wir in LPC2148 die sukzessive Approximationsmethode verwenden.
3. BURST: Das Bit 16 wird für den BURST-Konvertierungsmodus verwendet.
Einstellung 1: Der ADC führt die Konvertierung für alle Kanäle durch, die in SEL-Bits ausgewählt sind.
Einstellung 0: Deaktiviert den BURST-Konvertierungsmodus.
4. CLCKS: Die Bits von (17 bis 19) drei Bits werden zur Auswahl der Auflösung und der Anzahl der Takte für die A / D-Wandlung im Burst-Modus verwendet, da es sich um einen kontinuierlichen A / D-Wandlungsmodus handelt.
Wert für Bits (17 bis 19) |
Bits (Genauigkeit) |
Nein von der Uhr |
000 |
10 |
11 |
001 |
9 |
10 |
010 |
8 |
9 |
011 |
7 |
8 |
100 |
6 |
7 |
101 |
5 |
6 |
110 |
4 |
5 |
111 |
3 |
4 |
5. PDN: Das Bit 21 ist für die Auswahl Power Down Mode von ADC in LPC2148.
- A / D befindet sich im PDN-Modus.
- A / D ist im Betriebsmodus
6. START: Die Bits von (24 bis 26) sind für START. Wenn der BURST-Konvertierungsmodus durch Setzen von 0 ausgeschaltet ist, sind diese START-Bits nützlich, um die A / D-Konvertierung zu starten. Der START wird auch für die kantengesteuerte Konvertierung verwendet. Wenn sich dann ein Eingang im CAP- oder MAT-Pin von LPC2148 befindet, beginnt der A / D zu konvertieren. Lassen Sie uns die folgende Tabelle überprüfen
Wert für Bits (24 bis 26) |
Pins von LPC2148 |
Funktion des ADC |
000 |
Wird verwendet, um den ADC in den PDN-Modus zu versetzen Kein Start |
|
001 |
Starten Sie die A / D-Konvertierung |
|
010 |
CAP0.2 / MAT0.2 |
Starten Sie die A / D-Wandlung an der EDGE, die an Pin 27 (Rising oder Falling) an den CAP / MAT-Pins von LPC2148 ausgewählt wurde |
011 |
CAP0.0 / MAT0.0 |
|
100 |
MAT0.1 |
|
101 |
MAT0.3 |
|
110 |
MAT1.0 |
|
111 |
MAT1.1 |
7. EDGE: Der 27 - te Bit für EDGE ist nur dann verwendet wird, wenn das Startbit 010-111 enthält. Die Konvertierung wird gestartet, wenn CAP- oder MAT-Eingaben vorhanden sind (siehe Tabelle oben).
Einstellung : 0 - Bei fallender Kante
1 - Auf steigender Kante
ADxGDR: Globales ADC-Datenregister
AD0GDR & AD1GDR für ADC-Kanal 0 bzw. ADC-Kanal 1.
Es handelt sich um ein 32-Bit-Register, das das ERGEBNIS der A / D-Wandlung sowie das DONE-Bit enthält, das angibt, dass die A / D-Wandlung durchgeführt wurde. Die folgende Tabelle zeigt die Bitfelder für das ADGDR-Register.
31 |
30 |
29:27 |
26:24 |
23:16 |
15: 6 |
5: 0 |
GETAN |
ÜBERLAUF |
RESERVIERT |
CHN |
RESERVIERT |
ERGEBNIS |
RESERVIERT |
1. ERGEBNIS: Diese Bits (6 bis 15) enthalten das Ergebnis der A / D-Wandlung für den ausgewählten Kanal im ADCR SEL-Register. Der Wert wird erst nach Abschluss der A / D-Wandlung gelesen und durch das DONE- Bit angezeigt.
BEISPIEL: Für ein 10-Bit-ADC-Ergebnis variiert der gespeicherte Wert von (0 bis 1023).
2. KANAL: Diese Bits 24 bis 26 enthalten die Kanalnummer, für die die A / D-Wandlung durchgeführt wird. Der konvertierte digitale Wert ist im RESULT-Bit vorhanden.
BEISPIEL: 000 ist für ADC-Kanal 0 und 001 ist für ADC-Kanal 1 usw.
3. OVERRUN: Der 30 - te Bit für OVERRUN wird im Burst - Modus verwendet. Bei Einstellung 1 wird der zuvor konvertierte ADC-Wert durch den neu konvertierten ADC-Wert überschrieben. Wenn das Register gelesen wird, löscht es das OVERRUN-Bit.
4. FERTIG: Das 31. Bit ist für das FERTIG-Bit.
Set 1: Wenn die A / D-Konvertierung abgeschlossen ist.
Set 0: Wenn das Register gelesen und ADCR geschrieben wird.
Wir haben über die wichtigen Register gesehen, die in ADC in LPC2148 verwendet werden. Beginnen wir jetzt mit der Verwendung von ADC in ARM7.
Erforderliche Komponenten
Hardware
- ARM7-LPC2148 Mikrocontroller
- 3,3 V Spannungsregler IC
- 5V Spannungsregler IC
- 10K Potentiometer - 2 Nr
- LED (beliebige Farbe)
- LCD-Anzeige (16X2)
- 9V Batterie
- Steckbrett
- Kabel anschließen
Software
- Keil uVision5
- Magic Flash Tool
Schaltplan
Die folgende Tabelle zeigt die Schaltungsverbindungen zwischen LCD und ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Register Select) |
P0.6 |
E (Aktivieren) |
P0.12 |
D4 (Datenstift 4) |
P0.13 |
D5 (Datenstift 5) |
P0.14 |
D6 (Datenstift 6) |
P0.15 |
D7 (Datenstift 7) |
Weitere Informationen zur Verwendung von LCD mit ARM 7 - LPC2148.
WICHTIG: Hier verwenden wir zwei Spannungsregler-ICs, einen für das 5-V-LCD-Display und einen weiteren 3,3-V für den Analogeingang, der mit einem Potentiometer variiert werden kann.
Verbindungen zwischen 5V Spannungsregler mit LCD & ARM7 Stick
5V Spannungsregler IC |
Pin-Funktion |
LCD & ARM-7 LPC2148 |
1. Linker Stift |
+ Ve von Batterie 9V Eingang |
NC |
2.Centre Pin |
- Ve von der Batterie |
VSS, R / W, K des LCD GND von ARM7 |
3.Rechter Stift |
Geregelter + 5V Ausgang |
VDD, A von LCD + 5V von ARM7 |
Potentiometer mit LCD
Ein Potentiometer wird verwendet, um den Kontrast der LCD-Anzeige zu variieren. Ein Topf hat drei Stifte, der linke Stift (1) ist mit +5 V und die Mitte (2) mit VEE oder V0 des LCD-Moduls verbunden, und der rechte Stift (3) ist mit GND verbunden. Wir können den Kontrast einstellen, indem wir den Knopf drehen.
Verbindung zwischen LPC2148 und Potentiometer mit 3,3 V Spannungsregler
3,3 V Spannungsregler-IC |
Pin-Funktion |
ARM-7 LPC2148 |
1. Linker Stift |
- Ve von der Batterie |
GND Pin |
2.Centre Pin |
Geregelter + 3,3 V Ausgang |
Zum Potentiometereingang und Potentiometerausgang auf P0.28 |
3.Rechter Stift |
+ Ve von Batterie 9V Eingang |
NC |
Programmierung von ARM7-LPC2148 für ADC
Um ARM7-LPC2148 zu programmieren, benötigen wir das keil uVision & Flash Magic Tool. Wir verwenden ein USB-Kabel, um den ARM7 Stick über einen Micro-USB-Anschluss zu programmieren. Wir schreiben Code mit Keil und erstellen eine Hex-Datei. Anschließend wird die HEX-Datei mit Flash Magic auf den ARM7-Stick geflasht. Um mehr über die Installation von keil uVision und Flash Magic und deren Verwendung zu erfahren, folgen Sie dem Link Erste Schritte mit dem ARM7 LPC2148-Mikrocontroller und programmieren Sie ihn mit Keil uVision.
In diesem Tutorial wandeln wir die analoge Eingangsspannung (0 bis 3,3 V) mithilfe des ADC in LPC2148 in einen digitalen Wert um und zeigen die analoge Spannung auf dem LCD-Display (16x2) an. Ein Potentiometer wird verwendet, um die analoge Eingangsspannung zu variieren.
Um mehr über die Verbindung von LCD mit dem 4-Bit-Modus ARM7-LPC2148 zu erfahren, folgen Sie diesem Link.
Der vollständige Code für die Verwendung von ADC mit ARM 7 finden Sie am Ende dieses Tutorials. Hier werden einige Teile davon erläutert.
Schritte zur Programmierung von LPC2148-ADC
1. Das PINSEL-Register wird verwendet, um den Port-Pin von LPC2148 und die ADC-Funktion als Analogeingang auszuwählen.
PINSEL1 = 0x01000000; // Wählen Sie P0.28 als AD0.1
2. Wählen Sie die Takt- und Bitgenauigkeit für die Konvertierung aus, indem Sie den Wert in das ADxCR (ADC-Steuerregister) schreiben.
AD0CR = 0x00200402; // Setzt die ADC-Operation auf 10 Bit / 11 CLK für die Konvertierung (000)
3. Starten Sie die Konvertierung, indem Sie den Wert in ADxCR in START-Bits schreiben.
Hier habe ich bis 24 geschrieben th Bit AD0CR Register.
AD0CR = AD0CR - (1 << 24);
4. Nun müssen wir das DONE-Bit (31.) des entsprechenden ADxDRy (ADC-Datenregisters) überprüfen, wenn es sich von 0 auf 1 ändert. Daher verwenden wir die while- Schleife, um ständig zu überprüfen, ob die Konvertierung im 31. Bit des Datenregisters erfolgt.
while (! (AD0DR1 & 0x80000000));
5. Nachdem das Bit "Fertig" auf 1 gesetzt wurde, ist die Konvertierung erfolgreich. Als Nächstes lesen wir das Ergebnis aus demselben ADC-Datenregister AD0DR1 und speichern den Wert in einer Variablen.
adcvalue = AD0DR1;
Als nächstes verwenden wir eine Formel, um den digitalen Wert in Spannung umzuwandeln und in einer Variablen namens Spannung zu speichern.
Spannung = ((adcvalue / 1023.0) * 3.3);
5. Die folgenden Zeilen werden verwendet, um digitale Werte (0 bis 1023) nach der Analog-Digital-Wandlung anzuzeigen.
adc = adcvalue; sprintf (displayadc, "adcvalue =% f", adc); LCD_DISPLAY (displayadc); // ADC-Wert anzeigen (0 bis 1023)
6. Die folgenden Zeilen werden verwendet, um die analoge Eingangsspannung (0 bis 3,3 V) nach der Analog-Digital-Wandlung und nach Schritt 5 anzuzeigen.
LCD_SEND (0xC0); Sprintf (Voltwert, "Spannung =%. 2f V", Spannung); LCD_DISPLAY (Voltwert); // Anzeige (analoge Eingangsspannung)
7. Jetzt müssen wir die Eingangsspannung und die digitalen Werte auf dem LCD-Display anzeigen. Vorher müssen wir die LCD-Anzeige initialisieren und entsprechende Befehle zum Senden der Nachricht an die Anzeige verwenden.
Der folgende Code wird zum Initialisieren des LCD verwendet
void LCD_INITILIZE (void) // Funktion zum Vorbereiten des LCD { IO0DIR = 0x0000FFF0; // Setzt Pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 als OUTPUT delay_ms (20); LCD_SEND (0x02); // lcd im 4-Bit-Betriebsmodus initialisieren LCD_SEND (0x28); // 2 Zeilen (16X2) LCD_SEND (0x0C); // Anzeige am Cursor aus LCD_SEND (0x06); // Auto-Inkrement-Cursor LCD_SEND (0x01); // Anzeige löschen LCD_SEND (0x80); // Erste Zeile erste Position }
Der folgende Code wird verwendet, um die Werte auf dem LCD anzuzeigen
Leere LCD_DISPLAY (char * msg) // Funktion die Zeichen drucken gesendet eins nach dem anderen { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Sendet Upper Nibble IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH zum Drucken von Daten IO0CLR = 0x00000020; // RW LOW Schreibmodus delay_ms (2); IO0CLR = 0x00000040; // EN = 0, RS und RW unverändert (dh RS = 1, RW = 0) delay_ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Sendet Lower Nibble IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; delay_ms (2); IO0CLR = 0x00000040; delay_ms (5); i ++; } }
Die folgende Funktion wird verwendet, um eine Verzögerung zu erzeugen
void delay_ms (uint16_t j) // Funktion zum Erstellen einer Verzögerung in Millisekunden { uint16_t x, i; für (i = 0; i
Der vollständige Code mit Demonstrationsvideo ist unten angegeben.