- PWM (Pulsweitenmodulation)
- PWM-Pins in ARM7-LPC2148
- PWM-Register in ARM7-LPC2148
- Erforderliche Komponenten
- Schaltplan und Anschlüsse
- Programmierung von ARM7-LPC2148 für PWM
- Schritte zur Programmierung von LPC2148 für PWM & ADC
Wie wir wissen, nehmen Mikrocontroller analoge Eingaben von analogen Sensoren und verwenden ADC (Analog-Digital-Wandler), um diese Signale zu verarbeiten. Was aber, wenn ein Mikrocontroller ein analoges Signal zur Steuerung analog betriebener Geräte wie Servomotor, Gleichstrommotor usw. erzeugen möchte? Mikrocontroller erzeugen keine Ausgangsspannung wie 1 V, 5 V, sondern verwenden eine Technik namens PWM für den Betrieb analoger Geräte. Ein Beispiel für PWM ist der Lüfter (Gleichstrommotor) unseres Laptops, der entsprechend der Temperatur drehzahlgeregelt werden muss. Dasselbe wird mithilfe der PWM- Technik (Pulse Width Modulation) in Motherboards implementiert.
In diesem Tutorial steuern wir die Helligkeit einer LED mithilfe der PWM im ARM7-LPC2148-Mikrocontroller.
PWM (Pulsweitenmodulation)
PWM ist eine gute Möglichkeit, die analogen Geräte mithilfe digitaler Werte wie der Steuerung der Motordrehzahl, der Helligkeit einer LED usw. zu steuern. PWM bietet zwar keinen reinen analogen Ausgang, erzeugt jedoch anständige analoge Impulse zur Steuerung der analogen Geräte. PWM moduliert tatsächlich die Breite einer Rechteckimpulswelle, um eine Variation des Durchschnittswerts der resultierenden Welle zu erhalten.
Arbeitszyklus der PWM
Der Prozentsatz der Zeit, in der das PWM-Signal HIGH (Einschaltzeit) bleibt, wird als Arbeitszyklus bezeichnet. Wenn das Signal immer eingeschaltet ist, befindet es sich in einem Tastverhältnis von 100% und wenn es immer ausgeschaltet ist, ist es ein Tastverhältnis von 0%.
Arbeitszyklus = Einschaltzeit / (Einschaltzeit + Ausschaltzeit)
PWM-Pins in ARM7-LPC2148
Das Bild unten zeigt die PWM-Ausgangspins von ARM7-LPC2148. Es gibt insgesamt sechs Pins für PWM.
PWM-Kanal |
LPC2148 Anschlussstifte |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
PWM-Register in ARM7-LPC2148
Bevor wir in unser Projekt einsteigen, müssen wir uns mit den PWM-Registern in LPC2148 vertraut machen.
Hier ist die Liste der Register, die in LPC2148 für PWM verwendet werden
1. PWMPR: PWM Prescale Register
Verwendung: Es ist ein 32-Bit-Register. Es enthält die Häufigkeit (minus 1), die PCLK vor dem Inkrementieren des PWM-Timer-Zählers durchlaufen muss (es enthält tatsächlich den Maximalwert des Vorskalierungszählers).
2. PWMPC: PWM-Prescaler-Zähler
Verwendung: Es ist ein 32-Bit-Register . Es enthält den inkrementierenden Zählerwert. Wenn dieser Wert gleich dem PR-Wert plus 1 ist, wird der PWM-Timer-Zähler (TC) erhöht.
3. PWMTCR: PWM-Timer- Steuerregister
Verwendung: Es enthält die Steuerbits Counter Enable, Counter Reset und PWM Enable. Es ist ein 8-Bit-Register.
7: 4 |
3 |
2 |
1 |
0 |
RESERVIERT |
PWM AKTIVIEREN |
RESERVIERT |
COUNTER RESET |
ZÄHLER AKTIVIEREN |
- PWM-Aktivierung: (Bit-3)
0- PWM deaktiviert
1- PWM aktiviert
- Zähler aktivieren: (Bit-0)
0- Zähler deaktivieren
1- Zähler aktivieren
- Zurücksetzen des Zählers: (Bit-1)
0- Nichts tun.
1- Setzt PWMTC & PWMPC an der positiven Flanke von PCLK zurück.
4. PWMTC: PWM-Timer-Zähler
Verwendung: Es ist ein 32-Bit-Register. Es enthält den aktuellen Wert des inkrementierenden PWM-Timers. Wenn der Prescaler Counter (PC) den Wert des Prescaler Register (PR) plus 1 erreicht, wird dieser Zähler inkrementiert.
5. PWMIR: PWM-Interrupt-Register
Verwendung: Es ist ein 16-Bit-Register. Es enthält die Interrupt-Flags für die PWM-Match-Kanäle 0-6. Ein Interrupt-Flag wird gesetzt, wenn für diesen Kanal ein Interrupt auftritt (MRx Interrupt), wobei X die Kanalnummer ist (0 bis 6).
6. PWMMR0-PWMMR6: PWM -Übereinstimmungsregister
Verwendung: Es ist ein 32-Bit-Register . Tatsächlich ermöglicht die Match Channel-Gruppe die Einstellung von 6 Single-Edge-gesteuerten oder 3 Double-Edge-gesteuerten PWM-Ausgängen. Sie können die sieben Übereinstimmungskanäle ändern, um diese PWM-Ausgänge an Ihre Anforderungen in PWMPCR anzupassen.
7. PWMMCR: PWM Match Control Register
Verwendung: Es ist ein 32-Bit-Register. Es enthält die Interrupt-, Reset- und Stop-Bits, die den ausgewählten Match-Kanal steuern. Eine Übereinstimmung tritt zwischen den PWM-Übereinstimmungsregistern und den PWM-Zeitgeberzählern auf.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
RESERVIERT |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Hier ist x von 0 bis 6
- PWMMRxI (Bit-0)
Aktivieren oder Deaktivieren von PWM-Interrupts
0- PWM-Match-Interrupts deaktivieren.
1- Aktivieren Sie den PWM-Match-Interrupt.
- PWMMRxR: (Bit-1)
RESET PWMTC - Timer- Zählerwert, wenn er mit PWMRx übereinstimmt
0- Nichts tun.
1- Setzt den PWMTC zurück.
- PWMMRxS: (Bit 2)
STOP PWMTC & PWMPC, wenn PWMTC den Match-Registerwert erreicht
0- Deaktivieren Sie die PWM-Stoppfunktion.
1- Aktivieren Sie die PWM-Stoppfunktion.
8. PWMPCR: PWM- Steuerregister
Verwendung: Es ist ein 16-Bit-Register. Es enthält die Bits, die die PWM-Ausgänge 0-6 aktivieren und für jeden Ausgang die Steuerung mit einer oder zwei Kanten auswählen.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
UNGEBRAUCHT |
PWMENA6-PWMENA1 |
UNGEBRAUCHT |
PWMSEL6-PWMSEL2 |
UNGEBRAUCHT |
- PWMSELx (x: 2 bis 6)
- Single Edge-Modus für PWMx
- 1- Doppelkantenmodus für PWMx.
- PWMENAx (x: 1 bis 6)
- PWMx deaktivieren.
- 1- PWMx aktiviert.
9. PWMLER: PWM Latch Enable Register
Verwendung: Es ist ein 8-Bit-Register. Es enthält die Match x Latch-Bits für jeden Match-Kanal.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
UNGEBRAUCHT |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 bis 6):
0- Deaktivieren Sie das Laden neuer
Übereinstimmungswerte. 1- Laden Sie die neuen Übereinstimmungswerte aus dem PWMMatch-Register (PWMMRx), wenn der Timer zurückgesetzt wird.
Beginnen wir nun mit dem Aufbau des Hardware-Setups, um die Pulsweitenmodulation im ARM-Mikrocontroller zu demonstrieren.
Erforderliche Komponenten
Hardware
- ARM7-LPC2148 Mikrocontroller
- 3,3 V Spannungsregler-IC
- 10k Potentiometer
- LED (beliebige Farbe)
- LCD (16x2) Anzeigemodul
- Steckbrett
- Kabel anschließen
Software
- Keil uVision5
- Flash Magic Tool
Schaltplan und Anschlüsse
Verbindungen zwischen LCD & 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) |
GND |
VSS, R / W, K. |
+ 5V |
VDD, A. |
Verbindung zwischen LED & ARM7-LPC2148
Die ANODE der LED ist mit dem PWM-Ausgang (P0.0) von LPC2148 verbunden, während der CATHODE-Pin der LED mit dem GND-Pin von LPC2148 verbunden ist.
Verbindung zwischen ARM7-LPC2148 und Potentiometer mit 3,3-V-Spannungsregler
3,3 V Spannungsregler-IC |
Pin-Funktion |
ARM-7 LPC2148 Pin |
1. Linker Stift |
- Ve von GND |
GND Pin |
2.Centre Pin |
Geregelter + 3,3 V Ausgang |
Zum Potentiometereingang und Potentiometerausgang zu P0.28 von LPC2148 |
3.Rechter Stift |
+ Ve von 5V EINGANG |
+ 5V |
Zu beachtende Punkte
1. Ein Spannungsregler von 3,3 V wird hier verwendet, um den ADC-Pin (P0.28) von LPC2148 mit einem analogen Eingangswert zu versorgen. Da wir 5 V verwenden, müssen wir die Spannung mit einem Spannungsregler von 3,3 V regeln.
2. Ein Potentiometer wird verwendet, um die Spannung zwischen (0 V und 3,3 V) zu variieren und einen Analogeingang (ADC) für LPC2148 Pin P0.28 bereitzustellen
Programmierung von ARM7-LPC2148 für PWM
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 verwenden wir die ADC- und PWM-Technik, um die Helligkeit der LED zu steuern. Hier erhält LPC2148 über den ADC-Eingangspin P0.28 einen analogen Eingang (0 bis 3,3 V), dann wird dieser analoge Eingang in einen digitalen Wert (0 bis 1023) umgewandelt. Dann wird dieser Wert erneut in einen digitalen Wert (0 - 255) umgewandelt, da der PWM-Ausgang von LPC2148 nur eine 8-Bit-Auflösung hat (2 8). Die LED ist mit dem PWM-Pin P0.0 verbunden und die Helligkeit der LED kann mit dem Potentiometer gesteuert werden. Um mehr über ADC in ARM7-LPC2148 zu erfahren, folgen Sie dem Link.
Schritte zur Programmierung von LPC2148 für PWM & ADC
Schritt 1: - Das allererste ist, die PLL für die Taktgenerierung zu konfigurieren, da sie den Systemtakt und den Peripherietakt des LPC2148 gemäß den Anforderungen der Programmierer einstellt. Die maximale Taktfrequenz für LPC2148 beträgt 60 MHz. Die folgenden Zeilen werden zum Konfigurieren der PLL-Taktgenerierung verwendet.
void initilizePLL (void) // Funktion zur Verwendung von PLL zur Taktgenerierung { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; while (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }}
Schritt 2: - Als nächstes müssen Sie die PWM-Pins und die PWM-Funktion des LPC2148 mithilfe des PINSEL-Registers auswählen. Wir verwenden PINSEL0, da wir P0.0 für die PWM-Ausgabe von LPC2148 verwenden.
PINSEL0 = 0x00000002; // Pin P0.0 für PWM-Ausgang einstellen
Schritt 3: - Als nächstes müssen wir die Timer mit PWMTCR (Timer Control Register) zurücksetzen.
PWMTCR = (1 << 1); // PWM Timer Control Register als Zähler zurücksetzen
Stellen Sie dann den Vorskalierungswert ein, der über die Auflösung von PWM entscheidet. Ich setze es auf Null
PWMPR = 0X00; // PWM-Vorskalierungswert einstellen
Schritt 4: - Als nächstes müssen wir das PWMMCR (PWM Match Control Register) einstellen, da es die Operation wie Reset und Interrupts für PWMMR0 einstellt.
PWMMCR = (1 << 0) - (1 << 1); // PWM Match Control Register einstellen
Schritt 5: - Die maximale Dauer des PWM-Kanals wird mit PWMMR eingestellt.
PWMMR0 = PWM-Wert; // PWM-Wert angeben Maximalwert
In unserem Fall beträgt der Maximalwert 255 (für maximale Helligkeit)
Schritt 6: - Als nächstes müssen wir die Latch-Aktivierung mit PWMLER auf die entsprechenden Übereinstimmungsregister setzen
PWMLER = (1 << 0); // PWM-Latch aktivieren
(Wir verwenden PWMMR0) Aktivieren Sie also das entsprechende Bit, indem Sie 1 in PWMLER setzen
Schritt 7: - Um den PWM-Ausgang an den Pin zu aktivieren, müssen Sie den PWMTCR verwenden, um die PWM-Timer-Zähler und PWM-Modi zu aktivieren.
PWMTCR = (1 << 0) - (1 << 3); // PWM und PWM-Zähler aktivieren
Schritt 8: - Jetzt müssen wir die Potentiometerwerte zum Einstellen des Arbeitszyklus der PWM vom ADC-Pin P0.28 abrufen. Daher verwenden wir das ADC-Modul in LPC2148, um den Analogeingang des Potentiometers (0 bis 3,3 V) in die ADC-Werte (0 bis 1023) umzuwandeln.
Hier konvertieren wir die Werte von 0-1023 nach 0-255, indem wir sie durch 4 teilen, da die PWM von LPC2148 eine 8-Bit-Auflösung hat (2 8).
Schritt 9: - Zur Auswahl des ADC-Pins P0.28 in LPC2148 verwenden wir
PINSEL1 = 0x01000000; // P0.28 als ADC INPUT einstellen AD0CR = (((14) << 8) - (1 << 21)); // Einstellen von Uhr und PDN für die A / D-Wandlung
Die folgenden Zeilen erfassen den Analogeingang (0 bis 3,3 V) und wandeln ihn in einen digitalen Wert (0 bis 1023) um. Und dann werden diese digitalen Werte durch 4 geteilt, um sie in (0 bis 255) umzuwandeln, und schließlich als PWM-Ausgang in den P0.0-Pin von LPC2148 eingespeist, an dem die LED angeschlossen ist.
AD0CR - = (1 << 1); // AD0.1-Kanal in ADC-Registerverzögerungszeit auswählen (10); AD0CR - = (1 << 24); // Starten Sie die A / D-Wandlung, während ((AD0DR1 & (1 << 31)) == 0); // Überprüfen Sie das DONE-Bit im ADC-Datenregister adcvalue = (AD0DR1 >> 6) & 0x3ff; // Erhalte das ERGEBNIS aus dem ADC-Datenregister Dutycycle = adcvalue / 4; // Formel zum Abrufen von Dutycycle-Werten von (0 bis 255) PWMMR1 = Dutycycle; // Tastverhältniswert auf PWM-Übereinstimmungsregister setzen PWMLER - = (1 << 1); // PWM-Ausgabe mit Tastverhältniswert aktivieren
Schritt 10: - Als nächstes zeigen wir diese Werte im LCD (16X2) Anzeigemodul an. Daher fügen wir die folgenden Zeilen hinzu, um das LCD-Anzeigemodul zu initialisieren
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- Verzögerungszeit (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 }
Da wir LCD im 4-Bit-Modus mit LPC2148 verbunden haben, müssen wir Werte senden, die als Nibble by Nibble angezeigt werden (Upper Nibble & Lower Nibble). Daher werden die folgenden Zeilen verwendet.
void LCD_DISPLAY (char * msg) // Funktion zum Drucken der nacheinander gesendeten Zeichen { 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-Verzögerungszeit (2); IO0CLR = 0x00000040; // EN = 0, RS und RW unverändert (dh RS = 1, RW = 0) Verzögerungszeit (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Sendet Lower Nibble IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; Verzögerungszeit (2); IO0CLR = 0x00000040; Verzögerungszeit (5); i ++; } }
Um diese ADC- und PWM-Werte anzuzeigen, verwenden wir die folgenden Zeilen in der Funktion int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // ADC-Wert anzeigen (0 bis 1023) LCD_SEND (0xC0); Sprintf (LED-Ausgang, "PWM OP =%. 2f", Helligkeit); LCD_DISPLAY (LED-Ausgabe); // Tastverhältniswerte von (0 bis 255) anzeigen
Der vollständige Code und die Videobeschreibung des Tutorials sind unten angegeben.