erstellt 13.04.2014
Pulsweitenmodulation mit Atmega 8
Was ist eine Pulsweitenmodulation ?
Pulsweitenmodulation ist ein Signal mit immer gleichbleibender Frequenz aber unterschiedlichen Ein / Aus Fasen, durch diese unterschiedlichen Ein/Aus Fasen
wird dann die Ausgangsleistung geregelt.
Als Vergleich stellt man sich eine Herdplatte vor , deren Drehschalter beispielsweise auf die Stufe 1 steht.
Die Herdplatte macht dann nichts anderes als eine gewisse Zeit ein zuschalten, zB. 1 Sekunde , bleibt dann ca. 3 Sekunden aus um dann wieder für 1 Sekunde ein zuschalten,
damit wird dann die Herdplatte aufgewärmt.
Stell man hingegen den Stufenschalter auf die 2.Stufe dann schaltet die Herdplatte für 2 Sekunden an um anschließend für 2 Sekunden aus zubleiben usw.
Durch das unterschiedliche Verhältnis zwischen Ein und Aus fasen wird die Leistung geregelt.

Zu Veranschaulichung sehen wir uns unten die Bild 1 an, dort ist ein Signal A eingezeichnet mit ein Ein/Aus Verhältnis von 1,
in Skizze A1 erkennen wir an der 
schraffierten Fläche wenn wir den oberen Teil des Signal weg nehmen und und damit das Signal in der Aus fase auffüllen
ergibt sich ein durchschnittliches  mittleres Signal  mit einer Leistung von 50%.
In Skizze B sehen wird das die Einschalt fase länger als die Ausschaltphase ist und sich somit eine mittlere Leistung von 70% ergibt .und in Skizze C eben eine Leistung von 90%.
Ebenso ist es möglich (Skizze D )die Einschaltdauer kürzer zu gestalten als die Ausschalt dauer somit bekommen wir Leistungen unter 50 % bis hin zu nahezu 0 %

Bild 1

Atmega 8-16



Zeile
Programmcode
Beschreibung
1
$regfile "m8def.dat"   
Definiert den Atmega als Atmega8
2
$crystal = 1000000 
Gibt die Quarzfrequenz an in Herz
3
$hwstack = 32  
Default use 32 Hardware reservierte Speicher
4
$swstack = 25       
Default Software resvierung Speicher
Display konfigurieren
5
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , _
Db7 = Portb.2 , Rs = Portd.1 , E = Portd.0
Konfiguration fürs Display
Ordnet den Atmega Ausgängen  die dazughörigen Display Eingänge zu.
 Ein/Ausgänge setzen
6
Config Portb.1 = Output  '
OC1A Ausgang der als Pulsweitenausgang dient muss auch als Ausgang definiert werden
7
Config Portd.5 = Output 
 Ausgang für Rote Led wird hier definiert
Variable definieren
8
Dim Tastverhaeltnis As Byte
9
Dim Vorgabe As Byte
Timer Konfigurieren
10
Tccr1a = &B10000001 Wenn Bit 7 auf 1 gesetzt ist wird  Ausgang OC1A ( Beim Atmega 8 Pin 15)  beim Hochzählen und erreichen  des Vrgleichswert auf 1 gesetzt
Wenn Bit 1 auf 1 gesetzt ist Zählt Timer als PWM Phasen correkt im 8 Bit Modus
11
Tccr1b = &B00000001 Mit den letzten 3 Bits wird der Teilungsfaktor eingestellt durch den der Systemtakt geteilt wird.
001 = Teilfaktor =1
010 =  8
011 = 64
100=256
101=1024
Vorgabewerte
12
Tastverhaeltnis = 100
Programmschleife
13
Do

Toogle Portd.5
Rote Led wechselt ihren Zustand
14
Compare1a = Tastverhaeltnis
15
loop

Der PWM arbeitet in dieser Konstellation mit einer Frequenz von ca 1,953 Khz egal bei welchem Tastverhältnis
auch immer.
Das ergibt sich aus Systemtakt 1000 000 geteilt durch ( 255) 8 Bit Auflösung , dann noch einmal durch 2 teilen weil hoch und wieder runter gezählt wird.
Also 1 000 000 / 255 = 3921
3921/2= 1960 Hz
Somit wäre es Sinnvoll den Systemtakt zu erhöhen weil diese Frequenz noch im Hörbereich liegt  und mann so ein unangenehmes Piepsen bei der Ansteuerung von Spulen erzeugt.
Beispielsweise 16 000 000 ergibt dann 31,3 Khz und ist damit außerhalb des menschlichen Hörvermögen.




Download des Programm als *.bas
 
Aktualisiert 06.04.2016
Copyright by Manfred Schrod 2009