<?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=Joe-19</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=Joe-19"/>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/Joe-19"/>
		<updated>2026-04-11T21:16:31Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Schrittmotoren&amp;diff=23743</id>
		<title>Schrittmotoren</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Schrittmotoren&amp;diff=23743"/>
				<updated>2014-03-26T09:59:18Z</updated>
		
		<summary type="html">&lt;p&gt;Joe-19: /* Weblinks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Was ist ein Schrittmotor==&lt;br /&gt;
&lt;br /&gt;
Schrittmotoren arbeiten völlig anders als Gleichstrommotoren. Das ist schon daran zu erkennen, dass diese keine zwei, sondern meist 4, 6 oder 8 Anschlüsse (bipolare oder unipolare Motoren) besitzen. Demzufolge ist es also nicht damit getan, irgendwo Spannung anzulegen, um den Motor zum Drehen zu bewegen. Aber keine Sorge, sehr kompliziert ist es dennoch nicht. &lt;br /&gt;
&lt;br /&gt;
Ein Schrittmotor (oft auch ''Stepper'' genannt) ist ein Synchronmotor, bei dem der Rotor (drehbares Motorteil mit der Welle) bei geschickter Wahl der angesteuerten Statorspulen (nichtdrehbarer Motorteil) gezielt um einen Winkel gedreht werden kann. Auf diese Weise kann man in mehreren Schritten jeden Drehwinkel, wenn er ein Vielfaches des minimalen Drehwinkels ist, anfahren.&lt;br /&gt;
&lt;br /&gt;
==Wie unterscheidet man Schrittmotoren==&lt;br /&gt;
Man unterscheidet den Schrittmotor nach seiner Bauform in Reluktanzmotor und Permanentmagnetmotor, wobei man beide Formen auch zu einem Hybridschrittmotor kombinieren kann. &lt;br /&gt;
Beim Reluktanzschrittmotor besteht der Rotor aus einem gezahnten Weicheisenkern. Dieses Material gewährleistet nach dem Ausschalten des Statorstromes das Verschwinden jedes Rest-Magnetfeldes. Dadurch kann der magnetische Fluss bei eingeschaltetem Strom ungehindert durch den Weicheisenkern fließen. Die Drehbewegung des Rotors kommt zustande, weil so der Abstand zwischen dem nächstliegendem Zahn des Rotors und dem Stator verringert werden kann und der magnetische Widerstand verringert wird. &lt;br /&gt;
&lt;br /&gt;
Beim Permanentmagnetschrittmotor besteht der Stator aus Weicheisen und der Rotor aus Dauermagneten, die abwechselnd einen Nord- und einen Südpol aufweisen. Mit dem Stator-Magnetfeld richtet man den dauermagnetischen Rotor so aus, dass eine Drehbewegung entsteht. &lt;br /&gt;
&lt;br /&gt;
Da der Reluktanzschrittmotor keine Permanentmagnete enthält, hat er daher im Gegensatz zum Permanentmagnetschrittmotor auch kein Rastmoment bei ausgeschaltetem Strom. Beim Permanentmagnetschrittmotor ist die Anzahl der Pole (und damit die Auflösung) begrenzt. Der Hybridschrittmotor vereint die Eigenschaften beider Bauformen, in dem auf den Permanentmagneten noch ein gezahnter Weicheisenkranz eingefügt wird. Nahezu alle heute erhältlichen Schrittmotoren sind Hybridmotoren. Als High-Torque Motoren (=hohes Drehmoment) werden häufig Typen bezeichnet, bei denen für den Rotor besonders starke Seltenerdenmagnete verwendet werden. So lässt sich eine besonders hohe Kraftdichte erzielen. &lt;br /&gt;
&lt;br /&gt;
Typische Anwendungsgebiete sind Drucker, vor allem Matrixdrucker, oder der Antrieb des Schreib-/Lesekopfes in einem Diskettenlaufwerk. Da Schrittmotoren (solange sie nicht überlastet werden) exakt dem außen angelegten Feld folgen, können sie ohne Sensoren zur Positionsrückmeldung (Encoder, Drehgeber oder ähnliches) betrieben werden (Synchronmotorverhalten). Daher können sie im Gegensatz zu Servomotoren gesteuert betrieben werden. Servos müssen auf Position geregelt werden. &lt;br /&gt;
&lt;br /&gt;
Schrittmotoren existieren auch in Form von Linearmotoren. Schrittmotoren können bis ca. 1 kW wirtschaftlich eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
==Prinzip der Schrittmotoren==&lt;br /&gt;
&lt;br /&gt;
Der bipolare Motor besitzt zwei Spulen, und da jede Spule nun mal zwei Enden hat, also 4 Anschlüsse. Der unipolare Motor ist ebenfalls so aufgebaut, jedoch wird hier noch jede Spule in der Mitte durch eine Anschlussleitung angezapft (siehe Bild)&lt;br /&gt;
&lt;br /&gt;
[[Bild:schrittmotorprinzip.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um den Motor nun in Bewegung zu bringen, muss an den Spulen eine Spannung angelegt werden. Legt man die Mittelanzapfung auf Masse, so hat man also noch 4 Anschlüsse. Legt  man nun an zwei dieser Anschlüsse die Spannung an, bewegt sich der Motor - allerdings nur einen winzigen kaum sichtbaren Schritt. Wie groß ein Schritt ist, hängt vom jeweiligen Motor ab. Bei den meisten Motoren beträgt der Schrittwinkel 1,8 Grad. Das bedeutet, dass 200 Schritte notwendig sind, um die Achse einmal rund zu drehen. Nachdem der Motor nun einen Schritt gemacht hat, muss die Spannung an einer anderen Kombination von Anschlüssen eingeschaltet werden. Es gibt somit 4 Kombinationen, wobei immer zwei Anschlüsse an die Spannung und zwei andere auf 0 V gelegt werden. Dies ist die sogenannte unipolare Ansteuerung. Wechselt man ständig diese verschiedenen Anschlussbelegungen, so würde sich der Motor mit jeder Änderung einen Schritt drehen.&lt;br /&gt;
&lt;br /&gt;
==Schrittmotoransteuerung==&lt;br /&gt;
Um dies zu erreichen, benötigt man entweder eine elektronische Schaltung oder man verbindet die einzelnen Spulenenden jeweils mit einem Port eines Microcontrollers. Vorsicht, natürlich nicht direkt verbinden. Die Leistung eines Ports reicht natürlich niemals aus, um einen Motor zu bewegen. Ein Motortreiber (Verstärker) muss also schon dazwischen geschaltet werden. Zum Beispiel der Schaltkreis L293D, siehe Zeichnung. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:schrittmotorprinzip2.gif|center]]&lt;br /&gt;
&lt;br /&gt;
oder aber der stärkere L6205:&lt;br /&gt;
&lt;br /&gt;
[[Bild:l6205.gif|center]]&lt;br /&gt;
&lt;br /&gt;
Nun müsste der Microcontroller also nur noch eine 4-stellige Bitfolge ausgeben, um den Motor an den 4 Anschlüssen ständig in einer bestimmten Kombination mit Spannung zu versorgen.. Bei jeder Portausgabe würde sich somit der Schrittmotor einen Schritt bewegen. Das Ganze könnte natürlich in der Software in einer Schleife gemacht werden. Der Schleifenindex würde somit die Zahl der Schritte angeben. Der große Vorteil bei Schrittmotoren ist, dass man durch diese Methode ganz genau festlegen kann, wie weit sich ein Schrittmotor dreht. Man kann somit auch genau ausrechnen, wie viel Schritte pro Radumdrehung notwendig sind. Nutzt man keine Untersetzung (was ich allerdings noch zusätzlich empfehlen würde) so bräuchte man bei den meisten Motoren wie schon erwähnt 200 Schritte pro Radumdrehung. Berechnet man dann den Umfang des Rades, so kann man genau ausrechnen, wie viele Schritte pro cm Fahrtstrecke notwendig sind. So könnte man schnell eine Routine schreiben, welche als Parameter die Fahrtstrecke entgegennimmt und dann daraus die Schritte errechnet und in einer Schleife an die Ports weitergibt. &lt;br /&gt;
&lt;br /&gt;
Genauer lässt sich ein Roboter eigentlich kaum steuern. Ein Schrittmotor bewegt sich nur bei einem Schritt, ansonsten sorgt das Haltemoment dafür, dass er sich nicht weiter bewegt. Nachteil ist nur, dass der Motor auch im Stand mit Strom versorgt wird, damit er sich nicht bei unebenen Böden oder an Steigungen bewegt. Bei Robotern, die sich nur in der Wohnung bewegen, kann man oft auch in der Praxis die Spannung abschalten, ohne dass sich der Motor bewegt, insbesondere wenn man vielleicht durch einen Zahnriemen noch eine Untersetzung von 4:1 oder 6:1 eingebaut hat.&lt;br /&gt;
&lt;br /&gt;
In der Tat werden viele Roboter schon auf diese Weise gesteuert. Optimal ist diese Methode allerdings nicht, insbesondere bei schweren Robotern reicht die Kraft bei dieser Art Steuerung nicht aus, dies wird leider in vielen Artikeln zu diesem Thema verschwiegen. Wenn ein Motor zu schwach ist, können auch Schritte verloren gehen, wenn die Kraft nicht ausreicht um z.B. einen höheren Teppichrand zu überfahren. Dadurch würde die genaue Positionierung wieder gestört.&lt;br /&gt;
&lt;br /&gt;
Gleich dazu mehr. Erwähnen möchte ich erst noch kurz die bipolaren Motoren mit 4 Anschlüssen (also ohne Mittelanzapfung). Diese sind im Prinzip nicht anders aufgebaut als die unipolaren. Da sie jedoch keine Mittelanzapfung besitzen, wird das unterschiedliche Magnetfeld dadurch erreicht, dass man die Spannung an den Spulenenden immer umpolt. Lange Zeit galt das für Bastler als etwas zu kompliziert, daher wurde die unipolare Ansteuerung oft vorgezogen. Durch neue integrierte Schaltkreise wie den L298 ist das aber auch kein Problem mehr. Erwähnen möchte ich noch die Motoren mit 8 Anschlüssen. Im Prinzip sind das Motoren, in denen die beiden Spulen in der Mitte aufgetrennt und herausgeführt wurden. Diese Motoren erlauben wahlweise eine bipolare oder unipolare Ansteuerung. Man kann die Leistung und Anschlusswerte auch verändern, indem man hier die 4 Spulen (sind ja nun quasi 4 durch die Auftrennung) entweder parallel oder in Serie schaltet.&lt;br /&gt;
&lt;br /&gt;
Hier alle denkbaren Ansteuerungsmöglichkeiten bei den unterschiedlichen Motoren (die Farbangaben können bei den Motoren sehr unterschiedlich sein):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:schrittmotorprinzip3.gif|center]]&lt;br /&gt;
&lt;br /&gt;
==Ansteuerarten==&lt;br /&gt;
&lt;br /&gt;
Die einfachste Art, einen Schrittmotor zu betreiben, ist der sogenannte WaveDrive-Betrieb, bei dem immer nur eine Spule stromerfüllt ist. Dies ist am Einfachsten zu realisieren, birgt aber ein geringes Drehmoment. Die Positionen, die der Rotor einnehmen kann, liegen bei 0, 90, 180 und 270 Grad. Werden dagegen immer zwei benachbarte Spulen mit Strom versorgt, gelangt man zum sog. Vollschrittbetrieb und erreicht ein größeres Drehmoment. Die Positionen liegen hier genau zwischen den Positionen beim WaveDrive-Betrieb. Werden beide Betriebsarten kombiniert, also immer abwechselnd eine oder beide Spulen versorgt, können insgesamt schon 8 Positionen angefahren werden. Dies nennt man Halbschrittbetrieb. Führt man diese Idee weiter, so gelangt man zu einem idealen Drehfeld: Beide Spulenpaare werden mit einer Sin/Cos-Welle angesteuert, sodass sich ein nahezu idealer Rundlauf ergibt. Die Vorteile des Mehrschrittbetriebs liegen auf der Hand: Der Kraftverlauf wird bei kleineren Schritten gleichmäßiger, die Gefahr des Schrittverlustes sinkt und der Motor wird deutlich leiser.&lt;br /&gt;
&lt;br /&gt;
==Schrittmotoren in Bezug auf Roboter==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Schrittmotor.jpg|right]]&lt;br /&gt;
Schrittmotoren eignen sich vorzüglich für Roboter. Insbesondere für Roboter, die sich nur im Haus bewegen und weniger als 20 kg wiegen, halte ich persönlich Schrittmotoren für die 1. Wahl. Sie zeichnen sich dadurch aus, dass die Steuerung besonders leicht und präzise per Software möglich ist. Oft hört man in Foren, dass Schrittmotoren im Vergleich zu Getriebemotoren recht schwach seien. Dazu ist zu sagen, dass dieser Vergleich etwas hinkt. Ein Schrittmotor könnte ja auch mit einem Getriebe versehen werden. Also wenn man Getriebemotoren schon mit Schrittmotoren vergleicht, dann müssten beide über ein Getriebe verfügen. Natürlich gibt es auch Schrittmotoren mit Getriebe. Allerdings braucht man bei Schrittmotoren oft gar kein Getriebe, denn die Kraft ohne Getriebe ist nämlich in der Regel wesentlich höher als bei den Gleichstrommotoren. Auch niedrige Drehzahlen sind bei Schrittmotoren kein Problem, sogar von Vorteil. Je niedriger die Drehzahl, desto höher ist bei Schrittmotoren das Drehmoment.&lt;br /&gt;
Dass es trotzdem immer wieder bei Einsteigern Probleme mit der Wahl des richtigen Schrittmotors gibt, liegt vorwiegend am mangelnden Wissen über das Stromverhalten dieser Motoren. Dazu später ein paar Tipps, die zeigen, dass man auch schwere Roboter durchaus mit recht kleinen Motoren bewegen kann. Zuvor aber ein paar Grundlagen für Einsteiger. Anwender, die sich schon etwas mit Schrittmotoren auskennen, können den nächsten Absatz überspringen&lt;br /&gt;
&lt;br /&gt;
==Fehler, die bei der Motorwahl oft gemacht werden==&lt;br /&gt;
&lt;br /&gt;
Bei der Auswahl eines Schrittmotors sollte man sorgfältig vorgehen. Kleine Motoren, wie sie in Druckern oder Floppys stecken, reichen in der Regel wirklich nur für Roboter der Fliegengewichtsklasse aus. Wenn ein Roboter ein paar kg wiegt, dann braucht man schon etwas mehr Power. Hier sollte man immer auf das Haltemoment achten, dies entspricht fast dem Drehmoment. Mit einem Motor, der 40 Ncm Haltemoment besitzt kann man schon einiges anfangen. Bei einigen Versuchen hab ich durchaus Roboter mit 10 kg ohne Schrittverlust damit bewegt. Allerdings hab ich noch eine Untersetzung 6:1 über Riemen eingebaut. Wenn man sicher gehen will, dann nimmt man immer einen etwas stärkeren Motor. Ein 100 Ncm Motor kommt oft noch mit 6 oder 7 VA (Watt) aus.&lt;br /&gt;
Es ist ein Irrtum, dass sich die Größe des Motors linear mit der Kraft ändert. Es gibt zahlreiche Motoren, welche die gleiche Größe aufweisen und dennoch ganz unterschiedlich stark sind. Ein Standardmaß ist 56 x 56 mm. In der Regel findet man in dieser Größe schon starke Motoren, die keine Wünsche mehr offen lassen.&lt;br /&gt;
&lt;br /&gt;
Ein Fehler, der bei der Auswahl des Motors oft gemacht wird, ist die Betriebsspannung. Auch ich habe am Anfang gedacht, dass man bei einer vorhandenen Spannung von 12 V am besten einen Motortyp mit 12 V kaufen muss. Dies ist zwar nicht ganz falsch, aber wird nie zu großer Leistung führen. Wichtig für den Motor ist, dass der angegebene Strom fließt. Ein Motor, bei dem beispielsweise 12 V und 0,5 A angegeben sind, wird in der Praxis nur bei wirklich sehr niedrigen Drehzahlen seine Kraft, also sein Drehmoment, erreichen. Je höher die Drehzahl, desto schwächer wird der Motor. Das kann soweit gehen, dass schon das geringste Hindernis den Motor Schritte verlieren lässt oder dass der Motor bei höheren Drehzahlen gar nicht mehr anläuft.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:stepperdrehmoment.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Woran liegt dies? Ganz einfach: Ein Schrittmotor hat auch eine Induktivität. Da der Motor ständig umgepolt wird, wird durch diese Induktivität eine Art Gegenstrom erzeugt. Dies hat zur Folge, dass der eigentliche Strom bei höheren Drehzahlen nicht mehr erreicht wird. Je schneller sich der Motor dreht, desto weniger Strom fließt. Verständlich, dass dadurch die Leistung reduziert wird.&lt;br /&gt;
&lt;br /&gt;
Wie kann man diesem Verhalten entgegenwirken? Ganz einfach mit einer wesentlich höheren Spannung als auf dem Motor angegeben. Doch Vorsicht, so einfach geht es nicht. Wenn der Motor steht oder sich langsam dreht, dann würde der Motor ja sofort durchbrennen. Die Lösung ist eine stromgeregelte Steuerung!  Die Regelung wird mit einer hohen Spannung (oft bis zu 30 oder 40 Volt) versorgt. Aber die Regelung sorgt dafür, dass immer nur der eingestellte Nennstrom, in unserem Beispiel 0,5 A, zum Motor gelangt. Auf diese Art und Weise wird der Motor, ohne Schaden zu nehmen, immer mit der optimalen Spannung versorgt.&lt;br /&gt;
&lt;br /&gt;
In der Tat werden heute alle Schrittmotoren, die etwas Leistung bringen müssen, z.B. bei Drehmaschinen, auf diese Art angesteuert. Das Ganze klingt nun recht kompliziert und aufwendig für einen Roboter-Hobbybastler. Ist es aber nicht, denn es gibt heute zwei integrierte Schaltkreise, die einen das Ganze recht einfach machen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Schaltung zum Ansteuern eines Schrittmotors mit L298 und L297==&lt;br /&gt;
&lt;br /&gt;
Die hier abgebildete Schaltung ist quasi der Standard für Schrittmotoren. Auch bei Drehmaschinen wird diese Schaltung oft eingesetzt. &lt;br /&gt;
&lt;br /&gt;
[[Bild:l298standard.gif|center| Widerstand RS1, RS2: 1 oder 0,5 Ohm (bei größerer Belastung); Dioden: schnelle Dioden z.B. BYV27-200]]&lt;br /&gt;
&lt;br /&gt;
Die Schaltung lässt sich recht einfach auf einer Experimentierplatine  aufbauen, es gibt jetzt aber auf vielfachen Wunsch auch eine fertig erhältliche Platine für Einsteiger. Seit neustem gibts die Schaltung auch als Fertigmodul.&lt;br /&gt;
&lt;br /&gt;
[[Bild:rnstepp297_platine390.jpg|center| Eine erhältliche Platine erleichtert den Aufbau der Schaltung erheblich]]&lt;br /&gt;
&lt;br /&gt;
Bedenkt man, dass auch bei einem Gleichstrommotor ein Motortreiber notwendig ist, dann ist diese Schaltung auch nicht viel komplexer. Die einzelnen Steuerleitungen können direkt mit den Ports eines Microcontrollers ([[Controllerboard]]) oder mit dem Parallelport eines PCs verbunden werden. Hier die Bedeutung:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;background:transparent; padding:0px; margin:0px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| {{Blauetabelle}} &lt;br /&gt;
|-&lt;br /&gt;
|{{Hintergrund1}} | Bezeichnung&lt;br /&gt;
|{{Hintergrund1}} width=40| Pin #&lt;br /&gt;
|{{Hintergrund1}} | Erklärung&lt;br /&gt;
|- &lt;br /&gt;
| '''CW/CCW'''&lt;br /&gt;
|  17&lt;br /&gt;
| Gibt die Richtung an, in die der Motor bewegt werden soll&lt;br /&gt;
(CW = ClockWise = im Uhrzeigersinn, CCW = CounterClockWise = gegen den Uhrzeigersinn)&lt;br /&gt;
|- &lt;br /&gt;
| '''Clock'''&lt;br /&gt;
|  18&lt;br /&gt;
| Durch einen kurzen Impuls auf diese Leitung wird der Motor einen Schritt bewegt. In einer Schleife braucht mal also nur diese Leitung kurz ein- und auszuschalten. Der Schritt wird bei steigender Flanke ausgelöst (beim Wechsel des anliegenden Zustandes von &amp;quot;low&amp;quot; zu &amp;quot;high&amp;quot;)&lt;br /&gt;
|- &lt;br /&gt;
| '''Half/Full'''&lt;br /&gt;
|  19&lt;br /&gt;
| Gewöhnlich legt man den Anschluss auf Masse. Legt man ihn auf 5 V, dann werden immer halbe Schritte durchgeführt, also doppelt so viele Schritte pro Umdrehung&lt;br /&gt;
|- &lt;br /&gt;
| '''Enable'''&lt;br /&gt;
|  10&lt;br /&gt;
| Wenn man diesen Anschluss auf Masse legt, wird die Motorspannung ausgeschaltet&lt;br /&gt;
|-&lt;br /&gt;
|'''Vref'''&lt;br /&gt;
|  15&lt;br /&gt;
| Hier muss eine Spannung zwischen 0 und 3 Volt angelegt werden. Die Spannung legt den maximalen Motorstrom fest.&lt;br /&gt;
VRef berechnet sich nach folgender Formel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{ref} = I_{Motorstrom} \cdot  R_s&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Angenommen, Sie haben einen Motor, der 0,5 A Strom verträgt und einen 1 Ohm Widerstand für Rs gewählt, sieht die Rechnung so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Vref=0,5A  \cdot  1 \Omega = 0,5V&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man muss also an Vref eine Spannung von 0,5 V anlegen. Am Einfachsten geht das, indem man zwischen 5 V und Masse ein 10-k-Poti und den Schleifer an Vref legt. Damit man die 3 Volt nicht überschreitet kann man zwischen 5 V und Poti noch einen 6 kOhm Widerstand legen.&lt;br /&gt;
|-&lt;br /&gt;
|'''RESET'''&lt;br /&gt;
|  20&lt;br /&gt;
| Bringt Schrittmotor in Grundstellung (dieser Anschluss muss auf +5 V gelegt werden, damit die Schaltung funktioniert [http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=16449&amp;amp;postdays=0&amp;amp;postorder=asc&amp;amp;start=22 Quelle])&lt;br /&gt;
|-&lt;br /&gt;
|'''Control'''&lt;br /&gt;
|  11&lt;br /&gt;
| Mit diesem Anschluss kann man die Art des [[Chopper Betrieb]]s ändern. Ist der Control Eingang  auf high, dann klingt der Motorstrom langsam ab (Phasen Chopping), zum schnellen Abklingen setzt man ihn auf low (Inhibit Chopping).&lt;br /&gt;
|-&lt;br /&gt;
|'''Sync, Home'''&lt;br /&gt;
|  1,3&lt;br /&gt;
| Diese Anschlüsse kann man meist vernachlässigen und unbelegt lassen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;float:right; background:transparent; padding:0px; margin:0px;&amp;quot;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [[Bild:l298eigenbau.jpeg|thumb|200px|right|Meine erste Schrittmotoransteuerung. Nicht schön - aber es funktionierte :-)]]&lt;br /&gt;
[[Bild:rnstepp297.jpeg|thumb|200px|right|Die gleiche Schaltung heute als Bausatz oder Fertigmodul RN-Stepp297 für einen Schrittmotor - nur noch 1/4 so groß!]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, braucht man also nur 3 Port-Pins, um einen Schrittmotor in beliebige Richtungen und in beliebiger Geschwindigkeit bewegen zu können. Kommt noch ein Motor hinzu, dann könnte man die Enable-Leitung beider verbinden, sodass dann zwei Motoren mit 5 Ports-Pins optimal gesteuert werden können. Ich habe mit einer solchen Schaltung auf einer Experimentierplatine schon einen 15-kg-Roboter problemlos mit einer C-Control gesteuert.&lt;br /&gt;
&lt;br /&gt;
Einen interessanten Forum Thread zu oberer Schaltung findet man unter [[#Weblinks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hier noch mal ein größerer Schaltplan mit eingezeichnetem Anschlussstecker und Spannungsteiler.&lt;br /&gt;
&lt;br /&gt;
[[Bild:schaltungstep298.gif|thumb|right|Ansteuerung mit L298]]&lt;br /&gt;
&lt;br /&gt;
Wichtig ist nur, dass man diese Schaltung mit einer möglichst hohen Spannung versorgt und einen Schrittmotor mit möglichst niedriger Spannung auswählt. Man sollte sich nicht davor abschrecken lassen, dass Schrittmotoren mit niedriger Spannung höhere Ströme z.B. 1 bis 2 A benötigen. Die Leistung berechnet sich ja bekanntlich mit der Formel P=U*I. Somit brauchen auch diese Motoren nicht mehr Energie als Motoren mit höherer Spannung und niedrigem Strombedarf. Hat man bei einem Roboter nur 12 V zur Verfügung, so ist es empfehlenswert z.B. einen 3- oder 4-Volt-Motor zu kaufen. Der Widerstand sollte jedenfalls deutlich unter 10 Ohm liegen. In diesem Fall könnte man dann die obige Schaltung auch mit 12 V betreiben. Allerdings bei höheren Drehzahlen würde die Spannung wegen der Induktivität meist immer noch nicht ausreichen, um die volle Leistung des Motors zu nutzen. Daher wäre zu überlegen, ob man nicht zwei 12-V-Batterien in Serie schaltet oder eine Spannungsverdopplerschaltung einsetzt. Ich habe mich für letzteres entschieden. Mit ein paar Kondensatoren und Dioden kann man recht einfach die Spannung von 12 auf ca. 21 V erhöhen. In der Praxis bricht diese Spannung bei hohen Strömen ein paar Volt ein, aber das tut der Leistung keinen Abbruch. Mit Spannungsverdoppler war der Motor jedenfalls deutlich stärker und hatte mit 15 kg in der Wohnung keinerlei Probleme. Schwieriger wird es mit Robotern, die schwerer als 15 kg sind, denn hier wird der Strombedarf einfach zu groß und die Akku-Kapazität ist zu schnell erschöpft.     &lt;br /&gt;
&lt;br /&gt;
[[Bild:icrnst01schaltplan.gif|thumb|Schrittmotorsteuerung mit RS232 oder I2C]]&lt;br /&gt;
&lt;br /&gt;
Fazit: Roboter, die sehr genau gesteuert werden müssen und deutlich weniger als 10 kg wiegen, kann man sehr gut mit Schrittmotoren steuern. Bei Robotern, die schwerer sind, sich sehr schnell bewegen müssen oder deren Steuergenauigkeit nicht so wichtig ist, sind Getriebemotoren oft sinnvoller. &lt;br /&gt;
&lt;br /&gt;
Als Alternative eine Ansteuerung für 2 Schrittmotoren per Befehl über I2C oder RS232 &lt;br /&gt;
speziell für Roboterbastler (ebenfalls mit Stromregelung und L298). Das Board RN-Motor beruht auf dieser Schaltung &lt;br /&gt;
&lt;br /&gt;
Einen interessanten Forum Thread zu dieser Schaltung findet man unter [[#Weblinks]]&lt;br /&gt;
&lt;br /&gt;
Neben dem Motortreiber L298 gibt es aber auch alternative Motortreiber, die sich sehr gut für die Schrittmotorsteuerung eignen. Sehr gut eignen sich zum Beispiel auch L293D oder der neuere L6205. Diese Treiber werden auf unserer Seite [[Getriebemotoren-Ansteuerung]] näher beschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wer eine etwas einfachere Schaltung zum Ansteuern eines kleineren Uni-/bipolaren Schrittmotors im Halb-/Vollschrittmodus  möchte, kann auch einen SAA1042 benutzen. Dieser 16-polige IC beinhaltet ein Schieberegister mit CW/CCW-, CLK- und half/full-Eingängen, 2 H-Brücken und Freilaufdioden. Man benötigt auch keine externe OSC-Beschaltung zum Takten des ICs, und es gibt keine Strombegrenzung durch etwaige Vref-Beschaltungen oder Ähnliches. Durch die einzelnen Windungen des Schrittmotors dürfen (lt. Datenblatt) maximal 500mA fließen.&lt;br /&gt;
&lt;br /&gt;
Der SAA1042 arbeitet mit bis zu 20V Versorgungsspannung, sie ist gleichzeitig die Arbeitsspannung für den Schrittmotor.&lt;br /&gt;
&lt;br /&gt;
Schaltpläne und Anschlussbelegung findet man im Datenblatt unter [[#Weblinks]]&lt;br /&gt;
&lt;br /&gt;
==Wie identifiziert man die Leitungen wenn man kein Datenblatt zum Motor hat?==&lt;br /&gt;
&lt;br /&gt;
Ein Schrittmotor ist aus zwei Spulen aufgebaut:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:stepperspulen.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit einem Ohmmeter kann man die Anschlüsse einfach identifizieren: Von Spule 1 - a nach Spule 1 - Common ist der Widerstand halb so groß wie der Widerstand von Spule 1 - a nach Spule 1 - b. Der Widerstand nach den Anschlüssen von Spule 2 sollte unendlich sein. &lt;br /&gt;
&lt;br /&gt;
Dass die Anschlüsse a und b voneinander nicht zu unterscheiden sind, ist unwichtig. Falls Sie sie vertauschen, dreht sich der Motor andersherum. Wichtig ist allenfalls, dass sie bei mehreren Motoren gleichen Typs die Anschlüsse gleich legen, um voraussagen zu können, in welche Richtung der Motor sich drehen wird.&lt;br /&gt;
&lt;br /&gt;
Um den Motor bipolar anzusteuern, werden übrigens die Common-Anschlüsse nicht benötigt.&lt;br /&gt;
&lt;br /&gt;
==Phasenbeschreibung der Ansteuerung==&lt;br /&gt;
&lt;br /&gt;
=== Schema zur Beschreibung der Spulen ===&lt;br /&gt;
Zur Beschreibung verwenden wir wieder das folgende Schema der Spulen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:stepperspulen.gif|center]]&lt;br /&gt;
&lt;br /&gt;
===Unipolare Ansteuerung Vollschritt ===&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{|cellspacing=1 cellpadding=5 bgcolor=666666&lt;br /&gt;
!colspan='7' bgcolor='#ECF0F6'| &amp;lt;br&amp;gt; Unipolare Ansteuerung Vollschritt &amp;lt;br&amp;gt; &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor='#ECF0F6' |&lt;br /&gt;
| bgcolor='#ECF0F6' | Phase Spule 1a&lt;br /&gt;
| bgcolor='#ECF0F6' | Phase Spule 1b&lt;br /&gt;
| bgcolor='#ECF0F6' | Common Spule 1&lt;br /&gt;
| bgcolor='#ECF0F6' | Phase Spule 2a&lt;br /&gt;
| bgcolor='#ECF0F6' | Phase Spule 2b&lt;br /&gt;
| bgcolor='#ECF0F6' | Common Spule 2&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor='#ECF0F6' | Schritt 1&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor='#ECF0F6' | Schritt 2&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor='#ECF0F6' | Schritt 3&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor='#ECF0F6' | Schritt 4&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
|-&lt;br /&gt;
!colspan='7' bgcolor='#ECF0F6'|&lt;br /&gt;
&amp;lt;span style=&amp;quot;background-color:#B0B0D9;&amp;quot;&amp;gt;- steht für Minus&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;background-color:#FFBDBD;&amp;quot;&amp;gt;+ steht für Plus&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;background-color:#BDBDBD;&amp;quot;&amp;gt;0 steht für Unbelegt&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
=== Bipolare Ansteuerung Vollschritt ===&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{|cellspacing=1 cellpadding=5 bgcolor=666666&lt;br /&gt;
!colspan='7' bgcolor='#ECF0F6'| &amp;lt;br&amp;gt; Bipolare Ansteuerung Vollschritt &amp;lt;br&amp;gt; &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor='#ECF0F6' |&lt;br /&gt;
| bgcolor='#ECF0F6' | Phase Spule 1a&lt;br /&gt;
| bgcolor='#ECF0F6' | Phase Spule 1b&lt;br /&gt;
| bgcolor='#ECF0F6' | Common Spule 1&lt;br /&gt;
| bgcolor='#ECF0F6' | Phase Spule 2a&lt;br /&gt;
| bgcolor='#ECF0F6' | Phase Spule 2b&lt;br /&gt;
| bgcolor='#ECF0F6' | Common Spule 2&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor='#ECF0F6' | Schritt 1&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor='#ECF0F6' | Schritt 2&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor='#ECF0F6' | Schritt 3&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor='#ECF0F6' | Schritt 4&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
|-&lt;br /&gt;
!colspan='7' bgcolor='#ECF0F6'|&lt;br /&gt;
&amp;lt;span style=&amp;quot;background-color:#B0B0D9;&amp;quot;&amp;gt;- steht für Minus&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;background-color:#FFBDBD;&amp;quot;&amp;gt;+ steht für Plus&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;background-color:#BDBDBD;&amp;quot;&amp;gt;0 steht für Unbelegt&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
=== Bipolare Ansteuerung Halbschritt ===&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{|cellspacing=1 cellpadding=5 bgcolor=666666&lt;br /&gt;
!colspan='7' bgcolor='#ECF0F6'| &amp;lt;br&amp;gt; Bipolare Ansteuerung Halbschritt &amp;lt;br&amp;gt; &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor='#ECF0F6' |&lt;br /&gt;
| bgcolor='#ECF0F6' | Phase Spule 1a&lt;br /&gt;
| bgcolor='#ECF0F6' | Phase Spule 1b&lt;br /&gt;
| bgcolor='#ECF0F6' | Common Spule 1&lt;br /&gt;
| bgcolor='#ECF0F6' | Phase Spule 2a&lt;br /&gt;
| bgcolor='#ECF0F6' | Phase Spule 2b&lt;br /&gt;
| bgcolor='#ECF0F6' | Common Spule 2&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor='#ECF0F6' | Schritt 1&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor='#ECF0F6' | Schritt 2&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor='#ECF0F6' | Schritt 3&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor='#ECF0F6' | Schritt 4&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor='#ECF0F6' | Schritt 5&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor='#ECF0F6' | Schritt 6&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor='#ECF0F6' | Schritt 7&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor='#ECF0F6' | Schritt 8&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
| bgcolor='#FFBDBD' align='center' | +&lt;br /&gt;
| bgcolor='#B0B0D9' align='center' | -&lt;br /&gt;
| bgcolor='#BDBDBD' align='center' | 0&lt;br /&gt;
|-&lt;br /&gt;
!colspan='7' bgcolor='#ECF0F6'|&lt;br /&gt;
&amp;lt;span style=&amp;quot;background-color:#B0B0D9;&amp;quot;&amp;gt;- steht für Minus&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;background-color:#FFBDBD;&amp;quot;&amp;gt;+ steht für Plus&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;background-color:#BDBDBD;&amp;quot;&amp;gt;0 steht für Unbelegt&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schrittmotorphasen bildlich dargestellt===&lt;br /&gt;
&lt;br /&gt;
[[Bild:schrittmotorphasenzeichnung.gif|center]]&lt;br /&gt;
&lt;br /&gt;
==Motoren mit 5 Anschlüssen?==&lt;br /&gt;
Es gibt auch Schrittmotoren mit 5 Drähten. In diesem Fall sind die mittleren Spulenanzapfungen miteinander verbunden und nur als einzige Leitung herausgeführt (also beide Common-Anschlüsse /siehe Skizze). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:stepper5draehte.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In dem Fall kann man den Motor nicht bipolar ansteuern, sondern muss ihn unipolar ansteuern. Mit L297/L298 bzw. RN-Motor usw. wird ein Schrittmotor immer bipolar angesteuert, also kann dafür kein Motor mit 5 Drähten verwendet werden.&lt;br /&gt;
Da heutzutage Schrittmotoren bevorzugt bipolar angesteuert werden um maximales Drehmoment (Kraft) zu erreichen, sollte man daher beim Kauf möglichst Motoren mit 4, 6 oder 8 Drähten kaufen. &lt;br /&gt;
&lt;br /&gt;
{|{{Blaueschmaltabelle}}&lt;br /&gt;
|'''Merke:'''&lt;br /&gt;
Motoren mit 4 Drähten kann man immer nur bipolar ansteuern. &lt;br /&gt;
Motoren mit 6 oder 8 Drähten kann man sowohl bipolar als auch unipolar  ansteuern. Gewöhnlich werden Motoren heute bevorzugt bipolar angesteuert, weil diese Ansteuerung ein größeres Drehmoment erzeugt. &lt;br /&gt;
Bei der bipolaren Ansteuerung in Verbindung mit Stromregelung (wie bei L297/L298  oder RN-Motor etc.) kann die Nennspannung des Motors weit unter der Betriebsspannung liegen.&lt;br /&gt;
Bei einer Ansteuerung ohne Stromregelung muss die Nennspannung des Motors in  etwa der Betriebsspannung entsprechen (egal ob unipolar oder bipolar Ansteuerung).  In diesem Fall ist jedoch das Drehmoment (Kraft) erheblich (deutlich spürbar) geringer.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Die wichtigsten Daten bei einem Schrittmotor==&lt;br /&gt;
Zum besseren Verständnis habe ich die Daten in die Klassen ''unverzichtbar'', ''hilfreich'' und ''weniger notwendig'' unterteilt. Diese Unterteilung habe ich vorwiegend im Blick auf Hobby-Anwender und Robotik-Bastler vorgenommen. Es versteht sich von selbst, dass je nach Vorhaben oder bei industrieller Anwendung eines Motors alle Daten wichtig sein könnten. &lt;br /&gt;
&lt;br /&gt;
===Unverzichtbare Daten===&lt;br /&gt;
&lt;br /&gt;
;Nennstrom: Maximal zulässiger Strom pro Wicklung (Phase). Bei Motoren mit mehreren Wicklungen (also Motoren mit 6 oder 8 Anschlüssen) bezieht sich die Stromangabe auf nur eine Wicklung (unipolare Ansteuerung). Siehe dazu auch das Rechenbeispiel im nächsten Abschnitt.&lt;br /&gt;
[[Bild:stepperdaten.png|framed|So sehen die Daten auf einem Motor aus, Hier wird Nennstrom, Nennspannung und Schrittwinkel angegeben]]&lt;br /&gt;
;Haltemoment: Bis zu diesem Moment ([[Drehmoment]], also dieser Kraft) kann ein Schrittmotor belastet werden, bis sich die Achse um einen oder mehrere Schritte durch die Belastung verdreht. Diese Angabe gilt für einen stehenden Schrittmotor, der unter voller Betriebsspannung steht. Die Angabe gibt somit quasi an wieviel Kraft der Motor besitzt, eine sehr wichtige Angabe.&lt;br /&gt;
&lt;br /&gt;
;Schrittwinkel: Der Schrittwinkel gibt an, um wieviel Grad sich die Achse bei einem Vollschritt bewegt. Dadurch wird also gleichzeitig angegeben, wie viele Schritte ein Motor für eine volle Drehung benötigt. Man teilt einfach 360 Grad durch den Schrittwinkel und erhält die Schrittanzahl. Bei guten Industriemotoren beträgt der Schrittwinkel oft 1,8 Grad, das ergibt also 200 Vollschritte pro Umdrehung. Nutzt man das Halbschrittverfahren zur Ansteuerung, also 400 Schritte. Je mehr Schritte ein Motor besitzt desto genauer kann er natürlich bestimmte Positionen anfahren, zugleich läuft er ruhiger und leiser. Nachteil von hohen Schrittzahlen ist allerdings, dass oft nicht so hohe Drehzahlen erreicht werden können wie bei großen Schrittwinkeln. &lt;br /&gt;
&lt;br /&gt;
;Nennspannung: Die Betriebsspannung, die notwendig ist, um den Nennstrom zu erreichen. Die Nennspanung gilt in der Regel für den stehenden Schrittmotor. Bei drehenden Motoren reduziert sich der Strom durch die Induktivität des Motors, daher könnte dann die Nennspannung mit steigender Drehzahl höher werden. Genau das machen auch moderne Schrittmotoransteuerungen. Darüber haben wir aber oben im Artikel schon ausgiebig gelesen. Steuert man einen Schrittmotor mit konstanter Spannung, so sollte man die Nennspannung verwenden, damit der Motor nicht überhitzt.&lt;br /&gt;
&lt;br /&gt;
;Anschlussbelegung: Schrittmotoren haben 4, 5, 6 oder 8 Anschlussdrähte. Daher gehört zu jedem Schrittmotor ein Plan, der Auskunft über interne Verdrahtung der Spulen gibt. Notfalls kann man dieses auch mit Hilfe eines Ohmmeters ermitteln, auch dies wurde oben schon geschildert.&lt;br /&gt;
&lt;br /&gt;
===Hilfreiche Daten===&lt;br /&gt;
&lt;br /&gt;
;Start-Stop Frequenz (fs): Die maximale Frequenz (Geschwindigkeit der Schrittfolge), bei der ein nicht belasteter Schrittmotor anläuft ohne Schritte zu verlieren. Leider findet man auch diese Angabe wohl nur bei etwas teureren Markenmotoren. &lt;br /&gt;
&lt;br /&gt;
;Betriebsmoment: Ähnlich wie das Haltemoment, jedoch wird hier das Moment für den drehenden Schrittmotor angegeben. Da bei Schrittmotoren das Drehmoment mit steigender Drehzahl abnimmt, reicht hier also kein einzelner Wert. Daher wird diese Angabe in Form einer Kennlinie, oft mit verschiedenen Betriebsspannungen, dargestellt. Eine solche Kennline haben wir schon im Artikel weiter oben kennengelernt. Sie ist sehr hilfreich, um den richtigen Motor für ein Vorhaben zu finden. Man sollte insbesondere darauf achten, dass das Drehmoment bei der maximalen geplanten Drehzahl auch wirklich noch für die Aufgabe ausreichend ist. Leider wird das Betriebsmoment (also diese Kennlinie) bei vielen Motoren (insbesondere bei Angeboten, kleineren Motoren usw.) nicht angegeben. Da der Kennlinienverlauf der Schrittmotoren jedoch eine gewisse Grundähnlichkeit aufweist, kann man in der Praxis deshalb oft auch mit der Angabe des Haltemoments auskommen.&lt;br /&gt;
&lt;br /&gt;
===Weniger oft notwendige Daten===&lt;br /&gt;
&lt;br /&gt;
;Widerstand: Manchmal wird der ohmsche Widerstand der Spule angegeben, allerdings nicht immer. Wenn die Nennspannung und der Nennstrom angebenen sind, so kann man sich den Widerstand nach dem ohmschen Gesetz selbst berechnen (R=U/I). Sind nur die Nennspannung und der Widerstand angegeben, was auch vorkommt, so muss man sich dagegen den Nennstrom selbst ausrechnen (I=U/R). Die Leistungsaufnahme der Wicklung kann man natürlich ebenfalls durch diese Angaben bestimmen (P=I²*R)&lt;br /&gt;
&lt;br /&gt;
;Rastmoment: Das Rastmoment kennt man bei Permanentmagnet- und Hybrid-Schrittmotoren. Es ist beim Drehen des Motors (ohne Spannung) spürbar. Wenn man die Wicklungen kurzschließt, wird dieses erheblich stärker. Dieser Sachverhalt kann auch für eine Bremse ausgenutzt werden.&lt;br /&gt;
&lt;br /&gt;
;Rotorträgheit: Das Massenträgheitsmoment des Rotors. Je größer und schwerer ein Motor bzw. eine Achse wird, desto größer wird die Masse des Rotors, der zusammen mit der Nutzlast beschleunigt werden muss. Je niedriger dieser Wert ist, desto schneller und dynamischer verhält sich der Motor bei Beschleunigungen. Da die Masse des Rotors und der Last ein schwingungsfähiges System bilden, sollte das auf die Motorwelle reduzierte Trägheitsmoment der Last in der selben Größenordnung liegen wie die Rotorträgheit.&lt;br /&gt;
&lt;br /&gt;
==Praxisbeispiel für Stromberechnung==&lt;br /&gt;
Soll ein Schrittmotor mit 8 Anschlüssen (4 Wicklungen) bipolar angesteuert werden, so hat man die Wahl jeweils zwei Spulen parallel oder in Reihe zu schalten. Die Stromangaben auf dem Motor beziehen sich in der Regel auf eine Phase, also eine Wicklung. Angenommen, wir haben einen Motor mit folgender Beschriftung:&lt;br /&gt;
&lt;br /&gt;
[[Bild:stepperdaten.png|framed|Auf einem Foto könnte das so aussehen]]&lt;br /&gt;
&lt;br /&gt;
* Nennspannung: 5,1 V &lt;br /&gt;
* Phasenstrom:  1,0 A &lt;br /&gt;
* Anschluß: 8 Drähte = wahlweise unipolar oder bipolar &lt;br /&gt;
* Schrittwinkel 1,8 Grad / 200 Schritte pro Umdrehung &lt;br /&gt;
* Haltekraft: ca. 50 Ncm &lt;br /&gt;
* Wellendurchmesser: 6 mm &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Möchte man die Spulen in Reihe schalten, so muss der Strom in etwa um den Faktor 1,41 (Wurzel aus 2) verringert werden, damit der Motor nicht zu heiss wird. &lt;br /&gt;
In unserem Beispiel müsste also 1A / 1,41 = '''0,792A''' fließen. Bei einer Chopper-Regelung (Stromregelung) müsste man somit 0,79A einstellen. Da sich der ohmische Widerstand durch die Reihenschaltung verdoppelt, benötigt man auch eine höhere Spannung. Anhand des ohmischen Widerstandes, der sich messen oder berechnen lässt, kann man in etwa die notwendige Mindestspannung berechnen.  Wenn bei 5,1 V ein Strom von 1 A fließt, so müsste der ohmische Widerstand R=U/I = 5,1 V / 1 = '''5,1 Ohm''' betragen. Der Gesamtwiderstand der Reihenschaltung wäre demnach 10,2 Ohm. Wenn wir den Strom von 0,79 A erreichen wollen, so müsste U=I*R  = 0,79*10,2 = '''8,06 V''' vorhanden sein. Das wäre aber nur die Mindestspannung, also die Spannung, die man ohne Stromregelung auch konstant anlegen könnte. Nutzt man jedoch eine Stromregelung, so müssen natürlich Regelreserven vorhanden sein. Zudem müssten die Schaltungsverluste der Chopperregelung berücksichtigt werden. Daher verwendet man eine deutlich höhere Spannung. 12V bis 24 V wären in dem Beispiel durchaus angebracht. Je höher desto besser, denn so kann bei hohen Drehzahlen der Strom schneller dem induktiven Widerstand entgegenwirken und das Drehmoment fällt nicht mehr so stark bei steigenden Drehzahlen ab. Das Drehmoment erhöht sich im übrigen bei der Reihenschaltung ebenfalls in etwa um den Faktor 1,41 (Wurzel aus 2).&lt;br /&gt;
&lt;br /&gt;
Bei der Parallelschaltung von zwei Spulen ist es genau umgekehrt. Hier darf der Strom in etwa um den Faktor 1,41 erhöht werden. Also 1A * 1,41 = 1,41 A sollten hier fließen. Da sich der ohmische Widerstand durch die Parallelschaltung halbiert, also in unserem Fall auf 2,55 Ohm, ist natürlich auch eine niedrigere Spannung notwendig. Die Berechnung wäre also U=I*R  = 1,41 A * 2,55 = 3,6 V&lt;br /&gt;
Auch das ist wieder die Mindestspannung, die auch als Konstantspannung angelegt werden darf. Auch hier muss bei der Chopper-Regelung (Stromregelung) eine höhere Spannung angelegt werden. Mit Werten zwischen ca. 8 und 16V würde man jetzt aber schon sehr gute Ergebnisse erzielen. Auch in diesem Beispiel würde sich das Drehmoment in etwa um den Faktor 1,41 erhöhen.&lt;br /&gt;
&lt;br /&gt;
Problematisch kann bei der Parallelschaltung mancher Motoren der niedrige ohmsche Widerstand werden. Nicht jede Motorregelung/Motortreiber macht das mit. Aus diesem Grund werden sicherlich Reihenschaltungen in der Praxis bevorzugt eingesetzt.&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
* Frank&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Chopper Betrieb]]&lt;br /&gt;
* [[Getriebemotoren Ansteuerung]]&lt;br /&gt;
* [[Getriebemotoren]]&lt;br /&gt;
* [[Stepmotore und deren Ansteuerung]]&lt;br /&gt;
* [[Servomotore und deren Ansteuerung (1)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
Hier noch ein paar Links, wenn ihr euch noch eingehender mit dem Thema befassen wollt:&lt;br /&gt;
&lt;br /&gt;
'''Animationen:'''&lt;br /&gt;
* [http://de.nanotec.com/support/tutorials/schrittmotor-und-bldc-motoren-animation/ Interaktive Animation von Schrittmotor- und BLDC-Betriebsmodi]&lt;br /&gt;
&lt;br /&gt;
'''Deutschsprachige Links:'''&lt;br /&gt;
* [http://github.com/slaxor/rnschrittmotor Eine Ruby lib für das RN-Schrittmotor Controllerboard]&lt;br /&gt;
* [http://www.robotikhardware.de/download/rnstepp297.pdf Doku zum Fertigmodul und Bausatz / Platine für L297/L298 Schaltung]&lt;br /&gt;
* [http://www.roboternetz.de/robotertutorial.html Robotertutorial (Projekt mit Schrittmotor)]&lt;br /&gt;
* [http://www.rn-wissen.de/images/a/a2/Schrittmotorphasentabelle.gif Phasentabelle als Grafik]&lt;br /&gt;
* [http://www.shop.robotikhardware.de/shop/catalog/index.php?cPath=65&amp;amp;osC L297/L298 Bauteilesortiment + Schrittmotoren]&lt;br /&gt;
* [http://www.robotikhardware.de/download/rnschrittmotor.pdf Bequeme Schrittmotoransteuerung über RS232 , I2C und Takt mit RN-Schrittmotor]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=21730 800mA I2C Schrittmotorsteuerung mit Trinamic TMC222]&lt;br /&gt;
* [http://www.kocomotion.de/schrittmotor.html Koco Motion]&lt;br /&gt;
* [http://www.nanotec.de/ Nanotec]&lt;br /&gt;
* [http://www.mechapro.de/ mechapro]&lt;br /&gt;
* [http://www.schrittmotor-blog.de/ Schrittmotor-Blog]&lt;br /&gt;
* [http://www.ostermann-net.de/electronic/schritt/sm_faq.htm Schrittmotor_Faq]&lt;br /&gt;
* [http://www.wolfgang-back.com/schrittmotor_demo.php Wolfgang Backs Seite]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/motordrehmoment.php Automatische Berechnung der Robotergeschwindigkeit und Drehmoment bei unterschiedlichen Motoren]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=284 Schaltung mit L297/L298 Protobed_StepM_297-298]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewtopic.php?t=13162 Roboternetz-Forum Thread Messung von Daten an einem Schrittmotor] &lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=733 Roboternetz-Forum Thread L297/L298]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=2741 Roboternetz-Forum Thread zum RNST01/RN-Motor]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Englische Links:'''&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/AppNotes/00907a.pdf Stepping Motors Fundamentals (enthält INFOs über Microstepping)]&lt;br /&gt;
* [http://www.cs.uiowa.edu/~jones/step/ Control of stepping motors (gutes Tutorial)]&lt;br /&gt;
* [http://library.solarbotics.net/pdflib/pdf/drive.pdf Drive motor circuit basics] &lt;br /&gt;
* [http://www.njr.co.jp/pdf/ee/ee05004.pdf Half stepping techniques] &lt;br /&gt;
* [http://www.njr.co.jp/pdf/ee/ee05005.pdf Microstepping ]&lt;br /&gt;
* [http://www.compumotor.com/catalog/cataloga/A29-A30.pdf Microstepping drive technology]&lt;br /&gt;
&lt;br /&gt;
'''Datenblätter:'''&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/dload.php?action=category&amp;amp;cat_id=2 L298 und L297 Datenblatt im RN-Downloadbereich (mittlerweile auf S.2)]&lt;br /&gt;
* [http://www.ortodoxism.ro/datasheets2/2/052daje928cw7pc0uqs1ipyryppy.pdf Datenblatt des L298 (englisch)]&lt;br /&gt;
* [http://www.ortodoxism.ro/datasheets2/c/0g0gh362kxwx30o7xi4x2i4jzffy.pdf Datenblatt des L297 (englisch)]&lt;br /&gt;
* [http://www.ortodoxism.ro/datasheets/motorola/SAA1042V.pdf Datenblatt des SAA1042 (englisch)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Robotikeinstieg]]&lt;br /&gt;
[[Category:Praxis]]&lt;br /&gt;
[[Category:Grundlagen]]&lt;br /&gt;
[[Category:Motoren]]&lt;br /&gt;
[[Category:Elektronik]]&lt;/div&gt;</summary>
		<author><name>Joe-19</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Timer/Counter_(Avr)&amp;diff=16649</id>
		<title>Timer/Counter (Avr)</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Timer/Counter_(Avr)&amp;diff=16649"/>
				<updated>2010-05-16T11:59:37Z</updated>
		
		<summary type="html">&lt;p&gt;Joe-19: /* nutzbare Pins am AVR */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Mikrocontroller der AVR-Familie besitzen je nach Typ eine unterschiedliche Anzahl an programmierbaren [[Timer|Timern]]. Bei den aktuellen ATmegas sind das mindestens ein 8-Bit Timer und ein 16-Bit Timer. Die Timer werden immer Timerx benannt, wobei x für die Timernummer steht (also 0, 1, 2, usw.). &lt;br /&gt;
Die Konfigurationsmöglichkeiten sind von Timer zu Timer unterschiedlich.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Die folgenden Code-Beispiele sind in C programmiert und wurden für einen [[ATMega32|ATmega32]] entwickelt. Sie lassen sich also ohne große Änderungen auch auf anderen Mikrocontrollern der AVR-Familie einsetzen.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Funktionsweise ==&lt;br /&gt;
Timer funktionieren nach dem allgemeinen Prinzip, dass sie eine Ganzzahl (im weiteren als Zähler bezeichnet) je nach Betriebsmodus auf- oder abwärtszählen, d.h. inkrementieren bzw. dekrementieren.&lt;br /&gt;
&lt;br /&gt;
Angenommen, der Timer arbeitet im einfachsten Betriebsmodus, dem [[Timer/Counter (Avr)#Normaler Modus (Normal Mode)|Normalen Modus]]. Die Zählrichtung des Timers ist aufsteigend gerichtet. Je nach Auflösung, also 8-Bit oder 16-Bit, folgt auf den maximalen Zählerstand wieder die Null. Wenn z.B. bei einem 8-Bit Timer der Wert 255 inkrementiert wird folgt die Null (siehe Grafik).&lt;br /&gt;
&lt;br /&gt;
[[Bild:AbstrakterZaehlvorgang.png]]&lt;br /&gt;
&lt;br /&gt;
== Der Prescaler ==&lt;br /&gt;
Der Prescaler (eng. = Vorteiler) kann der Takt für den Timer herunter geteilt werden. Oft hat man Faktoren von 1, 8, 64 ,256 oder 1024 zur Auswahl. Über das selbe Register kann der Timer auch ganz angehalten werden oder ein externer Takt ausgewählt werden. Ein externer Takt darf dabei höchstens halb so hoch wie der Prozezessortakt sein.&lt;br /&gt;
Hier eine Grafik die den Prescaler veranschaulicht:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Prescaler.png]]&lt;br /&gt;
&lt;br /&gt;
Das obere Diagramm zeigt den Betrieb ohne Prescaler, das untere mit Prescaler (:2). Die gestrichelte Linie zeigt, wann der Timer weiterzählt.&lt;br /&gt;
&lt;br /&gt;
Im Teil [[Timer/Counter (Avr)#Die Betriebsmodi|Die Betriebsmodi]] wird weiter auf die praktische Verwendung des Prescalers eingegangen.&lt;br /&gt;
&lt;br /&gt;
== Die Betriebsmodi ==&lt;br /&gt;
Die AVR-Timer können in unterschiedlichen Betriebsmodi betrieben werden. Diese sind:&lt;br /&gt;
* Normaler Modus&lt;br /&gt;
* CTC Modus&lt;br /&gt;
* PWM&lt;br /&gt;
&lt;br /&gt;
=== Normaler Modus (Normal Mode) ===&lt;br /&gt;
Der einfachste Betriebsmodus ist der normale Modus. Er funktioniert wie im Abschnitt  &amp;quot;[[Timer/Counter (Avr)#Allgemeine Funktionsweise|Allgemeine Funktionsweise]]&amp;quot; beschrieben. Die Zählrichtung des Timers ist immer aufsteigend, bis zum Überlauf - da fängt der Zähler wieder bei 0 an. Der Überlauf kann einen Interrupt (Timer-Overflow) auslösen. Im einfachsten Fall kann dieser Modus im folgendem Diagramm dargestellt werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_1.png]]&lt;br /&gt;
&lt;br /&gt;
Der Zähler des Timers (im Diagramm oben, die aufsteigende und dann wieder zurückgesetzte Linie) ist in dem Register TCNTx gespeichert, wobei x für eine Zahl steht. Soll z.B. auf den Timer0 (siehe Datenblatt des jeweiligen Controllers) des Controllers zugegriffen werden, so ist an TCNT eine 0 anzuhängen, also TCNT0.&lt;br /&gt;
Wie lange es braucht, bis der Zähler einen Overflow auslöst, ist von der Taktfrequenz des Controllers, dem eingestellten Prescaler-Wert und von der Timerauflösung abhängig. Nun wäre es ja sehr unpraktisch, wenn wir den Zähler nicht anpassen könnten. Denn sonst müssten wir unsere Software, die den Timer benutzt, evtl. anpassen und viel rechnen, um z.B. für 1000 ms zu schlafen. Deswegen kann auf den Zähler zugegriffen werden und ihn vorladen, bevor dieser wieder vom eigentlichen Timer hochgezählt wird. Dies veranschaulicht folgendes Diagramm:&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_1_Vorladen.png]]&lt;br /&gt;
&lt;br /&gt;
Dadurch kann eingestellt werden, wie lange es dauert, bis ein Overflow auftritt. Um zu berechnen, welchen Wert wir vorladen müssen, kann auch ein Java-Applet genutzt werden, siehe unter [[Timer/Counter (Avr)#Weblinks|Weblinks Java Applet]].&lt;br /&gt;
&lt;br /&gt;
Natürlich kann das auch &amp;quot;von Hand&amp;quot; berechnet werden. Die Berechnung des Preloader- sowie Prescalerwerts bei Verwendung der Overflow-Interrupts, eines Prescalers von 64 (nicht alle Prescaler können verwendet werden) und eines Quarzes mit der Frequenz von 8 MHz sieht folgendermaßen aus (gesuchte Frequenz beträgt 1000 Hz unter der Verwendung des Timer0 eines ATmega32):&lt;br /&gt;
# &amp;lt;math&amp;gt;Prescale = Frequenz * 1000000 [Hz] = 8000000&amp;lt;/math&amp;gt;&lt;br /&gt;
# Wir definieren den maximalen Zählerwert. Dieser ist bei einem 8-Bit Timer 256, bei einem 16-Bit Timer 65536. In unserem Fall ist der maximale Zählerwert 256, weil Timer0 verwendet wird.&lt;br /&gt;
# Nun wird die Variable ''Prescale'' (s.o.) durch den verwendeten Prescaler (64) geteilt (&amp;lt;math&amp;gt;8000000 Hz / 64 = 125000&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Als nächstes wird der im dritten Punkt errechnete Wert durch die gesuchte Frequenz geteilt &amp;lt;math&amp;gt;=125000 / 1000Hz = 125&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Nun wird mathematisch überprüft, ob der errechnete Wert aus dem vierten Punkt kleiner als der maximale Zählerwert ist. Trifft dies zu, so wird der errechneten Wert vom maximalen Zählerwert subtrahiert(&amp;lt;math&amp;gt;= 256 - 125 = 131&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Damit haben wir den Wert errechnet, der bei jedem Interrupt, den der Timer0 auslöst, in TCNTx (in diesem Fall TCNT0) nachgeladen werden muss, damit die Interrupts in dem gewünschten Zeitabstand von einer Millisekunde ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
Zwischen dem Timer Overflow und dem tatsächlichen Aufrufen der ISR mit dem Nachladen des Timers ergibt sich eine kleine Verzögerung, die nicht einmal immer gleich ist. Besonders bei kleinen Prescalern kann es dadurch zu Fehlern in der Zeit kommen. Wenn möglich wird für die Erzeugung einer konstanten Interruptrate deshalb besser der CTC Moduls benutzt.&lt;br /&gt;
&lt;br /&gt;
Zusammenfassend ein Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Es wird der Timer2 (8-Bit) eines ATmega32 verwendet, der mit einem Quarz mit 7,3728 MHz&lt;br /&gt;
betrieben wird. Im Abstand von 0,01 ms erzeugt der Timer einen Interrupt, also eine&lt;br /&gt;
Frequenz von 100000 Hz (oder 100 kHz). Der Timer wird auf einen Prescaler von 1 und&lt;br /&gt;
einem Preloader von  183 konfiguriert.*/&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t countTimer2;	// Speichert den aktuellen Zählerwert&lt;br /&gt;
&lt;br /&gt;
// ISR zum auffangen der Interrupts:&lt;br /&gt;
SIGNAL(SIG_SIG_OVERFLOW2)&lt;br /&gt;
{&lt;br /&gt;
	countTimer2++;&lt;br /&gt;
	TCNT2 = 183;		// Nachladen&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initialisierung:&lt;br /&gt;
TCCR2 = (1&amp;lt;&amp;lt;CS22);		// Prescaler von 1&lt;br /&gt;
TCNT2  = 183;			// Vorladen&lt;br /&gt;
TIMSK |= (1&amp;lt;&amp;lt;TOIE2);		// Interrupts aktivieren und damit Timer starten&lt;br /&gt;
sei();&lt;br /&gt;
&lt;br /&gt;
// Funktionen zum benutzen der Timer:&lt;br /&gt;
/** Diese Funktion nicht aufrufen. Wird von sleep_millisec aufgerufen.&lt;br /&gt;
Bei t=100 schläft die Funktion 1 ms. */&lt;br /&gt;
inline void sleep (uint8_t t)&lt;br /&gt;
{&lt;br /&gt;
	// countTimer2 wird in der ISR oben inkrementiert&lt;br /&gt;
	countTimer2 = 0;&lt;br /&gt;
	while (countTimer2 &amp;lt; t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** Schläft x-Millisekunden. */&lt;br /&gt;
inline void sleep_millisec(uint16_t msec)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i;&lt;br /&gt;
	for(i=0; i&amp;lt;msec; i++) {&lt;br /&gt;
		sleep(100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele Timer haben &amp;quot;Output-Compare&amp;quot; Register: OCRx oder OCRAx,OCRBx. Wenn der Zähler den darin eingestellten Wert erreicht hat, kann ein Interrupts ausgelöst werden. &lt;br /&gt;
&lt;br /&gt;
==== Input Capture ====&lt;br /&gt;
&lt;br /&gt;
Die 16 Bit Timer haben eine &amp;quot;Input Capture&amp;quot; Funktion. Dieser Hardwareteil dient zur genauen Zeitmessung. Außer in einigen PWM Betriebsarten, wo das ICP Register als TOP-wert für den Timer benutzt wird, ist die ICP-Funktion immer aktiv. Wenn am ICP Pin die über das Bit &amp;quot;ICESx&amp;quot; eingestellte Flanke auftritt, wird der aktuelle Zählerstand in das ICP Register kopiert. Außerdem kann ein Interrupt ausgelöst werden. Der Interrupt wird, wie die anderen Timer Interrupts, in den Registern TIMSK und TIFR an- oder abgestellt. Man kann zwar die ICP-Funktion selber nicht ohne weiteres abschalten, aber natürlich den dazugehörigen Interrupt.  Als eine spezielle Funktion (&amp;quot;Noise Cancler&amp;quot;) gibt es die Möglichkeit sehr kurze Pulse (unter 4 Zyklen) zu unterdrücken. In der Regel kann man diese Funktion angestellt lassen, denn so schnell kann man die Daten ohnehin nicht verarbeiten.&lt;br /&gt;
&lt;br /&gt;
Die typische Anwendung ist die Messung von kurze Zeiten, wie z.B. die Zeit für eine Motorumdrehung. Solange die 16 Bit des Timers ausreichen ist die Benutzung ganz einfach: Der Timer wird mit dem gewünschten Vorteiler im normalen Modus gestartet. Im ICP-Interrupt wird die Differenz aus zwei aufeinanderfolgenden Zeiten (Werte in ICP-Register) berechnet. Dazu wird jeweils die vorherige Zeit im RAM zwischengespeichert. Wenn man bei der Rechnung eventuelle Überläufe ignoriert, bekommt man die richtige Zeitdifferenz, auch wenn der Timer während der Messzeit einen Überlauf hatte. Das funktioniert so einfach, denn wenn noch weitere (höherwertige) Bytes vorhanden wären, damit es keinen Überlauf gibt, würde man genau so die unteren Bits berechnen.&lt;br /&gt;
&lt;br /&gt;
Etwas komplizierter wird es, wenn die 16 Bit Auflösung nicht mehr ausreicht. Dann kann der Timer-Überlauf benutzt werden, um auch längere Zeiten mit voller Auflösung zu messen. Die wesentliche Schwierigkeit ist es, den Fall zu berücksichtigen, dass ein Überlauf Interrupt und der ICP Interrupt fast gleichzeitig ausgelöst werden. Es kann passieren, dass der ICP-Interrupt aufgerufen wird, obwohl eigentlich erst der Overflow Interrupt dran gewesen wäre. Dieser seltene Fall läßt sich daran erkennen, dass das Overflow-Interrupt Flag gesetzt ist und der Wert im ICP Register klein ist (high Byte &amp;lt; 128, meistens 0).&lt;br /&gt;
&lt;br /&gt;
Beispielpropgramm (für GCC):&lt;br /&gt;
(Bisher nur im Simulator getestet)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Beispielprogramm für Zeitmessung mit ICP-Funktion&lt;br /&gt;
// Erweiterung des Timers auf 32 Bit durch Software&lt;br /&gt;
// Es wird die Periodendauer am ICP-Eingang gemessen und als ASCII via UART ausgegeben&lt;br /&gt;
// Code für Mega48 / Mega88 / Mega 168 / ...&lt;br /&gt;
// mit leichten Anpassungen auch für Tiny2313, Mega16, Mega32,...&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;         // für utoa&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.h&amp;gt;      // Unterstützung für sleep mode&lt;br /&gt;
&lt;br /&gt;
// #define F_CPU  1000000UL      // Definition der Frequenz ist normal in makefile&lt;br /&gt;
#define BAUD        19200UL&lt;br /&gt;
#define UBRR_BAUD   ((F_CPU/(16UL*BAUD))-1)&lt;br /&gt;
&lt;br /&gt;
typedef union {  // union erlaubt einen effektiven, seperaten Zugriff auf Teile der Variable&lt;br /&gt;
        unsigned long i32;&lt;br /&gt;
        struct {uint8_t i8l;        // low&lt;br /&gt;
                uint8_t i8m;        // mid&lt;br /&gt;
		unsigned int high;  // high, soft timer                &lt;br /&gt;
               };&lt;br /&gt;
              } convert32to8;&lt;br /&gt;
&lt;br /&gt;
volatile unsigned long timestamp;    // volatile wegen Zugriff im Interrrupt&lt;br /&gt;
volatile unsigned int softtimer;&lt;br /&gt;
volatile unsigned long zeitdifferenz;&lt;br /&gt;
unsigned long zeit;&lt;br /&gt;
char puffer[12];           // puffer für Ausgabe als Ascii&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_OVF_vect)   	   // Timer1 Überlauf&lt;br /&gt;
{ &lt;br /&gt;
  ++softtimer; 		   // zählen der Überläufe&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_CAPT_vect)      //  Flanke an ICP pin&lt;br /&gt;
{ &lt;br /&gt;
  convert32to8 cap;        // Variablendeklaration&lt;br /&gt;
   &lt;br /&gt;
  cap.i8l = ICR1L;         // low Byte zuerst, high Byte wird gepuffert&lt;br /&gt;
  cap.i8m = ICR1H;  &lt;br /&gt;
  // overflow verpasst, wenn ICR1H klein und wartender Overflow Interrupt&lt;br /&gt;
  if ((cap.i8m &amp;lt; 128) &amp;amp;&amp;amp; (TIFR1 &amp;amp; (1&amp;lt;&amp;lt;TOV1)))&lt;br /&gt;
   {   // wartenden timer overflow Interrupt vorziehen&lt;br /&gt;
     ++softtimer;         &lt;br /&gt;
     TIFR1 = (1&amp;lt;&amp;lt;TOV1);    // timer overflow int. löschen, da schon hier ausgeführt&lt;br /&gt;
   }&lt;br /&gt;
  cap.high = softtimer;    // obere 16 Bit aus Software Zähler&lt;br /&gt;
  zeitdifferenz = cap.i32 - timestamp;&lt;br /&gt;
  timestamp = cap.i32;     // Zeit merken&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_init(void)       // USART initialisieren (Mega48 etc.)&lt;br /&gt;
{&lt;br /&gt;
// Baudrate einstellen (Normaler Modus)&lt;br /&gt;
// kann bei älteren AVR Typen etwas anders sein (kein UBRR0H, dafür prescaler)&lt;br /&gt;
  UBRR0H = (uint8_t) (UBRR_BAUD&amp;gt;&amp;gt;8);             // bei Mega32  anders !&lt;br /&gt;
  UBRR0L = (uint8_t) (UBRR_BAUD &amp;amp; 0x0ff);        // bei Mega32 UBRRL&lt;br /&gt;
  UCSR0B = (1&amp;lt;&amp;lt;TXEN0);   // Aktivieren des Senders, bei Mega32 UCSRB&lt;br /&gt;
  UCSR0C = (1&amp;lt;&amp;lt;UCSZ01)|(1&amp;lt;&amp;lt;UCSZ00)|(1&amp;lt;&amp;lt;USBS0);   // bei Mega32 UCSRC&lt;br /&gt;
// Einstellen des Datenformats: 8 Datenbits, 2 Stoppbit:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void putser(char c)  // sende ein Byte via UART&lt;br /&gt;
{&lt;br /&gt;
  while ( !( UCSR0A &amp;amp; (1&amp;lt;&amp;lt;UDRE0)) ) ; // Warten bis der Sendepuffer frei ist&lt;br /&gt;
  UDR0 = c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
 unsigned char i;&lt;br /&gt;
// Datenrichtungen:&lt;br /&gt;
 DDRB = 0;  			  // Alles Eingänge, PB0 ist ICP&lt;br /&gt;
 PORTB = 0xFF - (1&amp;lt;&amp;lt;PB0);         // Pullups an Eingängen außer ICP&lt;br /&gt;
 DDRC = 0;     		 	  // Eingänge&lt;br /&gt;
 PORTC = 0xFF;  		  // Pullups an Eingängen &lt;br /&gt;
 DDRD = (1&amp;lt;&amp;lt;PD1);                 // Eingänge, außer PD1 = Tx (UART)&lt;br /&gt;
 PORTC = 0xFF- (1&amp;lt;&amp;lt;PD1);          // Pullups an alle Eingängen (außer TX)&lt;br /&gt;
// Timer1 initialisieren:&lt;br /&gt;
 TCCR1A = 0;                      // normal mode, keine PWM Ausgänge&lt;br /&gt;
 TCCR1B = (1&amp;lt;&amp;lt; ICNC1) + (1&amp;lt;&amp;lt;CS10)    // start Timer mit Systemtakt&lt;br /&gt;
          + (1 &amp;lt;&amp;lt; ICES1);            // steigende Flanke auswählen&lt;br /&gt;
 TIMSK1 = (1&amp;lt;&amp;lt;TOIE1) + (1&amp;lt;&amp;lt;ICIE1);   // overflow und Input-capture aktivieren, Mega32: TIMSK&lt;br /&gt;
 TIFR1 = (1&amp;lt;&amp;lt;TOIE1) + (1&amp;lt;&amp;lt;ICIE1);    // Schon aktive Interrrupts löschen, Mega32: TIFR&lt;br /&gt;
// UART initialisieren:&lt;br /&gt;
 uart_init();                &lt;br /&gt;
&lt;br /&gt;
 zeitdifferenz = 0;&lt;br /&gt;
 softtimer = 0;      // wird für Zeitdifferenzmessung nicht mal gebraucht,&lt;br /&gt;
                     // denn Differenz geht auch über Überlauf bei Softtimer&lt;br /&gt;
 set_sleep_mode (SLEEP_MODE_IDLE);  // idle Mode: timer läuft weiter, int zum aufwachen&lt;br /&gt;
&lt;br /&gt;
 sei();              // Interrupts erlauben: Messung startet&lt;br /&gt;
 while (1)&lt;br /&gt;
 {&lt;br /&gt;
  sleep_enable ();     &lt;br /&gt;
  sei();&lt;br /&gt;
  sleep_cpu();          // wartet auf irgendeinen Interrupt, z.B. ICP, timer_ovr,...&lt;br /&gt;
  sleep_disable();      &lt;br /&gt;
  cli();		// Interrupt sperren wegen Zugriff auf volatile Variable&lt;br /&gt;
  zeit = zeitdifferenz;&lt;br /&gt;
  zeitdifferenz = 0;   	// als Markierung für ungültigen Wert&lt;br /&gt;
  sei();&lt;br /&gt;
  if (zeit &amp;gt; 0)&lt;br /&gt;
  { &lt;br /&gt;
    utoa(zeit,puffer,10);   // nach ASCII umwandeln&lt;br /&gt;
    i = 0;&lt;br /&gt;
    while (puffer[i])&lt;br /&gt;
     {&lt;br /&gt;
      putser(puffer[i++]);  // Ausgabe&lt;br /&gt;
     }&lt;br /&gt;
    putser(13);             // Zeilenumbruch senden&lt;br /&gt;
    putser(10);&lt;br /&gt;
  }&lt;br /&gt;
 }  // Ende von While-schleife&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CTC Modus (Clear Timer on Compare Match mode) ===&lt;br /&gt;
Der CTC Modus ist eine Erweiterung des &amp;quot;Output-Compare&amp;quot;-Funktion. Der CTC Modus eignet sich besonders, um einen mit konstanter Frequenz wiederkehrenden Interrupt zu erzeugen. Wie im normalen Modus zählt der Timer hoch. Wenn der Wert im OCRx Register erreicht wird, wird zusätzlich zum möglichen Interrupt der Zähler wieder auf 0 gesetzt. Es kann also die maximalen Zählergrenze selber definiert werden.&lt;br /&gt;
Dieses Diagramm veranschaulicht den CTC Modus.&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_CompareMatch.png]]&lt;br /&gt;
&lt;br /&gt;
Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Es wird der Timer2 (8-Bit) eines ATmega32 verwendet, der mit einem Quarz &lt;br /&gt;
   mit 7,3728 MHz betrieben wird. Im Abstand von 0,01 ms erzeugt der Timer &lt;br /&gt;
   einen Interrupt, also eine Frequenz von 100000 Hz (oder 100 kHz). &lt;br /&gt;
   Der Timer wird auf einen Prescaler von 1 und einem OCR2-Wert von 73 konfiguriert. */&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t countTimer2;	// Speichert den aktuellen Zählerwert&lt;br /&gt;
&lt;br /&gt;
// ISR zum auffangen der Interrupts:&lt;br /&gt;
SIGNAL(SIG_OUTPUT_COMPARE2)&lt;br /&gt;
{&lt;br /&gt;
  countTimer2++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initialisierung:&lt;br /&gt;
TCCR2 = (1&amp;lt;&amp;lt;CS22) | (1&amp;lt;&amp;lt;WGM21);	// Prescaler von 1 | CTC-Modus (siehe unten für Beschreibung)&lt;br /&gt;
OCR2  = 73;			// Vergleichswert&lt;br /&gt;
TIMSK |= (1&amp;lt;&amp;lt;OCIE2);		// Interrupts aktivieren und damit Timer starten&lt;br /&gt;
sei();&lt;br /&gt;
&lt;br /&gt;
// Funktionen zum benutzen der Timer:&lt;br /&gt;
/** Diese Funktion nicht aufrufen. Wird von sleep_millisec aufgerufen.&lt;br /&gt;
Bei t=100 schläft die Funktion 1 ms. */&lt;br /&gt;
inline void sleep(uint8_t t)&lt;br /&gt;
{&lt;br /&gt;
	// countTimer2 wird in der ISR oben inkrementiert&lt;br /&gt;
	countTimer2 = 0;&lt;br /&gt;
	while (countTimer2 &amp;lt; t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** Schläft x-Millisekunden. */&lt;br /&gt;
inline void sleep_millisec(uint16_t msec)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i;&lt;br /&gt;
	for(i=0; i&amp;lt;msec; i++) {&lt;br /&gt;
		sleep(100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== PWM ===&lt;br /&gt;
&lt;br /&gt;
Eine häufige Aufgabe für Mikrocontroller ist die Erzeugung von [[PWM]]-Signalen, zum Beispiel für Motorsteuerungen. Daher sind in den meisten [[AVR|AVRs]] PWM-Einheiten als Hardware vorhanden. Sie sind direkt mit den Timern verbunden und nutzen diese als Taktquelle. Die Hardware-PWM-Einheiten haben den Vorteil, sehr wenig Rechenzeit in Anspruch zu nehmen. Es muss nur die PWM aktiviert werden und bei Änderungen den gewünschten Wert in ein Register schreiben. Der Rest läuft automatisch und unabhängig vom restlichen Programm, ohne den AVR ständig zu beschäftigen wie bei einer PWM-Lösung in Software. Allerdings stehen meist nur zwei bis drei solcher PWM-Kanäle zur Verfügung, die außerdem an bestimmte Pins gebunden sind. Für die meisten Roboter mit zwei Antriebsmotoren reicht dies aber für gewöhnlich aus. &lt;br /&gt;
&lt;br /&gt;
==== nutzbare Pins am AVR ====&lt;br /&gt;
Die Hardware-PWM-Funktion steht nur an bestimmten Pins zur Verfügung. In der Pinbelegungsübersicht im Datenblatt ist erkenntbar, dass als Sonderfunktion in Klammern &amp;quot;OC...&amp;quot; angegeben ist. Beim Mega32 sind dies zb. OC0 an PB3, OC1A an PD5, OC1B an PD4 und OC2 an PD7. Der Mega32 hat also insgesamt vier Hardware-PWM-Kanäle. Die Zahl hinter dem &amp;quot;OC&amp;quot; gibt an, zu welchem der Timer dieser PWM-Kanal gehört. Wenn noch ein Buchstabe dahinter kommt, dann gehören mehrere PWMs zu diesem Timer. Beim Mega32 sind also OC1A und OC1B demselben Timer, nämlich Timer1, zugeordnet.&lt;br /&gt;
&lt;br /&gt;
'''Zu beachten ist, dass die für die PWM benutzten Pins zuvor explizit als Ausgang konfiguriert werden müssen! Ansonsten gelangt das PWM-Signal nicht nach draußen!'''&lt;br /&gt;
&lt;br /&gt;
==== Funktionsprinzip ====&lt;br /&gt;
Das &amp;quot;OC&amp;quot; in den Pinbezeichnungen steht für &amp;quot;Output Compare Unit&amp;quot;, also frei übersetzt Ausgangs-Vergleicher-Einheit. Dies beschreibt die Funktionsweise der PWM-Kanäle: der Zählerstand des Timers wird fortlaufend mit einen einstellbaren Referenzwert verglichen, und wenn beide Werte übereinstimmen, kann ein Ausgangspin des AVRs automatisch geschaltet werden (und ein Interrupt ausgelöst werden, was allerdings für die PWM-Funktion nicht relevant ist). Dies entspricht dem Verfahren im [[PWM#PWM_per_Software|Beispiel zur Software-PWM]]. Es läuft nun allerdings vollautomatisch im Hintergrund, sodass der Controller nicht damit belastet wird.&lt;br /&gt;
&lt;br /&gt;
==== Die verschiedenen PWM-Modi ====&lt;br /&gt;
Es gibt -je nach AVR und Timer- etliche Betriebsarten, in denen die PWM-Einheit betrieben werden kann. Sie unterscheiden sich vor allem darin, wie schnell und mit welchen Nebeneffekten sich Änderungen des Sollwertes auf das Ausgangssignal auswirken. Für den Anfang sind diese Unterschiede erst einmal nebensächlich, und für eine einfache Motorsteuerung meist auch irrelevant. Daher wird hier zunächst der &amp;quot;Fast PWM Mode&amp;quot; (&amp;quot;Schneller PWM Modus&amp;quot;, weil hier die größte Ausgangsfrequenz möglich ist) beschreiben, welcher der einfachste von allen ist.&lt;br /&gt;
&lt;br /&gt;
Hierbei zählt der Timer immer von Null an aufwärts, bis er den Maximalwert (teilweise einstellbar) erreicht hat. Dann läuft er über und fängt von vorne an. Wie schnell dies geschieht, wird, wie im normalen Modus, über den Prescaler eingestellt.&lt;br /&gt;
Der gewünschte PWM-Ausgangswert wird im &amp;quot;OCRn&amp;quot;-Register abgelegt. Er darf zwischen Null und dem Maximalwert des Timers liegen. Er wird nun mit dem Timer-Wert verglichen. Was dann passiert, regeln die &amp;quot;COM...&amp;quot;-Bits. Sie bestimmen, wie der Ausgang geschaltet wird. Die übliche Konfiguration ist, dass bei Erreichen des Sollwertes die Ausgänge auf high geschaltet werden, und beim Überlauf auf low. Damit ergibt sich ein nichtinvertiertes PWM-Signal. Schließt man (über einem passenden Motortreiber!) einen Motor an, dreht er sich bei einem Sollwert von 0 gar nicht und beim Maximalwert mit voller Geschwindigkeit.&lt;br /&gt;
&lt;br /&gt;
Beispielcode für den Timer1 des Mega16/32 (und vieler anderer AVRs): &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt; // Warteschleife für die Demo. Für die eigentliche PWM nicht benötigt!  &lt;br /&gt;
&lt;br /&gt;
/*  PWM-Beispiel für Mega16/32 (beiden haben den gleichen Timer)&lt;br /&gt;
	Benutzt wird Timer1 im Fast PWM Mode, 8 Bit Auflösung&lt;br /&gt;
	Die PWM-Signale liegen auf PD5/OC1A und PD4/OC1B&lt;br /&gt;
*/	&lt;br /&gt;
&lt;br /&gt;
// 1. Den Prescaler einstellen, der die Frequenz festlegt&lt;br /&gt;
	TCCR1B |= (1&amp;lt;&amp;lt;CS12); //Prescaler 256&lt;br /&gt;
	&lt;br /&gt;
// 2. Den Timer in den Fast PWM Mode, 8 Bit schalten&lt;br /&gt;
//    ACHTUNG: Die WGM-Bits sind auf beide Konfigurationsregister verteilt!&lt;br /&gt;
	TCCR1A |= (1&amp;lt;&amp;lt;WGM10);&lt;br /&gt;
	TCCR1B |= (1&amp;lt;&amp;lt;WGM12);&lt;br /&gt;
	&lt;br /&gt;
// 3. Compare Output mode einstellen: Pin geht auf high bei Compare match, auf low bei Überlauf. &lt;br /&gt;
//    Ergibt nichtinvertierte PWM.	&lt;br /&gt;
	TCCR1A |= (1&amp;lt;&amp;lt;COM1A1) | (1&amp;lt;&amp;lt;COM1B1) ;	&lt;br /&gt;
	&lt;br /&gt;
// In diesen Registern wird der gwünschte PWM-Wert abgelegt. Erlaubter Bereich: 0 bis 255.&lt;br /&gt;
	OCR1A =	0;&lt;br /&gt;
	OCR1B = 0;	&lt;br /&gt;
&lt;br /&gt;
// 4. Die Pins als Ausgänge konfigurieren. Erst jetzt liegt das PWM-Signal an den Pins an!	&lt;br /&gt;
	DDRD |= (1&amp;lt;&amp;lt;PD4) | (1&amp;lt;&amp;lt; PD5);&lt;br /&gt;
&lt;br /&gt;
/*Nun ist der PWM-Modus aktiv! Der Ausgangswert kann nun über die Register OCR1A und OCR1B&lt;br /&gt;
  vorgegeben werden. Man könnte ihnen per define noch einen Zweitnamen verpassen, zb */&lt;br /&gt;
#define MotorLinks OCR1A&lt;br /&gt;
#define MotorRechts OCR1B&lt;br /&gt;
//Und nun kann man per &lt;br /&gt;
MotorLinks = 127;&lt;br /&gt;
MotorRechts = 127;&lt;br /&gt;
//seinen Roboter mit halber Kraft vorwärts fahren lassen.&lt;br /&gt;
&lt;br /&gt;
/*PWM-Demo: Die PWM-Werte werden erst bis zum Maximalwert erhöht und dann wieder verringert. &lt;br /&gt;
Ein angeschlossener Motor wird beschleunigen und dann wieder abbremsen. */&lt;br /&gt;
	uint8_t wert;&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		for (wert=0; wert&amp;lt;255; wert++)&lt;br /&gt;
			{&lt;br /&gt;
				OCR1A =	wert;&lt;br /&gt;
				OCR1B = wert;&lt;br /&gt;
				_delay_ms(10);&lt;br /&gt;
			}&lt;br /&gt;
	&lt;br /&gt;
		for (wert=255; wert&amp;gt;0; wert--)&lt;br /&gt;
			{&lt;br /&gt;
				OCR1A =	wert;&lt;br /&gt;
				OCR1B = wert;&lt;br /&gt;
				_delay_ms(10);&lt;br /&gt;
			}	&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es sind also vier Einstellungen zu treffen:&lt;br /&gt;
# Takt anlegen per Prescaler&lt;br /&gt;
# PWM-Modus wählen&lt;br /&gt;
# Ausgangs-Aktion festlegen&lt;br /&gt;
# Pins als Ausgänge schalten&lt;br /&gt;
&lt;br /&gt;
Diese Schritte müssen bei jedem AVR-PWM-Kanal ausgeführt werden. Die genauen Registernamen und Werte können sich jedoch je nach Timer-Ausführung etwas unterscheiden.&lt;br /&gt;
&lt;br /&gt;
== Registerübersicht ==&lt;br /&gt;
''Hinweis: Diese Registertabellen wurden für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden kann es sein, dass ein oder mehrere Register nicht existieren, oder sie eine andere Bezeichnung haben.''&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''TIMSK'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Mit diesem Register, der von allen Timern verwendet wird, lässt sich die Interruptausführung und Art des jeweiligen Timers bestimmen.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|OCIE2|TOIE2|TICIE1|OCIE1A|OCIE1B|TOIE1|OCIE0|TOIE0}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''OCIE2 (Timer/Counter2 Output Compare Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter2 Compare Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE2 (Timer/Counter2 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter2 Overflow Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TICIE1 (Timer/Counter1, Input Capture Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Input Capture Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE1A (Timer/Counter1 Output Compare A Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Output Compare A Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE1B (Timer/Counter1 Output Compare B Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Output Compare B Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE1 (Timer/Counter1 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Overflow Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE0 (Timer/Counter0 Output Compare Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, so wird der Timer/Counter0 Compare Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE0 (Timer/Counter0 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, so wird der Timer/Counter0 Overflow Interrupt aktiviert  (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Atmel]]&lt;br /&gt;
* [[HEX Beispiel-Dateien für AVR]]&lt;br /&gt;
* [[Bascom_und_Timer]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/dyn/products/devices.asp?family_id=607 Die Datenblätter zu Atmel Controllern]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=169 AvrTimer Windows Berechnungstool (für Bascom, nur nach Anmeldung)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Abkürzung|AVR]]&lt;br /&gt;
[[Kategorie:Quellcode C]]&lt;/div&gt;</summary>
		<author><name>Joe-19</name></author>	</entry>

	</feed>