Aus RN-Wissen.de
Wechseln zu: Navigation, Suche
Rasenmaehroboter Test

K (Genauere Erklärung:)
(Grundprogramm)
 
(4 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
== Mit Bascom, PWM-Signale erzeugen ==
+
== PWM-Signale mit Bascom erzeugen ==
(Bezogen auf den Mega8. Aber es gilt in etwa, auch für andere AVR's)
+
  
 
===Grundbegriffe===
 
===Grundbegriffe===
'''Puls Weiten Modulation (PWM)'''
+
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 gibt das Verhältnis der Länge des eingeschalteten Zustands zur Periodendauer an. Dabei bleiben die Frequenz und der Pegel des Signals immer
 
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
Zeile 11: Zeile 8:
 
Es ändert sich nur die Länge von High zu Low.
 
Es ändert sich nur die Länge von High zu Low.
  
 
+
Folgendes Bild zeigt ein Tastverhältnis einmal von 10% und einmal von 50%
Dieses Bild zeigt ein Tastverhältnis von 10% und 50 % <br/>
+
  
 
[[Bild:Tastverhältnis.png|center]]
 
[[Bild:Tastverhältnis.png|center]]
Zeile 25: Zeile 21:
 
die raus kommt.
 
die raus kommt.
  
Mit dem PWM Signal kann man nun tolle Sachen machen.  
+
Mit dem [[PWM]]-Signal kann man nun tolle Sachen machen. <br />
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.
+
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.  
+
* einen Motor in der Geschwindigkeit regeln.
 +
* mittels nachgeschaltetem RC-Filter, welcher das [[PWM]]-Signal glättet, kann eine Gleichspannung erzeugt werden die zwischen 0V und 5V geregelt werden kann.
  
Man kann aber auch dem PWM-Signal einen RC-Filter nachschalten, welches das 
+
=== PWM-Arten ===
PWM-Signal glättet. Dann hat man eine regelbare Gleichspannung, in der das Minimum 
+
dann 0V und das Maximum 5V ist.
+
  
 +
Es gibt zwei Arten PWM-Signale in Bascom zu erzeugen:
  
Es gibt grundsätzlich zwei Gruppen von PWM-Arten
+
==== Software PWM ====
 +
:'''Vorteile''':
 +
::* es kann (fast) jeder Ausgabe-Pin des AVR benutzt werden.
 +
::* unter zuhilfename eines (freien) [[Timer]]s k&ouml;nnen sogar mehrere verschiedene PWM-Signale auf verschiedene Pins erzeugt werden.
 +
:'''Nachteil''':
 +
::* Etwas gr&ouml;sserer Programmaufwand, da der PortPin per Software verändert werden muss.
  
'''Software PWM und Hardware PWM '''
+
==== Hardware PWM ====
 +
:'''Vorteile''':
 +
::* Sehr schnell (Maximal die Quarzfrequenz / Periode)
 +
::* unabhängig vom Programmablauf des AVR
 +
:'''Nachteile''':
 +
::* Je nach AVR k&ouml;nnen nur bestimmte Timer mit bestimmten Ausgangspins daf&uuml;r verwendet werden.
 +
::* belegt den Timer, der für keine weiteren funktionen verwendet werden kann.
  
  
;'''Software PWM'''
+
Beim einem [[ATMega8]] stehen drei Hardware-PWM-Ausg&auml;nge verteilt auf zwei Timer zur Verf&uuml;gung.
:Vorteile: Man kann diese PWM auf jeden Ausgabe-Pin des AVR anwenden.
+
:Nachteil: Da die PWM per Software gemacht wird, ist sie eher langsam.
+
  
;'''Hardware PWM'''
+
Mit Timer1 können zwei PWM Signale erzeugt werden
:Vorteile: Sehr schnell (Maximal die Quarzfrequenz / Periode)
+
(Compare A => OC1A - Pin 15 und Compare B => OC1B - Pin 16).
:Nachteile: Man kann nur bestimmte Ausgänge dafür verwenden
+
  
 +
Die Auflösung kann auf 8, 9 und 10 Bit eingestellt werden, also max. 1024 Abstufungen.
  
Der Mega8 hat nun drei Hardware PWM Ausgänge.
+
Timer2 kann ein PWM-Signal mit einer Auflösung von 8 Bit erzeugen
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, das ja rein Softwaremäßig erzeugt wird
+
(Compare Register => OC2 - Pin 17)
und wo man dann das PWM-Signal fast an jeden Pin ausgeben kann.
+
  
Für die Hardware-PWM Erzeugung kann man beim Mega8
+
=== PWM-Ablauf ===
den Timer1 und den Timer2 verwänden.
+
  
Timer1 hat zwei Compare Register und kann dadurch zwei PWM Signale erzeugen.
+
Das folgende Bild zeigt den Ablauf bei Timer1. Als Taktquelle dient die CPU-Frequenz, dessen Frequenz im Prescaler (Vorteiler) nochmal verkleinert werden kann.
(Compare A = Pin 15 und Compare B= Pin 16)
+
Je nach eingestelltem Wert in den ''Output Compare Registern'' wird der Status des Ausgangs-Pin entsprechend oft umgeschaltet,
Weiters kann man beim Timer1 eine Auflösung von 8, 9 und 10 Bit einstellen.
+
und erzeugt somit das PWM-Signal.
 
+
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  
+
<br/> und erzeugt somit das PWM-Signal am Ausgangs-Pin
+
  
 
[[Bild:PWM.png|center]]
 
[[Bild:PWM.png|center]]
  
  
===Genauere Erklärung:===
+
=== Genauere Erklärung ===
  
 
Der Prescaler teilt die Frequenz die vom Quarz kommt!
 
Der Prescaler teilt die Frequenz die vom Quarz kommt!
Zeile 91: Zeile 79:
 
zu der eingestellten Timerauflösung rauf, dann wieder auf  0 zurück.
 
zu der eingestellten Timerauflösung rauf, dann wieder auf  0 zurück.
 
(dann wieder von 0 auf Timerauflösung u.s.w.)
 
(dann wieder von 0 auf Timerauflösung u.s.w.)
Einmal rauf und runterzählen, ergibt ein Periode.
+
Einmal rauf- und runterzählen, ergibt ein Periode.
Die Periode ist gleich die Ausgangsfrequenz von dem PWM-Signal.
+
Die Periode ist gleich die Ausgangsfrequenz des PWM-Signals.
 
Ausgangsfrequenz = (Quarzfrequenz/Prescale ) /(Timerauflösung*2)
 
Ausgangsfrequenz = (Quarzfrequenz/Prescale ) /(Timerauflösung*2)
  
Zeile 99: Zeile 87:
  
 
oder: Quarz = 8 MHz ;  Prescaler = 8 ; Timer = 10 Bit
 
oder: Quarz = 8 MHz ;  Prescaler = 8 ; Timer = 10 Bit
ergibt:  (8000000Hz/8) / (2048*2)  = 244,14 Hz
+
ergibt:  (8000000Hz/8) / (1024*2)  = 244,14 Hz
  
Mit dem Compare Register definiert man nun das Tastverhältnis!
+
Mit dem Compare Register definiert man nun das Tastverhältnis!
 
Überall, wo nun der Timer diese Compare Linie schneidet, schaltet der Ausgang!
 
Überall, wo nun der Timer diese Compare Linie schneidet, schaltet der Ausgang!
 
Beim raufzählen des Timers auf EIN, beim runterzählen auf AUS.
 
Beim raufzählen des Timers auf EIN, beim runterzählen auf AUS.
 
  
  
Zeile 112: Zeile 99:
  
  
 
+
Als Beispiel ein Tastverhältnis von 80%
 
+
 
+
 
+
Als Beispiel ein Tastverhältnis von 80%<br/>
+
 
[[Bild:Compare51.png|center]]
 
[[Bild:Compare51.png|center]]
  
  
  
 
+
Hier sieht man, wie die Signale auf einem Oszilloskop  ausschauen.
Hier sieht man, wie die Signale dann auf einem Oszilloskop  ausschauen.
+
 
Oben das Signal von Pin15 (Compare A), unten das von Pin 16 (Compare B)
 
Oben das Signal von Pin15 (Compare A), unten das von Pin 16 (Compare B)
 
[[Bild:Osci-PWM-kleiner3.GIF|center]]
 
[[Bild:Osci-PWM-kleiner3.GIF|center]]
Zeile 136: Zeile 118:
 
$crystal = 4000000
 
$crystal = 4000000
  
Config Pinb.1 = Output
+
Config Portb.1 = Output
Config Pinb.2 = Output
+
Config Portb.2 = Output
  
 
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
 
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Zeile 159: Zeile 141:
  
 
<pre>
 
<pre>
Config Pinb.1 = Output
+
Config Portb.1 = Output
Config Pinb.2 = Output
+
Config Portb.2 = Output
 
</pre>
 
</pre>
 
Definiert die zwei Ausgänge von Timer1 auf Ausgabe.<br/>
 
Definiert die zwei Ausgänge von Timer1 auf Ausgabe.<br/>
Pinb.1 = für Compare1a (= Compare A) = Pin 15<br/>
+
Portb.1 = für Compare1a (= Compare A) = Pin 15<br/>
Pinb.2 = für Compare1b (= Compare B) = Pin 16
+
Portb.2 = für Compare1b (= Compare B) = Pin 16
  
  
Zeile 177: Zeile 159:
 
:Timer Auflösung = 8 Bit einstellen
 
: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   
+
;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.  
 
:des Compare-Wertes zuerst auf  High und dann auf Low. Bei „Clear Down“, umgekehrt.  
  
Zeile 184: Zeile 166:
  
 
;Prescale = 1
 
;Prescale = 1
:Hier wird der Prescaler auf 1 eingestellt.
+
:Hier wird der Prescaler auf 1 eingestellt.
 
:(Wert 1 heißt, direkte Frequenz vom Quarz zum Timer.)
 
:(Wert 1 heißt, direkte Frequenz vom Quarz zum Timer.)
:Weitere Teilungen, wie z.B.: 8, 64, 256 und 1024 sind möglich.
+
:Weitere Teilungen, wie z.B.: 8, 64, 256 und 1024 sind möglich.
  
  
Zeile 194: Zeile 176:
 
Compare1b = 51
 
Compare1b = 51
 
</pre>  
 
</pre>  
Hier kann man nun die Werte für das Tastverhältnis, in das Register Compare1a
+
Hier kann man nun die Werte für das Tastverhältnis, in dem Register Compare1a
und Compare1b schreiben. Oder man kann auch, satt Compare1a und 1b , die Bezeichnungen  
+
und Compare1b übergeben. Oder man kann, statt Compare1a und 1b, auch die Bezeichnungen  
Pwm1a und Pwm1b verwenden. Bascom nimmt beides.
+
Pwm1a und Pwm1b verwenden, Bascom nimmt beides.
  
  
Mit diesem kurzen Programm, hat man nun zwei PWM Signale erzeigt, wo das eine ein Tastverhältnis
+
Mit diesem kurzen Programm, hat man nun zwei [[PWM]] Signale erzeugt, bei dem eines ein Tastverhältnis
von 20% (Compare1a) und das andere von 80 % hat. :-)
+
von 20% (Compare1a) und das andere 80 % hat. :-)
  
  
 +
 +
Möchte man nun unabhängig vom Stand des Timers den PWM-Ausgang bzw. Funktion ausschalten, um damit den Ausgangspin vom OC1A auf Null zu setzen, kann dies durch:
 +
<pre>
 +
' Pin OC1A umschalten auf normale Portfunktion (PWM-ist abgeschalten)
 +
Tccr1a.7 = 0
 +
Tccr1a.6 = 0
 +
 +
' Pin OC1A wieder als PWM-Ausgang nutzen
 +
' Einschalten als Clear OC1A on Compare Match (Set output to low level).
 +
Tccr1a.7 = 1
 +
Tccr1a.6 = 0
 +
Start Timer1 ' Timer muss neu gestartet werden, PWM-Ausgang wird mit gleichem Wert aus Ocr1a ausgegeben
 +
</pre>
 +
Nachzulesen ist dies alles im Datenblatt unter Register Description: TCCR1A – Timer/Counter1 Control Register A
  
 
==Autor==
 
==Autor==
Zeile 211: Zeile 207:
 
* [[Bascom]]
 
* [[Bascom]]
 
* [[Pwm]]
 
* [[Pwm]]
 +
* [[Timer]]
 +
* [[Bascom und Timer]]
 +
  
 
[[Kategorie:Robotikeinstieg]]
 
[[Kategorie:Robotikeinstieg]]

Aktuelle Version vom 15. Februar 2014, 17:14 Uhr

PWM-Signale mit Bascom erzeugen

Grundbegriffe

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.

Folgendes Bild zeigt ein Tastverhältnis einmal von 10% und einmal von 50%

Tastverhältnis.png

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.
  • einen Motor in der Geschwindigkeit regeln.
  • mittels nachgeschaltetem RC-Filter, welcher das PWM-Signal glättet, kann eine Gleichspannung erzeugt werden die zwischen 0V und 5V geregelt werden kann.

PWM-Arten

Es gibt zwei Arten PWM-Signale in Bascom zu erzeugen:

Software PWM

Vorteile:
  • es kann (fast) jeder Ausgabe-Pin des AVR benutzt werden.
  • unter zuhilfename eines (freien) Timers können sogar mehrere verschiedene PWM-Signale auf verschiedene Pins erzeugt werden.
Nachteil:
  • Etwas grösserer Programmaufwand, da der PortPin per Software verändert werden muss.

Hardware PWM

Vorteile:
  • Sehr schnell (Maximal die Quarzfrequenz / Periode)
  • unabhängig vom Programmablauf des AVR
Nachteile:
  • Je nach AVR können nur bestimmte Timer mit bestimmten Ausgangspins dafür verwendet werden.
  • belegt den Timer, der für keine weiteren funktionen verwendet werden kann.


Beim einem ATMega8 stehen drei Hardware-PWM-Ausgänge verteilt auf zwei Timer zur Verfügung.

Mit Timer1 können zwei PWM Signale erzeugt werden (Compare A => OC1A - Pin 15 und Compare B => OC1B - Pin 16).

Die Auflösung kann auf 8, 9 und 10 Bit eingestellt werden, also max. 1024 Abstufungen.

Timer2 kann ein PWM-Signal mit einer Auflösung von 8 Bit erzeugen

(Compare Register => OC2 - Pin 17)

PWM-Ablauf

Das folgende Bild zeigt den Ablauf bei Timer1. Als Taktquelle dient die CPU-Frequenz, dessen Frequenz im Prescaler (Vorteiler) nochmal verkleinert werden kann. Je nach eingestelltem Wert in den Output Compare Registern wird der Status des Ausgangs-Pin entsprechend oft umgeschaltet, und erzeugt somit das PWM-Signal.

PWM.png


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 die 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 des PWM-Signals. 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) / (1024*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%

Compare205.png


Als Beispiel ein Tastverhältnis von 80%

Compare51.png


Hier sieht man, wie die Signale auf einem Oszilloskop ausschauen. Oben das Signal von Pin15 (Compare A), unten das von Pin 16 (Compare B)

Osci-PWM-kleiner3.GIF

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 Portb.1 = Output
Config Portb.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 Portb.1 = Output
Config Portb.2 = Output

Definiert die zwei Ausgänge von Timer1 auf Ausgabe.
Portb.1 = für Compare1a (= Compare A) = Pin 15
Portb.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 dem Register Compare1a und Compare1b übergeben. Oder man kann, statt Compare1a und 1b, auch die Bezeichnungen Pwm1a und Pwm1b verwenden, Bascom nimmt beides.


Mit diesem kurzen Programm, hat man nun zwei PWM Signale erzeugt, bei dem eines ein Tastverhältnis von 20% (Compare1a) und das andere 80 % hat. :-)


Möchte man nun unabhängig vom Stand des Timers den PWM-Ausgang bzw. Funktion ausschalten, um damit den Ausgangspin vom OC1A auf Null zu setzen, kann dies durch:

' Pin OC1A umschalten auf normale Portfunktion (PWM-ist abgeschalten)
Tccr1a.7 = 0
Tccr1a.6 = 0

' Pin OC1A wieder als PWM-Ausgang nutzen
' Einschalten als Clear OC1A on Compare Match (Set output to low level).
Tccr1a.7 = 1
Tccr1a.6 = 0
Start Timer1 ' Timer muss neu gestartet werden, PWM-Ausgang wird mit gleichem Wert aus Ocr1a ausgegeben 

Nachzulesen ist dies alles im Datenblatt unter Register Description: TCCR1A – Timer/Counter1 Control Register A

Autor

Siehe auch


LiFePO4 Speicher Test