<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mat-sche</id>
		<title>RN-Wissen.de - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mat-sche"/>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/Mat-sche"/>
		<updated>2026-04-11T20:44:58Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bascom_und_PWM&amp;diff=23515</id>
		<title>Bascom und PWM</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bascom_und_PWM&amp;diff=23515"/>
				<updated>2014-02-15T16:14:34Z</updated>
		
		<summary type="html">&lt;p&gt;Mat-sche: /* Grundprogramm */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PWM-Signale mit Bascom erzeugen ==&lt;br /&gt;
&lt;br /&gt;
===Grundbegriffe===&lt;br /&gt;
Bei der ''Puls-Weiten-Modulation'' ([[PWM]]) wird ein digitales Ausgangssignal erzeugt, dessen Tastverhältnis moduliert wird.&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
gleich! &lt;br /&gt;
Es ändert sich nur die Länge von High zu Low.&lt;br /&gt;
&lt;br /&gt;
Folgendes Bild zeigt ein Tastverhältnis einmal von 10% und einmal von 50%&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tastverhältnis.png|center]]&lt;br /&gt;
&lt;br /&gt;
Man könnte das in etwa mit einem Wasserhahn vergleichen, den man z.B. alle Minuten betätigt.&lt;br /&gt;
Wenn man ihn in jeder Minute nur kurz aufdreht und dann gleich wieder zumacht, &lt;br /&gt;
kommt in Summe nur wenig Wasser raus. &lt;br /&gt;
Wenn man ihn aber in jeder dieser Minuten länger offen lässt,  &lt;br /&gt;
kommt mehr Wasser raus.&lt;br /&gt;
&lt;br /&gt;
Der Rhythmus bleibt immer gleich, aber es ändert sich in Summe die Wassermenge,&lt;br /&gt;
die raus kommt.&lt;br /&gt;
&lt;br /&gt;
Mit dem [[PWM]]-Signal kann man nun tolle Sachen machen. &amp;lt;br /&amp;gt;&lt;br /&gt;
Zum Beispiel:&lt;br /&gt;
* 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.&lt;br /&gt;
* einen Motor in der Geschwindigkeit regeln. &lt;br /&gt;
* mittels nachgeschaltetem RC-Filter, welcher das [[PWM]]-Signal glättet, kann eine Gleichspannung erzeugt werden die zwischen 0V und 5V geregelt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== PWM-Arten ===&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Arten PWM-Signale in Bascom zu erzeugen:&lt;br /&gt;
&lt;br /&gt;
==== Software PWM ====&lt;br /&gt;
:'''Vorteile''': &lt;br /&gt;
::* es kann (fast) jeder Ausgabe-Pin des AVR benutzt werden.&lt;br /&gt;
::* unter zuhilfename eines (freien) [[Timer]]s k&amp;amp;ouml;nnen sogar mehrere verschiedene PWM-Signale auf verschiedene Pins erzeugt werden.&lt;br /&gt;
:'''Nachteil''': &lt;br /&gt;
::* Etwas gr&amp;amp;ouml;sserer Programmaufwand, da der PortPin per Software verändert werden muss.&lt;br /&gt;
&lt;br /&gt;
==== Hardware PWM ====&lt;br /&gt;
:'''Vorteile''':&lt;br /&gt;
::* Sehr schnell (Maximal die Quarzfrequenz / Periode)&lt;br /&gt;
::* unabhängig vom Programmablauf des AVR&lt;br /&gt;
:'''Nachteile''':&lt;br /&gt;
::* Je nach AVR k&amp;amp;ouml;nnen nur bestimmte Timer mit bestimmten Ausgangspins daf&amp;amp;uuml;r verwendet werden.&lt;br /&gt;
::* belegt den Timer, der für keine weiteren funktionen verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim einem [[ATMega8]] stehen drei Hardware-PWM-Ausg&amp;amp;auml;nge verteilt auf zwei Timer zur Verf&amp;amp;uuml;gung.&lt;br /&gt;
&lt;br /&gt;
Mit Timer1 können zwei PWM Signale erzeugt werden &lt;br /&gt;
(Compare A =&amp;gt; OC1A - Pin 15 und Compare B =&amp;gt; OC1B - Pin 16).&lt;br /&gt;
&lt;br /&gt;
Die Auflösung kann auf 8, 9 und 10 Bit eingestellt werden, also max. 1024 Abstufungen.&lt;br /&gt;
&lt;br /&gt;
Timer2 kann ein PWM-Signal mit einer Auflösung von 8 Bit erzeugen&lt;br /&gt;
&lt;br /&gt;
(Compare Register =&amp;gt; OC2 - Pin 17)&lt;br /&gt;
&lt;br /&gt;
=== PWM-Ablauf ===&lt;br /&gt;
&lt;br /&gt;
Das folgende Bild zeigt den Ablauf bei Timer1. Als Taktquelle dient die CPU-Frequenz, dessen Frequenz im Prescaler (Vorteiler) nochmal verkleinert werden kann.&lt;br /&gt;
Je nach eingestelltem Wert in den ''Output Compare Registern'' wird der Status des Ausgangs-Pin entsprechend oft umgeschaltet, &lt;br /&gt;
und erzeugt somit das PWM-Signal.&lt;br /&gt;
&lt;br /&gt;
[[Bild:PWM.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Genauere Erklärung ===&lt;br /&gt;
&lt;br /&gt;
Der Prescaler teilt die Frequenz die vom Quarz kommt!&lt;br /&gt;
Bei Teilung 1 geht die vollständige Frequenz zum Timer.&lt;br /&gt;
Bei Teilung 8 nur ein Achtel der Quarzfrequenz.&lt;br /&gt;
(Also bei 8 MHz Quarz kommen zum Timer dann nur 1 MHz )&lt;br /&gt;
Bei Teilung 1024  sind es dann z.B. 8 MHz/1024 = 7,8125kHz &lt;br /&gt;
&lt;br /&gt;
Der Timer ist hier der Zähler für die PWM.&lt;br /&gt;
Er zählt mit der Frequenz, die vom Prescaler kommt, einmal von 0 bis&lt;br /&gt;
zu der eingestellten Timerauflösung rauf, dann wieder auf  0 zurück.&lt;br /&gt;
(dann wieder von 0 auf Timerauflösung u.s.w.)&lt;br /&gt;
Einmal rauf- und runterzählen, ergibt ein Periode.&lt;br /&gt;
Die Periode ist gleich die Ausgangsfrequenz des PWM-Signals.&lt;br /&gt;
Ausgangsfrequenz = (Quarzfrequenz/Prescale ) /(Timerauflösung*2)&lt;br /&gt;
&lt;br /&gt;
z.B.: Quarz = 8 MHz ;  Prescaler = 1 ; Timer = 8 Bit&lt;br /&gt;
ergibt:  (8000000Hz/1) / (256*2)  = 15,625 kHz&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder: Quarz = 8 MHz ;  Prescaler = 8 ; Timer = 10 Bit&lt;br /&gt;
ergibt:  (8000000Hz/8) / (1024*2)  = 244,14 Hz&lt;br /&gt;
&lt;br /&gt;
Mit dem Compare Register definiert man nun das Tastverhältnis!&lt;br /&gt;
Überall, wo nun der Timer diese Compare Linie schneidet, schaltet der Ausgang!&lt;br /&gt;
Beim raufzählen des Timers auf EIN, beim runterzählen auf AUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als Beispiel ein Tastverhältnis von 20%&lt;br /&gt;
[[Bild:Compare205.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als Beispiel ein Tastverhältnis von 80%&lt;br /&gt;
[[Bild:Compare51.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hier sieht man, wie die Signale auf einem Oszilloskop  ausschauen.&lt;br /&gt;
Oben das Signal von Pin15 (Compare A), unten das von Pin 16 (Compare B)&lt;br /&gt;
[[Bild:Osci-PWM-kleiner3.GIF|center]]&lt;br /&gt;
&lt;br /&gt;
=== Grundprogramm ===&lt;br /&gt;
&lt;br /&gt;
Hier nun ein Grundprogramm für die Ausgabe von zwei PWM Signalen mit dem Timer1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
' Hardware PWM mit Timer1&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
$crystal = 4000000&lt;br /&gt;
&lt;br /&gt;
Config Portb.1 = Output&lt;br /&gt;
Config Portb.2 = Output&lt;br /&gt;
&lt;br /&gt;
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
 Compare1a = 205&lt;br /&gt;
 Compare1b = 51&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Erklärung:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
$crystal = 8000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert den Mega8 und den 8MHz Quarz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Config Portb.1 = Output&lt;br /&gt;
Config Portb.2 = Output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert die zwei Ausgänge von Timer1 auf Ausgabe.&amp;lt;br/&amp;gt;&lt;br /&gt;
Portb.1 = für Compare1a (= Compare A) = Pin 15&amp;lt;br/&amp;gt;&lt;br /&gt;
Portb.2 = für Compare1b (= Compare B) = Pin 16&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Config Timer1 = Pwm&lt;br /&gt;
: Timer1 auf  PWM  einstellen&lt;br /&gt;
&lt;br /&gt;
;Pwm = 8 &lt;br /&gt;
:Timer Auflösung = 8 Bit einstellen&lt;br /&gt;
&lt;br /&gt;
;Compare A Pwm = Clear Up:Definiert, wie der Compare A schalten soll. Bei „Clear Up“ schaltet der Ausgang beim erreichen  &lt;br /&gt;
:des Compare-Wertes zuerst auf  High und dann auf Low. Bei „Clear Down“, umgekehrt. &lt;br /&gt;
&lt;br /&gt;
;Compare B Pwm = Clear Up&lt;br /&gt;
:Das gleiche noch mal mit Compare B                                          &lt;br /&gt;
&lt;br /&gt;
;Prescale = 1&lt;br /&gt;
:Hier wird der Prescaler auf 1 eingestellt.&lt;br /&gt;
:(Wert 1 heißt, direkte Frequenz vom Quarz zum Timer.)&lt;br /&gt;
:Weitere Teilungen, wie z.B.: 8, 64, 256 und 1024 sind möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Compare1a = 205&lt;br /&gt;
Compare1b = 51&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Hier kann man nun die Werte für das Tastverhältnis, in dem Register Compare1a&lt;br /&gt;
und Compare1b übergeben. Oder man kann, statt Compare1a und 1b, auch die Bezeichnungen &lt;br /&gt;
Pwm1a und Pwm1b verwenden, Bascom nimmt beides.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit diesem kurzen Programm, hat man nun zwei [[PWM]] Signale erzeugt, bei dem eines ein Tastverhältnis&lt;br /&gt;
von 20% (Compare1a) und das andere 80 % hat. :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
' Pin OC1A umschalten auf normale Portfunktion (PWM-ist abgeschalten)&lt;br /&gt;
Tccr1a.7 = 0&lt;br /&gt;
Tccr1a.6 = 0&lt;br /&gt;
&lt;br /&gt;
' Pin OC1A wieder als PWM-Ausgang nutzen&lt;br /&gt;
' Einschalten als Clear OC1A on Compare Match (Set output to low level).&lt;br /&gt;
Tccr1a.7 = 1&lt;br /&gt;
Tccr1a.6 = 0&lt;br /&gt;
Start Timer1 ' Timer muss neu gestartet werden, PWM-Ausgang wird mit gleichem Wert aus Ocr1a ausgegeben &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nachzulesen ist dies alles im Datenblatt unter Register Description: TCCR1A – Timer/Counter1 Control Register A&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*  [[Benutzer:Roberto|Roberto]]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Avr]]&lt;br /&gt;
* [[Bascom]]&lt;br /&gt;
* [[Pwm]]&lt;br /&gt;
* [[Timer]]&lt;br /&gt;
* [[Bascom und Timer]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Quellcode Bascom]]&lt;/div&gt;</summary>
		<author><name>Mat-sche</name></author>	</entry>

	</feed>