- PWM-Pins im AVR-Mikrocontroller Atmega16
- Was ist ein PWM-Signal?
- Erforderliche Komponenten
- Schaltplan
- Programmierung von Atmega16 für PWM
Die Pulsweitenmodulation (PWM) ist eine leistungsstarke Technik, bei der die Pulsbreite geändert wird, indem die Frequenz konstant gehalten wird. Die Technik wird heute in vielen Steuerungssystemen eingesetzt. Die Anwendung von PWM ist nicht beschränkt und wird in einer Vielzahl von Anwendungen wie Motordrehzahlregelung, Messung, Leistungsregelung und Kommunikation usw. verwendet. In der PWM-Technik kann man leicht ein analoges Ausgangssignal unter Verwendung digitaler Signale erzeugen. Dieses Tutorial hilft Ihnen dabei, PWM, seine Terminologien und die Implementierung mit einem Mikrocontroller zu verstehen. In diesem Tutorial demonstrieren wir PWM mit dem AVR Atmega16 Microcontroller durch Variieren der Intensität einer LED.
Um die Grundlagen von PWM im Detail zu verstehen, lesen Sie bitte unsere vorherigen Tutorials zu PWM mit verschiedenen Mikrocontrollern:
- 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-Pins im AVR-Mikrocontroller Atmega16
Atmega16 verfügt über vier dedizierte PWM-Pins. Diese Pins sind PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Auch Atmega16 hat zwei 8-Bit-Timer und einen 16-Bit-Timer. Timer0 und Timer2 sind 8-Bit-Timer, während Timer1 ein 16-Bit-Timer ist. Um PWM zu generieren, müssen wir einen Überblick über Timer haben, da Timer zum Generieren von PWM verwendet werden. Wie wir wissen, ist die Frequenz die Anzahl der Zyklen pro Sekunde, mit denen der Timer läuft. Die höhere Frequenz gibt uns also einen schnelleren Timer. Bei der Erzeugung von PWM bietet eine schnellere PWM-Frequenz eine feinere Kontrolle über den Ausgang, da sie schneller auf neue PWM-Arbeitszyklen reagieren kann.
In diesem Atmega16 PWM-Tutorial verwenden wir Timer2. Sie können einen beliebigen Arbeitszyklus auswählen. Wenn Sie nicht wissen, was der Arbeitszyklus in PWM ist, lassen Sie uns kurz darauf eingehen.
Was ist ein PWM-Signal?
Die Pulsweitenmodulation (PWM) ist ein digitales Signal, das am häufigsten in Steuerschaltungen verwendet wird. Die Zeit, während der das Signal hoch bleibt, wird als "Einschaltzeit" bezeichnet, und die Zeit, während der das Signal niedrig bleibt, wird als "Ausschaltzeit" bezeichnet. Es gibt zwei wichtige Parameter für eine PWM, wie unten erläutert:
Arbeitszyklus der PWM
Der Prozentsatz der Zeit, in der das PWM-Signal HIGH (Einschaltzeit) bleibt, wird als Arbeitszyklus bezeichnet.
Wie im 100-ms-Impulssignal bedeutet das Signal, wenn es 50 ms lang HIGH und 50 ms lang LOW ist, dass der Impuls zur Hälfte HIGH und zur Hälfte LOW war. Wir können also sagen, dass der Arbeitszyklus 50% beträgt. In ähnlicher Weise würde das Tastverhältnis 25% betragen, wenn sich der Impuls im 25-ms-HIGH-Zustand und 75 ms im LOW-Zustand von 100 ms befindet. Beachten Sie, dass wir nur die Dauer des HIGH-Zustands berechnen. Zum visuellen Verständnis können Sie sich auf das folgende Bild beziehen. Die Formel für das Tastverhältnis lautet dann:
Arbeitszyklus (%) = Einschaltzeit / (Einschaltzeit + Ausschaltzeit)
Durch Ändern des Arbeitszyklus können wir also die Breite der PWM ändern, was zu einer Änderung der LED-Helligkeit führt. Wir werden eine Demo zur Verwendung unterschiedlicher Arbeitszyklen bei der Steuerung der LED-Helligkeit haben. Überprüfen Sie das Demo-Video am Ende dieses Tutorials.
Nach Auswahl des Arbeitszyklus würde der nächste Schritt die Auswahl des PWM-Modus sein. Der PWM-Modus gibt an, wie PWM funktionieren soll. Es gibt hauptsächlich 3 Arten von PWM-Modi. Diese sind wie folgt:
- Schnelle PWM
- Phasenkorrektur PWM
- Phasen- und Frequenzkorrektur PWM
Schnelle PWM wird verwendet, wenn der Phasenwechsel keine Rolle spielt. Mit Fast PWM können wir die PWM-Werte schnell ausgeben. Schnelle PWM kann nicht verwendet werden, wenn der Phasenwechsel den Betrieb beeinflusst, wie z. B. die Motorsteuerung. In solchen Anwendungen werden daher andere PWM-Modi verwendet. Da wir die Helligkeit der LED steuern, bei der der Phasenwechsel keinen großen Einfluss hat, verwenden wir den Fast PWM-Modus.
Um nun PWM zu generieren, steuern wir den internen Timer, um hochzuzählen, und setzen ihn dann bei einer bestimmten Zählung auf Null zurück, sodass der Timer hochzählt und dann immer wieder auf Null zurückgesetzt wird. Dies legt den Zeitraum fest. Wir haben jetzt die Möglichkeit, einen Impuls zu steuern und einen Impuls bei einer bestimmten Anzahl im Timer einzuschalten, während er ansteigt. Wenn der Zähler auf 0 zurückgeht, schalten Sie den Impuls aus. Dies bietet viel Flexibilität, da Sie jederzeit auf die Anzahl der Timer zugreifen und mit einem einzigen Timer verschiedene Impulse bereitstellen können. Dies ist ideal, wenn Sie mehrere LEDs gleichzeitig steuern möchten. Beginnen wir nun damit, eine LED mit Atmega16 für PWM zu verbinden.
Überprüfen Sie hier alle PWM-bezogenen Projekte.
Erforderliche Komponenten
- Atmega16 AVR Mikrocontroller IC
- 16 MHz Kristalloszillator
- Zwei 100nF Kondensatoren
- Zwei 22pF-Kondensatoren
- Druckknopf
- Überbrückungsdrähte
- Steckbrett
- USBASP v2.0
- 2 LED (beliebige Farbe)
Schaltplan
Wir verwenden OC2 für PWM, dh Pin21 (PD7). Schließen Sie also eine LED am PD7-Pin von Atmega16 an.
Programmierung von Atmega16 für PWM
Das vollständige Programm finden Sie weiter unten. Brennen Sie das Programm in Atmega16 mit JTAG und Atmel Studio und sehen Sie den PWM-Effekt auf der LED. Die Helligkeit nimmt aufgrund des unterschiedlichen Arbeitszyklus der PWM langsam zu und ab. Überprüfen Sie das Video am Ende.
Starten Sie die Programmierung von Atmega16 mit dem Einrichten des Timer2-Registers. Die Timer2-Registerbits sind wie folgt und wir können die Bits entsprechend setzen oder zurücksetzen.
Jetzt werden wir über alle Bits von Timer2 diskutieren, damit wir die gewünschte PWM mit einem geschriebenen Programm erhalten können.
Das Timer2-Register besteht hauptsächlich aus vier Teilen:
FOC2 (Force Output Compare für Timer2): Das FOC2-Bit wird gesetzt, wenn die WGM-Bits einen Nicht-PWM-Modus angeben.
WGM2 (Wave Generation Mode für Timer2): Diese Bits steuern die Zählsequenz des Zählers, die Quelle für den maximalen (TOP) Zählerwert und welche Art der Wellenformgenerierung verwendet werden soll.
COM2 (Compare Output Mode for Timer2): Diese Bits steuern das Ausgabeverhalten. Die vollständige Bitbeschreibung wird unten erklärt.
TCCR2 - = (1 <
Setzen Sie die Bits WGM20 und WGM21 auf HIGH, um den PWM-Schnellmodus zu aktivieren. Das WGM steht für Waveform Generation Mode. Die Auswahlbits sind wie folgt.
WGM00 |
WGM01 |
Timer2-Modus Betrieb |
0 |
0 |
Normaler Modus |
0 |
1 |
CTC (Clear Timer On Compare Match) |
1 |
0 |
PWM, Phase korrekt |
1 |
1 |
Schneller PWM-Modus |
Weitere Informationen zum Wellenformgenerierungsmodus finden Sie im offiziellen Datenblatt von Atmega16.
TCCR2 - = (1 <
Außerdem haben wir keine Vorskalierung verwendet, daher haben wir das Clock-Quellregister auf '001' gesetzt.
Die Taktauswahlbits sind wie folgt:
CS22 |
CS21 |
CS20 |
Beschreibung |
0 |
0 |
0 |
Keine Taktquelle (Timer / Zähler gestoppt) |
0 |
0 |
1 |
clk T2S / (keine Vorskalierung) |
0 |
1 |
0 |
Clk T2S / 8 (vom Prescaler) |
0 |
1 |
1 |
Clk T2S / 32 (vom Prescaler) |
1 |
0 |
0 |
Clk T2S / 64 (vom Prescaler) |
1 |
0 |
1 |
Clk T2S / 128 (vom Prescaler) |
1 |
1 |
0 |
Clk T2S / 256 (vom Prescaler) |
1 |
1 |
1 |
Clk T2S / 1024 (vom Prescaler) |
Auch OC2 wird beim Vergleichsabgleich gelöscht, indem das COM21-Bit als '1' und COM20 als '0' gesetzt wird.
Die Auswahloptionen für den Vergleichsausgabemodus (COM) für den schnellen PWM-Modus sind nachstehend aufgeführt:
COM21 |
COM21 |
Beschreibung |
0 |
0 |
Normaler Portbetrieb, OC2 getrennt. |
0 |
1 |
Reserviert |
1 |
0 |
Löschen Sie OC2 beim Vergleichen der Übereinstimmung und setzen Sie OC2 auf TOP |
1 |
1 |
Stellen Sie OC2 auf Vergleichsübereinstimmung ein und löschen Sie OC2 oben |
Erhöhen Sie den Arbeitszyklus von 0% auf 100%, damit die Helligkeit mit der Zeit zunimmt. Nehmen Sie den Wert von 0-255 und senden Sie ihn an den OCR2-Pin.
für (Einschaltdauer = 0; Einschaltdauer <255; Einschaltdauer ++) // 0 bis maximaler Einschaltdauer { OCR2 = Einschaltdauer; // langsam die LED-Helligkeit erhöhen _delay_ms (10); }}
Verringern Sie in ähnlicher Weise den Arbeitszyklus von 100% auf 0%, um die Helligkeit der LED allmählich zu verringern.
für (Duty = 0; Duty> 255; Duty--) // max bis 0 Duty Cycle { OCR2 = Duty; // langsam die LED-Helligkeit verringern _delay_ms (10); }}
Damit ist unser Tutorial zur Verwendung von PWM in Atmega16 / 32 abgeschlossen.