(→Siehe auch) |
K (→Grundbegriffe) |
||
Zeile 7: | Zeile 7: | ||
Bei der Puls-Weiten-Modulation (PWM), wird ein digitales Ausgangssignal erzeugt, dessen Tastverhältnis moduliert wird. | Bei der Puls-Weiten-Modulation (PWM), wird ein digitales Ausgangssignal erzeugt, dessen Tastverhältnis moduliert wird. | ||
− | Das Tastverhältnis | + | Das Tastverhältnis gibt das Verhältnis der Länge des eingeschalteten Zustands zur Periodendauer an. Dabei bleiben die Frequenz und der Pegel des Signals immer |
gleich! | gleich! | ||
Es ändert sich nur die Länge von High zu Low. | Es ändert sich nur die Länge von High zu Low. | ||
Zeile 16: | Zeile 16: | ||
[[Bild:Tastverhältnis.png|center]] | [[Bild:Tastverhältnis.png|center]] | ||
− | Man könnte das in etwa mit einem Wasserhahn vergleichen, | + | Man könnte das in etwa mit einem Wasserhahn vergleichen, den man z.B. alle Minuten betätigt. |
Wenn man ihn in jeder Minute nur kurz aufdreht, und dann gleich wieder zumacht, | Wenn man ihn in jeder Minute nur kurz aufdreht, und dann gleich wieder zumacht, | ||
kommt in Summe nur wenig Wasser raus. | kommt in Summe nur wenig Wasser raus. | ||
− | Wenn man ihn aber in jeder dieser Minuten | + | Wenn man ihn aber in jeder dieser Minuten länger offen lässt, |
kommt mehr Wasser raus. | kommt mehr Wasser raus. | ||
Zeile 30: | Zeile 30: | ||
Oder auch einen Motor in der Geschwindigkeit regeln. | Oder auch einen Motor in der Geschwindigkeit regeln. | ||
− | Man kann aber auch dem PWM-Signal | + | Man kann aber auch dem PWM-Signal einen RC-Filter nachschalten, das das |
− | PWM-Signal glättet. Dann hat man eine regelbare Gleichspannung, | + | PWM-Signal glättet. Dann hat man eine regelbare Gleichspannung, in der das Minimum |
dann 0V und das Maximum 5V ist. | dann 0V und das Maximum 5V ist. | ||
Zeile 50: | Zeile 50: | ||
Der Mega8 hat nun drei Hardware PWM Ausgänge. | Der Mega8 hat nun drei Hardware PWM Ausgänge. | ||
− | Diese laufen nach Definition der Register/Werte | + | Diese laufen nach Definition der Register/Werte selbstständig ab. |
(Darum ist Hardware-PWM auch sehr schnell und belastet die Abarbeitung des Programms nicht.) | (Darum ist Hardware-PWM auch sehr schnell und belastet die Abarbeitung des Programms nicht.) | ||
− | Leider sind die Ausgänge aber bestimmten Ausgangs Pin’s | + | Leider sind die Ausgänge aber bestimmten Ausgangs Pin’s fix zugeordnet. |
Man kann diese also nicht auf andere Pins legen und muss sich deshalb vorher | Man kann diese also nicht auf andere Pins legen und muss sich deshalb vorher | ||
Gedanken machen, wie man den Mega8 beschaltet. | Gedanken machen, wie man den Mega8 beschaltet. | ||
− | Ganz anders beim Software-PWM, dass ja rein Software | + | Ganz anders beim Software-PWM, dass ja rein Software mäßig erzeugt wird |
− | und wo man dann das PWM-Signal | + | und wo man dann das PWM-Signal fast an jeden Pin ausgeben kann. |
− | Für die Hardware-PWM Erzeugung | + | Für die Hardware-PWM Erzeugung kann man beim Mega8 |
den Timer1 und den Timer2 verwänden. | den Timer1 und den Timer2 verwänden. | ||
Version vom 24. Januar 2006, 20:27 Uhr
Inhaltsverzeichnis
Mit Bascom, PWM-Signale erzeugen
(Bezogen auf den Mega8. Aber es gilt in etwa, auch für andere AVR's)
Grundbegriffe
Puls Weiten Modulation (PWM)
Bei der Puls-Weiten-Modulation (PWM), wird ein digitales Ausgangssignal erzeugt, dessen Tastverhältnis moduliert wird.
Das Tastverhältnis gibt das Verhältnis der Länge des eingeschalteten Zustands zur Periodendauer an. Dabei bleiben die Frequenz und der Pegel des Signals immer gleich! Es ändert sich nur die Länge von High zu Low.
Dieses Bild zeigt ein Tastverhältnis von 10% und 50 %
Man könnte das in etwa mit einem Wasserhahn vergleichen, den man z.B. alle Minuten betätigt. Wenn man ihn in jeder Minute nur kurz aufdreht, und dann gleich wieder zumacht, kommt in Summe nur wenig Wasser raus. Wenn man ihn aber in jeder dieser Minuten länger offen lässt, kommt mehr Wasser raus.
Der Rhythmus bleibt immer gleich, aber es ändert sich in Summe die Wassermenge, die raus kommt.
Mit dem PWM Signal kann man nun tolle Sachen machen. Zum Beispiel eine LED (oder über einen Transistor auch eine Lampe) an den PWM Ausgang anschliessen und mit der Länge des PWM-Signal’s die Helligkeit der LED verändern.
Oder auch einen Motor in der Geschwindigkeit regeln.
Man kann aber auch dem PWM-Signal einen RC-Filter nachschalten, das das PWM-Signal glättet. Dann hat man eine regelbare Gleichspannung, in der das Minimum dann 0V und das Maximum 5V ist.
Es gibt grundsätzlich zwei Gruppen von PWM-Arten
Software PWM und Hardware PWM
- Software PWM
- Vorteile: Man kann dieses PWM auf jeden Ausgabe-Pin des AVR anwenden.
- Nachteil: Da das PWM per Software gemacht wird, ist er eher langsam.
- Hardware PWM
- Vorteile: Sehr schnell (Maximal die Quarzfrequenz / Periode)
- Nachteile: Man kann nur bestimmte Ausgänge dafür verwenden
Der Mega8 hat nun drei Hardware PWM Ausgänge.
Diese laufen nach Definition der Register/Werte selbstständig ab.
(Darum ist Hardware-PWM auch sehr schnell und belastet die Abarbeitung des Programms nicht.)
Leider sind die Ausgänge aber bestimmten Ausgangs Pin’s fix zugeordnet.
Man kann diese also nicht auf andere Pins legen und muss sich deshalb vorher
Gedanken machen, wie man den Mega8 beschaltet.
Ganz anders beim Software-PWM, dass ja rein Software mäßig erzeugt wird und wo man dann das PWM-Signal fast an jeden Pin ausgeben kann.
Für die Hardware-PWM Erzeugung kann man beim Mega8 den Timer1 und den Timer2 verwänden.
Timer1 hat zwei Compare Register und kann dadurch zwei PWM Signale erzeugen. (Compare A = Pin 15 und Compare B= Pin 16) Weiters kann man beim Timer1 eine Auflösung von 8, 9 und 10 Bit einstellen.
Timer2 hat nur ein Compare Register (Ausgang am Pin 17), nur 8 Bit Auflösung und kann auch nur ein PWM erzeugen.
PWM-Ablauf:
Unteres Bild zeigt den Ablauf für das PWM beim Timer1.
Es kommt zuerst die Frequenz vom Takterzeuger (Quarz), geht über den Prescaler zum Timer.
Beim Timer schaltet das Compare Register je nach seinem eingestellten Wert
und erzeugt somit das PWM-Signal am Ausgangs-Pin
Genauere Erklärung:
Der Prescaler, teilt die Frequenz die vom Quarz kommt! Bei Teilung 1, geht die vollständige Frequenz zum Timer. Bei Teilung 8, nur ein Achtel der Quarzfrequenz. (Also bei 8 MHz Quarz kommen zum Timer dann nur 1 MHz ) Bei Teilung 1024 sind es dann z.B. 8 MHz/1024 = 7,8125kHz
Der Timer ist hier der Zähler für das PWM. Er zählt mit der Frequenz, die vom Prescaler kommt, einmal von 0 bis zu der eingestellten Timerauflösung rauf, dann wieder auf 0 zurück. (dann wieder von 0 auf Timerauflösung u.s.w.) Einmal rauf und runterzählen, ergibt ein Periode. Die Periode ist gleich die Ausgangsfrequenz von dem PWM-Signal. Ausgangsfrequenz = (Quarzfrequenz/Prescale ) /(Timerauflösung*2)
z.B.: Quarz = 8 MHz ; Prescaler = 1 ; Timer = 8 Bit
ergibt: (8000000Hz/1) / (256*2) = 15,625 kHz
oder: Quarz = 8 MHz ; Prescaler = 8 ; Timer = 10 Bit ergibt: (8000000Hz/8) / (2048*2) = 244,14 Hz
Mit dem Compare Register definiert man nun das Tastverhältnis! Überall, wo nun der Timer diese Compare Linie schneidet, schaltet der Ausgang! Beim raufzählen des Timers auf EIN, beim runterzählen auf AUS.
Als Beispiel ein Tastverhältnis von 20%
Als Beispiel ein Tastverhältnis von 80%
Hier sieht man, wie die Signale dann auf einem Osciloskop ausschauen.
Oben das Signal von Pin15 (Compare A) , unten das von Pin 16 (Compare B)
Grundprogramm
Hier nun ein Grundprogramm für die Ausgabe von zwei PWM Signalen mit dem Timer1
' Hardware PWM mit Timer1 $regfile = "m8def.dat" $crystal = 4000000 Config Pinb.1 = Output Config Pinb.2 = Output Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1 Do Compare1a = 205 Compare1b = 51 Loop End
Erklärung:
$regfile = "m8def.dat" $crystal = 8000000
Definiert den Mega8 und den 8MHz Quarz
Config Pinb.1 = Output Config Pinb.2 = Output
Definiert die zwei Ausgänge von Timer1 auf Ausgabe.
Pinb.1 = für Compare1a (= Compare A) = Pin 15
Pinb.2 = für Compare1b (= Compare B) = Pin 16
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
- Config Timer1 = Pwm
- Timer1 auf PWM einstellen
- Pwm = 8
- Timer Auflösung = 8 Bit einstellen
- Compare A Pwm = Clear Up
- Definiert, wie der Compare A schalten soll. Bei „Clear Up“ schaltet der Ausgang beim erreichen
- des Compare-Wertes zuerst auf High und dann auf Low. Bei „Clear Down“, umgekehrt.
- Compare B Pwm = Clear Up
- Das gleiche noch mal mit Compare B
- Prescale = 1
- Hier wird der Prescaler auf 1 eingestellt.
- (Wert 1 heißt, direkte Frequenz vom Quarz zum Timer.)
- Weitere Teilungen, wie z.B.: 8, 64, 256 und 1024 sind möglich.
Compare1a = 205 Compare1b = 51
Hier kann man nun die Werte für das Tastverhältnis, in das Register Compare1a und Compare1b schreiben. Oder man kann auch, satt Compare1a und 1b , die Bezeichnungen Pwm1a und Pwm1b verwenden. Bascom nimmt beides.
Mit diesem kurzen Programm, hat man nun zwei PWM Signale erzeigt, wo das eine ein Tastverhältnis
von 20% (Compare1a) und das andere von 80 % hat. :-)