- Grundlagen des PWM-Signals
- Hardware-Setup und -Anforderung
- Schaltplan für Nuvoton N76E003 Mikrocontroller LED Dimmen
- PWM-Pins am Nuvoton-Mikrocontroller N76E003
- PWM-Register und -Funktionen im Nuvoton-Mikrocontroller N76E003
- PWM-Betriebsmodi im Nuvoton N6E003-Mikrocontroller
- Programmierung von Nuvoton N76E003 für PWM
- Flashen des Codes und Testen der Ausgabe
Die Pulsweitenmodulation (PWM) ist eine in Mikrocontrollern häufig verwendete Technik zur Erzeugung eines kontinuierlichen Pulssignals mit einer definierten Frequenz und einem definierten Arbeitszyklus. Kurz gesagt, bei PWM geht es darum, die Breite eines Impulses zu ändern, während die Frequenz konstant ist.
Ein PWM-Signal wird hauptsächlich zur Steuerung eines Servomotors oder der Helligkeit einer LED verwendet. Da Mikrocontroller nur Logik 1 (hoch) oder Logik 0 (niedrig) an ihren Ausgangspins bereitstellen können, kann sie keine variierende analoge Spannung bereitstellen, es sei denn, ein DAC- oder Digital-Analog-Wandler wird verwendet. In einem solchen Fall kann der Mikrocontroller so programmiert werden, dass er eine PWM mit einem variierten Arbeitszyklus ausgibt, die dann in die variierende analoge Spannung umgewandelt werden kann. Wir haben PWM-Peripheriegeräte bereits in vielen anderen Mikrocontrollern verwendet.
- ARM7-LPC2148 PWM-Lernprogramm: Steuern der Helligkeit von LEDs
- Pulsweitenmodulation (PWM) mit MSP430G2: Steuerung der Helligkeit von LEDs
- PWM mit PIC Microcontroller mit MPLAB und XC8 erzeugen
- Pulsweitenmodulation (PWM) in STM32F103C8: Steuerung der Drehzahl des DC-Lüfters
- Generieren von PWM-Signalen an GPIO-Pins des PIC-Mikrocontrollers
- Raspberry Pi PWM Tutorial
- PWM-Tutorial mit ESP32
In diesem Tutorial werden wir eine LED anschließen, die mit diesem PWM-Signal von der N76E003-Mikrocontrollereinheit gesteuert wird. Wir werden bewerten, welche Art von Hardware-Setup wir benötigen und wie wir unseren Mikrocontroller programmieren sollten. Lassen Sie uns vorher einige Grundlagen eines PWM-Signals verstehen.
Grundlagen des PWM-Signals
Im folgenden Bild ist ein konstantes PWM-Signal dargestellt.
Das obige Bild ist nichts anderes als eine konstante Rechteckwelle mit derselben EIN-Zeit und derselben AUS-Zeit. Angenommen, die Gesamtperiode des Signals beträgt 1 Sekunde. Somit beträgt die Ein- und Ausschaltzeit 500 ms. Wenn über dieses Signal eine LED angeschlossen ist, leuchtet die LED 500 ms lang und 500 ms lang aus. In der perspektivischen Ansicht leuchtet die LED daher mit der Hälfte der tatsächlichen Helligkeit auf, wenn sie ohne Ausschaltzeit auf ein direktes 5-V-Signal eingeschaltet wird.
Wie im obigen Bild gezeigt, leuchtet die LED bei Änderung des Arbeitszyklus mit 25% der tatsächlichen Helligkeit nach dem gleichen Prinzip wie zuvor beschrieben. Wenn Sie mehr wissen und mehr über die Pulsweitenmodulation (PWM) erfahren möchten, lesen Sie den verlinkten Artikel.
Hardware-Setup und -Anforderung
Da die Anforderung dieses Projekts ist, LED mit PWM zu steuern. Eine LED muss mit N76E003 verbunden sein. Da auf dem N76E003-Entwicklungsboard eine LED verfügbar ist, wird sie in diesem Projekt verwendet. Es sind keine weiteren Komponenten erforderlich.
Ganz zu schweigen davon, dass wir das auf einem Mikrocontroller basierende Entwicklungsboard N76E003 sowie den Nu-Link-Programmierer benötigen. Ein zusätzliches 5-V-Netzteil kann erforderlich sein, wenn der Programmierer nicht als Stromquelle verwendet wird.
Schaltplan für Nuvoton N76E003 Mikrocontroller LED Dimmen
Wie wir im folgenden Schema sehen können, ist die Test-LED auf der Entwicklungsplatine verfügbar und an Port 1.4 angeschlossen. Ganz links ist der Anschluss der Programmierschnittstelle dargestellt.
PWM-Pins am Nuvoton-Mikrocontroller N76E003
Der N76E003 verfügt über 20 Pins, von denen 10 als PWM verwendet werden können. Die folgenden Bilder zeigen die PWM-Pins, die im roten Quadrat hervorgehoben sind.
Wie wir sehen können, können die hervorgehobenen PWM-Pins auch für andere Zwecke verwendet werden. Dieser andere Zweck der Pins ist jedoch nicht verfügbar, wenn die Pins für die PWM-Ausgabe konfiguriert sind. Pin 1.4, der als PWM-Ausgangspin verwendet wird, verliert die andere Funktionalität. Dies ist jedoch kein Problem, da für dieses Projekt keine weitere Funktionalität erforderlich ist.
Der Grund für die Wahl von Pin 1.4 als Ausgangs-Pin liegt darin, dass die eingebaute Test-LED an diesem Pin in der Entwicklungsplatine angeschlossen ist und daher keine externen LEDs erforderlich sind. In diesem Mikrocontroller mit 20 Pins können jedoch 10 Pins als PWM-Ausgangspin verwendet werden, und alle anderen PWM-Pins können für ausgangsbezogene Zwecke verwendet werden.
PWM-Register und -Funktionen im Nuvoton-Mikrocontroller N76E003
Der N76E003 verwendet einen Systemtakt oder einen Timer 1-Überlauf geteilt durch einen PWM-Takt, wobei der Prescaler zwischen 1/1 und 1/128 wählbar ist. Die PWM-Periode kann unter Verwendung des 16-Bit-Periodenregisters PWMPH und des PWMPL-Registers eingestellt werden.
Der Mikrocontroller verfügt über sechs einzelne PWM-Register, die sechs PWM-Signale mit den Bezeichnungen PG0, PG1, PG2, PG3, PG4 und PG5 erzeugen. Die Periode ist jedoch für jeden PWM-Kanal gleich, da sie denselben 16-Bit-Periodenzähler verwenden, aber das Tastverhältnis jeder PWM kann sich von anderen unterscheiden, da jede PWM ein anderes 16-Bit-Tastverhältnisregister verwendet, das als {PWM0H, PWM0L} bezeichnet wird, {PWM1H, PWM1L}, {PWM2H, PWM2L}, {PWM3H, PWM3L}, {PWM4H, PWM4L} und {PWM5H, PWM5L}. Somit können in N76E003 sechs PWM-Ausgänge unabhängig voneinander mit unterschiedlichen Arbeitszyklen erzeugt werden.
Im Gegensatz zu anderen Mikrocontrollern werden beim Aktivieren der PWM die E / A-Pins nicht automatisch in ihren PWM-Ausgang gesetzt. Daher muss der Benutzer den E / A-Ausgabemodus konfigurieren.
Was auch immer für die Anwendung erforderlich ist, der erste Schritt besteht darin, zu bestimmen oder auszuwählen, welcher oder zwei oder sogar mehr als zwei E / A-Pins als PWM-Ausgang verwendet werden sollen. Nach Auswahl eines müssen die E / A-Pins auf Push-Pull-Modus oder quasi bidirektional eingestellt werden, um das PWM-Signal zu erzeugen. Dies kann über das Register PxM1 und PxM2 ausgewählt werden. Diese beiden Register legen die E / A-Modi fest, in denen x für die Portnummer steht (Beispiel: Port P1.0, das Register ist P1M1 und P1M2, für P3.0 ist es P3M1 und P3M2 usw.)
Die Konfiguration ist im folgenden Bild zu sehen.
Der nächste Schritt besteht dann darin, die PWM in diesen bestimmten E / A-Pins zu aktivieren. Dazu muss der Benutzer die Register PIOCON0 oder PIOCON1 festlegen. Das Register ist abhängig von der Pin-Zuordnung, da PIOCON0 und PIOCON1 abhängig von den PWM-Signalen unterschiedliche Pins steuern. Die Konfiguration dieser beiden Register ist im folgenden Bild zu sehen.
Wie wir sehen können, steuert das obige Register 6 Konfigurationen. Verwenden Sie im Übrigen das PIOCON1-Register.
Somit steuert das obige Register die restlichen 4 Konfigurationen.
PWM-Betriebsmodi im Nuvoton N6E003-Mikrocontroller
Der nächste Schritt ist die Auswahl der PWM-Betriebsarten. Jedes PWM unterstützt drei Betriebsmodi: Unabhängiger, Synchroner und Totzeit-Aktivierungsmodus.
Der unabhängige Modus bietet die Lösung, bei der die sechs PWM-Signale unabhängig voneinander erzeugt werden können. Dies ist maximal erforderlich, wenn LED-bezogene Vorgänge oder Summer eingeschaltet und gesteuert werden müssen.
Der synchrone Modus setzt das PG1 / 3/5 auf denselben gleichphasigen PWM-Ausgang wie PG0 / 2/4, wobei das PG0 / 2/4 unabhängige PWM-Ausgangssignale liefert. Dies ist hauptsächlich für die Steuerung von Drehstrommotoren erforderlich.
Der Dead-Time-Einfügemodus ist etwas komplex und wird in realen Motoranwendungen, insbesondere in industriellen Anwendungen, angewendet. In solchen Anwendungen muss ein komplementärer PWM-Ausgang eine Totzeiteinfügung sein, die eine Beschädigung der Leistungsschaltgeräte wie GPIBs verhindert. Die Konfigurationen werden in diesem Modus so eingestellt, dass das PG0 / 2/4 PWM-Ausgangssignale auf die gleiche Weise wie der unabhängige Modus liefert, PG1 / 3/5 jedoch entsprechend „phasenverschobene PWM-Signale“ des PG0 / 2/4 liefert und ignorieren Sie das PG1 / 3/5 Duty-Register.
Die oben genannten drei Modi können mithilfe der folgenden Registerkonfiguration ausgewählt werden.
Die nächste Konfiguration ist die Auswahl von PWM-Typen unter Verwendung des PWMCON1-Registers.
Wie wir sehen können, stehen zwei PWM-Typen zur Verfügung, die unter Verwendung des obigen Registers ausgewählt werden können. Bei der Kantenausrichtung verwendet der 16-Bit-Zähler eine Operation mit einfacher Steigung, indem er von 0000H bis zum eingestellten Wert von {PWMPH, PWMPL} hochzählt und dann ab 0000H beginnt. Die Ausgangswellenform ist am linken Rand ausgerichtet.
Im mittig ausgerichteten Modus verwendet der 16-Bit-Zähler jedoch eine Dual-Slope-Operation, indem er von 0000H bis {PWMPH, PWMPL} hochzählt, und geht dann erneut von {PWMPH, PWMPL} bis 0000H durch Countdown hoch. Der Ausgang ist mittig ausgerichtet und eignet sich zum Erzeugen nicht überlappender Wellenformen. Nun endlich die PWM-Steueroperationen, die in den folgenden Registern überprüft werden können.
Verwenden Sie zum Einstellen der Taktquelle das CKCON-Taktsteuerregister.
Das PWM-Ausgangssignal kann auch mit dem PMEN-Register maskiert werden. Mit diesem Register kann der Benutzer das Ausgangssignal mit 0 oder 1 maskieren.
Als nächstes kommt das PWM-Steuerregister.
Das obige Register ist nützlich, um die PWM auszuführen, neue Perioden und Arbeitslasten zu laden, das PWM-Flag zu steuern und den PWM-Zähler zu löschen.
Die zugehörigen Bitkonfigurationen sind unten dargestellt.
Verwenden Sie zum Einstellen des Taktteilers das PWMCON1-Register für den PWM- Taktteiler. Das 5. Bit wird für die im Gruppenmodus aktivierte gruppierte PWM verwendet und bietet den gleichen Arbeitszyklus für die ersten drei PWM-Paare.
Programmierung von Nuvoton N76E003 für PWM
Die Codierung ist einfach und der vollständige Code, der in diesem Tutorial verwendet wird, befindet sich unten auf dieser Seite. Die LED ist mit dem P1.4-Pin verbunden. Daher wird der P1.4-Pin benötigt, um für die PWM-Ausgabe verwendet zu werden.
Im Hauptprogramm werden die Einstellungen in der jeweiligen Reihenfolge vorgenommen. Unterhalb der Codezeilen wird die PWM eingestellt und der P1.4-Pin als PWM-Ausgang konfiguriert.
P14_PushPull_Mode;
Hiermit wird der Pin P1.4 in den Push-Pull-Modus versetzt. Dies ist in der Bibliothek Function_define.h definiert als
#define P14_PushPull_Mode P1M1 & = ~ SET_BIT4; P1M2- = SET_BIT4 PWM1_P14_OUTPUT_ENABLE;
Die nächsten Zeilen werden verwendet, um die PWM in Pin P1.4 zu aktivieren. Dies ist auch in der Bibliothek Function_define.h definiert als
#define PWM1_P14_OUTPUT_ENABLE BIT_TMP = EA; EA = 0; TA = 0xAA; TA = 0x55; SFRS- = 0x01; PIOCON1- = 0x02; TA = 0xAA; TA = 0x55; SFRS & = 0xFE; EA = BIT_TMP //P1.4 als PWM1-Ausgangsfreigabe PWM_IMDEPENDENT_MODE;
Der folgende Code wird verwendet, um die PWM in den unabhängigen Modus zu versetzen. In der Bibliothek Function_define.h ist definiert als:
#define PWM_IMDEPENDENT_MODE PWMCON1 & = 0x3F PWM_EDGE_TYPE;
Dann müssen wir den PWM-Ausgang vom Typ EDGE einstellen. In der Bibliothek Function_define.h ist definiert als:
#define PWM_EDGE_TYPE PWMCON1 & = ~ SET_BIT4 set_CLRPWM;
Als nächstes müssen wir den PWM- Zählerwert löschen, der in der Bibliothek SFR_Macro.h verfügbar ist.
#define set_CLRPWM CLRPWM = 1
Danach wird der PWM-Takt als Fsys-Takt ausgewählt und der verwendete Teilungsfaktor ist die 64-Teilung.
PWM_CLOCK_FSYS; PWM_CLOCK_DIV_64;
Beide sind definiert als
#define PWM_CLOCK_FSYS CKCON & = 0xBF #define PWM_CLOCK_DIV_64 PWMCON1- = 0x06; PWMCON1 & = 0xFE PWM_OUTPUT_ALL_NORMAL;
Die folgende Codezeile wird verwendet, um das PWM-Ausgangssignal durch 0 zu maskieren, definiert als
#define PWM_OUTPUT_ALL_NORMAL PNP = 0x00 set_PWM_period (1023);
Dann müssen wir die Periodenzeit des PWM-Signals einstellen. Diese Funktion legt die Periode im PWMPL- und PWMPH-Register fest. Da dies ein 16-Bit-Register ist, verwendet die Funktion eine Bitverschiebungsmethode, um die PWM-Periode einzustellen.
void set_PWM_period (vorzeichenloser int-Wert) { PWMPL = (Wert & 0x00FF); PWMPH = ((Wert & 0xFF00) >> 8); }}
Neben der 1023- und 8-Bit-Periode können Benutzer jedoch auch andere Werte verwenden. Das Erhöhen der Periode führt zu einem gleichmäßigen Dimmen oder Verblassen.
set_PWMRUN;
Dadurch wird die PWM starten, die in definiert ist SFR_Macro.h Bibliothek as-
#define set_PWMRUN PWMRUN = 1
Als nächstes wird in der while-Schleife die LED eingeschaltet und kontinuierlich ausgeblendet.
während (1) { für (Wert = 0; Wert <1024; Wert + = 10) { set_PWM1 (Wert); Timer1_Delay10ms (3); } für (Wert = 1023; Wert> 0; Wert - = 10) { set_PWM1 (Wert); Timer1_Delay10ms (2); } } }
Das Tastverhältnis wird durch set_PWM1 (); eingestellt, eine Funktion, die das Tastverhältnis im Register PWM1L und PWM1H einstellt.
void set_PWM1 (vorzeichenloser int-Wert) { PWM1L = (Wert & 0x00FF); PWM1H = ((Wert & 0xFF00) >> 8); set_LOAD; }}
Flashen des Codes und Testen der Ausgabe
Sobald der Code fertig ist, kompilieren Sie ihn einfach und laden Sie ihn auf den Controller hoch. Wenn Sie mit der Umgebung noch nicht vertraut sind, lesen Sie die ersten Schritte mit dem Nuvoton N76E003-Lernprogramm, um die Grundlagen zu erlernen. Wie Sie dem folgenden Ergebnis entnehmen können, hat der Code 0 Warnungen und 0 Fehler zurückgegeben und mit der Standard-Blinkmethode des Keil geflasht. Die Anwendung beginnt zu arbeiten.
Neuerstellung gestartet: Projekt: PWM Neuerstellung des Ziels 'Ziel 1' beim Zusammenstellen von STARTUP.A51… Kompilieren von main.c… Kompilieren von Delay.c… Verknüpfen… Programmgröße: Daten = 35,1 xDaten = 0 Code = 709 Erstellen Hex-Datei aus ". \ Objects \ pwm"… ". \ Objects \ pwm" - 0 Fehler, 0 Warnung (en). Verstrichene Erstellungszeit: 00:00:05
Die Hardware ist an die Stromquelle angeschlossen und hat wie erwartet funktioniert. Dies ist die Helligkeit der integrierten LED, die verringert und dann erhöht wird, um den Änderungs-PWM-Arbeitszyklus anzuzeigen.
Die vollständige Funktionsweise dieses Tutorials finden Sie auch in dem unten verlinkten Video. Ich hoffe, Ihnen hat das Tutorial gefallen und Sie haben etwas Nützliches gelernt, wenn Sie Fragen haben. Lassen Sie diese im Kommentarbereich oder nutzen Sie unsere Foren für andere technische Fragen.