Pulsweitenmodulation. Software-PWM (PWM) Digitales PWM-Shaping mit 16 Bit

PWM- Pulsweitenmodulation
PWM- Pulsweitenmodulation (d. h. das Gleiche wie PWM)

Was ist PWM und warum wird es benötigt?

Warum benötigen Sie Software-PWM?

Dann gibt es am AVR (Atmega) selbst 1-2 Shim-Kanäle, was oft nicht ausreicht, um den Bedarf zu decken.

Nehmen wir an, wir haben 3 (drei) LEDs und wir möchten die Helligkeit jeder einzelnen LED einzeln steuern. Die eingebauten PWM-Timer-Kanäle reichen nicht aus. Und im Allgemeinen möchten wir vielleicht immer noch eine besondere Kontrolle über jeden von ihnen ausüben. Deshalb legen wir sie auf normale Beine (im PORTC-Beispiel die Beine 3,4,5) und steuern sie programmgesteuert.

Weitere Informationen zur Verbindung: http://www.radiokot.ru/start/mcu_fpga/avr/05/ und im Datenblatt zum Controller.

Berechnung eines Widerstands für eine LED:

Leistung: 5V. Der Spannungsabfall an der LED kann als 1,5 V angesehen werden. Der Strom an der LED sollte nicht mehr als 20 mA betragen (manche werden argumentieren, dass 15 mA benötigt werden, aber ich mag es heller).
Nach dem Ohmschen Gesetz: I=U/R, R=U/I=(5-1,5)/0,02=175 Ohm. Ich habe Widerstände R1, R2 und R2 installiert – 220 Ohm.

Algorithmus

Die einfachste Option ist ein ewiger Kreislauf. Die Option mit Unterbrechung wird später (unten) vorgestellt. Schauen wir uns nun ein einfaches Beispiel an, um das Wesentliche zu verstehen.

Erstens müssen Sie zwei Dinge festlegen: Mit welcher Frequenz die LEDs blinken, damit dieses Blinken nicht sichtbar ist, und zweitens, wie viele Helligkeitsstufen die LED haben kann.

In Bezug auf die Helligkeitsstufen sei es 256. 0 – vollständig aus, 255 – vollständig an (d. h. der PWM-Kanal ist die ganze Zeit im logischen Zustand Eins, d. h. Arbeitszyklus = 100 %).

Allerdings werde ich Sie jetzt ein wenig verwirren.

Der Punkt ist, dass wir das PLUS der Diode im Stromkreis haben, das direkt an die Stromversorgung angeschlossen ist, und das Minus durch den Widerstand zum Zweig geht (wo der Widerstand ist, spielt keine Rolle, wichtig ist, was zum MK-Zweig ist). . Daher leuchtet die LED, wenn der Pegel am MK-Zweig niedrig ist, d. h. Null, d.h. das Bein innerhalb des MK wird auf GND geworfen, d.h. auf den Boden. Das bedeutet, dass die 0er und 1er im PWM tatsächlich invertiert werden müssen. Diese. Je länger das Signal Nullen im Vergleich zu Einsen enthält, desto heller wird die Diode.

Es gibt also 256 Helligkeitsstufen.

Von was für einem Blinzeln reden wir? Die Quintessenz ist, dass wir, wenn wir ein PWM-Signal an viele, viele Dioden anlegen müssen und dies nacheinander an jede anlegen müssen, nach der Ausgabe des Signals an die erste Diode zur Ausgabe des Signals an diese in einer solchen Zeit zurückkehren müssen, dass:

  1. Zeit haben, ein vollwertiges PWM-Signal zu erzeugen,
  2. nicht mehr als 1/25 Sekunde vergangen ist, sonst blinkt die LED merklich,
  3. Es gab keine wahrnehmbaren Pausen bei der PWM-Erzeugung zwischen Segmenten des PWM-Signals, d. h. damit das PWM-Signal NICHT VERZERRT WIRD.

Hier ist ein Beispiel für eine PWM-Signalverzerrung:

Wir werden das alles im Hinterkopf behalten, aber eigentlich ist es für uns hier nicht wichtig, da wir einen ganz einfachen Smooth-Blinker haben werden und dieser nur die Helligkeit ändert, d.h. Es wird viel Zeit zur Verfügung stehen, und die Aufgabe ist so einfach, dass die Generierung des PWM-Signals keine Zeit verschlingt.

Und hier ist der Quellcode (für AVR Studio, also gcc):

#define F_CPU 1000000UL #include #enthalten #define LEDS_N 3 #define LEDS_PORT PORTC #define LEDS_DDR DDRC int main() ( register unsigned char scancounter=0; register unsigned char i; register unsigned char glow=0; unsigned char level=(0,16,32); // In welchem ​​Teil aller Zyklen die LED eingeschaltet ist unsigned char ledbits=(0b00001000,0b00010000, 0b00100000); // C5-Richtung festlegen - Ausgabe LEDS_DDR=0b11111111; // alle LEDs ausschalten LEDS_PORT=0b11111111; for(;;)( // Haupt-PWM-Teil für (i=0;i =level[i])( // aus – Pin LEDS_PORT einschalten|=ledbits[i]; ) else ( // ein – Pin LEDS_PORT ausschalten&=~ledbits[i]; ) ) scancounter++; // LED-Helligkeitsänderung if (!scancounter)( for (i=0;i 128)level[i]=0; ) ) ) )

Wie das Programm funktioniert

Es gibt einen Zeitintervallzähler – Scancount. Der Maximalwert dieses Zählers ist die Anzahl der Helligkeitsstufen minus 1. Mit jeder Umdrehung des Zyklus erhöht er sich um eins, überschreitet dann 255 und wird wieder 0. Bei jeder Umdrehung des Zyklus wird für jede LED ein Signal gesetzt. Wenn der Zähler kleiner oder gleich dem Helligkeitswert ist, schalten Sie die Diode aus. Wenn der Zähler unter dem für die Diode angegebenen Helligkeitswert liegt, schalten Sie die Diode ein. Und wie jeder Zyklus. Wenn die Helligkeit beispielsweise 0 beträgt, ist der Zähler immer gleich oder größer als Null und die Diode ist immer ausgeschaltet. Beträgt die Helligkeitsstufe 255, dann wird der Zähler bei 254 von 255 Umdrehungen des Zählers unter diesem Wert liegen und mit nahezu voller Intensität brennen. Wenn die Helligkeit auf 50 eingestellt ist, ist die Diode für die ersten 50 Umdrehungen des Zyklus eingeschaltet und für die restlichen 206 Umdrehungen ausgeschaltet, d. h. Es werden 50/256 des maximalen Stroms zugeführt.

Unten im Programm steuern wir die Helligkeit der Diode, damit es eine Art Demonstration gibt. Bei jedem Zählerüberlauf wird 1 zur Helligkeit aller Dioden addiert, wenn die Helligkeit jedoch mehr als 128 erreicht, wird sie auf 0 zurückgesetzt. Wenn diese Prüfung nicht vorhanden war, wird sie im Allgemeinen nach Erreichen des Helligkeitswerts von 255 aktiviert hätte auf Null zurückgesetzt, aber die Erfahrung zeigt, dass sie ab einer Helligkeit von 128 so unmerklich ansteigt, dass wir davon ausgehen können, dass sie bei einem Wert von 128 bereits fast das Maximum erreicht. Und damit der resultierende Effekt dynamischer ist, wurde diese Prüfung eingeführt.

Sie sollten auch wissen, dass die Abhängigkeit der Helligkeit vom Strom bei LEDs NICHT LINEAR ist. Diese. 128 ist nicht doppelt so dunkel wie 255 und nicht doppelt so hell wie 64.

Wie lange es dauert, den gesamten Zyklus mit allen Dioden durchzudrehen, interessiert uns hier wenig, da klar ist, dass es bei einer Reinheit von 1 MHz (dort arbeitet mein MK) schnell genug ist, dass das Auge es nicht sieht kein Flackern sehen.

Montagefoto:


Klicken Sie auf das Foto, um es zu vergrößern

Und hier ist ein Video der Arbeit: (avi, divx, 3MB)
Das Video zeigt den Helligkeitsübergangsprozess nicht gut, da die Kameramatrix nicht die gleiche visuelle Trägheit wie das menschliche Auge hat, aber im Allgemeinen ist der Prozess sichtbar.

Betrachtet wurde ein Hardware-PWM-Generator eines Mikrocontrollers. Alles daran ist gut, aber es gibt ein paar „Aber“:
- Hardware-PWM ist streng an bestimmte Pins des MK gebunden und kann nicht einem anderen Zweig zugewiesen werden
- Die Anzahl der Hardware-PWM-Kanäle ist begrenzt, ihre Anzahl hängt vom MK-Modell ab
- Die Bittiefe der Hardware-PWM kann nicht geändert werden

In diesem Fall kann eine Softwaremethode zum Erhalten eines PWM-Signals nützlich sein. Dies ist nicht schwierig, stellt jedoch hohe Anforderungen an die Betriebsfrequenz des Mikrocontrollers und nimmt im Gegensatz zu Hardware, die vom Hauptprogramm unbemerkt arbeitet, ziemlich viel Prozessorzeit in Anspruch. Da es jedoch in der Regel für LED-Blinker verwendet wird, ist dies nicht so wichtig.

Wir müssen einen bestimmten MK-Zweig zu Beginn der PWM-Signalperiode auf 1 oder 0 setzen (je nachdem, welche Art von Signal wir benötigen) und dann, wenn die angegebene Impulsdauer erreicht ist, den Wert des Zweigs invertieren. Der bequemste Weg, dies zu tun, ist ein Überlauf-Interrupt. Dies ist, was wir tun werden, wir werden den T0-Timer-Überlauf-Interrupt verwenden. Wir werden eine RGB-LED ansteuern, um die Variablennamen und Makrodefinitionen für Ports lesbar zu machen.

/*Block definieren************************************************** ******** **************************************** ** */ #ROTEN PORTB.0 definieren #GRÜNEN PORTB.1 definieren #BLAUEN PORTB.2 definieren /******************************* ******** **************************************** ** ********************************/ /*Änderungen ankündigen********** ** ************************************ ************ *********************/ unsigned char red=255, green, blue; //Variablen zum Ändern des PWM-Tastverhältnisses im Programm unsigned char red_b, green_b, blue_b; //Variablen zum Puffern von PWM-Arbeitszykluswerten unsigned char count; //Variable – Interrupt-Handler-Aufrufzähler unsigned char temp=1; //Variable für den Betrieb des Farbwechselalgorithmus /************************************** ********** **************************************** **********************/

Wenn ein Interrupt auftritt, müssen Sie den Programmzähler um 1 erhöhen und prüfen, ob ein Überlauf vorliegt. Wenn der Timer voll ist, müssen Sie an alle Pins, an denen PWM ausgegeben wird, eine logische 1 ausgeben und die Variablen außerdem in einem Puffer speichern. Variablen werden im Puffer gespeichert, sodass die Arbeitszyklusdaten einmal zu Beginn jeder Periode aktualisiert werden. Dadurch wird ein unvorhersehbares Verhalten des Ausgangs vermieden. Als nächstes vergleichen wir den Zählerwert mit dem Wert des Duty-Cycle-Puffers jedes Kanals. Wenn der Zähler diesen Wert erreicht hat, geben wir eine logische 0 an den entsprechenden MK-Zweig aus.

/*Interrupt-Handler********************************************* ******** ****************************************** *******/ interrupt void timer0_ovf_isr( void) ( count++; if (count == 0)( //wenn der Zähler übergelaufen ist und den Wert 0 angenommen hat red_b = red; //Speichern des Wertes im Puffer green_b = green; blue_b = blue; RED =1; //setze die entsprechenden Zweige hinter PWM auf logisch 1 GREEN =1; BLUE =1; ) if (red_b == count) ( RED = 0;) //bei Erreichen des angegebenen Arbeitszyklus, logische 0 an den MK-Pin ausgeben, wenn (green_b == count) (GREEN = 0 ;) if (blue_b == count) ( BLUE = 0;) ) /************ ********************* ******************************* *********** ******************************/

Um die Arbeit zu demonstrieren, zeigen wir auf der LED einen sanften Farbwechsel entsprechend den Farben des Regenbogens (Jeder Jäger möchte wissen, wo der Fasan sitzt). Dazu verwenden wir einen einfachen Algorithmus, den wir in einer Endlosschleife ausführen.

/*Hauptfunktion********************************************** **** ************************************ */ void main(void ) ( PORTB=0x08; //den Port konfigurieren DDRB=0x07; TCCR0=0x01; //den Timer einrichten TCNT0=0x00; TIMSK=0x01; //die Generierung eines Interrupts bei Timer-T0-Überlauf zulassen #asm("sei ") //Interrupts global aktivieren /*Endlosschleife******************************************* **************************************** *******/ während ( 1) ( if (temp==1) (if (green< 255) green += 1; else temp = 2;} if (temp==2) {if (red >0) rot -= 1; else temp = 3;) if (temp==3) (if (blue< 255) blue += 1; else temp = 4;} if (temp==4) {if (green >0) grün -= 1; else temp = 5;) if (temp==5) (if (red< 255) red += 1; else temp = 6;} if (temp==6) {if (blue >0) blau -= 1; sonst temp = 1;) delay_ms(2); ); /************************************************ * ************************************ *********** ***/ ) /*********************************** ************ ************************** ********************** ********/

PWM (PWM) – Pulsweitenmodulation. Es besteht kein Grund, sich von diesem Begriff einschüchtern zu lassen. Dies ist lediglich eine Möglichkeit, die Spannung zu regulieren. Angenommen, die Hintergrundbeleuchtung des Monitors ist zu hell. Sie ändern die Helligkeit. Aber was passiert in diesem Moment wirklich?

Stellen wir uns vor, dass die Hintergrundbeleuchtung des Monitors aus mehreren LEDs besteht. Das Ganze wird mit konstanter Spannung betrieben. Wir mussten jedoch die Helligkeit des Monitors reduzieren. Es ist logisch zu antworten, dass dies mit einem variablen Widerstand möglich ist. Bei niedrigen Strömen ist es möglich. Bei größeren Exemplaren wird der Widerstand jedoch sehr heiß. Abmessungen, Verluste und Energieverbrauch werden deutlich zunehmen.

Daher wurde eine Transistorschaltung entwickelt, die eine Gleichspannung in eine pulsierende Spannung umwandelt. Es stellt sich heraus, dass die pulsierende Spannung je nach Füllung der Periode einer konstanten Spannung entspricht. Diese. Wenn während eines Zeitraums die Spannung 50 % der Zeit eingeschaltet und 50 % ausgeschaltet wäre, dann wäre die äquivalente Gleichspannung gleich 50 % der Nennspannung.

In Zahlen ist es einfach: Es gab 5 V Gleichspannung, wir haben sie über PWM betrieben – wir bekamen 2,5 V. Wenn das Tastverhältnis 75 % beträgt, beträgt die äquivalente Gleichspannung 3,75 V. Ich denke, die Idee ist klar.

Kommen wir nun zur praktischen Umsetzung. Mithilfe eines Mikrocontrollers ändern wir die Füllung von 0 auf 100 % und dann von 100 % auf Null. Das Endergebnis sollte so aussehen:

Zur Verdeutlichung schließen wir eine LED an. Dadurch schaltet sich die LED reibungslos ein und aus.

Lassen Sie uns unser Lieblings-CodeVision starten. Wir erstellen ein Projekt mit dem Assistenten. Wählen Sie im Abschnitt „Timer“ Timer 2 aus und legen Sie die Einstellungen wie in der Abbildung fest.

Wenn Sie versuchen, ein Projekt zu generieren, flucht das Programm möglicherweise. Wir stimmen zu, denn wir haben Zweig 3 von Port B, der als Ausgang konfiguriert werden sollte.

Wir bringen den Code in die folgende Form:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #enthalten void main(void) (PORTB= 0x00; DDRB= 0x08; // Initialisierung von Timer/Zähler 2 ASSR= 0x00 ; TCCR2= 0x6C ; TCNT2= 0x00 ; OCR2= 0x00 ; TIMSK= 0x00 ; während (1) (); )

#enthalten void main(void) ( PORTB=0x00; DDRB=0x08; // Initialisierung von Timer/Zähler 2 ASSR=0x00; TCCR2=0x6C; TCNT2=0x00; OCR2=0x00; TIMSK=0x00; while (1) ( ); )

Achten wir auf die Zeile OCR2=0x00; Diese Variable ist genau für die Menge der Pulsfüllung verantwortlich. Dieser Wert ändert sich von 0 auf 255(0xFF), d.h. 255 entspricht 100 % Füllung (Konstantstrom). Wenn Sie also 30 % Füllung benötigen (255/100)*30=77. Als nächstes konvertieren wir 77 in Hexadezimalsystem OCR2=0x4D;

TCCR2=0x6C; Durch Ändern dieses Werts können wir die PWM-Frequenz anpassen. Die PWM-Betriebsfrequenz ist ein Vielfaches der Frequenz, mit der der Mikrocontroller arbeitet. Das Projekt verwendete eine Mikrocontroller-Frequenz von 8 MHz, eine PWM-Frequenz von 125 kHz wurde verwendet, daher beträgt der Teiler 8/125 = 64
0x6C im binären Zahlensystem 1101100, öffnen Sie das Datenblatt auf Atmega8 und sehen Sie sich die Beschreibung des TCCR2-Registers an, hier ist also 1101 100 Die letzten Ziffern lauten 100 und sind für die Auswahl der PWM-Betriebsfrequenz verantwortlich

Kommen wir gleich zum Programm:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #enthalten #enthalten void main(void ) ( PORTB= 0x00 ; DDRB= 0x08 ; ASSR= 0x00 ; TCCR2= 0x6C ; TCNT2= 0x00 ; OCR2= 0x00 ; TIMSK= 0x00 ; while (1 ) ( while (OCR2< 0xff ) { OCR2= OCR2+ 0x01 ; delay_ms(5 ) ; } while (OCR2>0x00 ) ( OCR2= OCR2- 0x01 ; delay_ms(5 ) ; ) ); )

#enthalten #enthalten void main(void) ( PORTB=0x00; DDRB=0x08; ASSR=0x00; TCCR2=0x6C; TCNT2=0x00; OCR2=0x00; TIMSK=0x00; while (1) ( while(OCR2<0xff) { OCR2=OCR2+0x01; delay_ms(5); } while(OCR2>0x00) ( OCR2=OCR2-0x01; delay_ms(5); ) ); )

Der Code ist unglaublich einfach: Zuerst erhöhen wir in einer Schleife die Füllung von 0 auf 255(ff), dann verringern wir sie von 255 auf 0.
Und zum Schluss noch ein Video, wie das Ganze funktionieren soll. Viel Erfolg beim Studium)

Abb.1

T = T0+T1. Pulsperiode

T = 1/F

S = T/T1

Auslastungsgrad

Füllfaktor D=1/S oder so D = T1/T*100 %

Digitale Geräte, beispielsweise ein Mikrocontroller, können nur mit zwei Signalpegeln arbeiten, d. h. Null und Eins oder aus und an. Somit können Sie damit problemlos den Laststatus überwachen, z. B. eine LED ein- oder ausschalten. Sie können damit auch jedes elektrische Gerät mit den entsprechenden Treibern (Transistor, Triac, Relais usw.) steuern. Manchmal ist jedoch mehr erforderlich als nur das „Einschalten“ und „Ausschalten“ des Geräts. Wenn Sie also die Helligkeit einer LED (oder Lampe) oder die Drehzahl eines Gleichstrommotors steuern möchten, dann digitale Signale Ich kann es einfach nicht. Diese Situation kommt in der Digitaltechnik sehr häufig vor und wird aufgerufen Pulsweitenmodulation (PWM).

Fast alle modernen Mikrocontroller verfügen über spezielle Hardware zur Erzeugung eines PWM-Signals. In diesem Tutorial lernen wir die Grundlagen der PWM-Technik kennen und erfahren später, wie man PWM mit AVR-Mikrocontrollern implementiert.

Digitale Geräte wie ein Mikrocontroller können auf den Ausgangsleitungen nur zwei Pegel erzeugen, hoch = 5 V und niedrig = 0 V. Aber was ist, wenn wir 2,5 oder 3,1 oder eine beliebige Spannung zwischen 0 und 5 V erhalten möchten? Anstatt eine konstante Gleichspannung am Ausgang zu erzeugen, erzeugen wir dazu eine Rechteckwelle mit hohen = 5 V- und niedrigen = 0 V-Pegeln (siehe Abbildung 1).

Abb.1

Die Abbildung zeigt, dass das Signal für einige Zeit abwechselnd auf niedrigem und hohem Pegel bleibt. T0 – niedriger Pegel, T1 – hoher Pegel. Die Signalperiode ist gleich T = T0+T1. Pulsperiode- Dies ist der Zeitabstand zwischen zwei charakteristischen Punkten zweier benachbarter Impulse. Typischerweise wird die Periode zwischen zwei Anstiegen oder Abfällen benachbarter Impulse gemessen und mit dem Großbuchstaben T bezeichnet.

Die Pulswiederholungsperiode steht in direktem Zusammenhang mit der Frequenz der Pulssequenz und kann mit der Formel berechnet werden: T = 1/F

Wenn die Impulslänge T1 genau der halben Periode T entspricht, wird ein solches Signal oft als „Rechteckwelle“ bezeichnet.

Das Tastverhältnis von Impulsen ist das Verhältnis der Impulswiederholungsperiode zu ihrer Dauer und wird mit dem Buchstaben S bezeichnet: S = T/T1

Der Arbeitsfaktor ist eine dimensionslose Größe und hat keine Maßeinheit, kann aber als Prozentsatz ausgedrückt werden. Der Begriff kommt häufig in englischen Texten vor Auslastungsgrad Dies ist der sogenannte Duty-Cycle- oder PWM-Tastverhältniswert. Das Tastverhältnis D ist der Kehrwert des Tastverhältnisses.

Füllfaktor wird üblicherweise als Prozentsatz ausgedrückt und nach folgender Formel berechnet: D=1/S oder so D = T1/T*100 %

In der Abbildung oben (Abb. 1) können Sie sehen, dass T1 = T0, dies entspricht der halben Zeitspanne. Das PWM-Tastverhältnis beträgt also 50 %. Wenn die Frequenz solcher Impulse hoch genug ist (z. B. 5000 Hz), erhalten wir die Hälfte von 5 V, d. h. 2,5V. Wenn also der Ausgang des Controllers an den Motor gekoppelt ist (mit geeigneten Treibern), läuft dieser mit 50 % seiner vollen Geschwindigkeit. Die PWM-Technik nutzt diese Tatsache, um eine beliebige Spannung zwischen zwei Pegeln (z. B. zwischen 0-12 V) zu erzeugen. Der Trick besteht darin, dass wir bei einer Änderung des Tastverhältnisses zwischen 0 und 100 % den gleichen Prozentsatz der Eingangsspannung am Ausgang erhalten. Nachfolgend finden Sie einige Beispiele für PWM-Signale mit unterschiedlichen Arbeitszyklen.

Wenn Sie am Ausgang einen R/C-Filter installieren, erhalten Sie einen reinen Gleichstromsignalpegel anstelle von Rechteckwellen. Bei Bürstenmotoren oder zur Steuerung der LED-Helligkeit ist dies jedoch nicht erforderlich. Dazu können Sie ein PWM-Signal direkt an den Treiber (z. B. einen Bipolartransistor, MOSFET usw.) anlegen.

Im 16-Bit-Betriebsmodus. Unter dem Timer versteht man seinen Zählalgorithmus und das damit verbundene Verhalten des Impulsformerausgangs, der durch eine Kombination von Bits bestimmt wird, die den Timer-Betriebsmodus (WGMn3-0) und den Ausgangssignal-Erzeugungsmodus (COMnx1:0) festlegen. . In diesem Fall haben die Bits zum Einstellen des Ausgangssignalerzeugungsmodus keinen Einfluss auf den Zählalgorithmus, weil Der Zählalgorithmus hängt nur vom Zustand der Bits zur Einstellung der Timer-Betriebsart ab. In den PWM-Modi ermöglichen Ihnen die COMnx1:0-Bits das Aktivieren/Deaktivieren der Invertierung des generierten PWM-Ausgangs (d. h. Wählen Sie „PWM mit Invertierung“ oder „PWM ohne Invertierung“). Bei Nicht-PWM-Modi bestimmen die COMnx1:0-Bits, welche Aktion bei einer Übereinstimmung ausgeführt werden soll: Zurücksetzen, Setzen oder Invertieren des Ausgangs (siehe auch „Output Signal Conditioning Block“ und „16-Bit-Timer-Counter-Timing-Diagramme“). .

Normale Operation

Der einfachste Betriebsmodus ist der Normalmodus (WGMn3-0 = 0b0000). IN diesen Modus Der Zähler arbeitet als summierender (inkrementierender) Zähler und wird nicht zurückgesetzt. Der Zähler läuft beim Durchlaufen der maximalen 16 Bit über. Wert (0xFFFF) auf die untere Zählgrenze (0x0000). Während des normalen Betriebs wird das Timer-Zähler-Überlaufflag TOVn im selben Taktzyklus gesetzt, wenn TCNTn Null erreicht.

Tatsächlich ist das TOVn-Überlaufflag das 17. Bit des Timer-Zählers, außer dass es nur gesetzt und nicht gelöscht wird. Diese Eigenschaft kann jedoch programmgesteuert verwendet werden, um die Auflösung des Timers zu erhöhen, indem ein Timer-Überlauf-Interrupt verwendet wird, bei dem das TOVn-Flag automatisch zurückgesetzt wird. Für den Normalbetrieb gibt es keine besonderen Situationen, so dass jederzeit ein neuer Zählerstand erfasst werden kann.

Im normalen Modus können Sie den Capture-Block verwenden. Es muss jedoch sichergestellt werden, dass der maximale Zeitabstand zwischen dem Auftreten externer Ereignisse die Zählerüberlaufperiode nicht überschreitet. Wenn diese Bedingung nicht erfüllt ist, muss ein Timer-Counter-Overflow-Interrupt oder ein Prescaler verwendet werden.

Mit dem Vergleichsbaustein können Interrupts erzeugt werden. Es wird nicht empfohlen, den OCnx-Ausgang zur Signalerzeugung im Normalbetrieb zu verwenden, weil In diesem Fall wird ein erheblicher Teil der Prozessorzeit aufgewendet.

Match-Timer-Reset-Modus (CTC)

Im CTC-Modus (WGM01, WGM00 =0b10) wird das OCR0-Register zum Einstellen der Zählerauflösung verwendet. Wenn der CTC-Modus eingestellt ist und der Zählerwert (TCNT0) mit dem Wert des OCR0-Registers übereinstimmt, wird der Zähler auf Null zurückgesetzt (TCNT0=0). Somit gibt OCR0 den höchsten Zählerstand des Zählers und damit seine Auflösung an. Dieser Modus bietet einen größeren Einstellbereich für die Frequenz der erzeugten Rechteckimpulse. Es vereinfacht auch die Bedienung des externen Ereigniszählers.

Beim Zurücksetzen des Timers im Match-Modus (WGMn3-0 = 0b0100 oder 0b1100) wird die Timerauflösung durch die Register OCRnA oder ICRn festgelegt. Im CTC-Modus wird der Zähler (TCNTn) zurückgesetzt, wenn sein Wert mit dem Wert des OCRnA-Registers (WGMn3-0 = 0b0100) oder ICRn (WGMn3-0 = 0b1100) übereinstimmt. Der Wert des OCRnA- oder ICRn-Registers bestimmt die obere Zählgrenze und damit die Auflösung des Timers. Dieser Modus bietet einen größeren Einstellbereich für die Frequenz der erzeugten Rechteckimpulse. Es vereinfacht auch die Bedienung des externen Ereigniszählers. Das Zeitdiagramm des Timer-Betriebs im CTC-Modus ist in Abbildung 1 dargestellt. Der Zähler (TCNTn) erhöht seinen Zustand, bis eine Übereinstimmung mit dem Wert von OCRnA oder ICRn auftritt, und dann wird der Zähler (TCNTn) zurückgesetzt.

Abbildung 1 – Zeitdiagramm für den STS-Modus

Wenn die obere Zählgrenze erreicht ist, kann ein Interrupt mithilfe der OCFnA- oder ICFn-Flags generiert werden, die den Registern entsprechen, die zum Festlegen der oberen Zählgrenze verwendet werden. Wenn der Interrupt aktiviert ist, kann die Interrupt-Routine verwendet werden, um die obere Zählgrenze zu aktualisieren. Wenn der Zähler jedoch ohne Vorskalierung oder mit einem kleinen Vorskalierungswert arbeitet, muss die Einstellung des oberen Zählwerts nahe am unteren Zählgrenzwert jedoch mit äußerster Vorsicht erfolgen, weil Im CTC-Modus erfolgt keine Doppelpufferung. Wenn der in OCRnA oder ICRn geschriebene Wert kleiner als der aktuelle Wert von TCNTn ist, wird der Zähler zurückgesetzt, wenn die Übereinstimmungsbedingung eintritt, wenn er den Maximalwert (0xFFFF) erreicht, und geht dann zu der Ausgangszustand 0x0000 und erreicht den neuen OCRnA- oder ICRn-Wert. In vielen Fällen ist diese Situation unerwünscht. Eine Alternative ist der schnelle PWM-Modus, bei dem das OCRnA-Register die obere Zählgrenze bestimmt (WGMn3-0 = 0b1111), weil in diesem Fall ist OCRnA doppelt gepuffert.

Um im CTC-Modus ein Signal zu erzeugen, kann der OCnA-Ausgang verwendet werden, um den Logikpegel bei jeder Übereinstimmung zu ändern, indem der Schaltmodus (COMnA1, COMnA0 = 0b01) eingestellt wird. Der OCnA-Wert ist nur dann am Port-Pin vorhanden, wenn diese Schlussfolgerung Ausgaberichtung angegeben ist. Die maximale Frequenz des erzeugten Signals beträgt fOC0 = fclk_I/O/2, wenn OCRnA = 0x0000. Für andere OCRn-Werte kann die Frequenz des erzeugten Signals durch die Formel bestimmt werden:

Dabei gibt die Variable N den Teilungsfaktor des Vorteilers an (1, 8, 32, 64, 128, 256 oder 1024).

Wie im Normalbetrieb wird das TOV0-Flag im gleichen Timer-Tick gesetzt, wenn sich sein Wert von 0xFFFF auf 0x0000 ändert.

Schneller PWM-Modus

Schneller Modus Pulsweitenmodulation(PWM) (WGMn3-0 = 0b0101, 0b0110, 0b0111, 0b1110, 0b1111) dient zur Erzeugung von PWM-Impulsen mit erhöhter Frequenz. Im Gegensatz zu anderen Betriebsarten verwendet diese Betriebsart einen unidirektionalen Zählerbetrieb. Gezählt wird in der Richtung von der unteren zur oberen Zählgrenze.

Wenn ein nicht invertierender Ausgabemodus eingestellt ist, wird bei Übereinstimmung von TCNTn und OCRnx das OCnx-Signal gesetzt und an der oberen Zählgrenze zurückgesetzt. Wenn der invertierende Modus angegeben ist, wird der OCnx-Ausgang bei einer Übereinstimmung zurückgesetzt und auf die obere Zählgrenze gesetzt. Aufgrund der unidirektionalen Zählung ist die Betriebsfrequenz für diesen Modus doppelt so hoch im Vergleich zum PWM-Modus mit Phasenkorrektur, bei dem bidirektionale Zählung verwendet wird. Die Fähigkeit, hochfrequente PWM-Signale zu erzeugen, macht die Verwendung dieses Modus für Aufgaben der Leistungsstabilisierung, Gleichrichtung und Digital-Analog-Umwandlung nützlich. Die hohe Frequenz ermöglicht gleichzeitig den Einsatz externe Elemente physikalisch klein (Induktivitäten, Kondensatoren), wodurch die Gesamtkosten des Systems gesenkt werden.

Die PWM-Auflösung kann auf 8, 9 oder 10 Bit festgelegt oder durch das ICRn- oder OCRnA-Register eingestellt werden, jedoch nicht weniger als 2 Bit (ICRn oder OCRnA = 0x0003) und nicht mehr als 16 Bit (ICRn oder OCRnA = 0xFFFF). Die PWM-Auflösung bei einem gegebenen oberen Grenzwert (UL) berechnet sich wie folgt:

Im schnellen PWM-Modus wird der Zähler erhöht, bis sein Wert mit einem der festen Werte 0x00FF, 0x01FF oder 0x03FF übereinstimmt (wenn WGMn3:0 = 0b0101, 0b0110 bzw. 0b0111), der Wert in ICRn (wenn WGMn3:0 = 0b1110) oder den Wert in OCRnA (wenn WGMn3:0 = 0b1111) und wird dann beim nächsten Timer-Takt zurückgesetzt. Das Zeitdiagramm für den schnellen PWM-Modus ist in Abbildung 2 dargestellt. Die Abbildung zeigt den schnellen PWM-Modus, wenn das OCRnA- oder ICRn-Register zum Festlegen der Obergrenze verwendet wird. Der TCNTn-Wert im Zeitdiagramm wird als Funktionsgraph dargestellt, um die unidirektionale Zählung zu veranschaulichen. Das Diagramm zeigt sowohl invertierte als auch nicht invertierte PWM-Ausgänge. Eine kurze horizontale Linie zeigt Punkte im TCNTn-Diagramm, an denen die OCRnx- und TCNTnx-Werte zusammenfallen. Das OCnx-Interrupt-Flag wird gesetzt, wenn eine Übereinstimmung auftritt.

Abbildung 2 – Zeitdiagramm für den schnellen PWM-Modus

Das Timer-Counter Overflow (TOVn)-Flag wird immer dann gesetzt, wenn der Zähler seinen oberen Grenzwert erreicht. Darüber hinaus kann derselbe Taktimpuls zusammen mit dem TOVn-Flag die OCnA- oder ICFn-Flags setzen, wenn das OCRnA- bzw. ICRn-Register zum Festlegen der Obergrenze verwendet wird. Wenn einer dieser Interrupts aktiviert ist, kann die Interrupt-Routine die obere Zählgrenze und die Vergleichsschwellenwerte aktualisieren.

Ändert sich der Wert der oberen Zählgrenze, so muss die Bedingung erfüllt sein, dass der neu geschriebene obere Grenzwert größer oder gleich den Werten in allen Vergleichsschwellenwertregistern ist. Andernfalls kommt es nie zu einer Übereinstimmung zwischen TCNTn und OCRnx. Beachten Sie, dass bei Verwendung fester oberer Grenzwerte nicht verwendete Bits beim Schreiben in die OCRnx-Register auf 0 maskiert werden.

Der ICRn-Registeränderungsmechanismus unterscheidet sich von OCRnA darin, dass er zum Festlegen der Obergrenze verwendet wird. Das ICRn-Register ist nicht doppelt gepuffert. Das heißt, wenn ein kleiner Wert in ICRn geschrieben wird, während der Zähler mit geringer oder keiner Vorskalierung läuft, besteht die Gefahr, dass ein Wert in das ICRn-Register geschrieben wird, der kleiner als der aktuelle Wert von TCNTn ist. Infolgedessen wird in dieser Situation das Spiel an der Spitze der Zählung verpasst. In diesem Fall erreicht der Zähler seinen Maximalwert (0xFFFF), startet bei 0x0000 neu und generiert erst dann einen Match. Das OCRnA-Register enthält ein Doppelpufferungsschema, sodass es jederzeit geändert werden kann.

class="eliadunit">

Wenn an die Adresse OCRnA geschrieben wird, wird der Wert tatsächlich im OCRnA-Pufferregister abgelegt. Wenn eine Übereinstimmung zwischen TCNTn und dem oberen Ende der Zählung auftritt, ist der nächste Taktzyklus des Timers das Kopieren des Pufferregisters in das Vergleichsschwellenwertregister OCRnA. Das Register wird im selben Taktzyklus aktualisiert, in dem TCNTn zurückgesetzt und das TOVn-Flag gesetzt wird.

Es wird empfohlen, das ICRn-Register zum Festlegen der Obergrenze zu verwenden, wenn die obere Zählgrenze eine Konstante ist. In diesem Fall wird auch das OCRnA-Register freigegeben, um am OCnA-Ausgang ein PWM-Signal zu erzeugen. Ändert sich die PWM-Frequenz jedoch dynamisch (durch Änderung der Obergrenze), dann ist es in diesem Fall vorteilhafter, das OCRnA-Register zum Einstellen der Obergrenze zu verwenden, weil es unterstützt doppelte Pufferung.

Im schnellen PWM-Modus ermöglichen Ihnen die Vergleichseinheiten die Erzeugung von PWM-Signalen an den OCnx-Pins. Wenn COMnx1:0 = 0b10, dann ist PWM ohne Ausgangsinvertierung eingestellt, und wenn COMnx1:0 = 0b11, dann ist der PWM-Modus mit Ausgangsinvertierung eingestellt (siehe Tabelle 59). Der tatsächliche OCnx-Wert kann am Port-Pin beobachtet werden, wenn dieser auf Ausgaberichtung (DDR_OCnx) eingestellt ist. Das PWM-Signal wird durch Setzen (Zurücksetzen) des OCnx-Registers erzeugt, wenn eine Übereinstimmung zwischen OCRnx und TCNTn auftritt, und durch Zurücksetzen (Setzen) des OCnx-Registers zusammen mit dem Zurücksetzen des Zählers (Wechsel von der Obergrenze zur Untergrenze).

Die PWM-Frequenz des Ausgangssignals für einen gegebenen oberen Grenzwert (UL) wird durch den Ausdruck bestimmt:

Dabei ist N eine Variable, die den Wert des Vorteilungskoeffizienten angibt (1, 8, 32, 64, 128, 256 oder 1024).

Das Schreiben von Grenzwerten in das OCRnx-Register ist mit Sonderfällen bei der Erzeugung von PWM-Impulsen verbunden. Wenn OCRnx auf den unteren Grenzwert (0x0000) gesetzt ist, erscheint in jedem (VP+1)-ten Taktzyklus des Timers ein kurzer Impuls am Ausgang. Das Schreiben eines Werts, der der Obergrenze entspricht, in OCRnx führt zur Festlegung einer konstanten Protokollebene. 1 oder 0 am Ausgang (abhängig von der mit dem COMnx1:0-Bit gewählten Polarität des Ausgangssignals).

Wenn eine Rechteckwellenerzeugung erforderlich ist (Rechteckimpulse mit einem Arbeitszyklus von 2 oder 50 % Füllung) Hochfrequenz, dann ist es notwendig, den schnellen PWM-Modus mit gesetzten Bits COMnA1:0 = 0b01 zu verwenden, was dazu führt, dass der Logikpegel am OCnA-Ausgang bei jeder Übereinstimmung umschaltet (invertiert). Dies gilt nur, wenn OCRnA zum Festlegen der Obergrenze verwendet wird (WGMn3-0 =0b1111). Die maximal erzeugte Rechteckfrequenz beträgt in diesem Fall fOCnA = fclk_I/O/2, wenn OCRnA = 0x0000. Diese Funktion ähnelt der OCnA-Umschaltung im CTC-Modus, mit Ausnahme der doppelten Pufferung, die im schnellen PWM-Modus vorhanden ist.

Pulsweitenmodulationsmodus mit Phasenkorrektur (Phase Correct)

Der phasenkorrigierte Pulsweitenmodulationsmodus (PWM FC) (WGMn3-0 = 0b0001, 0b010, 0b0011, 0b1010 oder 0b1011) ist darauf ausgelegt, ein phasenkorrigiertes PWM-Signal mit hoher Auflösung zu erzeugen. Der PWM-FC-Modus basiert auf dem bidirektionalen Betrieb eines Timer-Zählers. Der Zähler wechselt vom unteren Grenzwert (0x0000) zum oberen Grenzwert und dann vom oberen zum unteren Grenzwert zurück. Wenn der Impulsformer-Ausgabemodus auf „Nicht invertierend“ eingestellt ist, wird der OCnx-Ausgang zurückgesetzt/eingestellt, wenn die TCNTn- und OCRnx-Werte während des Aufwärts-/Abwärtszählens übereinstimmen. Wenn der invertierende Ausgangsmodus eingestellt ist, erfolgt die Einstellung hingegen beim direkten Zählen und beim Rückwärtszählen wird der OCnx-Ausgang zurückgesetzt. Beim bidirektionalen Betrieb ist die maximale Frequenz des PWM-Signals geringer als beim unidirektionalen Betrieb. Aufgrund von Merkmalen wie der Symmetrie in den PWM-Modi mit bidirektionalem Betrieb werden diese Modi jedoch bevorzugt zur Lösung von Antriebssteuerungsproblemen verwendet.

Die PWM-Auflösung in diesem Modus kann entweder fest (8, 9 oder 10 Bit) oder über das ICRn- oder OCRnA-Register eingestellt werden. Die minimale Auflösung beträgt 2 Bit (ICRn oder OCRnA = 0x0003) und die maximale Auflösung beträgt 16 Bit (ICRn oder OCRnA = 0xFFFF). Bei Angabe einer Obergrenze wird die PWM-Auflösung in diesem Modus wie folgt bestimmt:

Im PWM-FC-Modus wird der Zähler erhöht, bis er einen der festen Werte 0x00FF, 0x01FF oder 0x03FF (jeweils für WGMn3-0 = 0b0001, 0b0010 oder 0b0011) sowie einen Wert gleich ICRn erreicht (wenn WGMn3- 0 = 0b1010) oder OCRnA (wenn WGMn3 :0 = 0b1011). Wenn der obere Grenzwert erreicht ist, ändert der Zähler außerdem die Zählrichtung. Der TCNTn-Wert bleibt für einen Timer-Taktzyklus an der Obergrenze. Das Zeitdiagramm für den PWM-PC-Modus ist in Abbildung 3 dargestellt. Die Abbildung zeigt den PWM-PC-Modus unter Verwendung des OCRnA- oder ICRn-Registers zum Festlegen der Obergrenze. Der TCNTn-Zustand wird als Funktionsgraph dargestellt, um die bidirektionale Zählung zu veranschaulichen. Die Abbildung zeigt sowohl den nichtinvertierten als auch den invertierten PWM-Ausgang. Kurze horizontale Linien zeigen Punkte im TCNTn-Diagramm an, an denen eine Übereinstimmung mit dem OCRnx-Wert auftritt. Das OCnx-Interrupt-Flag wird gesetzt, wenn eine Übereinstimmung auftritt.

Abbildung 3 – Zeitdiagramm für den PWM-FC-Modus

Das Timer-Counter Overflow (TOVn)-Flag wird immer dann gesetzt, wenn der Zähler seinen unteren Grenzwert erreicht. Wenn das OCRnA- oder ICRn-Register zum Festlegen der Obergrenze verwendet wird, wird das OCnA- oder ICFn-Flag entsprechend mit demselben Taktimpuls gesetzt, mit dem das OCRnx-Register aus dem Pufferregister aktualisiert wurde (am oberen Ende der Zählung). Interrupt-Flags können verwendet werden, um einen Interrupt zu generieren, wenn ein Zähler einen unteren oder oberen Grenzwert erreicht.

Bei der Änderung des Wertes der oberen Zählgrenze ist darauf zu achten, dass dieser größer oder gleich den Werten in allen Vergleichsregistern ist. Andernfalls kommt es nie zu einer Übereinstimmung zwischen TCNTn und OCRnx. Beachten Sie, dass bei Verwendung fester oberer Zählwerte nicht verwendete Bits beim Schreiben in die OCRnx-Register auf Null gelöscht werden. Die dritte Periode in Abbildung 53 veranschaulicht den Fall, dass eine dynamische Änderung der oberen Zählgrenze zur Erzeugung eines asymmetrischen Impulses führt. Diese Funktion basiert auf der Aktualisierungszeit des OCRnx-Registers. Da die OCRnx-Aktualisierung am oberen Ende der Zählung erfolgt, beginnt und endet die PWM-Periode am oberen Ende der Zählung. Dies bedeutet, dass die Countdown-Dauer durch den vorherigen oberen Grenzwert bestimmt wird und die Vorwärtszähldauer durch den neuen oberen Grenzwert bestimmt wird. Sind diese beiden Werte unterschiedlich, dann ist auch die Dauer der Vorwärts- und Rückwärtszählung unterschiedlich. Der Unterschied in der Dauer führt zu einer Asymmetrie der Ausgangsimpulse.

Wenn die Aufgabe darin besteht, die Obergrenze bei laufendem Zähler zu ändern, empfiehlt es sich, anstelle dieses Modus den PWM-PFC-Modus (Phasen- und Frequenzkorrektur) zu verwenden. Wenn ein statischer oberer Grenzwert verwendet wird, gibt es praktisch keine Unterschiede zwischen diesen Modi.

Im PWM-FC-Modus ermöglichen Ihnen Vergleichseinheiten die Erzeugung von PWM-Signalen an den OCnx-Pins. Wenn Sie COMnx1:0 = 0b10 einstellen, erfolgt der PWM-Ausgang ohne Invertierung, und wenn COMnx1:0 = 0b11, dann mit Invertierung. Der tatsächliche Wert von OCnx kann am Port-Pin beobachtet werden, wenn das Datenrichtungsregister für diesen Port-Pin auf Ausgaberichtung (DDR_OCnx) eingestellt ist. Das PWM-Signal wird durch Setzen (Zurücksetzen) des OCnx-Registers erzeugt, wenn die Werte von OCRnx und TCNTn während des Aufwärtszählens übereinstimmen, und durch Zurücksetzen (Setzen) des OCnx-Registers, wenn während des Abwärtszählens eine Übereinstimmung zwischen OCRnx und TCNTn besteht. Die resultierende Frequenz des PWM-Signals im PWM-FC-Modus bei einer gegebenen Obergrenze (UL) kann mit dem folgenden Ausdruck berechnet werden:

Das Schreiben von Grenzwerten in das OCRnx-Register ist mit Sonderfällen bei der Erzeugung von PWM-Signalen im PWM-FC-Modus verbunden. Wenn Sie den PWM-Modus ohne Invertierung einstellen und OCRnx auf den unteren Grenzwert setzen, wird der Ausgang kontinuierlich auf log gesetzt. 0, und wenn gleich der Obergrenze, dann ist am Ausgang immer ein Protokoll vorhanden. 1. Bei PWM mit Invertierung müssen die angegebenen Stufen durch die entgegengesetzten ersetzt werden.

Wenn Sie OCnA als Obergrenze verwenden (WGMn3:0 = 0b1011) und COMnA1:0 =0b01 festlegen, wird am OCnA-Ausgang eine Rechteckwelle erzeugt.

Pulsweitenmodulationsmodus mit Phasen- und Frequenzkorrektur (Phase and Frequency Correct)

Der Pulsweitenmodulationsmodus mit Phasen- und Frequenzkorrektur (PWM PFC) (WGMn3-0 = 0b1000 oder 0b1001) ist für die Erzeugung hochauflösender PWM-Pulse mit Phasen- und Frequenzkorrektur ausgelegt. Ebenso wie der PWM-FC-Modus basiert der PWM-FC-Modus auf dem bidirektionalen Betrieb des Zählers. Der Zähler wechselt vom unteren Grenzwert (0x0000) zum oberen Grenzwert und dann vom oberen zum unteren Grenzwert zurück. Wenn der nicht invertierende PWM-Modus angegeben ist, wird der OCnx-Ausgang zurückgesetzt, wenn beim Aufwärtszählen eine Übereinstimmung zwischen TCNTn und OCRnx auftritt, und gesetzt, wenn beim Abwärtszählen eine Übereinstimmung auftritt. Im Umkehrmodus ist der Betrieb umgekehrt. Der bidirektionale Betrieb ist im Vergleich zum unidirektionalen Betrieb mit der Erzeugung niedrigerer Frequenzen verbunden. Aufgrund der Symmetrie in den PWM-Modi mit bidirektionaler Zählung ist ihr Einsatz jedoch bei Antriebssteuerungsaufgaben vorzuziehen.

Der Hauptunterschied zwischen den Modi „PWM FC“ und „PWM FC“ besteht in dem Moment, in dem das OCRnx-Register vom OCRnx-Pufferregister aktualisiert wird (siehe Abbildung 3 und Abbildung 4).

Die PWM-Auflösung in diesem Modus kann über das ICRn- oder OCRnA-Register eingestellt werden. Die minimale Auflösung beträgt 2 Bit (ICRn oder OCRnA = 0x0003) und die maximale Auflösung beträgt 16 Bit (ICRn oder OCRnA = 0xFFFF). Die PWM-Auflösung in Bits kann mit dem folgenden Ausdruck berechnet werden:

Im PWM-FCC-Modus wird der Zähler erhöht, bis er mit dem Wert in ICRn (WGMn3:0 = 0b1000) oder in OCRnA (WGMn3:0 = 0b1001) übereinstimmt. Dies bedeutet, dass die Spitze der Zählung erreicht ist, woraufhin sich die Richtung der Zählung ändert. Der Wert von TCNTn bleibt einen Timer-Taktzyklus lang an der Spitze der Zählung. Das Zeitdiagramm für den PWM-FCC-Modus ist in Abbildung 54 dargestellt. Die Abbildung zeigt den PWM-FCC-Modus, wenn die Zählspitze durch das OCRnA- oder ICRn-Register eingestellt wird. Zur Veranschaulichung der bidirektionalen Zählung wird der TCNTn-Wert als Funktionsgraph dargestellt. Das Diagramm zeigt sowohl nichtinvertierende als auch invertierende PWM-Ausgänge. Kurze horizontale Linien zeigen Punkte im TCNTn-Diagramm an, an denen eine Übereinstimmung zwischen OCRnx und TCNTn auftritt. Das OCnx-Interrupt-Flag wird gesetzt, nachdem eine Übereinstimmung auftritt.

Abbildung 4 – Zeitdiagramm des PWM-Modus mit Phasen- und Frequenzkorrektur

Das Timer-Counter-Overflow-Flag (TOVn) wird im gleichen Taktzyklus gesetzt, wenn die Register mit dem Wert aus dem Pufferregister aktualisiert werden (an der unteren Zählgrenze). Wenn das OCRnA- oder ICRn-Register zum Festlegen der Obergrenze verwendet wird, wird das OCnA- bzw. ICFn-Flag gesetzt, wenn der Zähler die Obergrenze erreicht. Interrupt-Flags können verwendet werden, um einen Interrupt zu generieren, wenn ein Zähler einen oberen oder unteren Grenzwert erreicht.

Bei der Änderung der Obergrenze muss darauf geachtet werden, dass der neue Wert größer oder gleich den Werten in allen Vergleichsschwellenwertregistern ist. Andernfalls kommt es nie zu einer Übereinstimmung zwischen TCNTn und OCRnx, wenn die Obergrenze auf einen Wert eingestellt wird, der kleiner als einer der Werte in den Vergleichsschwellenwertregistern ist.

Abbildung 4 zeigt, dass das erzeugte Ausgangssignal im Gegensatz zum PWM-FC-Modus in allen Perioden symmetrisch ist. Da die OCRnx-Register an der unteren Zählgrenze aktualisiert werden, sind die Dauern der Vorwärts- und Rückwärtszählungen immer gleich. Dadurch haben die Ausgangsimpulse eine symmetrische Form und damit eine korrigierte Frequenz.

Die Verwendung des ICRn-Registers zum Festlegen der Obergrenze wird empfohlen, wenn der obere Grenzwert eine Konstante ist. In diesem Fall wird auch das OCRnA-Register für die Pulsweitenmodulation der Pulse am OCnA-Pin freigegeben. Wenn Sie jedoch die PWM-Frequenz dynamisch ändern müssen, indem Sie die Obergrenze ändern, empfiehlt es sich aufgrund der doppelten Pufferung, das OCRnA-Register zum Festlegen der Obergrenze zu verwenden.

Im PWM-Modus ermöglichen Ihnen die Vergleichseinheiten die Erzeugung von PWM-Impulsen am OCnx-Pin. Wenn COMnx1:0 = 0b10, dann wird ein nicht invertierender PWM-Ausgang eingestellt, und wenn COMnx1:0 = 0b11, dann ein invertierender (siehe Tabelle 60). Der OCnx-Wert ist nur dann am entsprechenden Port-Pin vorhanden, wenn dieser auf Ausgaberichtung eingestellt ist. Das PWM-Signal wird erzeugt, indem das OCnx-Register bei einer Übereinstimmung zwischen OCRnx und TCNTn während des Aufwärtszählens gesetzt (zurückgesetzt) ​​und das OCnx-Register bei einer Übereinstimmung zwischen OCRnx und TCNTn während des Abwärtszählens zurückgesetzt (gesetzt) ​​wird. Die PWM-Frequenz in diesem Modus wird bei gegebener Zählobergrenze (UP) wie folgt bestimmt:

Dabei ist N der Vorteiler-Teilungsfaktor (1, 8, 32, 64, 128, 256 oder 1024).

Das Schreiben von Grenzwerten in das OCRnx-Register ist in diesem Modus mit Sonderfällen bei der Erzeugung von PWM-Signalen verbunden. Wenn Sie OCRnx auf den unteren Grenzwert (0x0000) setzen, ist der Ausgang im nichtinvertierenden Modus konstant niedrig Logikebene, und beim Schreiben eines Wertes gleich der Obergrenze liegt am Ausgang für längere Zeit ein hoher logischer Pegel an. Im Umkehrmodus sind die angegebenen Pegel entgegengesetzt.

Wenn OCRnA zur Einstellung der Obergrenze (WGMn3:0 = 0b1001) und COMnA1:0 = 0b01 verwendet wird, wird am OCnA-Ausgang eine Rechteckwelle erzeugt.

Die Hardware-Implementierung von PWM bietet zweifellos Vorteile gegenüber Software, da sie den Prozessor sowohl von unnötigem und umständlichem Code als auch von der Zeit für seine Wartung entlastet und außerdem mehr Möglichkeiten für die Arbeit mit PWM bietet. Es reicht aus, den Timer/Zähler zu initialisieren (die erforderlichen Werte in die vom Timer/Zähler verwendeten Register einzugeben) und der Timer/Zähler kann unabhängig vom Prozessor arbeiten; dementsprechend kann der Prozessor nur gelegentlich andere Aufgaben erledigen Kontaktaufnahme im erforderlichen Moment, um den Modus anzupassen oder zu ändern oder Ergebnisse vom Timer/Zähler zu erhalten.

Beschreibung der Interrupt-Flags

T1 kann einen Interrupt generieren, wenn:

  1. Zählerregister TCNT1 Überlauf;
  2. wenn das Zählregister TCNT1 und die Vergleichsregister OCR1A und OCR1B gleich sind (getrennt für jedes Register);
  3. während das Zählregister im Erfassungsregister ICR1 gespeichert wird.

T2 kann einen Interrupt generieren, wenn:

  1. Überlauf des TCNT2-Zählerregisters;
  2. wenn das Zählregister TCNT2 und das Vergleichsregister OCR2 gleich sind.

Die Flags aller Interrupts befinden sich im TIFR-Register und die Aktivierung/Deaktivierung von Interrupts befindet sich im TIMSK-Register.

TIMSK-Registerbits
Registrieren7 6 5 4 3 2 1 0
TIMSK OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0* TOIE0
  • OCIE2- Interrupt-Freigabeflag für das „Match“-Ereignis des Timers/Zählers T2
  • TOIE2- T2-Timer-/Zählerüberlauf-Interrupt-Aktivierungsflag
  • TICIE1- Interrupt-Freigabeflag für das „Capture“-Ereignis des Timers/Zählers T1
  • OCIE1A- Interrupt-Freigabeflag für das „Match A“-Ereignis des Timers/Zählers T1
  • OCIE1B- Interrupt-Freigabeflag für das „Match B“-Ereignis des Timers/Zählers T1
  • TOIE1- T1-Timer-/Zählerüberlauf-Interrupt-Aktivierungsflag
  • OCIE0*- Interrupt-Aktivierungsflag für das „Koinzidenz“-Ereignis des Timers/Zählers T0 (* – nicht verfügbar in ATmega8)
  • TOIE0- Timer-/Zählerüberlauf-Interrupt-Aktivierungsflag T0
  • OCF2- Interrupt-Flag für das „Koinzidenz“-Ereignis des Timers/Zählers T2
  • TOV2- Timer-/Zählerüberlauf-Interrupt-Flag T2
  • ICF1- Interrupt-Flag für das „Capture“-Ereignis des Timers/Zählers T1
  • OCF1A- Interrupt-Flag für das Ereignis „Koinzidenz A“ des Timers/Zählers T1
  • OCF1B- Interrupt-Flag für das Ereignis „Koinzidenz B“ des Timers/Zählers T1
  • TOV1- T1-Timer/Zähler-Überlauf-Interrupt-Flag
  • OCF0- Interrupt-Flag für das „Koinzidenz“-Ereignis des Timers/Zählers T0
  • TOV0- Timer-/Zählerüberlauf-Interrupt-Flag T0

Beschreibung der Funktionsweise des Timers/Zählers T1 im ATmega8/16-Controller

Der 16-Bit-Timer/Zähler T1 kann zum Generieren von Zeitintervallen, zum Zählen der Anzahl externer Signale und zum Erzeugen von PWM-Signalen mit unterschiedlichen Arbeitszyklen und Dauern an den Pins OC1A und OC1B verwendet werden. Darüber hinaus kann T1 durch ein externes Signal vom ICP1-Pin oder von einem analogen Komparator seinen aktuellen Zustand in einem separaten Erfassungsregister ICR1 speichern.

Registerbits TCCR1A:TCC1B:TCNT1:OCR1A:OCR1B:ICR1
Registrieren7 6 5 4 3 2 1 0
TCCR1A COM1A1 COM1A0 COM1B1 COM1BO FOC1A FOC1B WGM11 WGM10
TCCR1B ICNC1 ICES1 * WGM13 WGM12 CS12 CS11 CS10
TCNT1:H R/W R/W R/W R/W R/W R/W R/W R/W
TCNT1:L R/W R/W R/W R/W R/W R/W R/W R/W
OCR1A:H R/W R/W R/W R/W R/W R/W R/W R/W
OCR1A:L R/W R/W R/W R/W R/W R/W R/W R/W
OCR1B:H R/W R/W R/W R/W R/W R/W R/W R/W
OCR1B:L R/W R/W R/W R/W R/W R/W R/W R/W
ICR1:H R/W R/W R/W R/W R/W R/W R/W R/W
ICR1:L R/W R/W R/W R/W R/W R/W R/W R/W

Jedes 16-Bit-Register befindet sich physisch in zwei 8-Bit-Registern, sodass beim Lesen eines Eintrags in diese zwei Operationen ausgeführt werden müssen. Beim Schreiben wird zuerst das High-Byte und dann das Low-Byte geladen; beim Lesen hingegen wird zuerst das Low-Byte und dann das High-Byte gelesen.

TCCR1A:TCCR1B- 8-Bit-Timer-/Zähler-Steuerregister T1

TCNT1- 16-Bit-Timer-/Zählerregister T1. Abhängig von der Betriebsart wird der Inhalt dieses Registers bei jedem Impuls des Timer-/Zählertaktsignals zurückgesetzt, inkrementiert (Wert um 1 erhöht) oder dekrementiert (Wert um 1 verringert).

OCR1A:OCR1B- 16-Bit-Vergleichsregister

ICR1- 16-Bit-Erfassungsregister, speichert den Wert von TCNT1, wenn eine aktive Signalflanke an den ICP1-Pin angelegt wird oder durch ein Signal vom Komparator.

Bitzuordnung

COM1A1:COM1A0:COM1B1:COM1B0– Diese Bits bestimmen das Verhalten des OC1A:OC1B-Pins, wenn der Wert des TCNT1-Zählregisters und des OCR1A:OCR1B-Vergleichsregisters übereinstimmen

FOC1A:FOC1B– Diese Bits werden verwendet, um eine Änderung des Zustands von Pin OC1A:OC1B zu erzwingen

ICNC1- Interferenzschaltkreis-Steuerbit. Wenn das Bit „0“ ist, erfolgt die Erfassung an der ersten aktiven Flanke, bei „1“ erfolgt die Erfassung nach dem vierten identischen Abtastwert des Erfassungssignals.

ICES1- Bit zur Auswahl der aktiven Flanke des Signals. Wenn sein Wert „0“ ist, erfolgt die Speicherung des Zählregisters TCNT1 im Erfassungsregister OCR1 bei der fallenden Flanke des Signals, bei „1“ bei der steigenden Flanke.

WGM13:WGM12:WGM11:WGM10- Diese Bits bestimmen die Betriebsart des Timers/Zählers T1

CS22:CS21:C20– Bits, die die Quelle des T1-Timer-/Zählertaktsignals bestimmen.

Auswahl der Betriebsart des Timers/Zählers T1
WGM13WGM12WGM11WGM10BetriebsartKontomodul (TOP)
0 0 0 0 Normal $FFFF
0 0 0 1 Phasenrichtiges PWM

8 Bit

$00FF
0 0 1 0 Phasenrichtiges PWM

9-Bit

$01FF
0 0 1 1 Phasenrichtiges PWM

10-Bit

$03FF
0 1 0 0 CTC (bei Spiel zurücksetzen) OCR1A
0 1 0 1 Schnelles PWM

8 Bit

$00FF
0 1 1 0 Schnelles PWM

9-Bit

$01FF
0 1 1 1 Schnelles PWM

10-Bit

$03FF
1 0 0 0 ICR1
1 0 0 1 Phasen- und frequenzkorrektes PWM OCR1A
1 0 1 0 Phasenrichtiges PWM ICR1
1 0 1 1 Phasenrichtiges PWM OCR1A
1 1 0 0 CTC (bei Spiel zurücksetzen) ICR1
1 1 0 1 Reserviert *
1 1 1 0 Schnelles PWM ICR1
1 1 1 1 Schnelles PWM OCR1A

Auswählen einer Taktquelle

Normaler Modus

Die einfachste Betriebsart ist T1. Mit jedem Impuls des Taktsignals wird das Zählregister TCNT1 inkrementiert (der Wert erhöht sich um 1). Beim Durchlaufen des Werts $FFFF des Zählmoduls (TOP) kommt es zu einem Überlauf und der nächste Taktzyklus beginnt mit dem Zählen ab dem Wert $0000, gleichzeitig wird das Flag TOV1=1 im TIFR-Register gesetzt und ein Interrupt kann erfolgen generiert werden, wenn das Flag TOIE1=1 im TIMSK-Register gesetzt ist. Um in diesem Modus ein Signal einer bestimmten Frequenz zu erzeugen, müssen die Bits COM1A1=0:COM1A0=1 für den OC1A-Ausgang oder COM1B1=0:COM1B0=1 für den OC1B-Ausgang des Controllers geschrieben werden.

Zusätzlich wird für jeden Taktzyklus ein Vergleich zwischen dem Zählregister TCNT1 und dem Vergleichsregister OCR1A:OCR1B durchgeführt; bei Übereinstimmung wird das Interrupt-Flag OCF1A=1:OCF1B=1 gesetzt und wenn das Bit OCIE1A=1 :OCIE1B=1 des TIMSK-Registers wird ein Interrupt generiert. Gleichzeitig kann der Zustand des OC1A:OC1B-Pins abhängig von den Einstellungen der COM1A1:COM1A0:COM1B1:COM1B0-Bits geändert werden.

CTC-Modus (bei Spiel zurücksetzen)

In diesem Modus funktioniert T1 nach dem gleichen Prinzip wie im Normalmodus. Der Unterschied besteht darin, dass der maximal mögliche Wert des Zählregisters TCNT1 durch den Wert des Vergleichsregisters OCR1A oder ICR1 begrenzt ist (siehe Tabelle zur Auswahl des Timer-/Zählermodus). Wenn TCNT1 den Wert von OCR1A oder ICR1 erreicht, wird der Wert von TCNT1 auf TCNT1=$0000 zurückgesetzt. Gleichzeitig wird das Flag TOV1=1 gesetzt. COM1A1:COM1A0:COM1B1:COM1B0 Bestimmt das Verhalten des OC1A:OC1B-Pins, wenn es gibt eine Übereinstimmung.

Schneller PWM-Modus (schnelles PWM)

Mit diesem Modus können Sie ein hochfrequentes PWM-Signal erzeugen. Das Funktionsprinzip und die Funktionsweise unterscheiden sich nicht vom Normalmodus, mit Ausnahme der doppelten Pufferung des OCR1A:OCR1B-Registers, die das Auftreten asymmetrischer Signalimpulse verhindert, und unterscheiden sich auch im Verhalten der OC1A:OC1B-Pins ( siehe Tabelle).


Phasenkorrekter PWM-Modus

Der Unterschied zwischen diesem Modus und den vorherigen besteht darin, dass das Zählregister als Rückwärtszähler arbeitet. Da dieser Modus von Atmel als am besten zum Tuning von Motoren geeignet empfohlen wird, werden wir ihn genauer betrachten. Wenn das Zählregister TCNT1 den Wert des Zählmoduls (TOP) (oder den Wert des ICR1-Registers oder den Wert des OCR1A-Registers, siehe Tabelle zur Auswahl des Timer-/Zählermodus) erreicht, ändert sich die Zählrichtung. Wenn das Zählregister TCNT1 den Minimalwert ($0000) erreicht, ändert sich auch die Zählrichtung und gleichzeitig wird das Interrupt-Flag TOV1 des TIFR-Registers gesetzt. Wenn außerdem die Inhalte des Zählregisters TCNT1 und des Vergleichsregisters OCR1A:OCR1B gleich sind, wird das OCF1A:OCF1B-Flag des TIFR-Registers gesetzt und der Zustand des OC1A:OC1B-Ausgangs ändert sich gemäß der Tabelle.

Um asymmetrische Emissionen beim Schreiben eines Wertes in das OCR1A:OCR1B-Register zu vermeiden, ist in diesem Modus eine doppelte Schreibpufferung implementiert. Dadurch ändert sich die tatsächliche Änderung des Registerwerts in dem Moment, in dem das Zählerregister TCNT1 den Wert des Zählmoduls (TOP) (oder den Wert des ICR1-Registers oder des OCR1A-Registerwerts, siehe Auswahl des Timer-/Zählermodus) erreicht Tisch). Daher ändert der OC1A:OC1B-Pin ganz am Anfang, wenn der Timer/Zähler initialisiert wird, seinen Zustand bei Übereinstimmung nicht, bis das Register den Wert (TOP) erreicht.

Aufgabe: Lassen Sie uns ein Programm entwickeln, um die Helligkeit einer 12-Volt-Glühlampe mithilfe von PWM zu steuern. Wenn Sie auf die Schaltfläche „Mehr“ klicken, erhöht sich die Helligkeit der Lampe, und wenn Sie auf die Schaltfläche „Weniger“ klicken, verringert sich die Helligkeit. Das Diagramm unseres zukünftigen Geräts ist in der Abbildung dargestellt. Wie üblich verwenden wir den Atmega8-Mikrocontroller, der von einem internen Oszillator mit einer Frequenz von 4 MHz getaktet wird. Eigentlich bekommen wir einen Dimmer; diese Geräte dienen dazu, die Helligkeit von Beleuchtungskörpern anzupassen. Heutzutage sind LED-Dimmer am weitesten verbreitet.

Der Einfachheit halber können Sie an unsere Schaltung auch eine LED anschließen, mit einer Glühbirne wird es aber deutlicher. Knöpfe sind mit Pins verbunden PD0, PD1. Wir verbinden die Last mit dem Ausgang PB1(OC1A)über einen Widerstand und einen MOSFET-Feldeffekttransistor, der für uns als Schlüssel fungiert (im Schaltmodus). Ein Feldeffekttransistor ist vorzuziehen, da sein Gate vom Stromkreis isoliert ist und durch ein elektrisches Feld gesteuert wird und der Steuerstrom Mikroampere erreicht. Dies ermöglicht es, mit einem oder zwei Transistoren eine Last mit enormer Leistung (bis zu mehreren zehn Ampere und zehn oder hundert Volt) zu steuern, ohne den Mikrocontroller zu belasten. Berücksichtigt man auch die Tatsache, dass Feldeffekttransistoren (im Gegensatz zu bipolaren) parallel geschaltet werden können, ist es möglich, eine noch leistungsfähigere Kaskade von Hunderten von Ampere zu erhalten.

Lassen Sie uns nun herausfinden, wie der Mikrocontroller PWM implementiert und ein Programm schreiben. Wie bereits erwähnt verfügt unser MK über 3 Timer, die alle im PWM-Modus arbeiten können. Wir werden mit einem 16-Bit-Timer/Zähler arbeiten. Bits WGM13-10 Lassen Sie uns unseren Timer so konfigurieren, dass FastPWM mit einer oberen Zählgrenze arbeitet ICR1. Das Prinzip des Programms ist folgendes: Unser Timer zählt von 0 bis 65535 (0xFFFF) in das Register ICR1 Geben wir die Zahl 255 ein, dies ist die Obergrenze des Timer-Zählers (TOP), die Frequenz des PWM-Signals bleibt konstant. Außerdem ist unser Timer so konfiguriert, dass bei Übereinstimmung des Zählregisters und des Vergleichsregisters (TCNT1 = OCR1A) der Controller-Ausgang schaltet OC1A. Der PWM-Arbeitszyklus kann durch Schreiben in das Vergleichsregister geändert werden OCR1A eine bestimmte Zahl von 0 bis 255, je größer diese Zahl, desto größer der Füllfaktor, desto heller brennt die Lampe. Je nachdem, welche Taste gedrückt wird, ändert sich die Variable ich, und dann wird es in das Register geschrieben OCR1A.

Der vollständige Text des Programms ist unten aufgeführt. Die Kommentare beschreiben die Funktionsweise des Programms genauer.

/***Lektion Nr. 8. Erzeugen von PWM-Signalen***/ #include #enthalten int main(void) ( unsigned int i=0; //variable i definieren /***E/A-Ports konfigurieren***/ PORTB = 0x00; DDRB |= (1<< PB1); PORTD |= (1 << PD1)|(1 << PD0); // подключаем внутренние нагрузочные резисторы DDRD = 0x00; /***Настройка таймера***/ TCCR1A |= (1 << COM1A1)|(0 << COM1A0) // Установим биты COM1A1-COM1A0:0b10, означает сброс вывода канала A при сравнении |(1 << WGM11)|(0 << WGM10); // Установим биты WGM13-10:0b1110, согласно таблице это TCCR1B |= (1 << WGM13)|(1 << WGM12) // будет режим - FAST PWM, где верхний предел счета задается битом ICR1 |(0 << CS12)|(0 << CS11)|(1 << CS10); // Битами CS12-10:0b001 задаем источник тактового сигнала для таймера МК, включен без делителя TCNT1 = 0x00; // начальная установка счетчика ICR1 = 0xFF; // задаем период ШИМ, здесь у нас число 255, // по формуле fPWM=fclk_I/O/N*(1+ICR1)// вычисляем частоту ШИМ, она будет равна 15625 Hz OCR1A = 0x00; // начальный коэффициент заполнения ШИМ /***Основной цикл программы***/ while(1) { if((PIND&(1 << PD0)) == 0) //если кнопка "больше" нажата { if (i < 254) { // коэффициент заполнения ШИМ изменяется от 0 до 255 i=i+1; // увеличиваем i на единицу OCR1A = i; // записываем переменную в регистр сравнения _delay_ms(30); // задержка 30ms } } if((PIND&(1 << PD1)) == 0) //если кнопка "меньше" нажата { if (i >0) // Der PWM-Arbeitszyklus ändert sich von 255 auf 0 ( i--; // i um eins verringern (Sie können dies auch schreiben) OCR1A = i; // eine Variable in das Vergleichsregister schreiben _delay_ms(30); // Verzögerung 30ms ) ) ) )

Aufmerksamkeit! Zuerst versorgen wir den Mikrocontroller mit Strom, dann müssen Sie sicherstellen, dass der Transistor mit dem MK-Pin verbunden ist, und erst dann die Schaltung mit der Lampe und dem Feldeffekttransistor mit Strom versorgen. Andernfalls könnte der Transistor durchbrennen. Tatsache ist, dass die „Beine“ des MK im ausgeschalteten Zustand „in der Luft baumeln“ - sie sind mit nichts verbunden und es treten Störungen auf. Diese schwachen Störungen reichen aus, um einen sehr empfindlichen Feldeffekttransistor teilweise zu öffnen. Dann sinkt sein Widerstand zwischen Drain und Source von mehreren MOhm auf mehrere Ohm oder Bruchteile von Ohm und es fließt ein großer Strom durch ihn zur Lampe. Der Transistor öffnet sich jedoch nicht vollständig, da Sie dazu keine 1-3 V-Interferenz an das Gate anlegen müssen, sondern stabile 5 V, und sein Widerstand wird viel größer als das Minimum sein. Dadurch wird eine große Hitzemenge freigesetzt, es entsteht Rauch und es kann zu Verbrennungen kommen.

PWM oder PWM (Pulsweitenmodulation, auf Englisch) ist eine Möglichkeit, die Stromversorgung der Last zu steuern. Die Steuerung besteht darin, die Pulsdauer bei konstanter Pulswiederholungsrate zu verändern. Die Pulsweitenmodulation kann analog, digital, binär oder ternär erfolgen.

Durch den Einsatz der Pulsweitenmodulation lässt sich der Wirkungsgrad elektrischer Wandler steigern, insbesondere von Pulswandlern, die heute die Grundlage für die Sekundärstromversorgung verschiedener elektronischer Geräte bilden. Flyback- und Forward-Single-Cycle-, Push-Pull- und Halbbrücken- sowie Brückenpulswandler werden heute unter Beteiligung von PWM gesteuert, dies gilt auch für Resonanzwandler.

Mit der Pulsweitenmodulation können Sie die Helligkeit der Hintergrundbeleuchtung von Flüssigkristalldisplays von Mobiltelefonen, Smartphones und Laptops anpassen. PWM wird in Kfz-Wechselrichtern, Ladegeräten usw. implementiert. Heutzutage verwendet jedes Ladegerät PWM für seinen Betrieb.

Als Schaltelemente in modernen Hochfrequenzwandlern werden im Schaltbetrieb arbeitende Bipolar- und Feldeffekttransistoren eingesetzt. Dies bedeutet, dass der Transistor während eines Teils der Periode vollständig geöffnet und während eines Teils der Periode vollständig geschlossen ist.

Und da in Übergangszuständen, die nur einige zehn Nanosekunden dauern, die am Schalter abgegebene Leistung im Vergleich zur geschalteten Leistung gering ist, erweist sich die durchschnittliche in Form von Wärme am Schalter abgegebene Leistung letztendlich als unbedeutend. In diesem Fall ist im geschlossenen Zustand der Widerstand des Transistors als Schalter sehr klein und der Spannungsabfall an ihm geht gegen Null.

Im offenen Zustand liegt die Leitfähigkeit des Transistors nahe bei Null und es fließt praktisch kein Strom durch ihn. Dadurch ist es möglich, kompakte Konverter mit hohem Wirkungsgrad, also mit geringen thermischen Verlusten, zu realisieren. Und Resonanzwandler mit Nullstromschaltung ZCS (Zero-Current-Switching) ermöglichen es, diese Verluste auf ein Minimum zu reduzieren.


Bei analogen PWM-Generatoren wird das Steuersignal von einem analogen Komparator erzeugt, wenn beispielsweise ein Dreiecks- oder Sägezahnsignal an den invertierenden Eingang des Komparators und ein modulierendes kontinuierliches Signal an den nichtinvertierenden Eingang angelegt wird.

Die Ausgangsimpulse werden erhalten, ihre Wiederholungsfrequenz ist gleich der Frequenz des Sägezahns (oder Dreiecksignals) und die Dauer des positiven Teils des Impulses hängt mit der Zeit zusammen, während der der Pegel des dem Modulator zugeführten konstanten Signals ansteigt Der nichtinvertierende Eingang des Komparators ist höher als der Pegel des Sägesignals, das dem invertierenden Eingang zugeführt wird. Wenn die Sägespannung höher als das Modulationssignal ist, weist der Ausgang einen negativen Teil des Impulses auf.

Wenn die Säge dem nicht invertierenden Eingang des Komparators zugeführt wird und das Modulationssignal dem invertierenden Eingang zugeführt wird, haben die ausgegebenen Rechteckimpulse einen positiven Wert, wenn die Sägespannung höher ist als der Wert des zugeführten Modulationssignals zum invertierenden Eingang und negativ, wenn die Sägespannung niedriger als das Modulationssignal ist. Ein Beispiel für die analoge PWM-Erzeugung ist die Mikroschaltung TL494, die heute häufig beim Bau von Schaltnetzteilen verwendet wird.


Digitales PWM wird in der binären Digitaltechnik eingesetzt. Auch die Ausgangsimpulse nehmen nur einen von zwei Werten an (Ein oder Aus) und der durchschnittliche Ausgangspegel nähert sich dem gewünschten Pegel. Hier wird das Sägezahnsignal durch Verwendung eines N-Bit-Zählers gewonnen.

Auch digitale Geräte mit PWM arbeiten mit einer konstanten Frequenz, die zwangsläufig die Reaktionszeit des angesteuerten Geräts überschreitet, dieser Ansatz wird Oversampling genannt. Zwischen den Taktflanken bleibt der digitale PWM-Ausgang stabil, entweder hoch oder niedrig, abhängig vom aktuellen Zustand des Ausgangs des digitalen Komparators, der die Signalpegel am Zähler und den ungefähren digitalen Pegel vergleicht.

Der Ausgang wird als Folge von Impulsen mit den Zuständen 1 und 0 getaktet; jeder Taktzustand kann sich in das Gegenteil ändern oder auch nicht. Die Frequenz der Impulse ist proportional zum Pegel des sich nähernden Signals, und aufeinander folgende Einheiten können einen breiteren, längeren Impuls bilden.

Die resultierenden Impulse variabler Breite betragen ein Vielfaches der Taktperiode und die Frequenz beträgt 1/2NT, wobei T die Taktperiode und N die Anzahl der Taktzyklen ist. Hier ist eine niedrigere Frequenz im Verhältnis zur Taktfrequenz erreichbar. Die beschriebene digitale Erzeugungsschaltung ist eine Ein-Bit- oder Zwei-Pegel-PWM-, pulscodierte PCM-Modulation.

Diese zweistufige pulscodierte Modulation besteht im Wesentlichen aus einer Reihe von Impulsen mit einer Frequenz von 1/T und einer Breite von T oder 0. Durch Überabtastung wird über einen längeren Zeitraum gemittelt. Hochwertiges PWM kann durch Ein-Bit-Pulsdichtemodulation, auch Pulsfrequenzmodulation genannt, erreicht werden.

Bei der digitalen Pulsweitenmodulation können rechteckige Teilimpulse, die eine Periode füllen, an jeder beliebigen Stelle der Periode auftreten, und dann beeinflusst nur ihre Anzahl den Durchschnittswert des Signals über die Periode. Wenn Sie also die Periode in 8 Teile unterteilen, ergeben die Kombinationen der Impulse 11001100, 11110000, 11000101, 10101010 usw. den gleichen Durchschnittswert für die Periode, separate Einheiten erschweren jedoch die Betriebsart des Schlüsseltransistors.

Elektronikleuchten, die über PWM sprechen, geben die folgende Analogie zur Mechanik an. Wenn Sie einen Motor zum Drehen eines schweren Schwungrads verwenden, dreht sich das Schwungrad entweder und dreht sich weiter, da der Motor entweder ein- oder ausgeschaltet werden kann, oder es stoppt aufgrund der Reibung, wenn der Motor ausgeschaltet wird.

Wenn der Motor jedoch einige Sekunden pro Minute eingeschaltet bleibt, bleibt die Drehung des Schwungrads aufgrund der Trägheit bei einer bestimmten Geschwindigkeit erhalten. Und je länger der Motor läuft, desto schneller dreht sich das Schwungrad. Das Gleiche gilt für PWM, das Ein- und Ausschaltsignal (0 und 1) kommt am Ausgang an und dadurch wird der Durchschnittswert erreicht. Durch Integration der Impulsspannung über die Zeit erhalten wir die Fläche unter den Impulsen, und die Wirkung auf den Arbeitskörper ist identisch mit der Arbeit bei einem durchschnittlichen Spannungswert.

So funktionieren Konverter, bei denen die Umschaltung tausende Male pro Sekunde erfolgt und die Frequenzen mehrere Megahertz erreichen. Zur Steuerung von Energiesparlampen-Vorschaltgeräten, Netzteilen usw. werden häufig spezielle PWM-Controller eingesetzt.


Das Verhältnis der Gesamtdauer der Impulsperiode zur Einschaltzeit (dem positiven Teil des Impulses) wird als Tastverhältnis des Impulses bezeichnet. Wenn also die Einschaltzeit 10 μs beträgt und die Periode 100 μs dauert, dann ist das Tastverhältnis bei einer Frequenz von 10 kHz gleich 10, und es wird geschrieben, dass S = 10. Das inverse Tastverhältnis wird aufgerufen das Puls-Tastverhältnis, auf Englisch Duty Cycle, oder abgekürzt als DC.

Für das gegebene Beispiel ist also DC = 0,1, da 10/100 = 0,1. Bei der Pulsweitenmodulation wird durch Anpassen des Tastverhältnisses des Impulses, also durch Variation des Gleichstroms, der erforderliche Durchschnittswert am Ausgang eines elektronischen oder anderen elektrischen Geräts, beispielsweise eines Motors, erreicht.

gastroguru 2017