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

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Getriebemotoren_Ansteuerung&amp;diff=20418</id>
		<title>Getriebemotoren Ansteuerung</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Getriebemotoren_Ansteuerung&amp;diff=20418"/>
				<updated>2012-07-22T13:29:25Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Grundprinzip */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ist der Entschluss gefasst, für seinen Roboter oder andere Konstruktion einen Getriebemotor zu verwenden, so müssen sich Gedanken gemacht werden, wie er ansteuert werden kann. Gewöhnlich sollen die Motoren ja sowohl in Bezug auf Drehrichtung und Geschwindigkeit über eine Programmiersprache angesteuert werden. Daher wird in der Regel erst mal ein Controllerboard benötigt. Leider kann man an die wenigsten Controllerboards einen Getriebemotor direkt anschließen, eine der wenigen Ausnahmen ist das [[RN-Control]]-Board und das RNBFRA-Board. Bei beiden Boards ist es einfach, dort müssen die Getriebemotoren einfach nur an die Schraubklemmen angeschlossen werden, danach kann man sofort mit der Programmierung loslegen.&lt;br /&gt;
&lt;br /&gt;
Ich möchte hier aber aufzeigen, wie man Motoren auch bei anderen Boards anschließen kann. Die gleiche Technik lässt sich natürlich auch nutzen, um z.B. mehr als zwei Motoren an [[RN-Control]] anzuschließen.&lt;br /&gt;
&lt;br /&gt;
==Ansteuerung mit Relais==&lt;br /&gt;
&lt;br /&gt;
Die einfachste Methode, um Motoren per [[Microcontroller|Controller]] anzusteuern, erreicht man durch die Verwendung von Relais. Mit einem Relais, das zwei Umschaltkontakte besitzt, lässt sich über einen einzelnen Controllerport bequem die Drehrichtung wechseln.&lt;br /&gt;
&lt;br /&gt;
[[Bild:hbrueckerelais.gif|center]]&lt;br /&gt;
&lt;br /&gt;
Da auch Relais wegen des Strombedarfes nicht direkt vom Controller geschaltet werden können, wurde in dem oberen Beispiel ein Transistor vorangestellt. Die Diode dient dazu, die Spannungen abzuleiten, die beim Ausschalten des Relais induziert werden. Ohne Diode könnte der Transistor oder sogar der Controller durch die induzierte Spannung beschädigt werden. &lt;br /&gt;
Die Schaltung ist also in der Lage, die Drehrichtung umzuschalten, jedoch nicht in der Lage, den Motor zu stoppen. Um den Motor ganz auszuschalten, könnte man man 2 getrennte Relais für die beiden Umschaltkontakte nutzen. Ein Schaltbild können wir uns ersparen, da das Ganze recht ähnlich aussieht. &lt;br /&gt;
Der große Nachteil von Relaisschaltungen ist, dass die Geschwindigkeit des Motors nicht geregelt werden kann, zudem haben Relais bei vielen Schaltvorgängen einen gewissen Verschleiß.&lt;br /&gt;
Das Auschalten einer induktiven Last ist dabei für die Relaiskontakte besonders schädlich.&lt;br /&gt;
Vorteil der Schaltung ist jedoch, das man auch große Lasten/Motoren schalten kann.&lt;br /&gt;
&lt;br /&gt;
==Ansteuerung mit Relais und MOS-FET==&lt;br /&gt;
Die Schaltung ist sehr ähnlich wie die vorherige Relaisschaltung. Es wird aber in die Masseleitung hinter dem Relais ein [[Feldeffekttransistor#MOSFETS|MOSFET]] und eine Freilaufdiode eingesetzt. Dadurch werden die meisten Nachteile der einfachen Relaisschaltung behoben. Durch den MOSFET läßt sich der Motor in der Geschwindigkeit regeln und ggf. abschalten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RelaisundFet.png|center]]&lt;br /&gt;
  &lt;br /&gt;
Es sind prinzipiell alle N-Kanal MOS-FETs geeignet. Für die hier gezeigte direkte Steuerung vom µC sollte es ein Logik-Level-Typen sein. Der FET IRLZ34 sollte ohne Kühlung bis etwa 5 A genügen. Die Freilaufdiode D1 muß für den Motorstrom ausgelegt sein, und bei PWM Steuerung genügend schnell sein(z.B. Shottky SB540). Die Induktivität L1 (ca. 1...100 µH) und der Kondensator C1 dienen zur Funkentstörung und können bei kurzem Kabel zum Motor auch weggelassen werden. Um die Umschaltverluste und Funkstörungen gering zu halten, sollte die [[PWM]]-Frequenz nicht unnötig hoch liegen. Eine einfache Motorbremse ist möglich mit einem P-MOSFET (oder PNP Transistor) parallel zur Freilaufdiode. Ein Programmfehler kann damit allerdings zu einem Kurzschluss führen. &lt;br /&gt;
&lt;br /&gt;
Da das Relais nur Strom verbraucht, wenn es angezogen wird, sollte man den Motor so anschließen, dass in der bevorzugten Drehrichtung (beim Roboter Vorwärtsfahren) das Relais nicht angezogen ist. &lt;br /&gt;
Die Schaltung (ohne Motorbremse) ist sicher gegen Querströme und es können durch Fehler im Programm des µC kaum Schäden entstehen. Das Relais sollte erst umgeschaltet werden, wenn der Motor steht, dann gibt es keine Funken an den Relaiskontakten.&lt;br /&gt;
&lt;br /&gt;
Der Verdrahtungsaufwand insgesamt ist minimal und sogar kleiner als bei Motortreiber-ICs, wie dem [[Getriebemotoren_Ansteuerung#Ansteuerung_mit_dem_Schaltkreis_L298|L298]], da keine zusätzlichen Bauteile benötigt werden. Daher ist die Schaltung insbesondere für Anfänger geeignet.&lt;br /&gt;
&lt;br /&gt;
Vorteile sind:&lt;br /&gt;
*tolerant gegen Fehler im µC Programm&lt;br /&gt;
*hohe Strombelastbarkeit&lt;br /&gt;
*sehr geringer Spannungsabfall (&amp;lt; 1 V)&lt;br /&gt;
*niedrige Kosten, auch bei hoher Leistung&lt;br /&gt;
*das Relais kann stromlos geschaltet werden (wenig Verschleiß an Kontakten)&lt;br /&gt;
&lt;br /&gt;
Nachteile sind:&lt;br /&gt;
*hörbares &amp;quot;Klacken&amp;quot; beim Laufrichtungswechsel&lt;br /&gt;
*zusätzlicher Stromverbrauch, wenn das Relais geschaltet ist&lt;br /&gt;
&lt;br /&gt;
==Ansteuerung mit MOS-FET==&lt;br /&gt;
===Neufassung===&lt;br /&gt;
{{Ausbauwunsch|Die Neufassung kann im momentanen Stand nur als Anregung verstanden werden.&lt;br /&gt;
&lt;br /&gt;
Insbesondere fehlen noch angepasste Schaltpläne.&lt;br /&gt;
&lt;br /&gt;
Einige der Anmerkungen aus dem Abschnitt &amp;quot;Kritik an der Schaltung&amp;quot; sind in der Neufassung noch nicht enthalten, die Beschreibung von Verzögerungsgliedern müsste auch eine Erklärung enthalten, welche Verzögerung mit welchen Werten erreicht wird.&lt;br /&gt;
&lt;br /&gt;
Wenn die Neufassung komplett fertig ist, sollten die alten Texte weg.&lt;br /&gt;
}}&lt;br /&gt;
===Grundprinzip===&lt;br /&gt;
Wenn man die Steuerung rein mit Halbleitern realisieren will, bietet sich die H Brückenschaltung (Vollbrücke) an.  An jeden Motoranschluß kommt einen Halbbrücke, die den Anschluß mit GND oder der Versorgungsspannung verbinden kann. Die fertigen [[Getriebemotoren_Ansteuerung#Ansteuerung_mit_Treiber_IC_L293_D|Motorteiber ICs]] sind auch entsprechend aufgebaut.&lt;br /&gt;
Der Aufbau aus Einzelteilen wird vor allem gebraucht, wenn man kein passendes IC findet, z.B. bei hoher Leistung.&lt;br /&gt;
&lt;br /&gt;
Bei den üblichen Batteriespannungen sind als Schaltelemete [[Feldeffekttransistor#MOSFETS|MOS-FET]]s die beste Wahl. Also (unipolaren) Transistoren, die quasi leistungslos nur durch Spannungen geschaltet werden. Zu diesem Thema findet man unzählige Beiträge im Roboternetz, denn die Schaltung ist nicht ganz einfach.&lt;br /&gt;
&lt;br /&gt;
Die Grundschaltung besteht aus 2 N-Kanal-MOS-FET und zwei P-Kanal-MOS-FET, mit denen die Motoranschlüsse nach GND bzw. UB geschaltet werden.  &lt;br /&gt;
Auf die extra Freilaufdioden kann bei einer Vollbrücke mit modernen MOSFETs meistens verzichtet werden, da die MOSFETs bereits hinreichend gute Dioden enthalten.  Teilweise werden trotzdem zusätzliche [[Im RN-Wiki verwendete Elektronikbauteile|Schottky-Dioden]] benutzt, um die Verluste etwas weiter zu reduzieren. Die Dioden werden in Sperrichtung von den beiden Motoranschlüssen nach GND bzw. UB geschaltet.&lt;br /&gt;
Die Transistortypen werden entsprechend der benötigten Ströme und Spannungen gewählt. Zu große Transistoren haben den Nachteil einer großen Gatekapazität und benötigen daher aufwendigere Treiber.&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich muss die Beschaltung der Gate-Eingänge so erfolgen, dass zum Starten des Motors die Transistoren einer Diagonale auf &amp;quot;leitend&amp;quot; und die der anderen auf &amp;quot;sperrend&amp;quot; geschaltet werden. Zum Anhalten des Motors werden z.B. die unteren auf leitend und die oberen auf sperrend geschaltet  (Der Motor wird aufgrund des nicht unerheblichen Bremsstroms von Transistor und Freilaufdiode stark gebremst).&lt;br /&gt;
Alternativ kann man auch alle Transistoren auf sperrend schalten, der Motor läuft dann im Leerlauf aus.&lt;br /&gt;
&lt;br /&gt;
Die Transistoren einer Seite dürfen nicht gleichzeitig auf &amp;quot;leitend&amp;quot; geschaltet werden, da dies einen Kurzschluss verursacht.&lt;br /&gt;
&lt;br /&gt;
===Elektrische Ansteuerung der Gates===&lt;br /&gt;
Beim Umschalten der Transistoren entstehen Verluste - der Widerstand wechselt von sperrend (sehr großer Widerstand) nach leitend (sehr kleiner Widerstand) und umgekehrt.&lt;br /&gt;
Zwischen beiden Enden des Schaltvorgangs befindet sich der Transistor in der &amp;quot;Widerstandsphase&amp;quot; (weder ganz leitend, noch ganz sperrend), die eine erhebliche Verlustleistung und damit Erwärmung mit sich bringt.&lt;br /&gt;
&lt;br /&gt;
Deshalb sollte der Schaltvorgang schnell erfolgen, insbesondere wenn für eine [[PWM]]-Regelung sehr oft geschaltet wird. Da zum Umschalten die durch den Aufbau des MOSFETs bedingte Gatekapazität umgeladen werden muss, ist hierzu (sehr kurzzeitig) ein hoher Stromfluss nötig. Zu schnell (&amp;lt;100 ns) sollte man wegen der Funkstörungen aber auch nicht schalten.&lt;br /&gt;
&lt;br /&gt;
Für die P-Mosfets wird eine Spannung von 0 V bzw. etwa -10 V realtiv zur postiven Versorgung gebraucht. Für die N-Mosfets reicht eine Spannung von 0 V bzw. ca. 10 V, bei logic level Mosfets reichen 5 V.&lt;br /&gt;
&lt;br /&gt;
====Schaltung direkt am Port====&lt;br /&gt;
Eine Ansteuerung unmittelbar über den Ausgang eines Mikrocontrollers (oder eines TTL-IC) ist schon wegen der benötigten Spannungen oft nur für die N-MOSFETs möglich, und das auch nur bei Logic Level Fets. Bei den P-[[MOSFET]] bemisst sich die Schaltspannung gegen UB und nur für ein UB von etwa 5-6 V könnte die Spannung passen.&lt;br /&gt;
&lt;br /&gt;
Dass ein Portpin nur einen geringen Stromfluss (ca. 20 mA) zulässt, ist ein weiteres Problem und verhindert einen schnellen Schaltvorgang. &lt;br /&gt;
Diese Schaltungsversion ist für eher kleine Logic Level MOSFETs (bis etwa 2 nF Gate Kapazität), bevorzugt ohne PWM, möglich.&lt;br /&gt;
&lt;br /&gt;
====Schaltung mit einem Transistor====&lt;br /&gt;
Eine einfache Steuerschaltung besteht aus einem Transistor-Schalter (Emitter nach GND)und einem Pull-Up-Widerstand. &lt;br /&gt;
&lt;br /&gt;
Der Vorteil liegt in der Einfachheit, der Nachteil liegt darin, dass die Schaltung nicht sonderlich schnell vonstatten geht: Für die Schaltung des FET muss die Gate-Kapazität transferiert werden, was insbesondere beim Wechsel von 0 V nach U&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt; einen Moment dauert, da die Ladung durch den Widerstand hindurch muss. Ein kleinerer Widerstand könnte hier helfen, verursacht allerdings einen nicht unerheblichen Stromfluss im geschalteten Zustand.&lt;br /&gt;
&lt;br /&gt;
Sinnvoll ist diese Version damit nur für die P-MOSFETs, wenn diese nicht mit dem PWM Signal versorgt werden. Für die N Kanal Fets ist es in der Regel besser direkt den Logicpegel und Logic Level Fets zu nehmen.&lt;br /&gt;
&lt;br /&gt;
====Schaltung mit zwei Transistoren====&lt;br /&gt;
Eine bessere Ansteuerung sollte sich ergeben, wenn man zwei Transistoren zur Gate-Ansteuerung verwendet: Einer schaltet gegen 0 V, der andere gegen UC. So kann man erreichen, dass in beide Richtungen rasch umgeschaltet werden kann.&lt;br /&gt;
&lt;br /&gt;
====Integrierte Gate-Treiber====&lt;br /&gt;
Statt der Beschaltung mit zwei Transistoren kann man auch einen integrierten [[MOSFET]]-Treiber verwenden. Derartige ICs (z.B. ICL7667) sind darauf ausgelegt, kurzfristig den für eine Umschaltung benötigten hohen Stromfluss zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch Treiber-ICs (z.B. IR2111), die zur Ansteuerung der oberen Transistoren eine Spannung oberhalb von UB erzeugen. Mit solchen Highside-Treibern kann die H-Brücke auch aus 4 N-Kanal-Transistoren gebaut werden, was den Vorteil hat, dass N-Kanal-FETs mit geringerem Schaltwiderstand zu bekommen sind.  Bei den Treibern für highside N-Kanal-Fets hat man aber oft eine Begrenzung des Tastverhältnisses.&lt;br /&gt;
&lt;br /&gt;
===Logische Ansteuerung der Gates===&lt;br /&gt;
Nach der elektrischen Ansteuerung ist die logische Ansteuerung durch den Mikrocontroller zu überlegen. In der H-Brücke sind zwei problematische Zustände zu berücksichtigen:&lt;br /&gt;
&lt;br /&gt;
1. Das offensichtliche Problem ist ein Kurzschluss: Wenn beide Transistoren einer Seite auf leitend geschaltet werden ist das ein Kurzschluss. Falls vorhanden brennt die Sicherung durch oder es wird sogar etwas beschädigt.&lt;br /&gt;
&lt;br /&gt;
2. Ein nicht so offensichtliches Problem rührt daher, dass der Schaltvorgang nur mit endlicher Geschwindigkeit abläuft und der Transistor auch schon vor Erreichen des Zielwertes der Gate-Spannung erheblichen Strom leitet. Hierdurch kommt es zu einem Kurzschluss durch den nicht mehr richtig gesperrten und den noch nicht richtig gesperrten Transistor. Es reicht also nicht die beiden Transistoren gleichzeitig zu schalten, sondern es wird eine kleine Verzögerung benötigt.&lt;br /&gt;
&lt;br /&gt;
Die Stromspitze selbst liegt oft noch im Rahmen der Spezifikationen der Transistoren. &lt;br /&gt;
Allerdings hat die Stromspitze drei Auswirkungen: &lt;br /&gt;
# Die Transistoren erwärmen sich&lt;br /&gt;
# Es kann an einem Messwiderstand zu einer Spannungsspitze kommen&lt;br /&gt;
# Die Versorgungsspannung bricht kurzzeitig zusammen&lt;br /&gt;
&lt;br /&gt;
Die Störung der Versorgungsspannung lässt sich ohne Oszilloskop kaum messen. Insbesondere in umfangreicheren Schaltungen können Störungen an ganz anderen Stellen (z.B. bei Sensoren) auftreten, die man dann nicht gleich mit der Motorsteuerung in Verbindung bringt.&lt;br /&gt;
&lt;br /&gt;
====softwaremäßige Ansteuerung====&lt;br /&gt;
Die einfachste Art der Ansteuerung besteht darin, die 4 Gates mit 4 Ausgängen des Controllers zu steuern.&lt;br /&gt;
&lt;br /&gt;
Die korrekte Ansteuerung muss dann durch die Software garantiert werden. &lt;br /&gt;
Eine Fehlschaltung der Software z.B. bei einem Absturz kann allerdings zur Zerstörung der Schaltung führen, die Schaltung sollte also in jedem Fall eine Sicherung haben.&lt;br /&gt;
&lt;br /&gt;
====Einfache, gemeinsame Ansteuerung ====&lt;br /&gt;
Bei passender Spannung, können die Gates einer Seite jeweils gemeinsam geschaltet werden. Bei einer Gate-Spannung von 0V sperrt der N-[[MOSFET]] (U&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;=0V), der P-[[MOSFET]] leitet bei dieser Gate-Spannung, da hier U&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;=-UB ist. &lt;br /&gt;
&lt;br /&gt;
Bei einer Gate-Spannung von UB verhält es sich genau umgekehrt: Der N-[[MOSFET]] leitet (U&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;=UB) und der P-[[MOSFET]] sperrt (U&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;=0V)&lt;br /&gt;
&lt;br /&gt;
Diese einfache Ansteuerung benötigt nur 2 Port-Pins, hat jedoch den Nachteil, dass während des Umschaltens die oben beschriebenen temporären Querströme auftreten können und deshalb eher schnell geschaltet werden sollte. Die Ansteuerung mit nur einem Transistor ist hier also nicht angebracht. Je höher die Spannung, desto schlimmer wird das Problem beim Umschalten. Ohne extra Verzögerungen sind damit nur Spannungen bis ca. 8 V möglich. &lt;br /&gt;
&lt;br /&gt;
Mit einer Parallelschaltung aus einem Widerstand und einer Diode vor den Gates, kann man erreichen, dass die Transistoren schneller auf sperrend als auf leitend schalten. Beim N-FET zeigt die Anode zum FET, beim P-FET die Kathode.&lt;br /&gt;
Damit sind dann auch etwas höhere Spannungen möglich, aber spätestens bei ca. 20 V wird die maximale Gatespannung erreicht.&lt;br /&gt;
&lt;br /&gt;
Eine mögliche Ausführung für etwa 8-15 V, ist es ein Gate Treiber IC (z.B. ICL7667) zu nehmen, und durch Dioden und Widerstände zu den Gates für eine Verzögerung beim Einschalten zu sorgen.&lt;br /&gt;
&lt;br /&gt;
====Ansteuerung mit logischer Verknüpfung====&lt;br /&gt;
Der Zustand eines dauerhaften Querstroms sollte besser Hardwaremäßig vermieden werden. Zusätzlich kann die Logic die Zahl der IO Pins auf 2 oder 3 reduziert werden. Sinnvollerweise sollte dabei nur eine Leitung die PWM Steuerung übernehmen.&lt;br /&gt;
Mittels Logik-Bausteinen werden zwei Ausgänge des Controllers so umgesetzt, dass die folgenden Zustände geschaltet werden können:&lt;br /&gt;
# Motor-Stop: untere Transistoren leitend, obere sperrend (oder umgekehrt)&lt;br /&gt;
# Motor-Vorlauf: 1. Diagonale leitend&lt;br /&gt;
# Motor-Rücklauf: 2. Diagonale leitend&lt;br /&gt;
# Motor-Leerlauf: Alle Transistoren sperrend&lt;br /&gt;
Der Motor Stop Zustand ist dabei nicht unbedingt nötig. Wie die Logic genau aussieht hängt davon ab ob die Gate Treiber die Signale noch mal invertieren. &lt;br /&gt;
In der wohl einfachsten Form, kann man die P MOSFETs über einfache Transistortreiber langsam steuern. Die PWM Steurung geht dann nur mit den N-FETs. Hier kann man Logic Level Typen nehmen, die man direkt von Logic Gattern (z.B. 74HC...) ansteuern kann, oder bei größeren FETs mit Gate Treibern.&lt;br /&gt;
&lt;br /&gt;
Die Querstrom-Problematik beim Schalten kann hierbei softwaremäßig gelöst werden, indem beim Umschalten jeweils kurz der Leerlauf geschaltet wird, damit alle Transistoren sperren. Damit auch Temporäre Querströme sicher vermieden werden können auch hier Verzögerungselemente sinnvoll sein.&lt;br /&gt;
&lt;br /&gt;
=====Heidingscher Encoder (Beispiel für Logic) =====&lt;br /&gt;
Aufgrund der Kritik an der alten Schaltung(siehe '''Alte Schaltungsbeschreibung''') entschied ich mich einen neuen, einfachen sowie preisgünstigen Encoder zu entwickeln, den man mit der 74series aufbauen kann. Die [[Im RN-Wiki verwendete ICs|74series]] sind mit 20 mA Treiberstrom natürlich kaum zum direkten Treiben geeignet. Die Verzögerung müßte hier in die Treiber integriert sein.&lt;br /&gt;
Die Logikanzeigen in den Grafiken sollen je einen Transistor bzw. Mosfet darstellen. &lt;br /&gt;
&lt;br /&gt;
=====PR Encoder=====&lt;br /&gt;
[[Bild:Prtreiber.png]]&lt;br /&gt;
&lt;br /&gt;
Der PR Encoder(PWM-Richtung Encoder) ist mit zwei NOR Gates sowie eines Inverters aufgebaut, d.h. man kann ihn mit nur einem [[Im RN-Wiki verwendete ICs|IC(74HC(T)02)]] aufbauen. Will mein 2 Encoder verwenden, empfiehlt sich den Inverter auszulagern [[Im RN-Wiki verwendete ICs|(74HC(T)04]] oder [[Im RN-Wiki verwendete ICs|74HC(T)14]]. Sollte man keinen Schmitt-Trigger benötigen empfiehlt sich aus Schnelligkeitsgründen die [[Im RN-Wiki verwendete ICs|74HC(T)04]] Variante). &lt;br /&gt;
Alternativ ist es noch möglich sich den Inverter zu sparen, und die Ansteuerung für den P(WM) Kanal invertiert laufen zu lassen.&lt;br /&gt;
&lt;br /&gt;
=====PRK Encoder=====&lt;br /&gt;
[[Bild:Prktreiber.png]]&lt;br /&gt;
&lt;br /&gt;
Der Prk-Encoder([[PWM]]-Richtung-Kurzschluss-Encoder) ist eine Erweiterung des PR-Encoders. Er erlaubt es zusätzlich, die Motoren durch einen Kurzschluss zu stoppen.&lt;br /&gt;
Aufgebaut werden kann dieser aus 1 NOR und 1 NAND Gate. Dabei werden 3 NAND-Gates als Inverter beschaltet (d.h. eine Leitung, die übrigen bleiben auf VCC).&lt;br /&gt;
&lt;br /&gt;
====Support====&lt;br /&gt;
Fragen einfach in das Forum posten, oder mich anschreiben (User s.o.)&lt;br /&gt;
&lt;br /&gt;
===Alte Schaltungsbeschreibung===&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Achtung! Die Schaltung ist so nicht zu verwenden! Siehe unter '''Kritik an der Schaltung'''&lt;br /&gt;
}}&lt;br /&gt;
Wesentlich günstiger und auch beliebter ist die Ansteuerung von Motoren mit MOS-FETs. Also Transistoren, die quasi leistungslos nur durch Spannungen geschaltet werden und extrem hohe Ströme verkraften. Zu diesem Thema findet man unzählige Beiträge im Roboternetz. Eine der interessantesten Schaltungen, die im Roboternetz vorgestellt wurde, dürfte diese sein:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:hbrueckemosfet.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Den 74HC26N gibts wohl nicht , nur die TTL-Version [[Im RN-Wiki verwendete ICs|74LS26]], die HC-Mos-Version lautet [[Im RN-Wiki verwendete ICs|74HC03]].&lt;br /&gt;
&lt;br /&gt;
Eine sogenannte H-Brücke, die nur aus zwei MOSFETSs und einem Logik-IC besteht. Mit zwei Controllerports kann diese Schaltung sowohl Geschwindigkeit als auch Drehrichtung regeln. Für die Geschwindigkeit ist ein sogenannter [[PWM]]-Port notwendig. Also ein Port, der durch ein gepulstes Signal den Motor etlichemal innerhalb einer Sekunde ein- und ausschaltet und somit quasi die Leistung regelt (siehe [[PWM]]).&lt;br /&gt;
Die Schaltung ist so konstruiert, dass immer nur zwei Transistoren durchschalten. Auf diese Weise fließt einmal der Strom von links oben nach rechts unten und einmal von rechts oben nach links unten, der Motor wird also ähnlich wie bei der Relaisschaltung umgepolt. &lt;br /&gt;
Bei niedriger [[PWM]]_Frequenz sollte die Schaltung durchaus für einige Ampere geeignet sein, wobei ca. 8 bis 13 V ideal sein sollten.&lt;br /&gt;
&lt;br /&gt;
Das Logic-IC wurde durch 3x [[Im RN-Wiki verwendete Transistoren|BC547]] Transitoren ersetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Hbrückenmosfet BD547.PNG|center|900px]]&lt;br /&gt;
&lt;br /&gt;
====Kritik an der Schaltung====&lt;br /&gt;
&lt;br /&gt;
Diese Schaltung wird [http://www.roboternetz.de/phpBB2/viewtopic.php?t=33067&amp;amp;sid=892e80c6cd2d003292e607bcd7a7123aim hier Forum von mehreren Leuten, u.A. Ratber, shaun, massiv kritisiert].&lt;br /&gt;
&lt;br /&gt;
Ich habe leider nicht das Wissen eine bessere Lösung zu liefern. Das Problem sind die Querströme: Im Umschaltmoment sind highside und lowside switch für kurze Zeit beide leitend. Das entspricht einem Kurzschluss der Versorgungsleitung bei jedem Umschalten mit allen damit verbundenen Problemen (Erwärmung, Schwingung, Sicherungen, Reset). Aus diesem Grund sind NAND-Gatter nicht geeignet!&lt;br /&gt;
&lt;br /&gt;
Zum Umschalten muss man&lt;br /&gt;
*den bisher leitenden [[MOSFET]] ausschalten,&lt;br /&gt;
*dann etwas warten,&lt;br /&gt;
*und dann den nächsten [[MOSFET]] schließen.&lt;br /&gt;
&lt;br /&gt;
Dies kann man erreichen, indem man den Einschaltmoment &lt;br /&gt;
*durch RC-Glieder verzögert und &lt;br /&gt;
*den Ausschaltmoment durch Dioden beschleunigt.&lt;br /&gt;
Die entstehenden Schaltungen sind komplex, benötigen viele Bauteile und sind fehleranfällig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Am sinnvollsten sind integrierte [[MOSFET]]-Treiber. Diese haben oft eine einstellbare Tot-Zeit (''Dead-Time''), können hohe Leistungen zum Umladen der Gatekapazität liefern und beachten andere Effekte wie ''Propagation-Time'', Veränderung des Source Potentials beim Highside-switch, etc.&lt;br /&gt;
&lt;br /&gt;
'''Erklärung von shaun:'''&lt;br /&gt;
&lt;br /&gt;
Die gezeigte Schaltung taugt auch nur als Prinzipschaltung bedingt, da man einen variierenden Aufwand in eine sichere Verriegelung investieren müsste. Bei fixer und nicht zu hoher Betriebsspannung könnte man mit RD-Kombinationen in den Gateleitungen das Ausschalten beschleunigen und das Einschalten verzögern, so dass die Querleitung wegfällt. Allerdings bewirkt diese simple R-Cg-Verzögerung größere Schaltverluste. &lt;br /&gt;
&lt;br /&gt;
Setzt man die Verzögerung vor dedizierte Treiber, müssen diese wiederum leistungsfähig genug zum Umladen der Gates sein und bis an die Versorgung heranreichen, weshalb man an diesem Punkt überlegen sollte, ob 95% duty cycle nicht auch reichen würden ''(Anmerkung: Bezug auf bootstrapping?)'' und man integrierte Treiber für reine N-Kanal-Bestückung einsetzen sollte - spart dann wieder etwas Verluste am Highside-Switch, weil N-Kanäler gleicher Generation und Leistungsklasse einen niedrigeren Rds(on) als ihre P-Pendants haben.&lt;br /&gt;
&lt;br /&gt;
{{Ausbauwunsch|Eine vernünftige diskrete Ansteuerung für eine H-Brücke.&lt;br /&gt;
Korrektur auf Rechtschreibfehler, Zeichensetzung, Schreibstil, Fachausdrücke. Gibt's denn keinen, der etwas verbessern möchte?}}&lt;br /&gt;
==Ansteuerung mit einem LeistungsOPV==&lt;br /&gt;
Die wohl preislich und platztechnisch günstigste Alternative zur Ansteuerung von Motoren in H-Brücken ist die Verwendung von (Leistungs-)Operationsverstärkern oder Audioverstärker ICs. &lt;br /&gt;
&lt;br /&gt;
===Heidingscher Motortreiber=== &lt;br /&gt;
Bei dem Heidingschen Motortreiber wird jeder Anschluss des Motors mit einem Ausgang des Operationsverstärker verbunden, die Eingänge des OPVs selbst als Komparator. Diese Methode ist für kleine und mittlere Motoren(=&amp;lt; 1A) und mäßige PWM-Frequenzen(&amp;lt;10kHz) gut geeignet. Ein RB35 von Conrad kann damit problemlos angesteuert werden. Bei zu hohen [[PWM]]-Frequenzen ist die SlewRate von vielen OPVs zu gering und die entsprechenden OPVs sind dann viel zu teuer und man sollte eine Ansteuerung per [[MOSFET]] (s.o.) bevorzugen. Momentan hat sich der [[Im RN-Wiki verwendete ICs|TCA 0372 DP1]] (0,57€ bei Reichelt) Verwendung gefunden. &lt;br /&gt;
Weitere Informationen sind in [http://www.roboternetz.de/phpBB2/viewtopic.php?t=38412 diesem Forumsbeitrag] zu finden.&lt;br /&gt;
&lt;br /&gt;
===Gleichstromansteuerung===&lt;br /&gt;
Eine weitere Möglichkeit ist es, dem Operationsverstärker eine Gleichspannung vorzugeben, mit denen der OPV die Motoren ansteuert. Diese Methode eignet sich sehr gut für analoge Schaltkreise. Der Wirkungsgrad ist allerdings nicht der beste, da die restliche Spannung in Wärme umgesetzt wird. Zudem werden viele weitere Komponenten benötigt, was den Aufbau teurer und fehleranfälliger macht.&lt;br /&gt;
Der entsprechende Schaltkreis ist im Datenblatt des TCA 0372 DP1 zu finden.&lt;br /&gt;
&lt;br /&gt;
==Ansteuerung mit Treiber ICs ==&lt;br /&gt;
===Ansteuerung mit Treiber IC L293 D===&lt;br /&gt;
Dies ist ohne Zweifel die am häufigsten genutzte Ansteuerung bei Roboter-Bastlern: Man nimmt einfach das IC L293D, denn darin sind sogar zwei H-Brücken enthalten. Also mit einem IC lassen sich ohne weitere externe Bauteile gleich zwei Motoren ansteuern. Zwar nur bis ca. 600mA, aber das reicht oft schon für kleinere bis mittlere Roboteranwendungen aus.&lt;br /&gt;
&lt;br /&gt;
[[Bild:L293Pinout.JPG|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:hbrueckel293d.gif|center]]&lt;br /&gt;
&lt;br /&gt;
Wie aus dem Schaltbild zu ersehen ist, werden für die Ansteuerung jedes Motors 3 Ports benötigt. Die Enable-Leitung führt man oft auf einen [[PWM]]-Port welcher, wie bei der [[MOS-FET]] Schaltung oben, die Geschwindigkeit regelt. Die beiden anderen Ports geben die Drehrichtung an. Immer wenn die Ports unterschiedliche Polarität haben dreht der Motor in eine bestimmte Richtung, je nachdem wo Low und High anliegt. Das Besondere ist, dass wenn an beiden Ports der gleiche Pegel anliegt, also zweimal Low oder High, dann wird nämlich der Motor kurzgeschlossen, das dann als Bremse fungiert. Das Bremsen kann bei Robotern durchaus nützlich sein. Zudem ist bei schnellen Richtungswechseln immer zu empfehlen zuerst kurz zu bremsen, um nicht den Motor oder Motortreiber zu stark zu belasten.&lt;br /&gt;
&lt;br /&gt;
Hinweise zum Schaltplan:&lt;br /&gt;
&lt;br /&gt;
Es müssen unbedingt alle vier GND-Anschlüsse mit Masse verbunden werden!&lt;br /&gt;
&lt;br /&gt;
Zur Stabilisierung der Versorgungsspannung sollten noch Elkos (z.B. 100µF) eingebaut werden, dies ist im Schaltplan nicht eingezeichnet! (Vergleiche z.B. mit Schaltplan vom L293B, weiter unten)&lt;br /&gt;
&lt;br /&gt;
Wahrheitstabelle (hier exemplarisch für 1 und 2; bei 3 und 4 entsprechend):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Eingang &amp;quot;1A&amp;quot; || Eingang &amp;quot;2A&amp;quot; || &amp;quot;1,2EN&amp;quot; || Ausgang &amp;quot;1Y&amp;quot; || Ausgang &amp;quot;2Y&amp;quot; || entspricht&lt;br /&gt;
|-&lt;br /&gt;
| 0V || 0V || 5V || - || - || Motor kurzschließen (Bremsen)&lt;br /&gt;
|-&lt;br /&gt;
| 0V || 5V || 5V || - || + || Motor dreht vorwärts&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 0V || 5V || + || - || Motor dreht rückwärts&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || 5V || + || + || Motor kurzschließen (Bremsen)&lt;br /&gt;
|-&lt;br /&gt;
| egal || egal || 0V || hochohmig || hochohmig || Motor aus (Verbindung trennen, nicht kurzschließen)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Belastung des Ausgangs steht nicht mehr die volle Betriebsspannung am Ausgang zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Der angegebene Maximalstrom von 600mA pro H-Brücke ist mit Vorsicht zu genießen, da oft die Verlustleistung des Treibers außer Acht gelassen wird. Bei der Entnahme des Nennstroms (600mA) entwickelt das IC eine Verlustleistung von etwa 3 Watt !! (aufgrund UCE Sättigungsspannungen der Transistoren). Das IC kann sich dabei so stark erwärmen, dass es zerstört wird.&lt;br /&gt;
&lt;br /&gt;
Um dieses Problem zu lösen, kann man einerseits versuchen, mit Kühlkörpern und/oder einem Platinenlayout mit großer Massefläche, die Wärme abzuführen; andererseits könnte der Motor mit PWM betrieben werden, um die durchschnittliche Stromaufnahme zu verringern; die Motorleistung wird damit aber auch niedriger. Als Kühlkörper gibt es auch spezielle Formen, die direkt auf das IC geklebt werden können ([http://de.farnell.com/productimages/farnell/standard/42348245.jpg Beispiel]), ob diese dafür jedoch ausreichen sei dahin gestellt. Selten erfolgt auch eine Huckepack-Montage von mehreren identischen ICs zur Verteilung der Abwärme. Auch auf kurzes Abbremsen des Motors vor einem Richtungswechsel soll noch einmal hingewiesen werden.&lt;br /&gt;
&lt;br /&gt;
Falls diese Maßnahmen nicht zielführend sein sollten und der Motortreiber trotzdem überhitzt oder zerstört wird, sollte man sich nach einem anderen Motortreiber umsehen.&lt;br /&gt;
&lt;br /&gt;
Den Treiberbaustein gibt es auch in SMD und heißt dann L293DD.&lt;br /&gt;
&lt;br /&gt;
===Ansteuerung mit Treiber IC L293 B===&lt;br /&gt;
Der L293B ist dem L293D sehr ähnlich, da er die selbe Pinbelegung besitzt und auch von der Ansteuerung genau identisch ist. Im Gegensatz zum L293D kann er aber 67% mehr Strom (d.h. 1A) am Ausgang liefern, benötigt aber zusätzlich noch 4 Freilaufdioden pro Motor. Der Preisunterschied zum L293D ist minimal, sodass man sich den Einbau des etwas stärkeren L293B überlegen kann.&lt;br /&gt;
[[Bild:L293B_Pins.png|center]]&lt;br /&gt;
&lt;br /&gt;
Es soll noch eine typische Anwendungsschaltung für den L293B gezeigt werden (Auf das Bild klicken für höhere Auflösung):&lt;br /&gt;
&lt;br /&gt;
[[Bild:L293B_Schaltplan.png|550px|center]]&lt;br /&gt;
&lt;br /&gt;
Als Dioden schlägt das Datenblatt die Verwendung von 1N4001 vor. (Dioden in oben gezeigter Anordnung kommen so auch in Brückengleichrichtern vor.) Bei einem PWM Signal, wo der Strom nicht auf Null zurück geht, sind langsame Dioden aber problematisch, besser geeignet sind schnelle oder Schottkydioden (z.B. BYV27, 1N5819).&lt;br /&gt;
&lt;br /&gt;
Die Verlustleistung des ICs bei einem Ausgangsstrom von 1A (Nennstrom) beträgt ca. 3 Watt! Hierfür ist schon eine Kühlung erforderlich (Kühlkörper, Platinenlayout mit Kühlflächen, ggf. Lüfter).&lt;br /&gt;
&lt;br /&gt;
Wahrheitstabelle: siehe L293D&lt;br /&gt;
&lt;br /&gt;
Ein ähnliches IC ist das SN754410, welches allerdings schwer erhältlich ist.&lt;br /&gt;
&lt;br /&gt;
===Ansteuerung mit dem Schaltkreis L298===&lt;br /&gt;
&lt;br /&gt;
Der Schaltkreis [[Im RN-Wiki verwendete ICs|L298]] ist quasi der große Bruder des [[Im RN-Wiki verwendete ICs|L293D]]. Er beinhaltet auch zwei komplette H-Brücken, kann also auch zwei Motoren ansteuern. Die Pinbelegung ist ebenfalls dem [[Im RN-Wiki verwendete ICs|L293D]] sehr ähnlich, jedoch verfügt er über eine andere Bauform (&amp;quot;MULTIWATT-15&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:L298Pinout.JPG|center]]&lt;br /&gt;
Hinweis: Der L298 ist auch in einer SMD-Ausführung erhältlich.&lt;br /&gt;
&lt;br /&gt;
Der wichtigste Unterschied besteht jedoch darin, dass jede H-Brücke bei [[Im RN-Wiki verwendete ICs|L298]] bis zu 2 A belastet werden kann. Damit lassen sich also schon wesentlich größere Motoren ansteuern. Ein weiterer Vorzug sind die sogenannten SENSE-Ausgänge, über die der komplette Strom fließt. Oft wird hier ein Hochlastwiderstand  angeschlossen, um aus der abfallenden Spannung den Strom berechnen zu können. Dies machen sich Steuerungen wie [http://www.roboternetz.de/phpBB2/viewtopic.php?t=2741 RN-Motor] oder aber andere Schrittmotoransteuerungen zunutze, um den Strom zu regeln. Benötigt man keine Strommessung, so müssen die Sense-Ausgänge direkt mit GND verbunden werden. Anders als beim [[Im RN-Wiki verwendete ICs|L293D]] werden hier externe Freilaufdioden gebraucht.&lt;br /&gt;
&lt;br /&gt;
Bei der angegebenden Stromstärke von 2A ist allerdings auf eine ausreichende Wärmeabfuhr durch Kühlkörper zu achten. Laut Datenblatt kann bei einem Strom von 2A in einer Brücke eine Spannung von bis zu 4,9V abfallen. Die Verlustleistung beträgt dann 9,8W ''pro Brücke''.&lt;br /&gt;
Geringere Verluste haben im Allgemeinen Motortreiber, welche aus MOSFETs aufgebaut sind, da sie niederohmiger sind.&lt;br /&gt;
Leider lässt sich dieser Motortreiber bei Defekt aufgrund seiner Bauform nur schwer auswechseln.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:hbrueckel298.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Im Schaltplan fehlen Kondensatoren und Elkos. Es sollte noch ein Keramikkondensator 100nF zwischen +5V und GND, sowie noch ein 100nF Keramikkondensator und parallel dazu ein Elko mit ausreichender Kapazität zwischen Betriebsspannung und GND eingebaut werden.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Schaltbild gibt es hier [http://www.roboternetz.de/bilder/schaltung298getriebe.gif]&lt;br /&gt;
&lt;br /&gt;
===Ansteuerung mit L620x===&lt;br /&gt;
Der Schaltkreis [[Im RN-Wiki verwendete ICs|L620x]] stellt eine etwas modernere Alternative zur L298-Ansteuerung dar. Die Ansteuerung ist praktisch identisch, der Schaltungsaufbau in etwa gleich. Beim L620x sind keine externen Freilaufdioden mehr notwendig, dafür ist ein Kondensator und zwei Dioden für die interne Spannungserzeugung notwendig.&lt;br /&gt;
Ein großer Vorteil  ist auch, dass kein extra Kühlkörper mehr notwendig ist. Durch die Verwendung von niederohmigen FETs im L620x fällt am Motortreiber weniger Spannung ab und die Verlustleistung des Motortreiber-ICs wird dadurch deutlich geringer. Durch die erhältliche DIP-Bauform lassen sich diese Motortreiber bei Defekt auch schnell und einfach auswechseln. Viele integrierte Schutzfunktionen im L620x sorgen dafür, dass der Chip nicht so einfach zerstört werden kann.&lt;br /&gt;
&lt;br /&gt;
In der Praxis sind die angegeben 2,8 A (für den L6205) jedoch mit Vorsicht zu genießen. Bei Testlayouts erwärmten sich die ICs bereits bei 2 A Dauerstrom (PWM) oft so stark, dass die automatische Temperaturabschaltung reagierte, somit wird man vermutlich ohne Kühlung oder großes Kühllayout auf der Platine auch nicht mehr als beim [[Im RN-Wiki verwendete ICs|L298]] erreichen.&lt;br /&gt;
&lt;br /&gt;
====L6202 für 1 Motor====&lt;br /&gt;
&lt;br /&gt;
Pinbelegung des Motortreibers:&lt;br /&gt;
&lt;br /&gt;
[[Bild:L6202Pinbelegung.png]]&lt;br /&gt;
&lt;br /&gt;
Den L6202 gibt es auch noch in anderen Gehäusebauformen: L6201 ist die SMD-Ausführung (SO20 / PowerSO20), L6203 hat ein &amp;quot;Multiwatt-11&amp;quot;-Gehäuse.&lt;br /&gt;
&lt;br /&gt;
Schaltungsbeispiel:&lt;br /&gt;
&lt;br /&gt;
[[Bild:L6202Anwendung.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Kurze Erläuterung:&lt;br /&gt;
&lt;br /&gt;
R1 schaltet die H-Brücke bei fehlendem PWM-Signal ab und ist entbehrlich. Anmerkung: dieser Widerstand sollte scheinbar doch etwas hochohmiger gewählt werden, in der Größenordnung 50kOhm, um das PWM-Signal nicht zu stark zu belasten. (Details folgen u.U. noch)&lt;br /&gt;
&lt;br /&gt;
C1 stabilisiert eine interne Spannungsreferenz.&lt;br /&gt;
&lt;br /&gt;
C4 und C5 sind so genannte boostrap-Kondensatoren, die unbedingt notwendig sind, damit der Motortreiber seine oberen FETs treiben kann (nähere Details im Datenblatt). Die Kapazität von C4/C5 soll für einen sicheren Betrieb jeweils mindestens 10nF betragen.&lt;br /&gt;
&lt;br /&gt;
R2 und C6 bilden ein sog. Snubber-Netzwerk, welches zur Entstörung dient.&lt;br /&gt;
&lt;br /&gt;
====L6205 für 2 Motoren====&lt;br /&gt;
[[Bild:l6205ic.gif]] [[Bild:l6205pinbelegung.gif]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:l6205.gif|center]]&lt;br /&gt;
&lt;br /&gt;
=== TLE4202B / B57928 ===&lt;br /&gt;
Der TLE4202B ist ein kompakter Motortreiber von Siemens im TO-220-Gehäuse und kann einen Motor mit maximal 2A treiben. Er kann von 3,5V-17V Betriebsspannung arbeiten (absoutes Maximum: 40V).Intern ist der TLE4202B analog aufgebaut, eigentlich besteht er nur aus Komparatoren mit einer Leistungsendstufe. Die notwendigen Freilaufdioden sind bereits integriert. Der Treiber ist kurzschlussfest gegen Masse und schaltet bei Überhitzung ab. Leider lässt sich aufgrund des internen Aufbaus der Motorausgang nicht hochohmig schalten, es mangelt auch - im Vergleich&lt;br /&gt;
zu anderen Motortreiberbausteinen - an einem separaten PWM-Eingang. Der Betrieb mit PWM ist trotzdem möglich (zusätzliche Außenbeschaltung notwendig, [ToDo...]). Wird der angegebene maximale Strom von 2A entnommen, wird man aufgrund der Verlustleistung wahrscheinlich nicht ohne Kühlung auskommen. Bei geringen Strömen kann man den Treiber eventuell auch ohne Kühlkörper verwenden. Der TLE4202B kann laut Datenblatt auch als Leistungsoperationsverstärker verwendet werden (Figure 5 im Datenblatt). Bezugsquelle für den TLE4202B ist vorzugsweise Pollin aufgrund des attraktiven Preises (50Cent).&lt;br /&gt;
&lt;br /&gt;
Pinbelegung des Motortreibers TLE4202B (TO-220-Gehäuse):&lt;br /&gt;
&lt;br /&gt;
[[Bild:TLE4202_Pins.png]]&lt;br /&gt;
&lt;br /&gt;
Anwendungsschaltung laut Datenblatt (nachgezeichnet in Target):&lt;br /&gt;
&lt;br /&gt;
[[Bild:TLE4202_Schematic.png]]&lt;br /&gt;
&lt;br /&gt;
Die Kondensatoren (C2,C3) und Widerstände(R1,R2), die zwischen den Motoranschlüssen und Masse liegen, sind wichtig zur Schwingneigungsunterdrückung. Diese sog. Snubber-Netzwerke sind durchaus üblich, beispielsweise bei Audioverstärkern. Sie tragen hier zur Stabilität des Treibers bei. Ein Weglassen dieser Komponenten könnte zu wilden Schwingungen am Ausgang führen.&lt;br /&gt;
&lt;br /&gt;
Die 1,7V-Referenz wird intern erzeugt und ist mit den invertierenden Eingängen der Komparatoren verbunden (über 50kOhm intern). Die Komparatoren vergleichen die Eingangssignale an IN1/IN2 mit dieser Spannungsreferenz und steuern dann den Ausgang auf High (wenn Eingangsspannung über Referenzspannung) oder auf Low (wenn Eingangsspannung unter der Referenzspannung).&lt;br /&gt;
Im gezeigten Schaltplan wird die interne Referenz verwendet. Pin 2 wird dann nur mit einem Kondensator gegen Masse verbunden. Die Referenzspannung wird somit etwas stabilisiert.&lt;br /&gt;
&lt;br /&gt;
Da die Referenz über 50kOhm intern an die invertierenden Eingänge geschaltet ist, könnte auch von außen an Pin 2 eine andere beliebige (niederohmige) Referenzspannungsquelle eingespeist werden.&lt;br /&gt;
&lt;br /&gt;
Wahrheitstabelle der Ansteuerung:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| IN1 || IN2 || OUT1 || OUT2 || entspricht &lt;br /&gt;
|-&lt;br /&gt;
| L || L || - || - || Stop (Motor kurzschließen)&lt;br /&gt;
|-&lt;br /&gt;
| L || H || - || + || Motor dreht vorwärts&lt;br /&gt;
|-&lt;br /&gt;
| H || L || + || - || Motor dreht rückwärts&lt;br /&gt;
|-&lt;br /&gt;
| H || H || + || + || Stop (Motor kurzschließen)&lt;br /&gt;
|}&lt;br /&gt;
Wie man hier noch einmal sieht, kann bei dieser Brücke die Verbindung zum Motor nicht getrennt werden, Motor ausschalten bedeutet hier den Motor kurzschließen, sodass er dann relativ abrupt stehen bleibt.&lt;br /&gt;
&lt;br /&gt;
Es existiert auch ein TLE4203, welcher bis zu 4 Ampere treiben kann.&lt;br /&gt;
&lt;br /&gt;
=== TLE5205 ===&lt;br /&gt;
Der TLE5205 ist ein starker Motortreiber im TO-220-Gehäuse, welcher einen Motor bis 5A treiben kann. Freilaufdioden sind hier bereits integriert. Der Motortreiber kann falsche Verbindungen am Ausgang erkennen und zeigt dies durch ein Signal am Errorflag (EF) an. Kurzschlüsse der Ausgänge mit der Versorgung (V+ und GND) und eine zu hohe Stromaufnahme der Last können erkannt werden, der Ausgang wird dann innerhalb 50µS abgeschaltet und das EF gesetzt (open-drain-Ausgang!). Ein offener Ausgang wird ebenfalls detektiert. Bei Überhitzung (150°C) schaltet das IC ab. Achtung! Bei Unterspannung (&amp;quot;Under Voltage Lockout&amp;quot; im Datenblatt) schaltet sich die Brücke ebenfalls ab (bei etwa 5V). Die Betriebsspannung des ICs kann maximal 40V betragen, die Testschaltungen im Datenblatt werden im Bereich von 6-18V betrieben. Die Ruhestromaufnahme des ICs beträgt typisch 5mA (maximal 10mA).&lt;br /&gt;
&lt;br /&gt;
[[Bild:TLE5205_Pins.png]]&lt;br /&gt;
&lt;br /&gt;
Der TLE5205 ist nicht pinkompatibel zum TLE4202(B) !&lt;br /&gt;
&lt;br /&gt;
Wie man sieht, kommt dieser Motortreiber mit sehr wenig Außenbeschaltung aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:TLE5205_Schaltplan.png]]&lt;br /&gt;
&lt;br /&gt;
Als Elko kann auch gerne ein Typ mit größerer Kapazität verwendet werden (im Datenblatt 4700µF in der Testschaltung). Es können auch mehrere Elkos mit kleiner Kapazität parallel geschaltet werden (günstiger ESR).&lt;br /&gt;
&lt;br /&gt;
Im Fehlerfall (Kurzschluss, Überhitzung, Leerlauf) wird &amp;quot;ERROR&amp;quot; auf GND gelegt. Durch Ändern der Pegel an den Eingängen wird das EF wieder zurückgesetzt (liefert dann High, +5V). Der Pull-up-Widerstand ist notwendig, da der EF-Pin nur gegen GND schalten kann (open-drain-Ausgang).&lt;br /&gt;
&lt;br /&gt;
Die Brücke verhält sich im Vergleich zu den anderen gezeigten Motortreibern etwas anders an ihren Eingängen:&lt;br /&gt;
&lt;br /&gt;
Wahrheitstabelle (laut Datenblatt):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| IN1 || IN2 || OUT1 || OUT2 || entspricht &lt;br /&gt;
|-&lt;br /&gt;
| L || L || + || - || Motor dreht vorwärts&lt;br /&gt;
|-&lt;br /&gt;
| L || H || - || + || Motor dreht rückwärts&lt;br /&gt;
|-&lt;br /&gt;
| H || L || - || - || Motor stop (kurzschließen, OUT1+2 auf GND)&lt;br /&gt;
|-&lt;br /&gt;
| H || H || Z || Z || Motor ausschalten (Verbindung trennen)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wahrheitstabelle (nach Fehlersuche mit zwei Bauteilen herausgefunden):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| IN1 || IN2 || OUT1 || OUT2 || entspricht &lt;br /&gt;
|-&lt;br /&gt;
| L || L || - || - || Motor stop (kurzschließen, OUT1+2 auf GND)&lt;br /&gt;
|-&lt;br /&gt;
| L || H || - || + || Motor dreht rückwärts&lt;br /&gt;
|-&lt;br /&gt;
| H || L || + || - || Motor dreht vorwärts&lt;br /&gt;
|-&lt;br /&gt;
| H || H || Z || Z || Motor ausschalten (Verbindung trennen)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Leider mangelt es bei dieser Brücke an einem separaten Eingang für PWM. Man könnte zunächst auf die Idee kommen, den Eingang IN1 mit PWM zu verbinden und IN2 als Richtungssignal zu nehmen. Das das allerdings nicht ganz wie erhofft klappt soll hier erklärt werden (ist nicht ganz einfach): Der Motor würde beim Vorwärtsfahren abwechselnd drehen und gebremst (kurzgeschlossen) werden, beim Rückwärtsfahren allerdings abwechselnd drehen und ausgeschaltet werden (nicht kurzgeschlossen). Das Verhalten des Motors je nach Richtung wäre dann unterschiedlich. &lt;br /&gt;
&lt;br /&gt;
Abhilfe verschafft diese kleine Schaltung an den Eingängen des Motortreibers:&lt;br /&gt;
&lt;br /&gt;
[[Bild:TLE5205_PWM.png]]&lt;br /&gt;
&lt;br /&gt;
Ist PWM auf 5V, dann wird der Motor ausgeschaltet (Verbindung wird getrennt).&lt;br /&gt;
&lt;br /&gt;
Ist PWM auf 0V, so gelten die angelegten Pegel zur Richtungsinformation.&lt;br /&gt;
&lt;br /&gt;
Vorsicht! Bei den zuvor vorgestellten Motortreibern ist dieses Verhalten genau anders herum.&lt;br /&gt;
&lt;br /&gt;
=== Weitere Treiber-ICs ===&lt;br /&gt;
Es gibt noch mehr ähnliche Treiber ICs, die hier nur kurz aufgezählt werden sollten. Für Details sollte man ohnehin ins Datenblatt schauen.&lt;br /&gt;
*L293E ähnlich dem L293B, mit Strommessung&lt;br /&gt;
*BTS7741G  max. 7A , nur eine Brücke, SMD&lt;br /&gt;
*MC33887 max. 5A, nur eine Brücke, SMD&lt;br /&gt;
*BA6209 1,6A pk (max. continuous output current nicht angegeben), max.18V, nur eine Brücke, SIP10-Gehäuse&lt;br /&gt;
*TA7267 1A (3A pk), 6-18V, eine Brücke, HSIP7-Gehäuse&lt;br /&gt;
*TB6568KQ 1,5A (3A pk), 10-45V, eine Brücke, HSIP7-Gehäuse&lt;br /&gt;
&lt;br /&gt;
== Grundsätzliche Hinweise zum Aufbau ==&lt;br /&gt;
* Die '''Spannungsversorgung''' der Motortreiber sollte ausreichend '''gepuffert''' werden, um Spannungseinbrüche durch z.B. hohe Anlaufströme der Motoren zu vermeiden. Ein '''Elko''' mit einer Kapazität von 100µF...2200µF (je nach Stromaufnahme des Motors) sollte in der Versorgungsleitung vorgesehen werden. Typen mit geringem ESR sind von Vorteil; es können auch mehrere &amp;quot;normale&amp;quot; Elkos parallel geschaltet werden. Ein zusätzlicher 100nF Keramikkondensator filtert hochfrequente Störungen auf der Versorgungsleitung.&lt;br /&gt;
* Die '''Verkabelung''' von der Versorgungsleitung zum Motortreiber und von dort bis hin zu den Motoren muss einen ausreichenden Querschnitt aufweisen; ein Verdrillen der Kabel verbessert dabei die EMV (elektromagnetische Verträglichkeit). Die Kabel der Motoren sollten nach Möglichkeit Abstand zu Sensorleitungen halten und möglichst nicht zu ihnen parallel liegen, um eine Verfälschung der Sensormesswerte durch Induktion zu unterbinden. Dies ist vor allem bei einer Steuerung der Motoren mit PWM und bei hochohmigen Sensorimpedanzen enorm wichtig. Die Motoren sollten grundsätzlich immer entstört werden (siehe unten). Ein Kondensator zwischen den Anschlüssen ist das Minimum.&lt;br /&gt;
* Wird der Motortreiber mit PWM betrieben, sollte die '''Frequenz der PWM''' möglichst niedrig eingestellt werden. Dadurch werden Verluste beim Umschalten in der H-Brücke reduziert (v.a. bei MOSFETs).&lt;br /&gt;
* '''Freilaufdioden''' müssen für die auftretenden Ströme ausgelegt und auch &amp;quot;schnell genug&amp;quot; sein. Sind in den Motortreiberbausteinen bereits Freilaufdioden (&amp;quot;free wheeling diodes&amp;quot;) integriert, so müssen in der Regel keine zusätzlichen Dioden in die Schaltung eingebaut werden. Zusätzliche Freilaufdioden schaden allerdings auch nicht.&lt;br /&gt;
* Ein Motortreiber kann seinen angegebenen '''Nennstrom''' in Realität meist nicht ohne '''Kühlung''' erreichen (kurzzeitig durchaus möglich, langfristig aber nicht). Der Motortreiber sollte lieber etwas überdimensioniert werden (in Bezug auf maximal lieferbaren Strom), um einerseits die Verluste zu reduzieren, andererseits aber auch die Möglichkeit zum zukünftigen Umbau und Betrieb des Roboters mit leistungsfähigeren Motoren zu gewährleisten.&lt;br /&gt;
* Am Motor steht aufgrund der '''internen Verluste''' (z.B. RDS-ON-Widerstand bei MOSFETs) meist nicht mehr die volle Betriebsspannung zur Verfügung. Insbesondere bei niedrigen Versorgungsspannungen macht sich dies bemerkbar.&lt;br /&gt;
* Vor allem wenn größere Ströme von den Motoren benötigt werden, sollte man auf ein möglichst '''sternförmiges Massekonzept''' (Verdrahtung) der Schaltung achten, notfalls muss Steuerung und Leistungsteil aus getrennten Spannungsquellen versorgt werden.&lt;br /&gt;
* Die Motortreiber sollten '''auswechselbar''' sein, z.B. durch Verwendung einer IC-Fassung. Bei Defekt oder Überlastung kann der Motortreiber zügig und einfach ausgetauscht werden (besonders auf Roboter-Wettbewerben sinnvoll!). Nicht für alle Gehäusebauformen der Motortreiber sind Sockel verfügbar.&lt;br /&gt;
* Bei einem Platinenlayout für Motortreiber sind '''breite Leiterbahnen und Kühlflächen''' (häufig große Masseflächen) sowie '''kurze Verbindungen''' vorteilhaft, um Spannungsabfälle auf den Leitungen zu reduzieren und Wärme abzuführen.&lt;br /&gt;
&lt;br /&gt;
==Noch mehr Power gewünscht?==&lt;br /&gt;
Obwohl der L298 schon einiges abdeckt, so kommt er spätestens bei den Scheibenwischermotoren langsam an seine Grenzen. Bei starker Belastung können solche Motoren kurzzeitig bis ca. 10 A und mehr ziehen. Für solch starke Motoren gibt es jetzt einen ganz interessanten Motorchip aus dem Kfz-Bereich: VNH3SP (Datenblatt u.a. im Roboternetz Download-Bereich). &lt;br /&gt;
Mit ihm lassen sich sogar recht große Motoren ansteuern; vorausgesetzt, man kühlt ihn entsprechend, so verträgt der Chip bis zu 30 A. Aber selbst ohne Kühlung bietet er bedeutet mehr Leistung als der L298. Das Schöne: die Ansteuerung ist kaum anders als beim L298 und L293D.&lt;br /&gt;
&lt;br /&gt;
Kleiner Nachteil: Da es ein SMD-Chip mit 1mm Kontaktabstand ist, muss man schon eine geeignete Platine (spezielles Layout mit Kühlflächen) und etwas Löterfahrung besitzen. Inzwischen gibt es aber schon verschiedene RN-Projekte mit dem Chip (RN-Power, RN-Mini H-Bridge), Platinen und Chip können über den [http://www.shop.robotikhardware.de/shop/catalog/index.php Robotikhardware.de-Platinenservice] bezogen werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:minihbridge_ansteuerung.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alternativ zum [[SMD]]-Chip VNH'''3'''SP30 gibt es noch die Alternative VNH'''2'''SP30.&lt;br /&gt;
Dieser Chip erlaubt zwar nur Motorspannungen zwischen 6 und 16 Volt (Achtung: schaltet über 16V ab aufgrund Overvoltage Protection!), jedoch hat er einen wesentlich geringeren Innenwiderstand und wird deshalb nur etwa halb so warm wie der VNH3SP30.&lt;br /&gt;
Aus diesem Grund eignet er sich auch ideal für kleine Doppelmotorsteuerungen.&lt;br /&gt;
Natürlich gibt's auch hierfür ein Projekt und eine Bauanleitung, siehe [[RN-VNH2Dualmotor]]&lt;br /&gt;
&lt;br /&gt;
Das Schöne ist, dass es dieses RN-Projekt jetzt auch als Fertigmodul gibt!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:rndualmotoransteuerung.jpeg|center]]&lt;br /&gt;
&lt;br /&gt;
==Vergleich der gezeigten Motortreiber(-bausteine)==&lt;br /&gt;
&lt;br /&gt;
Bitte kontrollieren, korregieren und/oder ergänzen :)&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Bezeichnung || Bauformen || Mot. || UB || Ausg.strom || Freilaufd. || Curr.Sens. || ca. Preis || REI || CON || CSD || POL || RHW&lt;br /&gt;
|-&lt;br /&gt;
| L293B || DIL-16 || 2 || 4.5V-36V || 1A || keine || nein || 1-2 € || X || . || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| L293D || DIL-16 || 2 ||4.5V-36V || 600mA || integriert || nein || 1-2 € || X || X || X || . || X&lt;br /&gt;
|-&lt;br /&gt;
| L293DD || SO-16 (SMD) || 2 ||4.5V-36V || 600mA || integriert || nein || 2-3 € || X || X || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| L293E || DIL-20 || 2 || 4.5V-36V || 1A || keine || ja || 2-3 € || X || X || X || . || .&lt;br /&gt;
|-&lt;br /&gt;
| L298 || Multiwatt-15, Pow.SO20 || 2 || 4,5V-50V || 2A || keine || ja || 2-4 € || X || X || X || X || X&lt;br /&gt;
|-&lt;br /&gt;
| L6201/PS || SO20/PowerSO20 || 1 || 12V-48V || 1A / 4A(!?) || integriert || ja || 5 € || X || . || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| L6202 || DIL-18 || 1 || 12V-48V || 1,5-2 A || integriert || ja || 3-4 € || X || . || X || . || .&lt;br /&gt;
|-&lt;br /&gt;
| L6203 || Multiwatt-11 || 1 || 12V-48V || 2A / (4A!?) || integriert || ja || 4 € || X || . || X || . || .&lt;br /&gt;
|-&lt;br /&gt;
| L6205 || DIL-20,(Power)SO-20 || 2 || 8V-52V || 2,8A || integriert || ja || 7 € || X || . || . || . || X&lt;br /&gt;
|-&lt;br /&gt;
| TLE4202 || TO220 || 1 || 3,5-17V|| 2A || integriert || nein || 0,50 € || . || . || . || X || .&lt;br /&gt;
|-&lt;br /&gt;
| TLE5205 || TO220, P-DSO-20 || 1 || 6V-40V || 5A || integriert || nein || (5 €) || . || . || . || . || .&lt;br /&gt;
|-&lt;br /&gt;
| BTS7741G || P-DSO-28-14 || 1 || 4,8V-42V || 7A || integriert || nein || 2 € || . || . || . || X || .&lt;br /&gt;
|-&lt;br /&gt;
| VNH2SP30 || MultiPowerSO-30 || 1 || 5,5V-16V [*1]|| 30A || integriert || ja || 10 € || . || . || . || . || X&lt;br /&gt;
|-&lt;br /&gt;
| VNH3SP30 || MultiPowerSO-30 || 1 || 5,5V-36V [*2]|| 30A || integriert || nein || 6-9 € || X || . || . || . || X&lt;br /&gt;
|-&lt;br /&gt;
| Bezeichnung || Bauformen || Mot. || UB || Ausg.strom || Freilaufd. || Curr.Sens. || ca. Preis || REI || CON || CSD || POL || RHW&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Abkürzungen:&lt;br /&gt;
&lt;br /&gt;
* Mot. = Wie viele Motoren können gesteuert werden&lt;br /&gt;
* UB = Betriebsspannungsbereich&lt;br /&gt;
* Ausg.strom = Ausgangsstrom&lt;br /&gt;
* Freilaufd. = Freilaufdioden&lt;br /&gt;
* Curr.Sens. = Current Sensing = Messung des Motorstroms&lt;br /&gt;
&lt;br /&gt;
Verfügbarkeit bei Händlern:&lt;br /&gt;
&lt;br /&gt;
* REI = reichelt.de&lt;br /&gt;
* CON = conrad.de&lt;br /&gt;
* CSD = csd-electronics.de&lt;br /&gt;
* POL = pollin.de&lt;br /&gt;
* RHW = robotikhardware.de&lt;br /&gt;
&lt;br /&gt;
X bedeutet verfügbar, . bedeutet nicht verfügbar&lt;br /&gt;
&lt;br /&gt;
Anmerkungen zu Motortreibern vom Typ VNH2SP30 und VNH3SP30:&lt;br /&gt;
&lt;br /&gt;
* [*1]: schaltet bei typ. 19V (16V-22V) ab aufgrund Overvoltage Protection&lt;br /&gt;
* [*2]: schaltet bei typ. 43V (&amp;gt;36V) ab aufgrund Overvoltage Protection&lt;br /&gt;
&lt;br /&gt;
(keine Garantie auf Vollständigkeit und Richtigkeit der Angaben)&lt;br /&gt;
&lt;br /&gt;
Stand: März 2012&lt;br /&gt;
&lt;br /&gt;
==Endstufen mit I2C-Bus / RS232==&lt;br /&gt;
[[Bild:motctrl.png|thumb|Motoransteuerung über RS232, I2C, RC]]Verwendet man eine der oben vorgestellten H-Bridges, so wird immer vorausgesetzt, dass ein PWM-Signal und mehrere Ports zur Ansteuerung bereitstehen. Ist dies nicht der Fall, weil diese vielleicht schon belegt sind, so lassen sich Endstufen durch einen zusätzlichen Microcontroller auch um beliebige Schnittstellen erweitern. Insbesondere über I2C lassen sich dadurch mehrere Motorboards über einen einzigen Bus ansteuern. Ein Beispiel ist der programmierte Controller MOTCTRL, der speziell für diese Aufgabe gedacht ist. Die Grundschaltung sieht man in der rechten Skizze.&lt;br /&gt;
&lt;br /&gt;
==Varianten der Ansteuerung==&lt;br /&gt;
===Verwendung von Logikgattern===&lt;br /&gt;
Pro Motor, der angesteuert werden soll, werden normalerweise je drei Pins benötigt: 1xPWM und 2xRichtung. Sollen viele Motoren gleichzeitig angesteuert werden, so werden auch viele Pins des Mikrocontrollers benötigt. Durch die Verwendung von NAND oder NOT-Gattern können Pins für die Richtungsinformation gespart werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Motortreiber_NAND_NOT.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Aufgabe der Gatter ist es, das Richtungsbit zu invertieren. So liegt an IN1 der gleiche Pegel wie an Richtung an, an IN2 der invertierte Pegel.&lt;br /&gt;
Somit ist es möglich, mit nur einem Richtungsbit auszukommen. Es wird die Verwendung von 74HC00 (enthält 4x NAND) oder 74HC04 (enthält 6x NOT) - Logikgattern empfohlen. Selbstverständlich müssen die Logikgatter für den Betrieb auch mit der Versorgungsspannung (meist +5V) verbunden werden, üblicherweise wird die Versorgung auch mit einem 100nF Keramikkondensator in der Nähe des Gatters abgeblockt. (Nicht im Plan eingezeichnet!)&lt;br /&gt;
&lt;br /&gt;
Vorteile dieser Variante:&lt;br /&gt;
* 50% der Mikrocontrollerpins für die Richtungsinformation werden eingespart und können für andere Zwecke verwendet werden&lt;br /&gt;
* Programmierung wird einfacher, da weniger Pins gesteuert werden müssen&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* Es wird ein zusätzliches IC benötigt&lt;br /&gt;
* kurze Laufzeitunterschiede der Signale an IN1 und IN2 (in der Regel vernachlässigbar)&lt;br /&gt;
* Motor kann nicht kurzgeschlossen (also gebremst) werden, da hierzu gleiche Pegel an IN1 und IN2 notwendig wären; Ausschalten geschieht weiterhin über PWM&lt;br /&gt;
&lt;br /&gt;
Inverter können auch aus Transistoren und Widerständen gebaut werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Inverter_npn_pnp.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===Verwendung von Portexpandern===&lt;br /&gt;
Mit einem I2C-Portexpander wie z.B. PCF8574 oder mit einem Seriell-Parallel-Schieberegister 74HC595 könnten die Richtungsinformationen IN1, IN2 usw. geschaltet werden.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Einsparung der Mikrocontrollerpins für die Richtungsinformation&lt;br /&gt;
* Bremsen ist weiterhin möglich (im Gegensatz zur Variante mit den Logikgattern)&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* Es wird ein zusätzliches IC benötigt&lt;br /&gt;
* leicht erhöhter Softwareaufwand für den Mikrocontroller (I2C-Bus oder Ansteuerung des Schieberegisters)&lt;br /&gt;
* Verzögerungen durch die Ansteuerung&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Messung der Stromaufnahme des gesteuerten Motors ==&lt;br /&gt;
Es kann manchmal interessant sein, zu wissen, wie viel Strom die Motoren eines Roboters verbrauchen. Man könnte so einen Anhaltspunkt zur Belastung der Motoren erhalten. Ein hoher Motorstrom würde z.B. bedeuten, dass der Roboter gegen eine Wand fährt o.ä. Außerdem könnte eine Regelung der Motoren realisiert werden.&lt;br /&gt;
&lt;br /&gt;
Die meisten Motortreiber-ICs haben dafür SENSE-Anschlüsse. Wer keine Messung des Motorstroms benötigt, verbindet die SENSE-Anschlüsse mit GND (vgl. Schaltplan des L298). Ansonsten ist vorgesehen, einen Widerstand zwischen SENSE und GND einzubauen. Durch diesen Widerstand, der auch &amp;quot;Shunt&amp;quot; genannt wird, fließt auch genau der Strom, der durch den Motor fließt. Nach dem Ohmschen Gesetz U = R * I fällt dann an diesem Shunt eine Spannung ab, die proportional zum Motorstrom ist. Die Spannung lässt sich dann relativ einfach mit einem Mikrocontroller messen, indem man diese Spannung an einen Analogeingang anlegt.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Es soll ein Shunt mit 0,1 Ohm verwendet werden, der Motor benötigt 2A. Dann fallen am Shunt U = R * I = 0,1Ohm * 2A = 0,2V ab.&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller könnte diese Spannung direkt mit dem ADC messen. Da ein Mikrocontroller allerdings einen Messbereich bis meistens 5V aufweist, würde sich nur eine geringe Auflösung des gemessenen Motorstroms ergeben. Man könnte nun den Shunt größer machen (z.B. 1 Ohm), um größere Spannungen zum Messen zu erhalten. Allerdings fehlt die Spannung, die am Shunt abfällt, dann natürlich am Motor, sodass dieser langsamer dreht. Außerdem wird im Shunt elektrische Energie in Wärme umgesetzt, sodass diese für die entsprechende Leistung ausgelegt werden müssten. Die elektrische Leistung berechnet sich aus P = I² * R. Würde man beim angegebenen Beispiel einen 1-Ohm Widerstand einsetzen, müsste dieser schon P = (2A)² * 1Ohm = 4W verheizen!&lt;br /&gt;
&lt;br /&gt;
Eine bessere Lösung ist die Verwendung eines niederohmigen Shunts (z.B. 0,1 Ohm) sowie eines Operationsverstärkers, welcher die am Shunt gemessene Spannung quasi ''multipliziert'' und somit für den Mikrocontroller besser messbar macht.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Strommessung_shunt_tiefpass_opamp.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Gezeigt wird in der Abbildung der Shunt (links), dahinter ein RC-Tiefpassfilter, welches den Strom ''mittelt'', indem kurze Stromspitzen reduziert werden und den Messwert glätten/stabilisieren soll, sowie ein Operationsverstärker als nichtinvertierender Verstärker. Der Kondensator C2 dient nur zur Entstörung der Versorgungsspannung des Operationsverstärkers.&lt;br /&gt;
&lt;br /&gt;
Als Operationsverstärker kann z.B. der LM358 (zwei in einem Gehäuse) oder der LM324 (vier in einem Gehäuse) verwendet werden. Dieser kommt mit asymmetrischer Betriebsspannung - also +5V und GND - aus. Der Operationsverstärker wird in der Grundschaltung des nichtinvertierenden Verstärkers betrieben. Der Verstärkungsfaktor berechnet sich aus 1+(R3/R4); hier also 1+(10k/1k)=11. Aus einer Eingangsspannung von z.B. 0,2V würden dann 0,2V * 11 = 2,2V am Ausgang werden. Diese Spannung ließe sich schon viel besser mit einem Mikrocontroller messen. Es können auch andere Widerstandswerte für R3 und R4 verwendet werden, um den Verstärkungsfaktor anzupassen.&lt;br /&gt;
&lt;br /&gt;
Die genauen Werte des Tiefpassfilters sind unkritisch, es können auch andere Werte als in der Abbildung verwendet werden. Man könnte das Filter auch weglassen.&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Der LM358 bzw. LM324 kann bei 5V Betriebsspannung am Ausgang nur bis etwa 3,5V aussteuern. Sollen noch höhere Spannungen am Ausgang erreicht werden, muss entweder die Betriebsspannung des OpAmps erhöht oder ein sog. Rail-To-Rail Operationsverstärker (z.B. LMC6484) eingesetzt werden, der bis knapp an die Versorgungsspannung aussteuern kann.&lt;br /&gt;
&lt;br /&gt;
Bei ungeschickter Masseführung kann es zu Fehlmessungen kommen. Nicht nur in diesem Fall, sondern grundsätzlich ist es besser, einen Subtrahierer mit OpAmp anstatt der oben gezeigten Schaltung aufzubauen. Eine solche Schaltung ist nicht viel umfangreicher, es sind nur zwei zusätzliche Widerstände notwendig.&lt;br /&gt;
Sind präzise Messungen erforderlich, sollte der Widerstandswert des Shunts nachgemessen werden, außerdem wird die Verwendung von Metallfilmwiderständen mit einer Toleranz von 1% in der weiteren OpAmp-Schaltung empfohlen.&lt;br /&gt;
&lt;br /&gt;
== Motor ausschalten - Varianten ==&lt;br /&gt;
Muss man über einen so banalen Zusammenhang noch Worte verlieren? JA! Es gibt hier zwei Varianten, die durchaus wichtig sind, und in manchen Anwendungsgebieten auch einen großen Unterschied machen.&lt;br /&gt;
Naheliegend ist, die Verbindung zum Motor einfach zu trennen, sodass dieser noch ausrollen kann. Die andere Möglichkeit ist, die beiden Anschlüsse des Motors miteinander zu verbinden. Damit wird der Motor abgebremst. Den Effekt kann jeder einmal praktisch ausprobieren: Verbinde die beiden Anschlüsse des Motors und versuche dann, an der Achse zu drehen. Vor allem bei Getriebemotoren ist dann diese Bremse spürbar.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Motor_aus.png]]&lt;br /&gt;
&lt;br /&gt;
Für eine Geschwindigkeitsregelung mittels PWM sollte das &amp;quot;normale Ausschalten&amp;quot; gewählt werden, da sich der Roboter sonst wohl kaum vom Fleck bewegt.&lt;br /&gt;
Soll der Roboter schnell anhalten oder für einen relativ kleinen Winkel drehen, so sollten die Motoren gebremst werden.&lt;br /&gt;
&lt;br /&gt;
Andererseits sollte die Hardware falls erwünscht auch beide Betriebsarten unterstützen können. Jedoch sind dazu nicht alle Motortreiber in der Lage. Probleme kann das Bremsen machen, da der Motor dann über den Motortreiber kurzgeschlossen wird (z.B. beide Anschlüsse mit GND verbunden). Dann fließt im Moment des Bremsens ein Strom durch den Treiber, welcher dann Leistung in Form von Wärme abgeben muss.&lt;br /&gt;
&lt;br /&gt;
Motortreiber aus Operationsverstärkern können z.B. ihren Ausgang nicht hochohmig schalten, es liegt immer eine belastbare Spannung am Ausgang an, somit können diese nur bremsen und nicht &amp;quot;normal&amp;quot; ausschalten.&lt;br /&gt;
&lt;br /&gt;
Hier eine Tabelle die zeigt, welche Motortreiber welche Variante beherrschen können:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Treiber || L293B/D/DD/E || L298 || L620x || OpAmp || TLE4202B || TLE5202 || BTS7741 || VNH2SP30 || Variante mit Logikgattern&lt;br /&gt;
|-&lt;br /&gt;
| Ausschalten || ja || ja || ja || nein || nein || ja || nein || ja || ja&lt;br /&gt;
|-&lt;br /&gt;
| Bremsen || ja || ja || ja || ja || ja || ja || ja || ja || nein&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Und nie vergessen Motoren zu entstören==&lt;br /&gt;
&lt;br /&gt;
Das Entstören dient dazu, eine Ausbreitung von Funkstörungen durch das sogenannte &amp;quot;Bürstenfeuer&amp;quot; zu verhindern. Und so wird's gemacht:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:entstoerung.gif|center]]&lt;br /&gt;
&lt;br /&gt;
Bei Steuerung des Motors per PWM sind die Induktivitäten hilfreich. Sie verhindern das bei den steilen Flanken des PWM Signals große Ströme duch die Kondensatoren fließen. Alternativ zu den 2 Kondensatoren (C2,C3) gegen das Gehäuse kann das Gehäuse auch direkt an Masse angeschlosssen werden. Bei einer PWM Steuerung ist das die bessere Lösung.&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Getriebemotoren]]&lt;br /&gt;
* [[RN-VNH2Dualmotor]]&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/motordrehmoment.php Drehmoment Berechnung]&lt;br /&gt;
* [http://www.roboternetz.de/motoruebersicht.html Motoren Übersicht]&lt;br /&gt;
* [http://www.shop.robotikhardware.de/shop/catalog/index.php?cPath=65 Bauteilesets]&lt;br /&gt;
* [http://www.roboternetz.de/robotertutorial.html Roboter-Tutorial]&lt;br /&gt;
* [http://www.roboternetz.de Roboternetz Forum]&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>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bauteil_selber_erstellen&amp;diff=12634</id>
		<title>Bauteil selber erstellen</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bauteil_selber_erstellen&amp;diff=12634"/>
				<updated>2007-08-26T13:50:20Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Schritt 2: Symbol zeichnen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bauteile selber in Eagle erstellen =&lt;br /&gt;
Früher oder später kommt jeder einmal an den Punkt, an dem er/sie ein Bauteil in den Händen hält, von dem es in den Standardbibliotheken von Eagle kein entsprechendes Symbol gibt.&lt;br /&gt;
&lt;br /&gt;
== Was man tun muss ==&lt;br /&gt;
# Neue Library erstellen&lt;br /&gt;
# Symbol zeichnen&lt;br /&gt;
# Package zeichnen&lt;br /&gt;
# Symbol und Package zu einem Device verknüpfen&lt;br /&gt;
&lt;br /&gt;
=== Schritt 1: Neue Library erstellen ===&lt;br /&gt;
Hierzu wählt man einfach im Hauptfenster von Eagle File\New\Library aus.&lt;br /&gt;
&lt;br /&gt;
[[bild:0_newlib.jpg]]&lt;br /&gt;
&lt;br /&gt;
Dann öffnet sich ein neues leeres Fenster. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[bild:01_newlib.JPG]]&lt;br /&gt;
&lt;br /&gt;
Um jetzt ein neues Bauteil hinzuzufügen, klickt man sich an den rot umkringelten Icons von rechts nach links entlang. Zuerst erstellt man ein Symbol, dann ein Package und schließlich erstellt man ein Device aus beiden.&lt;br /&gt;
&lt;br /&gt;
=== Schritt 2: Symbol zeichnen ===&lt;br /&gt;
Da ich gerade kein Bauteil weiß, das ich jetzt unbedingt in meiner Library haben will, werde ich etwas entwerfen, das es garantiert noch nicht gibt. Ein Hirnkontrollbaustein (MindCtrl0815). Dazu male ich mittels Wires und Pins (bei denen man noch einstellen kann, in welche Richtung IO, I oder O sie gehen) ein Symbol, das später dann auf dem Schaltplan erscheinen soll. Hier habe ich zwei Brain IOs, einen Mind_Ctrl-Input, einen Reset-Input und zwei Gedankenleitungen (Output). Die grünen Kringel sind die Punkte, an die später die Leiterbahnen anknüpfen.&lt;br /&gt;
&lt;br /&gt;
[[bild:1_symbol.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Schritt 3: Package zeichnen ===&lt;br /&gt;
Nachdem das Symbol fertig ist, kann man zum nächsten Schritt übergehen. Dem Package:&lt;br /&gt;
Hier sollte das Bauteil in seinen originalen Abmessungen mit der Pinanordnung, wie sie auch in Wirklichkeit ist, nachgebildet werden. Hierzu verwendet man einfach die Symbole an der linken Bildschirmseite. Wenn man nicht wie ich ein reales Bauteil nachbilden will, findet man die Abmessungen meist im Datenblatt.&lt;br /&gt;
&lt;br /&gt;
[[bild:2_package.JPG]]&lt;br /&gt;
&lt;br /&gt;
=== Schritt 4: Device ===&lt;br /&gt;
Als nächstes werden dann Symbol und Package zu einem Device kombiniert. Dazu klickt man auf Device und gibt ihm einen sprechenden Namen. Danach klickt man auf den Add-Button und selektiert das gerade erstellte Symbol.&lt;br /&gt;
Dieses kann dann im großen Fenster platziert werden. Danach klickt man unten rechts auf &amp;quot;new&amp;quot; und wählt das gerade erstellte Package aus. &lt;br /&gt;
&lt;br /&gt;
[[bild:3_device.JPG]]&lt;br /&gt;
&lt;br /&gt;
Was jetzt noch fehlt ist, welcher Fuß des Symbols zu welchem des Packages gehört. Dies wird im Connect Dialog eingestellt. Ist alles zugeordnet, erscheint ein grüner Haken neben dem Package und das Device ist fertig.&lt;br /&gt;
&lt;br /&gt;
[[bild:4_connect.JPG]]&lt;br /&gt;
&lt;br /&gt;
Nachdem man die Library gespeichert hat, kann man das Bauteil nach dem nächsten Programmstart benutzen.&lt;br /&gt;
&lt;br /&gt;
[[bild:5_add.JPG]]&lt;br /&gt;
&lt;br /&gt;
Das wars.&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Wunschthemen&amp;diff=12633</id>
		<title>Wunschthemen</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Wunschthemen&amp;diff=12633"/>
				<updated>2007-08-26T13:48:32Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Meine Wunschthemen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite kann '''jeder''' Themen nennen, die er sich in diesem Wiki wünschen würde. Die Seite dient Usern, die gerne was schreiben möchten, als Anregung. Hat jemand ein entsprechendes Thema erstellt, kann er es auch aus dieser Liste wieder streichen. &lt;br /&gt;
&lt;br /&gt;
==Meine Wunschthemen==&lt;br /&gt;
&lt;br /&gt;
'''Allgemeines'''&lt;br /&gt;
* Spracherkennung&lt;br /&gt;
* [[Schaltung AVR-Digitizer]] um Videobild mit AVR zu digitalisieren und auszuwerten oder per Funk zu übertragen&lt;br /&gt;
* Ausführliche Bedienhinweise für Euroflex-Saugroboter Monster Intelligente F1&lt;br /&gt;
* Künstliche Neuronale Netze&lt;br /&gt;
* [[Formula Flowcode Buggy]]&lt;br /&gt;
&lt;br /&gt;
'''Programmierung'''&lt;br /&gt;
* [[Network_Controller/PC_RS232_mit_Windows|Ansprechen der RS232 Schnittstelle mit gängigen Programmiersprachen]]&lt;br /&gt;
* Pda und PPC steuerung über CF und MMC slot&lt;br /&gt;
* [[GCC]] Einführung mit Beispielen (welche Beispiele? Benutzung von GCC? (Optionen, ...)?, Programmbeispiele (also [[C-Tutorial]])?), für spezielle Maschinen oder Derivate? ANSI-C? Was fehlt in den [[:Kategorie:Quellcode C|C-Beispielen]]?)&lt;br /&gt;
* Mehr C Tutorials wie bei Bascom für LCDs,....&lt;br /&gt;
* C-Control 2 Tutorial&lt;br /&gt;
* PIC16F... Programmierung mit dem Go Embedded Pascal-Compiler&lt;br /&gt;
* PIC18F... Einführung&lt;br /&gt;
&lt;br /&gt;
'''Hardware'''&lt;br /&gt;
* CNY70&lt;br /&gt;
* CNY70 als Liniensensor (analoge / digitale Auswertung)&lt;br /&gt;
* Serielles AVR-ISP Programmierkabel&lt;br /&gt;
* USB-ISP Programmieradaper&lt;br /&gt;
* Schnittstellen Übersicht (Es sollten alle gängigen Schnittstellen mit Vorteilen, Nachteilen etc. aufgelistet werden, damit man für jede zu bewältigende Aufgabe die am besten geeignete Schnittstelle wählen kann)&lt;br /&gt;
* JTAG mit AVRs&lt;br /&gt;
* Shift-/Schieberegister&lt;br /&gt;
* Sensorschaltung Windrichtung&lt;br /&gt;
* Sensorschaltung Luftfeuchte&lt;br /&gt;
* Schaltungssicherheitsvorkehrungen (wenns nicht nur auf dem Basteltisch funktionieren soll)&lt;br /&gt;
** ESD-Sicherheit&lt;br /&gt;
*** ESD-konformes Routing&lt;br /&gt;
*** ESD-Bauteile (Supressor Dioden, etc.)&lt;br /&gt;
*** Abschirmung bei Leitungen, Gehäuseauswahl, etc.&lt;br /&gt;
** Kurzschlusssicherheit&lt;br /&gt;
** Verpolungsschutz&lt;br /&gt;
** Überspannungsschutz&lt;br /&gt;
* Kondensator mit Beispielschaltungen&lt;br /&gt;
* Bluetooth Support (senden/empfangen) nach dem Vorbild des Lego NXT&lt;br /&gt;
&lt;br /&gt;
==Folgende erscheinen noch unvollständig und sollten von Usern die in dem Bereich kundig sind, ergänzt werden==&lt;br /&gt;
Findet man jetzt durch folgenden Link: [[:Kategorie:Artikelausbau]]&lt;br /&gt;
Artikel die unvollständig sind sollte man jetzt also nicht mehr hier aufgelistet werden, sondern die Artikel sollten am unteren Ende durch folgendes Kommando ergänzen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
  {{Ausbauwunsch|Mehr Grundlagen und vor allem Programmbeispiele etc.}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Artikel wird dann ein Hinweis eingeblendet, ähnlich wie diesem:&lt;br /&gt;
&lt;br /&gt;
[[Bild:artikelausbau.gif]]&lt;br /&gt;
&lt;br /&gt;
Also hier klicken um ausbaufähige Artikel zu finden:&lt;br /&gt;
* [[:Kategorie:Artikelausbau]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Hier noch ein paar Artikel wo der Hinweis noch nicht drin steht:&lt;br /&gt;
&lt;br /&gt;
* [[GNU Assembler|AVR Assembler (GNU) Einführung]]:&lt;br /&gt;
* [[Zahnrad]]&lt;br /&gt;
* [[Flipflop]]&lt;br /&gt;
* [[C-Tutorial]] &lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
* [[Transistor]] (noch ein paar Bilder und vielleicht Grundschaltungen mit Beschreibung wären toll&lt;br /&gt;
* [[Avr-gcc|Dokumentation zu avr-gcc]]&lt;br /&gt;
* [[Arm]] Microcontroller&lt;br /&gt;
* [[GPS]] - Aufbau und Anwendung&lt;br /&gt;
* [[SPI]] - Vielleicht noch Beispiele&lt;br /&gt;
* [[Portexpander am AVR]] könnte nen BASCOM-Teil vertragen&lt;br /&gt;
* [[Manchester- Codierung]] - noch ein Programmbeispiel wäre toll&lt;br /&gt;
* [[JTAG]]&lt;br /&gt;
&lt;br /&gt;
== Bereits erfüllte Wünsche ==&lt;br /&gt;
* stellenanzeigen-forum -&amp;gt;Gibt es bereits hier http://www.roboternetz.de/phpBB2/viewforum.php?f=29&lt;br /&gt;
* Filter (Hardware/Software) -&amp;gt; Wurde hier angelegt [[Filter (Elektronik)]]&lt;br /&gt;
* [[Roboterwettbewerbe]]&lt;br /&gt;
* Motortreiber (Einsteigerguide) -&amp;gt; [[Getriebemotoren Ansteuerung]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:RN-Wissen]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bauteil_selber_erstellen&amp;diff=12632</id>
		<title>Bauteil selber erstellen</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bauteil_selber_erstellen&amp;diff=12632"/>
				<updated>2007-08-26T13:47:20Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Schritt 2: Symbol zeichnen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bauteile selber in Eagle erstellen =&lt;br /&gt;
Früher oder später kommt jeder einmal an den Punkt, an dem er/sie ein Bauteil in den Händen hält, von dem es in den Standardbibliotheken von Eagle kein entsprechendes Symbol gibt.&lt;br /&gt;
&lt;br /&gt;
== Was man tun muss ==&lt;br /&gt;
# Neue Library erstellen&lt;br /&gt;
# Symbol zeichnen&lt;br /&gt;
# Package zeichnen&lt;br /&gt;
# Symbol und Package zu einem Device verknüpfen&lt;br /&gt;
&lt;br /&gt;
=== Schritt 1: Neue Library erstellen ===&lt;br /&gt;
Hierzu wählt man einfach im Hauptfenster von Eagle File\New\Library aus.&lt;br /&gt;
&lt;br /&gt;
[[bild:0_newlib.jpg]]&lt;br /&gt;
&lt;br /&gt;
Dann öffnet sich ein neues leeres Fenster. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[bild:01_newlib.JPG]]&lt;br /&gt;
&lt;br /&gt;
Um jetzt ein neues Bauteil hinzuzufügen, klickt man sich an den rot umkringelten Icons von rechts nach links entlang. Zuerst erstellt man ein Symbol, dann ein Package und schließlich erstellt man ein Device aus beiden.&lt;br /&gt;
&lt;br /&gt;
=== Schritt 2: Symbol zeichnen ===&lt;br /&gt;
Da ich gerade kein Bauteil weiß, das ich jetzt unbedingt in meiner Library haben will, werde ich etwas entwerfen, das es garantiert noch nicht gibt. Ein Hirnkontrollbaustein (MindCtrl0815). Dazu male ich mittels Wires und Pins (bei denen man noch einstellen kann, in welche Richtung IO, I oder O sie gehen) ein Symbol, das später dann auf dem Schaltplan erscheinen soll. Hier habe ich zwei Brain IOs, einen Mind_Ctrl-Input, einen Reset-Input und zwei Gedankenleitungen (Output). Die grünen Kringel sind die Punkte, an die später die Leitung anknüpft.&lt;br /&gt;
&lt;br /&gt;
[[bild:1_symbol.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Schritt 3: Package zeichnen ===&lt;br /&gt;
Nachdem das Symbol fertig ist, kann man zum nächsten Schritt übergehen. Dem Package:&lt;br /&gt;
Hier sollte das Bauteil in seinen originalen Abmessungen mit der Pinanordnung, wie sie auch in Wirklichkeit ist, nachgebildet werden. Hierzu verwendet man einfach die Symbole an der linken Bildschirmseite. Wenn man nicht wie ich ein reales Bauteil nachbilden will, findet man die Abmessungen meist im Datenblatt.&lt;br /&gt;
&lt;br /&gt;
[[bild:2_package.JPG]]&lt;br /&gt;
&lt;br /&gt;
=== Schritt 4: Device ===&lt;br /&gt;
Als nächstes werden dann Symbol und Package zu einem Device kombiniert. Dazu klickt man auf Device und gibt ihm einen sprechenden Namen. Danach klickt man auf den Add-Button und selektiert das gerade erstellte Symbol.&lt;br /&gt;
Dieses kann dann im großen Fenster platziert werden. Danach klickt man unten rechts auf &amp;quot;new&amp;quot; und wählt das gerade erstellte Package aus. &lt;br /&gt;
&lt;br /&gt;
[[bild:3_device.JPG]]&lt;br /&gt;
&lt;br /&gt;
Was jetzt noch fehlt ist, welcher Fuß des Symbols zu welchem des Packages gehört. Dies wird im Connect Dialog eingestellt. Ist alles zugeordnet, erscheint ein grüner Haken neben dem Package und das Device ist fertig.&lt;br /&gt;
&lt;br /&gt;
[[bild:4_connect.JPG]]&lt;br /&gt;
&lt;br /&gt;
Nachdem man die Library gespeichert hat, kann man das Bauteil nach dem nächsten Programmstart benutzen.&lt;br /&gt;
&lt;br /&gt;
[[bild:5_add.JPG]]&lt;br /&gt;
&lt;br /&gt;
Das wars.&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bauteil_selber_erstellen&amp;diff=12631</id>
		<title>Bauteil selber erstellen</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bauteil_selber_erstellen&amp;diff=12631"/>
				<updated>2007-08-26T13:46:46Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bauteile selber in Eagle erstellen =&lt;br /&gt;
Früher oder später kommt jeder einmal an den Punkt, an dem er/sie ein Bauteil in den Händen hält, von dem es in den Standardbibliotheken von Eagle kein entsprechendes Symbol gibt.&lt;br /&gt;
&lt;br /&gt;
== Was man tun muss ==&lt;br /&gt;
# Neue Library erstellen&lt;br /&gt;
# Symbol zeichnen&lt;br /&gt;
# Package zeichnen&lt;br /&gt;
# Symbol und Package zu einem Device verknüpfen&lt;br /&gt;
&lt;br /&gt;
=== Schritt 1: Neue Library erstellen ===&lt;br /&gt;
Hierzu wählt man einfach im Hauptfenster von Eagle File\New\Library aus.&lt;br /&gt;
&lt;br /&gt;
[[bild:0_newlib.jpg]]&lt;br /&gt;
&lt;br /&gt;
Dann öffnet sich ein neues leeres Fenster. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[bild:01_newlib.JPG]]&lt;br /&gt;
&lt;br /&gt;
Um jetzt ein neues Bauteil hinzuzufügen, klickt man sich an den rot umkringelten Icons von rechts nach links entlang. Zuerst erstellt man ein Symbol, dann ein Package und schließlich erstellt man ein Device aus beiden.&lt;br /&gt;
&lt;br /&gt;
=== Schritt 2: Symbol zeichnen ===&lt;br /&gt;
Da ich gerade kein Bauteil weiß, das ich jetzt unbedingt in meiner Library haben will, werde ich etwas entwerfen, das es garantiert noch nicht gibt. Ein Hirnkontrollbaustein (MindCtrl0815). Dazu Male ich mittels Wires und Pins (bei denen man noch einstellen kann, in welche Richtung IO, I oder O sie gehen) ein Symbol, das später dann auf dem Schaltplan erscheinen soll. Hier habe ich zwei Brain IOs, einen Mind_Ctrl-Input, einen Reset-Input und zwei Gedankenleitungen (Output). Die grünen Kringel sind die Punkte, an die später die Leitung anknüpft.&lt;br /&gt;
&lt;br /&gt;
[[bild:1_symbol.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Schritt 3: Package zeichnen ===&lt;br /&gt;
Nachdem das Symbol fertig ist, kann man zum nächsten Schritt übergehen. Dem Package:&lt;br /&gt;
Hier sollte das Bauteil in seinen originalen Abmessungen mit der Pinanordnung, wie sie auch in Wirklichkeit ist, nachgebildet werden. Hierzu verwendet man einfach die Symbole an der linken Bildschirmseite. Wenn man nicht wie ich ein reales Bauteil nachbilden will, findet man die Abmessungen meist im Datenblatt.&lt;br /&gt;
&lt;br /&gt;
[[bild:2_package.JPG]]&lt;br /&gt;
&lt;br /&gt;
=== Schritt 4: Device ===&lt;br /&gt;
Als nächstes werden dann Symbol und Package zu einem Device kombiniert. Dazu klickt man auf Device und gibt ihm einen sprechenden Namen. Danach klickt man auf den Add-Button und selektiert das gerade erstellte Symbol.&lt;br /&gt;
Dieses kann dann im großen Fenster platziert werden. Danach klickt man unten rechts auf &amp;quot;new&amp;quot; und wählt das gerade erstellte Package aus. &lt;br /&gt;
&lt;br /&gt;
[[bild:3_device.JPG]]&lt;br /&gt;
&lt;br /&gt;
Was jetzt noch fehlt ist, welcher Fuß des Symbols zu welchem des Packages gehört. Dies wird im Connect Dialog eingestellt. Ist alles zugeordnet, erscheint ein grüner Haken neben dem Package und das Device ist fertig.&lt;br /&gt;
&lt;br /&gt;
[[bild:4_connect.JPG]]&lt;br /&gt;
&lt;br /&gt;
Nachdem man die Library gespeichert hat, kann man das Bauteil nach dem nächsten Programmstart benutzen.&lt;br /&gt;
&lt;br /&gt;
[[bild:5_add.JPG]]&lt;br /&gt;
&lt;br /&gt;
Das wars.&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:5_add.JPG&amp;diff=12630</id>
		<title>Datei:5 add.JPG</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:5_add.JPG&amp;diff=12630"/>
				<updated>2007-08-26T13:45:51Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:4_connect.JPG&amp;diff=12629</id>
		<title>Datei:4 connect.JPG</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:4_connect.JPG&amp;diff=12629"/>
				<updated>2007-08-26T13:44:52Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:3_device.JPG&amp;diff=12628</id>
		<title>Datei:3 device.JPG</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:3_device.JPG&amp;diff=12628"/>
				<updated>2007-08-26T13:44:05Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:2_package.JPG&amp;diff=12627</id>
		<title>Datei:2 package.JPG</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:2_package.JPG&amp;diff=12627"/>
				<updated>2007-08-26T13:42:18Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:1_symbol.jpg&amp;diff=12626</id>
		<title>Datei:1 symbol.jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:1_symbol.jpg&amp;diff=12626"/>
				<updated>2007-08-26T13:40:41Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:01_newlib.JPG&amp;diff=12625</id>
		<title>Datei:01 newlib.JPG</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:01_newlib.JPG&amp;diff=12625"/>
				<updated>2007-08-26T13:38:00Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:0_newlib.jpg&amp;diff=12624</id>
		<title>Datei:0 newlib.jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:0_newlib.jpg&amp;diff=12624"/>
				<updated>2007-08-26T13:36:25Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: Eine neue Library anlegen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine neue Library anlegen&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Eagle&amp;diff=12623</id>
		<title>Eagle</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Eagle&amp;diff=12623"/>
				<updated>2007-08-26T13:31:24Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Programm von Cadsoft zum erstellen von Schaltplänen und Leiterplatten Layouts.&lt;br /&gt;
Auch mit Autorouter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Leiterplatten Entwicklung]]&lt;br /&gt;
* [[Platinen doppelseitig layouten mit Eagle]]&lt;br /&gt;
* [[Bauteil selber erstellen]]&lt;br /&gt;
[[Kategorie:Abkürzung]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Stichworte]]&lt;br /&gt;
[[Kategorie:Software]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Eagle&amp;diff=12622</id>
		<title>Eagle</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Eagle&amp;diff=12622"/>
				<updated>2007-08-26T06:58:38Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Programm von Cadsoft zum erstellen von Schaltplänen und Leiterplatten Layouts.&lt;br /&gt;
Auch mit Autorouter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Leiterplatten Entwicklung]]&lt;br /&gt;
* [[Platinen doppelseitig layouten mit Eagle]]&lt;br /&gt;
[[Kategorie:Abkürzung]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Stichworte]]&lt;br /&gt;
[[Kategorie:Software]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Wunschthemen&amp;diff=12621</id>
		<title>Wunschthemen</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Wunschthemen&amp;diff=12621"/>
				<updated>2007-08-26T06:55:45Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Meine Wunschthemen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite kann '''jeder''' Themen nennen, die er sich in diesem Wiki wünschen würde. Die Seite dient Usern, die gerne was schreiben möchten, als Anregung. Hat jemand ein entsprechendes Thema erstellt, kann er es auch aus dieser Liste wieder streichen. &lt;br /&gt;
&lt;br /&gt;
==Meine Wunschthemen==&lt;br /&gt;
&lt;br /&gt;
'''Allgemeines'''&lt;br /&gt;
* Bauteile in Eagle erstellen, die es nicht in den vorgefertigten Libs gibt.&lt;br /&gt;
* Spracherkennung&lt;br /&gt;
* [[Schaltung AVR-Digitizer]] um Videobild mit AVR zu digitalisieren und auszuwerten oder per Funk zu übertragen&lt;br /&gt;
* Ausführliche Bedienhinweise für Euroflex-Saugroboter Monster Intelligente F1&lt;br /&gt;
* Künstliche Neuronale Netze&lt;br /&gt;
* [[Formula Flowcode Buggy]]&lt;br /&gt;
&lt;br /&gt;
'''Programmierung'''&lt;br /&gt;
* [[Network_Controller/PC_RS232_mit_Windows|Ansprechen der RS232 Schnittstelle mit gängigen Programmiersprachen]]&lt;br /&gt;
* Pda und PPC steuerung über CF und MMC slot&lt;br /&gt;
* [[GCC]] Einführung mit Beispielen (welche Beispiele? Benutzung von GCC? (Optionen, ...)?, Programmbeispiele (also [[C-Tutorial]])?), für spezielle Maschinen oder Derivate? ANSI-C? Was fehlt in den [[:Kategorie:Quellcode C|C-Beispielen]]?)&lt;br /&gt;
* Mehr C Tutorials wie bei Bascom für LCDs,....&lt;br /&gt;
* C-Control 2 Tutorial&lt;br /&gt;
* PIC16F... Programmierung mit dem Go Embedded Pascal-Compiler&lt;br /&gt;
* PIC18F... Einführung&lt;br /&gt;
&lt;br /&gt;
'''Hardware'''&lt;br /&gt;
* CNY70&lt;br /&gt;
* CNY70 als Liniensensor (analoge / digitale Auswertung)&lt;br /&gt;
* Serielles AVR-ISP Programmierkabel&lt;br /&gt;
* USB-ISP Programmieradaper&lt;br /&gt;
* Schnittstellen Übersicht (Es sollten alle gängigen Schnittstellen mit Vorteilen, Nachteilen etc. aufgelistet werden, damit man für jede zu bewältigende Aufgabe die am besten geeignete Schnittstelle wählen kann)&lt;br /&gt;
* JTAG mit AVRs&lt;br /&gt;
* Shift-/Schieberegister&lt;br /&gt;
* Sensorschaltung Windrichtung&lt;br /&gt;
* Sensorschaltung Luftfeuchte&lt;br /&gt;
* Schaltungssicherheitsvorkehrungen (wenns nicht nur auf dem Basteltisch funktionieren soll)&lt;br /&gt;
** ESD-Sicherheit&lt;br /&gt;
*** ESD-konformes Routing&lt;br /&gt;
*** ESD-Bauteile (Supressor Dioden, etc.)&lt;br /&gt;
*** Abschirmung bei Leitungen, Gehäuseauswahl, etc.&lt;br /&gt;
** Kurzschlusssicherheit&lt;br /&gt;
** Verpolungsschutz&lt;br /&gt;
** Überspannungsschutz&lt;br /&gt;
* Kondensator mit Beispielschaltungen&lt;br /&gt;
* Bluetooth Support (senden/empfangen) nach dem Vorbild des Lego NXT&lt;br /&gt;
&lt;br /&gt;
==Folgende erscheinen noch unvollständig und sollten von Usern die in dem Bereich kundig sind, ergänzt werden==&lt;br /&gt;
Findet man jetzt durch folgenden Link: [[:Kategorie:Artikelausbau]]&lt;br /&gt;
Artikel die unvollständig sind sollte man jetzt also nicht mehr hier aufgelistet werden, sondern die Artikel sollten am unteren Ende durch folgendes Kommando ergänzen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
  {{Ausbauwunsch|Mehr Grundlagen und vor allem Programmbeispiele etc.}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Artikel wird dann ein Hinweis eingeblendet, ähnlich wie diesem:&lt;br /&gt;
&lt;br /&gt;
[[Bild:artikelausbau.gif]]&lt;br /&gt;
&lt;br /&gt;
Also hier klicken um ausbaufähige Artikel zu finden:&lt;br /&gt;
* [[:Kategorie:Artikelausbau]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Hier noch ein paar Artikel wo der Hinweis noch nicht drin steht:&lt;br /&gt;
&lt;br /&gt;
* [[GNU Assembler|AVR Assembler (GNU) Einführung]]:&lt;br /&gt;
* [[Zahnrad]]&lt;br /&gt;
* [[Flipflop]]&lt;br /&gt;
* [[C-Tutorial]] &lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
* [[Transistor]] (noch ein paar Bilder und vielleicht Grundschaltungen mit Beschreibung wären toll&lt;br /&gt;
* [[Avr-gcc|Dokumentation zu avr-gcc]]&lt;br /&gt;
* [[Arm]] Microcontroller&lt;br /&gt;
* [[GPS]] - Aufbau und Anwendung&lt;br /&gt;
* [[SPI]] - Vielleicht noch Beispiele&lt;br /&gt;
* [[Portexpander am AVR]] könnte nen BASCOM-Teil vertragen&lt;br /&gt;
* [[Manchester- Codierung]] - noch ein Programmbeispiel wäre toll&lt;br /&gt;
* [[JTAG]]&lt;br /&gt;
&lt;br /&gt;
== Bereits erfüllte Wünsche ==&lt;br /&gt;
* stellenanzeigen-forum -&amp;gt;Gibt es bereits hier http://www.roboternetz.de/phpBB2/viewforum.php?f=29&lt;br /&gt;
* Filter (Hardware/Software) -&amp;gt; Wurde hier angelegt [[Filter (Elektronik)]]&lt;br /&gt;
* [[Roboterwettbewerbe]]&lt;br /&gt;
* Motortreiber (Einsteigerguide) -&amp;gt; [[Getriebemotoren Ansteuerung]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:RN-Wissen]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7456</id>
		<title>Pullup Pulldown Widerstand</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7456"/>
				<updated>2006-05-24T08:53:31Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Pulldown Widerstand */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemein ==&lt;br /&gt;
&lt;br /&gt;
Ein Pullup oder Pulldown-Widerstand wird dazu verwendet, einen Eingang auf einen definierten Wert zu &amp;quot;ziehen&amp;quot;.&lt;br /&gt;
Normalerweise befindet sich der Eingang im Zustand ''schwebend/hochohmig'', welcher sich irgendwo zwischen &lt;br /&gt;
High und Low befindet. Nun sind Schaltungen leider nicht komlett ohne Störsignale und durch Einstrahlungen &lt;br /&gt;
von Signalen kann es nun passieren, dass kurzzeitig mal ein Wert über- oder unterschritten wird und der Eingang &lt;br /&gt;
plötzlich ein High- oder Lowsignal bekommt. Dies führt dann zu unerklärlichen und unregelmäßig auftretenden &lt;br /&gt;
Fehlern, die einen Neuling zur Verzweiflung treiben können.&lt;br /&gt;
&lt;br /&gt;
== Pullup Widerstand ==&lt;br /&gt;
&lt;br /&gt;
Um dies zu vermeiden wird, während nichts am Eingang passiert, dieser auf High gezogen. (pullup)&lt;br /&gt;
Will man also einen Taster haben, der Low schaltet, so will man für den Rest der Zeit High am &lt;br /&gt;
Eingang liegen haben. Dies kann man erreichen, indem man den Eingang fest mit VCC verbindet. &lt;br /&gt;
Vom Eingang geht nun eine Leitung nach VCC und eine über den Taster nach GND. Leider würde dies &lt;br /&gt;
zu einem Kurzschluss führen sobald man den Taster drückt und die Schaltung könnte (und würde höchstwahrscheinlich) &lt;br /&gt;
Schaden nehmen. Deshalb wird nun zwischen VCC und dem Eingang ein hochohmiger Widerstand eingesetzt, der &lt;br /&gt;
Pullup-Widerstand. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei geschlossenem Taster wird nun der Strom über den Pullup Widerstand nach GND fließen und der Input &lt;br /&gt;
liegt auf GND (0V).&lt;br /&gt;
&lt;br /&gt;
== Pulldown Widerstand ==&lt;br /&gt;
&lt;br /&gt;
Der Pulldown Widerstand funktioniert analog zum Pullup-Widerstand, nur dass nun VCC geschaltet werden &lt;br /&gt;
soll und somit der Eingang auf GND gezogen werden muss. Dies geschieht in gleicher Weise wie beim Pullup, &lt;br /&gt;
nur dass der Pulldown-Widerstand nun zwischen GND und dem Eingang platziert wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schließt man nun wieder den Taster, liegt am Eingang Vcc an --&amp;gt; High.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
'''Weiterführende Links:'''&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Pull_up] Wikipedia Artikel&lt;br /&gt;
* [http://www.seattlerobotics.org/encoder/mar97/basics.html] (in englischer Sprache)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7455</id>
		<title>Pullup Pulldown Widerstand</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7455"/>
				<updated>2006-05-24T08:53:16Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Pullup Widerstand */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemein ==&lt;br /&gt;
&lt;br /&gt;
Ein Pullup oder Pulldown-Widerstand wird dazu verwendet, einen Eingang auf einen definierten Wert zu &amp;quot;ziehen&amp;quot;.&lt;br /&gt;
Normalerweise befindet sich der Eingang im Zustand ''schwebend/hochohmig'', welcher sich irgendwo zwischen &lt;br /&gt;
High und Low befindet. Nun sind Schaltungen leider nicht komlett ohne Störsignale und durch Einstrahlungen &lt;br /&gt;
von Signalen kann es nun passieren, dass kurzzeitig mal ein Wert über- oder unterschritten wird und der Eingang &lt;br /&gt;
plötzlich ein High- oder Lowsignal bekommt. Dies führt dann zu unerklärlichen und unregelmäßig auftretenden &lt;br /&gt;
Fehlern, die einen Neuling zur Verzweiflung treiben können.&lt;br /&gt;
&lt;br /&gt;
== Pullup Widerstand ==&lt;br /&gt;
&lt;br /&gt;
Um dies zu vermeiden wird, während nichts am Eingang passiert, dieser auf High gezogen. (pullup)&lt;br /&gt;
Will man also einen Taster haben, der Low schaltet, so will man für den Rest der Zeit High am &lt;br /&gt;
Eingang liegen haben. Dies kann man erreichen, indem man den Eingang fest mit VCC verbindet. &lt;br /&gt;
Vom Eingang geht nun eine Leitung nach VCC und eine über den Taster nach GND. Leider würde dies &lt;br /&gt;
zu einem Kurzschluss führen sobald man den Taster drückt und die Schaltung könnte (und würde höchstwahrscheinlich) &lt;br /&gt;
Schaden nehmen. Deshalb wird nun zwischen VCC und dem Eingang ein hochohmiger Widerstand eingesetzt, der &lt;br /&gt;
Pullup-Widerstand. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei geschlossenem Taster wird nun der Strom über den Pullup Widerstand nach GND fließen und der Input &lt;br /&gt;
liegt auf GND (0V).&lt;br /&gt;
&lt;br /&gt;
== Pulldown Widerstand ==&lt;br /&gt;
&lt;br /&gt;
Der Pulldown Widerstand funktioniert analog zum Pullup-Widerstand, nur dass nun VCC geschaltet werden &lt;br /&gt;
soll und somit der Eingang auf GND gezogen werden muss. Dies geschieht in gleicher Weise wie beim Pullup, &lt;br /&gt;
nur dass der Pulldown-Widerstand nun zwischen GND und dem Eingang platziert wird.&lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
Schließt man nun wieder den Taster, liegt am Eingang Vcc an --&amp;gt; High.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
'''Weiterführende Links:'''&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Pull_up] Wikipedia Artikel&lt;br /&gt;
* [http://www.seattlerobotics.org/encoder/mar97/basics.html] (in englischer Sprache)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7454</id>
		<title>Pullup Pulldown Widerstand</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7454"/>
				<updated>2006-05-24T08:45:01Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Pulldown Widerstand */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemein ==&lt;br /&gt;
&lt;br /&gt;
Ein Pullup oder Pulldown-Widerstand wird dazu verwendet, einen Eingang auf einen definierten Wert zu &amp;quot;ziehen&amp;quot;.&lt;br /&gt;
Normalerweise befindet sich der Eingang im Zustand ''schwebend/hochohmig'', welcher sich irgendwo zwischen &lt;br /&gt;
High und Low befindet. Nun sind Schaltungen leider nicht komlett ohne Störsignale und durch Einstrahlungen &lt;br /&gt;
von Signalen kann es nun passieren, dass kurzzeitig mal ein Wert über- oder unterschritten wird und der Eingang &lt;br /&gt;
plötzlich ein High- oder Lowsignal bekommt. Dies führt dann zu unerklärlichen und unregelmäßig auftretenden &lt;br /&gt;
Fehlern, die einen Neuling zur Verzweiflung treiben können.&lt;br /&gt;
&lt;br /&gt;
== Pullup Widerstand ==&lt;br /&gt;
&lt;br /&gt;
Um dies zu vermeiden wird, während nichts am Eingang passiert, dieser auf High gezogen. (pullup)&lt;br /&gt;
Will man also einen Taster haben, der Low schaltet, so will man für den Rest der Zeit High am &lt;br /&gt;
Eingang liegen haben. Dies kann man erreichen, indem man den Eingang fest mit VCC verbindet. &lt;br /&gt;
Vom Eingang geht nun eine Leitung nach VCC und eine über den Taster nach GND. Leider würde dies &lt;br /&gt;
zu einem Kurzschluss führen sobald man den Taster drückt und die Schaltung könnte (und würde höchstwahrscheinlich) &lt;br /&gt;
Schaden nehmen. Deshalb wird nun zwischen VCC und dem Eingang ein hochohmiger Widerstand eingesetzt, der &lt;br /&gt;
Pullup-Widerstand. &lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
Bei geschlossenem Taster wird nun der Strom über den Pullup Widerstand nach GND fließen und der Input &lt;br /&gt;
liegt auf GND (0V). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pulldown Widerstand ==&lt;br /&gt;
&lt;br /&gt;
Der Pulldown Widerstand funktioniert analog zum Pullup-Widerstand, nur dass nun VCC geschaltet werden &lt;br /&gt;
soll und somit der Eingang auf GND gezogen werden muss. Dies geschieht in gleicher Weise wie beim Pullup, &lt;br /&gt;
nur dass der Pulldown-Widerstand nun zwischen GND und dem Eingang platziert wird.&lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
Schließt man nun wieder den Taster, liegt am Eingang Vcc an --&amp;gt; High.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
'''Weiterführende Links:'''&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Pull_up] Wikipedia Artikel&lt;br /&gt;
* [http://www.seattlerobotics.org/encoder/mar97/basics.html] (in englischer Sprache)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Pullup_pulldown&amp;diff=7453</id>
		<title>Pullup pulldown</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Pullup_pulldown&amp;diff=7453"/>
				<updated>2006-05-24T08:39:59Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: Pullup pulldown wurde nach Pullup Pulldown Widerstand verschoben: blöder Titel. Wird nicht gefunden, wenn man &amp;quot;Pullup Widerstand&amp;quot; eingibt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[Pullup Pulldown Widerstand]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7452</id>
		<title>Pullup Pulldown Widerstand</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7452"/>
				<updated>2006-05-24T08:39:58Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: Pullup pulldown wurde nach Pullup Pulldown Widerstand verschoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemein ==&lt;br /&gt;
&lt;br /&gt;
Ein Pullup oder Pulldown-Widerstand wird dazu verwendet, einen Eingang auf einen definierten Wert zu &amp;quot;ziehen&amp;quot;.&lt;br /&gt;
Normalerweise befindet sich der Eingang im Zustand ''schwebend/hochohmig'', welcher sich irgendwo zwischen &lt;br /&gt;
High und Low befindet. Nun sind Schaltungen leider nicht komlett ohne Störsignale und durch Einstrahlungen &lt;br /&gt;
von Signalen kann es nun passieren, dass kurzzeitig mal ein Wert über- oder unterschritten wird und der Eingang &lt;br /&gt;
plötzlich ein High- oder Lowsignal bekommt. Dies führt dann zu unerklärlichen und unregelmäßig auftretenden &lt;br /&gt;
Fehlern, die einen Neuling zur Verzweiflung treiben können.&lt;br /&gt;
&lt;br /&gt;
== Pullup Widerstand ==&lt;br /&gt;
&lt;br /&gt;
Um dies zu vermeiden wird, während nichts am Eingang passiert, dieser auf High gezogen. (pullup)&lt;br /&gt;
Will man also einen Taster haben, der Low schaltet, so will man für den Rest der Zeit High am &lt;br /&gt;
Eingang liegen haben. Dies kann man erreichen, indem man den Eingang fest mit VCC verbindet. &lt;br /&gt;
Vom Eingang geht nun eine Leitung nach VCC und eine über den Taster nach GND. Leider würde dies &lt;br /&gt;
zu einem Kurzschluss führen sobald man den Taster drückt und die Schaltung könnte (und würde höchstwahrscheinlich) &lt;br /&gt;
Schaden nehmen. Deshalb wird nun zwischen VCC und dem Eingang ein hochohmiger Widerstand eingesetzt, der &lt;br /&gt;
Pullup-Widerstand. &lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
Bei geschlossenem Taster wird nun der Strom über den Pullup Widerstand nach GND fließen und der Input &lt;br /&gt;
liegt auf GND (0V). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pulldown Widerstand ==&lt;br /&gt;
&lt;br /&gt;
Der Pulldown Widerstand funktioniert analog zum Pullup-Widerstand, nur dass nun VCC geschaltet werden &lt;br /&gt;
soll und somit der Eingang auf GND gezogen werden muss. Dies geschieht in gleicher Weise wie beim Pullup, &lt;br /&gt;
nur dass der Pulldown-Widerstand nun zwischen GND und dem Eingang platziert wird.&lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
Schließt man nun wieder den Taster, liegt am Eingang Vcc an --&amp;gt; High.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
'''Weiterführende Links:'''&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Pull_up] Wikipedia Artikel&lt;br /&gt;
* [http://www.seattlerobotics.org/encoder/mar97/basics.html] (in englischer Sprache)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7451</id>
		<title>Pullup Pulldown Widerstand</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7451"/>
				<updated>2006-05-24T08:37:17Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Allgemein */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemein ==&lt;br /&gt;
&lt;br /&gt;
Ein Pullup oder Pulldown-Widerstand wird dazu verwendet, einen Eingang auf einen definierten Wert zu &amp;quot;ziehen&amp;quot;.&lt;br /&gt;
Normalerweise befindet sich der Eingang im Zustand ''schwebend/hochohmig'', welcher sich irgendwo zwischen &lt;br /&gt;
High und Low befindet. Nun sind Schaltungen leider nicht komlett ohne Störsignale und durch Einstrahlungen &lt;br /&gt;
von Signalen kann es nun passieren, dass kurzzeitig mal ein Wert über- oder unterschritten wird und der Eingang &lt;br /&gt;
plötzlich ein High- oder Lowsignal bekommt. Dies führt dann zu unerklärlichen und unregelmäßig auftretenden &lt;br /&gt;
Fehlern, die einen Neuling zur Verzweiflung treiben können.&lt;br /&gt;
&lt;br /&gt;
== Pullup Widerstand ==&lt;br /&gt;
&lt;br /&gt;
Um dies zu vermeiden wird, während nichts am Eingang passiert, dieser auf High gezogen. (pullup)&lt;br /&gt;
Will man also einen Taster haben, der Low schaltet, so will man für den Rest der Zeit High am &lt;br /&gt;
Eingang liegen haben. Dies kann man erreichen, indem man den Eingang fest mit VCC verbindet. &lt;br /&gt;
Vom Eingang geht nun eine Leitung nach VCC und eine über den Taster nach GND. Leider würde dies &lt;br /&gt;
zu einem Kurzschluss führen sobald man den Taster drückt und die Schaltung könnte (und würde höchstwahrscheinlich) &lt;br /&gt;
Schaden nehmen. Deshalb wird nun zwischen VCC und dem Eingang ein hochohmiger Widerstand eingesetzt, der &lt;br /&gt;
Pullup-Widerstand. &lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
Bei geschlossenem Taster wird nun der Strom über den Pullup Widerstand nach GND fließen und der Input &lt;br /&gt;
liegt auf GND (0V). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pulldown Widerstand ==&lt;br /&gt;
&lt;br /&gt;
Der Pulldown Widerstand funktioniert analog zum Pullup-Widerstand, nur dass nun VCC geschaltet werden &lt;br /&gt;
soll und somit der Eingang auf GND gezogen werden muss. Dies geschieht in gleicher Weise wie beim Pullup, &lt;br /&gt;
nur dass der Pulldown-Widerstand nun zwischen GND und dem Eingang platziert wird.&lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
Schließt man nun wieder den Taster, liegt am Eingang Vcc an --&amp;gt; High.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
'''Weiterführende Links:'''&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Pull_up] Wikipedia Artikel&lt;br /&gt;
* [http://www.seattlerobotics.org/encoder/mar97/basics.html] (in englischer Sprache)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7450</id>
		<title>Pullup Pulldown Widerstand</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7450"/>
				<updated>2006-05-24T08:37:04Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Pullup und Pulldown Widerstände */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemein ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Pullup oder Pulldown-Widerstand wird dazu verwendet, einen Eingang auf einen definierten Wert zu &amp;quot;ziehen&amp;quot;.&lt;br /&gt;
Normalerweise befindet sich der Eingang im Zustand ''schwebend/hochohmig'', welcher sich irgendwo zwischen &lt;br /&gt;
High und Low befindet. Nun sind Schaltungen leider nicht komlett ohne Störsignale und durch Einstrahlungen &lt;br /&gt;
von Signalen kann es nun passieren, dass kurzzeitig mal ein Wert über- oder unterschritten wird und der Eingang &lt;br /&gt;
plötzlich ein High- oder Lowsignal bekommt. Dies führt dann zu unerklärlichen und unregelmäßig auftretenden &lt;br /&gt;
Fehlern, die einen Neuling zur Verzweiflung treiben können.&lt;br /&gt;
&lt;br /&gt;
== Pullup Widerstand ==&lt;br /&gt;
&lt;br /&gt;
Um dies zu vermeiden wird, während nichts am Eingang passiert, dieser auf High gezogen. (pullup)&lt;br /&gt;
Will man also einen Taster haben, der Low schaltet, so will man für den Rest der Zeit High am &lt;br /&gt;
Eingang liegen haben. Dies kann man erreichen, indem man den Eingang fest mit VCC verbindet. &lt;br /&gt;
Vom Eingang geht nun eine Leitung nach VCC und eine über den Taster nach GND. Leider würde dies &lt;br /&gt;
zu einem Kurzschluss führen sobald man den Taster drückt und die Schaltung könnte (und würde höchstwahrscheinlich) &lt;br /&gt;
Schaden nehmen. Deshalb wird nun zwischen VCC und dem Eingang ein hochohmiger Widerstand eingesetzt, der &lt;br /&gt;
Pullup-Widerstand. &lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
Bei geschlossenem Taster wird nun der Strom über den Pullup Widerstand nach GND fließen und der Input &lt;br /&gt;
liegt auf GND (0V). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pulldown Widerstand ==&lt;br /&gt;
&lt;br /&gt;
Der Pulldown Widerstand funktioniert analog zum Pullup-Widerstand, nur dass nun VCC geschaltet werden &lt;br /&gt;
soll und somit der Eingang auf GND gezogen werden muss. Dies geschieht in gleicher Weise wie beim Pullup, &lt;br /&gt;
nur dass der Pulldown-Widerstand nun zwischen GND und dem Eingang platziert wird.&lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
Schließt man nun wieder den Taster, liegt am Eingang Vcc an --&amp;gt; High.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
'''Weiterführende Links:'''&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Pull_up] Wikipedia Artikel&lt;br /&gt;
* [http://www.seattlerobotics.org/encoder/mar97/basics.html] (in englischer Sprache)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7449</id>
		<title>Pullup Pulldown Widerstand</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7449"/>
				<updated>2006-05-24T08:36:36Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Pullup und Pulldown Widerstände */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Pullup und Pulldown Widerstände ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Pullup oder Pulldown-Widerstand wird dazu verwendet, einen Eingang auf einen definierten Wert zu &amp;quot;ziehen&amp;quot;.&lt;br /&gt;
Normalerweise befindet sich der Eingang im Zustand ''schwebend/hochohmig'', welcher sich irgendwo zwischen &lt;br /&gt;
High und Low befindet. Nun sind Schaltungen leider nicht komlett ohne Störsignale und durch Einstrahlungen &lt;br /&gt;
von Signalen kann es nun passieren, dass kurzzeitig mal ein Wert über- oder unterschritten wird und der Eingang &lt;br /&gt;
plötzlich ein High- oder Lowsignal bekommt. Dies führt dann zu unerklärlichen und unregelmäßig auftretenden &lt;br /&gt;
Fehlern, die einen Neuling zur Verzweiflung treiben können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pullup Widerstand ==&lt;br /&gt;
&lt;br /&gt;
Um dies zu vermeiden wird, während nichts am Eingang passiert, dieser auf High gezogen. (pullup)&lt;br /&gt;
Will man also einen Taster haben, der Low schaltet, so will man für den Rest der Zeit High am &lt;br /&gt;
Eingang liegen haben. Dies kann man erreichen, indem man den Eingang fest mit VCC verbindet. &lt;br /&gt;
Vom Eingang geht nun eine Leitung nach VCC und eine über den Taster nach GND. Leider würde dies &lt;br /&gt;
zu einem Kurzschluss führen sobald man den Taster drückt und die Schaltung könnte (und würde höchstwahrscheinlich) &lt;br /&gt;
Schaden nehmen. Deshalb wird nun zwischen VCC und dem Eingang ein hochohmiger Widerstand eingesetzt, der &lt;br /&gt;
Pullup-Widerstand. &lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
Bei geschlossenem Taster wird nun der Strom über den Pullup Widerstand nach GND fließen und der Input &lt;br /&gt;
liegt auf GND (0V). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pulldown Widerstand ==&lt;br /&gt;
&lt;br /&gt;
Der Pulldown Widerstand funktioniert analog zum Pullup-Widerstand, nur dass nun VCC geschaltet werden &lt;br /&gt;
soll und somit der Eingang auf GND gezogen werden muss. Dies geschieht in gleicher Weise wie beim Pullup, &lt;br /&gt;
nur dass der Pulldown-Widerstand nun zwischen GND und dem Eingang platziert wird.&lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
Schließt man nun wieder den Taster, liegt am Eingang Vcc an --&amp;gt; High.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
'''Weiterführende Links:'''&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Pull_up] Wikipedia Artikel&lt;br /&gt;
* [http://www.seattlerobotics.org/encoder/mar97/basics.html] (in englischer Sprache)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7448</id>
		<title>Pullup Pulldown Widerstand</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7448"/>
				<updated>2006-05-24T08:35:09Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Pullup und Pulldown Widerstände ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Pullup oder Pulldown-Widerstand wird dazu verwendet, einen Eingang auf einen definierten Wert zu &amp;quot;ziehen&amp;quot;.&lt;br /&gt;
Normalerweise befindet sich der Eingang im Zustand ''schwebend/hochohmig'', welcher sich irgendwo zwischen &lt;br /&gt;
High und Low befindet. Nun sind Schaltungen leider nicht komlett ohne Störsignale und durch Einstrahlungen &lt;br /&gt;
von Signalen kann es nun passieren, dass kurzzeitig mal ein Wert über- oder unterschritten wird und der Eingang &lt;br /&gt;
plötzlich ein High- oder Lowsignal bekommt. Dies führt dann zu unerklärlichen und unregelmäßig auftretenden &lt;br /&gt;
Fehlern, die einen Neuling zur Verzweiflung treiben können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pullup Widerstand'''&lt;br /&gt;
----&lt;br /&gt;
Um dies zu vermeiden wird, während nichts am Eingang passiert, dieser auf High gezogen. (pullup)&lt;br /&gt;
Will man also einen Taster haben, der Low schaltet, so will man für den Rest der Zeit High am &lt;br /&gt;
Eingang liegen haben. Dies kann man erreichen, indem man den Eingang fest mit VCC verbindet. &lt;br /&gt;
Vom Eingang geht nun eine Leitung nach VCC und eine über den Taster nach GND. Leider würde dies &lt;br /&gt;
zu einem Kurzschluss führen sobald man den Taster drückt und die Schaltung könnte (und würde höchstwahrscheinlich) &lt;br /&gt;
Schaden nehmen. Deshalb wird nun zwischen VCC und dem Eingang ein hochohmiger Widerstand eingesetzt, der &lt;br /&gt;
Pullup-Widerstand. &lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
Bei geschlossenem Taster wird nun der Strom über den Pullup Widerstand nach GND fließen und der Input &lt;br /&gt;
liegt auf GND (0V). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pulldown Widerstand'''&lt;br /&gt;
----&lt;br /&gt;
Der Pulldown Widerstand funktioniert analog zum Pullup-Widerstand, nur dass nun VCC geschaltet werden &lt;br /&gt;
soll und somit der Eingang auf GND gezogen werden muss. Dies geschieht in gleicher Weise wie beim Pullup, &lt;br /&gt;
nur dass der Pulldown-Widerstand nun zwischen GND und dem Eingang platziert wird.&lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
Schließt man nun wieder den Taster, liegt am Eingang Vcc an --&amp;gt; High.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
'''Weiterführende Links:'''&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Pull_up] Wikipedia Artikel&lt;br /&gt;
* [http://www.seattlerobotics.org/encoder/mar97/basics.html] (in englischer Sprache)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7441</id>
		<title>Pullup Pulldown Widerstand</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7441"/>
				<updated>2006-05-24T08:29:28Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Pullup und Pulldown Widerstände */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Pullup und Pulldown Widerstände ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Pullup oder Pulldown-Widerstand wird dazu verwendet, einen Eingang auf einen definierten Wert zu &amp;quot;ziehen&amp;quot;.&lt;br /&gt;
Normalerweise befindet sich der Eingang im Zustand ''schwebend/hochohmig'', welcher sich irgendwo zwischen &lt;br /&gt;
High und Low befindet. Nun sind Schaltungen leider nicht komlett ohne Störsignale und durch Einstrahlungen &lt;br /&gt;
von Signalen kann es nun passieren, dass kurzzeitig mal ein Wert über- oder unterschritten wird und der Eingang &lt;br /&gt;
plötzlich ein High- oder Lowsignal bekommt. Dies führt dann zu unerklärlichen und unregelmäßig auftretenden &lt;br /&gt;
Fehlern, die einen Neuling zur Verzweiflung treiben können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pullup Widerstand'''&lt;br /&gt;
----&lt;br /&gt;
Um dies zu vermeiden wird, während nichts am Eingang passiert, dieser auf High gezogen. (pullup)&lt;br /&gt;
Will man also einen Taster haben, der Low schaltet, so will man für den Rest der Zeit High am &lt;br /&gt;
Eingang liegen haben. Dies kann man erreichen, indem man den Eingang fest mit VCC verbindet. &lt;br /&gt;
Vom Eingang geht nun eine Leitung nach VCC und eine über den Taster nach GND. Leider würde dies &lt;br /&gt;
zu einem Kurzschluss führen sobald man den Taster drückt und die Schaltung könnte (und würde höchstwahrscheinlich) &lt;br /&gt;
Schaden nehmen. Deshalb wird nun zwischen VCC und dem Eingang ein hochohmiger Widerstand eingesetzt, der &lt;br /&gt;
Pullup-Widerstand. &lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
Bei geschlossenem Taster wird nun der Strom über den Pullup Widerstand nach GND fließen und der Input &lt;br /&gt;
liegt auf GND (0V). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pulldown Widerstand'''&lt;br /&gt;
----&lt;br /&gt;
Der Pulldown Widerstand funktioniert analog zum Pullup-Widerstand, nur dass nun VCC geschaltet werden &lt;br /&gt;
soll und somit der Eingang auf GND gezogen werden muss. Dies geschieht in gleicher Weise wie beim Pullup, &lt;br /&gt;
nur dass der Pulldown-Widerstand nun zwischen GND und dem Eingang platziert wird.&lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
Schließt man nun wieder den Taster, liegt am Eingang Vcc an --&amp;gt; High.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
'''Weiterführende Links:'''&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Pull_up] Wikipedia Artikel&lt;br /&gt;
* [http://www.seattlerobotics.org/encoder/mar97/basics.html] (englisch)&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7440</id>
		<title>Pullup Pulldown Widerstand</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7440"/>
				<updated>2006-05-24T08:26:11Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Pullup und Pulldown Widerstände */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Pullup und Pulldown Widerstände ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Pullup oder Pulldown-Widerstand wird dazu verwendet, einen Eingang auf einen definierten Wert zu &amp;quot;ziehen&amp;quot;.&lt;br /&gt;
Normalerweise befindet sich der Eingang im Zustand ''schwebend/hochohmig'', welcher sich irgendwo zwischen &lt;br /&gt;
High und Low befindet. Nun sind Schaltungen leider nicht komlett ohne Störsignale und durch Einstrahlungen &lt;br /&gt;
von Signalen kann es nun passieren, dass kurzzeitig mal ein Wert über- oder unterschritten wird und der Eingang &lt;br /&gt;
plötzlich ein High- oder Lowsignal bekommt. Dies führt dann zu unerklärlichen und unregelmäßig auftretenden &lt;br /&gt;
Fehlern, die einen Neuling zur Verzweiflung treiben können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pullup Widerstand'''&lt;br /&gt;
----&lt;br /&gt;
Um dies zu vermeiden wird, während nichts am Eingang passiert, dieser auf High gezogen. (pullup)&lt;br /&gt;
Will man also einen Taster haben, der Low schaltet, so will man für den Rest der Zeit High am &lt;br /&gt;
Eingang liegen haben. Dies kann man erreichen, indem man den Eingang fest mit VCC verbindet. &lt;br /&gt;
Vom Eingang geht nun eine Leitung nach VCC und eine über den Taster nach GND. Leider würde dies &lt;br /&gt;
zu einem Kurzschluss führen sobald man den Taster drückt und die Schaltung könnte (und würde höchstwahrscheinlich) &lt;br /&gt;
Schaden nehmen. Deshalb wird nun zwischen VCC und dem Eingang ein hochohmiger Widerstand eingesetzt, der &lt;br /&gt;
Pullup-Widerstand. &lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
Bei geschlossenem Taster wird nun der Strom über den Pullup Widerstand nach GND fließen und der Input &lt;br /&gt;
liegt auf GND (0V). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pulldown Widerstand'''&lt;br /&gt;
----&lt;br /&gt;
Der Pulldown Widerstand funktioniert analog zum Pullup-Widerstand, nur dass nun VCC geschaltet werden &lt;br /&gt;
soll und somit der Eingang auf GND gezogen werden muss. Dies geschieht in gleicher Weise wie beim Pullup, &lt;br /&gt;
nur dass der Pulldown-Widerstand nun zwischen GND und dem Eingang platziert wird.&lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
Schließt man nun wieder den Taster, liegt am Eingang Vcc an --&amp;gt; High.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ich hoffe, dieser Artikel ist nicht allzu falsch. Da ich am Anfang nicht genau wusste, was ein Pullup- oder &lt;br /&gt;
Pulldown-Widerstand ist, denke ich es könnte noch mehr Unwissende wie mich geben. :) Zur Not einfach Strg+A, DEL &lt;br /&gt;
und nochmal schreiben. Nur kann es glaube ich nicht schaden einen solchen Artikel zu haben auch wenn es &lt;br /&gt;
vielleicht als Selbstverständlichkeit gilt, wie diese Widerstände gehandhabt werden.&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7439</id>
		<title>Pullup Pulldown Widerstand</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Pullup_Pulldown_Widerstand&amp;diff=7439"/>
				<updated>2006-05-24T08:24:48Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Pullup und Pulldown Widerstände ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Pullup oder Pulldown-Widerstand wird dazu verwendet, einen Eingang auf einen definierten Wert zu &amp;quot;ziehen&amp;quot;.&lt;br /&gt;
Normalerweise befindet sich der Eingang im Zustand ''schwebend/hochohmig'', welcher sich irgendwo zwischen &lt;br /&gt;
High und Low befindet. Nun sind Schaltungen leider nicht komlett ohne Störsignale und durch Einstrahlungen &lt;br /&gt;
von Signalen kann es nun passieren, dass kurzzeitig mal ein Wert über- oder unterschritten wird und der Eingang &lt;br /&gt;
plötzlich ein High- oder Lowsignal bekommt. Dies führt dann zu unerklärlichen und unregelmäßig auftretenden &lt;br /&gt;
Fehlern, die einen Neuling zur Verzweiflung treiben können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pullup Widerstand'''&lt;br /&gt;
----&lt;br /&gt;
Um dies zu vermeiden wird, während nichts am Eingang passiert, dieser auf High gezogen. (pullup)&lt;br /&gt;
Will man also einen Taster haben, der Low schaltet, so will man für den Rest der Zeit High am &lt;br /&gt;
Eingang liegen haben. Dies kann man erreichen, indem man den Eingang fest mit VCC verbindet. &lt;br /&gt;
Vom Eingang geht nun eine Leitung nach VCC und eine über den Taster nach GND. Leider würde dies &lt;br /&gt;
zu einem Kurzschluss führen sobald man den Taster drückt und die Schaltung könnte (und würde höchstwahrscheinlich) &lt;br /&gt;
Schaden nehmen. Deshalb wird nun zwischen VCC und dem Eingang ein hochohmiger Widerstand eingesetzt, der &lt;br /&gt;
Pullup-Widerstand. &lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
Bei geschlossenem Taster wird nun der Strom über den Pullup Widerstand nach GND fließen und der Input &lt;br /&gt;
liegt auf GND (0V). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pulldown Widerstand'''&lt;br /&gt;
----&lt;br /&gt;
Der Pulldown Widerstand funktioniert analog zum Pullup-Widerstand, nur dass nun VCC geschaltet werden &lt;br /&gt;
soll und somit der Eingang auf GND gezogen werden muss. Dies geschieht in gleicher Weise wie beim Pullup, &lt;br /&gt;
nur dass der Pulldown-Widerstand nun zwischen GND und dem Eingang platziert wird.&lt;br /&gt;
&amp;lt;&amp;lt;BILD?&amp;gt;&amp;gt;&lt;br /&gt;
Schließt man nun wieder den Taster, liegt am Eingang Vcc an --&amp;gt; High.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ich hoffe, dieser Artikel ist nicht allzu falsch. Da ich am Anfang nicht genau wusste, was ein Pullup- oder &lt;br /&gt;
Pulldown-Widerstand ist, denke ich es könnte noch mehr Unwissende wie mich geben. :)&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Platinenherstellung_mit_der_%22Foto-Transfer-Technik%22&amp;diff=7375</id>
		<title>Platinenherstellung mit der &quot;Foto-Transfer-Technik&quot;</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Platinenherstellung_mit_der_%22Foto-Transfer-Technik%22&amp;diff=7375"/>
				<updated>2006-05-16T11:58:10Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Entwickeln */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Herstellen von Leiterplatten mit der Foto-Transfer-Technik'''&lt;br /&gt;
&lt;br /&gt;
== Fototransfer Methode ==&lt;br /&gt;
=== benötigtes Material ===&lt;br /&gt;
:* Eine Vorlage, nach welcher die Leiterplatte entstehen soll auch &amp;quot;Film&amp;quot; genannt &lt;br /&gt;
:: z.B. '''Transparentpapier''', Layoutfolie, OHP-Folie &lt;br /&gt;
::Im Schulzeichenbedarf bekommt man etwas stärkeres Transparentpapier für technisches Zeichen (etwa wie Postkartenkaron) das wellt sich mit Tinte nicht so sehr auf und bleibt schön glatt. (OHP-Folie ist meiner Meinung nach ungeignet, da zu geringe Deckkraft der Ausdrucke) oder Normalpapier und Pausklar-Spray (ist jedoch nur für Laserausdrucke oder für Vorlagen aus Büchern und Zeitschriften geeignet)&lt;br /&gt;
:: Wichtig ist, eine möglichst gute Vorlage zu erstellen, hier sollte man in den Optionen des Druckers die maximale Schwärzung einstellen. Im Durchlicht sollten die Flächen dunkelgrau bis schwarz sein, und auf gar keinen Fall Risse oder Unterbrechungen aufweisen (Ihr werdet euch wundern, wie hoch die Auflösung beim ätzen sein kann). &lt;br /&gt;
:* Fotopositiv beschichtete Leiterplatten&lt;br /&gt;
:* eine Geeignete Lichtquelle (UV-Quelle oder Nitraphot-Leuchtmittel)&lt;br /&gt;
::ich verwende mittlerweile einen UVA-Gesichtsbäuner, die funktionieren genauso gut wie&lt;br /&gt;
::&amp;quot;richtige&amp;quot; Belichtungsgeräte, sind aber um ein vielfaches günstiger zu beschaffen.&lt;br /&gt;
:* Glasplatte (etwas größer als die zu belichtende Platine) 3mm bis 5mm Stärke&lt;br /&gt;
:: z.B. aus einem einfachen (billigsten) Bilderrahmen&lt;br /&gt;
:: echtes unbeschichtetes Glas sollte es schon sein. Acryl oder Plexiglas filtern das UV-Licht aus.&lt;br /&gt;
:* Entwickler&lt;br /&gt;
:** z.B. Seno Entwickler 4007 oder&lt;br /&gt;
:** Natriumhydroxid (NaOH)&lt;br /&gt;
:* Entwicklerschale&lt;br /&gt;
:* Ätzmittel&lt;br /&gt;
:** Natriumpersulfat, auch Feinätzkristall genannt (meine Empfehlung)&lt;br /&gt;
:** Ammoniumchlorid (ist aber wegen des giftigen Ammoniums verpöhnt)&lt;br /&gt;
:** oder FeIIICl (Eisen III Chlorid) &lt;br /&gt;
:::dies ist jedoch wegen der Schaumbildung nicht für Ätz-Küvetten mit Luftverteiler geeignet.&lt;br /&gt;
:* Ätzschale oder Ätzküvette (dann aber mit Heizung)&lt;br /&gt;
:* Aufbewahrungsbehälter (Saugflaschen)&lt;br /&gt;
:* Timer (Wecker) oder Stoppuhr&lt;br /&gt;
:* Fließendes Wasser (vorzugsweise Nürnberger Leitungswasser)&lt;br /&gt;
:* Spülmittel oder Klarspüler (Spülmaschine)&lt;br /&gt;
:* Stahlwolle (Ako-Pads oder Abrazzo)&lt;br /&gt;
:* Aceton&lt;br /&gt;
:* Lötlack&lt;br /&gt;
:* Kleinbohrmaschine (am besten mit Ständer) und entspr. Bohrer (0,6-0,8-1,0-1,3 mm)&lt;br /&gt;
:* Schutzhandschuhe, Schutzbrille und eine Schürze (nehm ich aber nie :-) )&lt;br /&gt;
&lt;br /&gt;
[[Bild:LeiterplattenHerstellen-benötigetsMaterial.gif|640px]]&lt;br /&gt;
&lt;br /&gt;
Anfangs kann auch mit sog. Einsteigersets gearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
=== Bestimmung der Belichtungszeit ===&lt;br /&gt;
Die Belichtungszeit ist von vielen Faktoren abhängig:&lt;br /&gt;
:* Stärke und Art der Lichtquelle&lt;br /&gt;
:* Abstand von Lichtquelle zur Platine&lt;br /&gt;
:* Material (unterschiedliches Basismaterial)&lt;br /&gt;
&lt;br /&gt;
Um die richtige Belichungsdauer zu bestimmen, ist es sinnvoll einen sog. Belichtungstest durchzuführen.&lt;br /&gt;
&lt;br /&gt;
Um mit definierten Werten arbeiten zu können ist es zunächst nötig, dass man sich eine Anordnung aufbaut, zunächst Position und Abstand von Platine zur UV-Quelle, welche später immer wieder gleich nachgebildet werden kann. Auch sollte man immer die selbe Folienart verwenden, und den Entwickler immer in der gleichen Konzentration ansetzen.&lt;br /&gt;
&lt;br /&gt;
Nur so kann man gleichwertige Ergebnisse erwarten, und die Platinen gelingen jedes Mal auf Anhieb.&lt;br /&gt;
&lt;br /&gt;
==== Belichtungsteststreifen ====&lt;br /&gt;
&lt;br /&gt;
[[Bild:LeiterplattenHerstellen-Belichtungsteststeifen.gif|400px]]&lt;br /&gt;
&lt;br /&gt;
'''Vorbereitung:''' Für die Nitraphot-Lampe wird noch ein Stativ benötigt, welches die Lampe etwa 25 cm über der Tischfläche/Arbeitsfläche hält. Oder man hat schon ein Belichtungsgerät dann brauch man natürlich kein Stativ.&lt;br /&gt;
&lt;br /&gt;
Das '''Belichten''' kann '''bei normalen Tageslicht''' erfolgen, eine &amp;quot;Dunkelkammer&amp;quot; ist nicht nötig. Direktes Sonnenlicht sollte jedoch vermieden werden.&lt;br /&gt;
&lt;br /&gt;
Diesen Belichtungsteststeifen druckt man sich auf ein transparentes Material aus.&lt;br /&gt;
&lt;br /&gt;
Ich bevorzuge hierbei Transparentpapier. Dass der '''Ausdruck spiegelverkehrt''' ist hat folgenden Grund: &lt;br /&gt;
Wenn man den Ausdruck &amp;quot;seitenrichtig&amp;quot; auf die Fotoschicht legt, ist die Druckfarbe (Toner oder Tinte) direkt auf der Fotolack-Schicht und wird nicht durch die Filmschicht (Pergamentpapier) auf zwar kurzem aber immerhin einen gewissen Abstand gehalten. Bei sehr feinen Leiterbahnen, könnte sonst Streulicht bewirken dass diese Stellen auch (schwach) belichtet werden.&lt;br /&gt;
 &lt;br /&gt;
Nun zieht man die Schutzschicht von der Fotopositiv beschichteten Platine ab, legt darauf den Teststreifen und deckt mit einem zusätzlichen &amp;quot;normalen&amp;quot; Papier die Vorlage bis zur Markierung 3:50 ab, so dass nur 4:00 noch zu sehen ist bzw. belichtet werden kann. Auf diese Platine-Pergament-Papierschicht legt man nun noch eine Glasplatte (eine unbeschichtete klare Bilderrahmen-Glasscheibe), welche die &amp;quot;Filme&amp;quot; duch ihr Eigengewicht  auf der Leiterplatte fixiert. Den Timer stellt man auf 4 Minuten ein.&lt;br /&gt;
Nun schaltet man das Licht ein und startet den Timer, immer nach 10 Sekunden zieht man das Abdeckpapier einen Schritt weiter von dem Film. Aufpassen dass der Film mit dem Teststreifenmuster und die Platine nicht verrutschen. Am Ende, '''Licht ausschalten''' nicht vergessen, hat man dann eine mit verschiedenen Belichtungszeiten belichtete Platine. Diese wird im nächsten Schritt entwickelt.&lt;br /&gt;
&lt;br /&gt;
=== Entwickeln der belichteten Leiterplatte ===&lt;br /&gt;
====Vorarbeiten====&lt;br /&gt;
Hier kann man am meisten und schnell was falsch machen. Eine zu stark angesetzte Entwicklerlösung und eine zu hohe Temperatur können einem alles schnell versauen. Mit der Zeit bekommt man allerdings ein Gefühl hierfür, so dass man ohne Thermometer auskommt. Ich empfehle den Seno Entwickler 4007, der ist für 0,3 Liter Wasser fertig portioniert. Ich verwende meist ein wenig mehr Wasser (0,35 bis 0,4 Liter) um das ganze etwas langsamer entwickeln zu lassen.&lt;br /&gt;
Bei NaOH nimmt man 10g auf 1 Liter Wasser (bei Bungard Platinen 20g/l).&lt;br /&gt;
Nachdem die Lösung sonst nach Herstellerangaben angesetzt hat (50°C) lässt man das ganze wieder gänzlich abkühlen. Der Entwickler '''MUSS''' sich vollständig aufgelöst haben.&lt;br /&gt;
&lt;br /&gt;
Beim Ansetzen der Entwicklerlösung sollte man eine Schutzbrille tragen, da insbesonderen die Chemikalien in fester Form, wenn sie ins Auge gelangen, zur Erblindung führen können.&lt;br /&gt;
&lt;br /&gt;
==== Entwickeln ====&lt;br /&gt;
:*Zunächst legt man die belichtete Leiterplatte in die Schale, beschichtete Seite nach oben&lt;br /&gt;
:*Den Entwickler bringt man auf angenehme Handwärme etwa 25°C bis 30°C&lt;br /&gt;
::(ein paar (30-40) Sekunden in der Mikrowelle bei 600W)&lt;br /&gt;
:*Dann wieder etwas abkühlen lassen und umrühren/schütteln&lt;br /&gt;
:*nun die Entwicklerlösung zu der Platine in die Schale gießen (möglichst soviel wie möglich auf einmal)&lt;br /&gt;
:*nach kurzer Zeit (ein paar Sekunden) sollte der Fotolack an einigen Stellen &amp;quot;Wölkchen&amp;quot; bilden.&lt;br /&gt;
:*Ein sehr weicher Pinsel und sehr vorsichtiges Abstreifen oder eine Bewegung des&lt;br /&gt;
::Entwicklerbades lassen schnell die Konturen erkennen.&lt;br /&gt;
:* Sobald man die Konturen klar erkennen kann (bei dem Testmuster natürlich nur ein Teil der gesamten Fläche) schnell die Platine aus dem Entwicklerbad nehmen und sofort mit klarem Leitungswasser abspülen. (ein paar Tropfen Spülmittel oder Klarspüler (Spülmaschine) lassen das Wasser ohne Fleckenbildung ablaufen)&lt;br /&gt;
:* '''NICHT ABREIBEN''' feine Kratzer sind schneller drin als man meint.&lt;br /&gt;
&lt;br /&gt;
==== Gern gemachte Fehler ====&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Die gesamte Entwicklung sollte nach ca. 30 bis 45 Sek. abgeschlossen sein}}&lt;br /&gt;
&lt;br /&gt;
:*Dauert das entwickeln wesentlich länger (&amp;gt;2:00 Min.), weil der Entwickler zu &amp;quot;schwach&amp;quot; oder zu kalt angesetzte wurde, kann es passieren das die Fotoschicht an ungewünschten Stellen wegen der längeren Tauchzeit &amp;quot;einweicht&amp;quot; und dann beim abspülen zu dünn wird oder sich ganz ablöst. Leiterbahnunterbrechungen wären die Folge.&lt;br /&gt;
&lt;br /&gt;
:*Geschieht die Entwicklung zu schnell und ist fast sofort nach dem einfüllen des Entwicklers abgeschlossen, weil die Lösung zu &amp;quot;scharf&amp;quot; angesetzt wurde oder zu warm ist, hat man meist schon verloren, da auch die unbelichteten Leiterbahnen angegriffen werden. Bis man sein gutes Stück dann aus dem Bad genommen hat ist meist schon alles weg.&lt;br /&gt;
&lt;br /&gt;
:* Wird die Fotoschicht nicht ausreichend Belichtet, kann es passieren dass der Fotolack nicht korrekt entwickelt werden kann. Dies würde zum einen eine längere Entwicklungszeit mit ihren Folgen (s.oben) nach sich ziehen oder zum anderen Kurzschlüsse durch Fotolackreste beim Ätzen verursachen.&lt;br /&gt;
&lt;br /&gt;
==== Die optimale Belichtungszeit ====&lt;br /&gt;
Welche Belichtungszeit nun die optimale ist, lässt sich nun aufgrund des entwickelten Belichtungstestmusters schnell erkennen. Saubere, scharfe Konturen und eine satte Lackschicht an den nicht belichteteten Stellen (Leiterbahnen) geben hierüber Aufschluss.&lt;br /&gt;
&lt;br /&gt;
Je öfter und länger man mit seinem Belichtungsgerät arbeitet, desto schwächer wird dessen UV-Ausbeute. Ist also die UV-Quelle schon länger in Betrieb, können die Belichtungszeiten etwas länger werden. Irgendwann werden die Ergebnisse immer schlechter, da dies ein kriechender Prozess ist und nicht plötzlich auftritt bemerkt man dies nicht sofort. Oft schiebt man die Schuld dann auf den Entwickler oder das Basismaterial, obwohl eigentlich die Lichtquelle die Ursache ist.&lt;br /&gt;
&lt;br /&gt;
=== Ätzen der entwickelten Leiterplatte ===&lt;br /&gt;
Das Ätzen kann entweder in einer Schale erfolgen, ist jedoch wegen der schnellen Abkühlung des Ätzbades nicht besonders schnell, und nur für das Ätzen mit Fe(III)Cl empfehlenswert. Beim Ätzen mit NaPS muß der Ätzprozess in der Schale oft unterbrochen werden und das Ätzmittel wieder auf Temperatur gebracht werden. Eine Ätzküvette mit Heizung ist beim Ätzen mit&lt;br /&gt;
NaPS eine lohnenswerte Anschaffung. &lt;br /&gt;
&lt;br /&gt;
Wie man sich so eine '''Ätzküvette selbst bauen''' kann, ist in den Weblinks zu finden.&lt;br /&gt;
Ansonsten kann man beim ätzen eigentlich nicht viel falsch machen&lt;br /&gt;
:* Ätzbad sollte gemäß den Angaben annähernd die angegenene Temperatur aufweisen und möglichst auch beibehalten werden (das geht in einer Schale natürlich nur bedingt. Aber der Ätzvorgangang kann entgegen dem Entwicklungsvorgang durchaus mehrmals unterbrochen werden)&lt;br /&gt;
:* Bewegen des Ätzbades beschleunigt den Vorgang und begünstigen ein gleichmäßiges abätzen der Kupferschicht&lt;br /&gt;
:: Ätzküvetten sorgen durch einblasen von Luftperlen für eine ständige Umwälzung, ansonsten hat die Luftbeimengung keine Bedeutung (kein zusätzlicher Sauersoff oder sonstige Gimmiks nötig)&lt;br /&gt;
:: sobald die Leiterplatte an den entsprechenden Stellen keine Kupferreste mehr aufweist, kann diese entnommen und sorgfältig gespült werden.&lt;br /&gt;
&lt;br /&gt;
=== Nachbearbeiten der fast fertigen Leiterplatte ===&lt;br /&gt;
Die nun fertig geätzte Platine muss noch etwas nachbearbeitet werden.&lt;br /&gt;
:* Abschnitte durch Sägen und/oder feilen geben  der Platine ihre finale Form (Konturen)&lt;br /&gt;
:* Bohrungen durch die Pad's damit die Bauteile hindurchgesteckt werden können&lt;br /&gt;
:* Entschichten der Platte&lt;br /&gt;
:: den verbleibenen Fotolack mit Stahlwolle unter fließendem Wasser entfernen &lt;br /&gt;
:: und Bohrgrate werden auch geglättet, außerdem werden die Leiterbahnen schön blank&lt;br /&gt;
:* besonders hartnäckige Lackreste oder Fett (Fingerabdrücke) lassen sich mit Aceton entfenen &lt;br /&gt;
:: Vorsicht: Aceton greift die meisten Kunststoffe an&lt;br /&gt;
:* Beschichten mit Lötlack erleichtert zum einen das saubere einlöten der Bauelemente bzw. die Lotannahme&lt;br /&gt;
:: und schüzt zum anderen auch die Leiterbahnen vor Korrosion (Grünspan)&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Darwin.nuernberg|Darwin.nuernberg]] 00:03, 2. Mai 2006 (CEST)&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Aufbewahrung der Chemikalien ==&lt;br /&gt;
Die Ätzlösung und der Entwickler können in den Saugflaschen aufbewahrt werden, diese Saugflaschen eigen sich sehr gut, um die Lösungen aus flachen und tiefen Behältnissen (Schale) trof- und verlustfrei abzusaugen. Natürlich kann auch ein Trichter und andere Beältnisse dafür dienen.&lt;br /&gt;
Die Behälter sollten nicht unbedingt luftdicht verschlossen werden, da diese auch etwas gasen können (kommt auf die Chemikalien an). Außerden  sollten die Lösungen an einem dunklen und kühlen Ort gelagert werden.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Die Ätzlösungen/Chemikalien dürfen nicht in Trinkflaschen &lt;br /&gt;
oder in Gefäßen von Nahrungsmitteln &lt;br /&gt;
oder Gefäße welche diesen ähneln gefüllt werden!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vergiftungsgefahr durch Verwechslung der Gefäße}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Entsorgen der Chemikalien ==&lt;br /&gt;
Die Chemikalien bitte auf gar keinen Fall in das Abwasser leiten.&lt;br /&gt;
Die in den Klärwerken eingesetzten Bakterien können auch durch geringste Mengen der Chemikalien und des darin gelösten Kupfers absterben. Es könnte also mit nur einer Ätzküvette eine kleine Kläranlage zum &amp;quot;kippen&amp;quot; gebracht werden und dann wird es richtig teuer, denn die Kupfersalze hinterlassen Spuren, die auch in sehr kleinen Mengen nachzuverfolgen sind.&lt;br /&gt;
&lt;br /&gt;
Bitte die Chemikalien zur Reststoffverwertung / '''Sondermüllentsorgung''' bringen.&lt;br /&gt;
Dies ist '''für Privatleute meist unentgeltlich''' und erspart einem viel Ärger.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Darwin.nuernberg|Darwin.nuernberg]] 00:03, 2. Mai 2006 (CEST)&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Platinenherstellung]] mit der &amp;quot;Bügelmethode&amp;quot;&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=7415 Projekt im Roboternetz: Bauanleitung für eine Ätzküvette]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Platinenherstellung_mit_der_%22Foto-Transfer-Technik%22&amp;diff=7374</id>
		<title>Platinenherstellung mit der &quot;Foto-Transfer-Technik&quot;</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Platinenherstellung_mit_der_%22Foto-Transfer-Technik%22&amp;diff=7374"/>
				<updated>2006-05-16T11:56:45Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Entwickeln */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Herstellen von Leiterplatten mit der Foto-Transfer-Technik'''&lt;br /&gt;
&lt;br /&gt;
== Fototransfer Methode ==&lt;br /&gt;
=== benötigtes Material ===&lt;br /&gt;
:* Eine Vorlage, nach welcher die Leiterplatte entstehen soll auch &amp;quot;Film&amp;quot; genannt &lt;br /&gt;
:: z.B. '''Transparentpapier''', Layoutfolie, OHP-Folie &lt;br /&gt;
::Im Schulzeichenbedarf bekommt man etwas stärkeres Transparentpapier für technisches Zeichen (etwa wie Postkartenkaron) das wellt sich mit Tinte nicht so sehr auf und bleibt schön glatt. (OHP-Folie ist meiner Meinung nach ungeignet, da zu geringe Deckkraft der Ausdrucke) oder Normalpapier und Pausklar-Spray (ist jedoch nur für Laserausdrucke oder für Vorlagen aus Büchern und Zeitschriften geeignet)&lt;br /&gt;
:: Wichtig ist, eine möglichst gute Vorlage zu erstellen, hier sollte man in den Optionen des Druckers die maximale Schwärzung einstellen. Im Durchlicht sollten die Flächen dunkelgrau bis schwarz sein, und auf gar keinen Fall Risse oder Unterbrechungen aufweisen (Ihr werdet euch wundern, wie hoch die Auflösung beim ätzen sein kann). &lt;br /&gt;
:* Fotopositiv beschichtete Leiterplatten&lt;br /&gt;
:* eine Geeignete Lichtquelle (UV-Quelle oder Nitraphot-Leuchtmittel)&lt;br /&gt;
::ich verwende mittlerweile einen UVA-Gesichtsbäuner, die funktionieren genauso gut wie&lt;br /&gt;
::&amp;quot;richtige&amp;quot; Belichtungsgeräte, sind aber um ein vielfaches günstiger zu beschaffen.&lt;br /&gt;
:* Glasplatte (etwas größer als die zu belichtende Platine) 3mm bis 5mm Stärke&lt;br /&gt;
:: z.B. aus einem einfachen (billigsten) Bilderrahmen&lt;br /&gt;
:: echtes unbeschichtetes Glas sollte es schon sein. Acryl oder Plexiglas filtern das UV-Licht aus.&lt;br /&gt;
:* Entwickler&lt;br /&gt;
:** z.B. Seno Entwickler 4007 oder&lt;br /&gt;
:** Natriumhydroxid (NaOH)&lt;br /&gt;
:* Entwicklerschale&lt;br /&gt;
:* Ätzmittel&lt;br /&gt;
:** Natriumpersulfat, auch Feinätzkristall genannt (meine Empfehlung)&lt;br /&gt;
:** Ammoniumchlorid (ist aber wegen des giftigen Ammoniums verpöhnt)&lt;br /&gt;
:** oder FeIIICl (Eisen III Chlorid) &lt;br /&gt;
:::dies ist jedoch wegen der Schaumbildung nicht für Ätz-Küvetten mit Luftverteiler geeignet.&lt;br /&gt;
:* Ätzschale oder Ätzküvette (dann aber mit Heizung)&lt;br /&gt;
:* Aufbewahrungsbehälter (Saugflaschen)&lt;br /&gt;
:* Timer (Wecker) oder Stoppuhr&lt;br /&gt;
:* Fließendes Wasser (vorzugsweise Nürnberger Leitungswasser)&lt;br /&gt;
:* Spülmittel oder Klarspüler (Spülmaschine)&lt;br /&gt;
:* Stahlwolle (Ako-Pads oder Abrazzo)&lt;br /&gt;
:* Aceton&lt;br /&gt;
:* Lötlack&lt;br /&gt;
:* Kleinbohrmaschine (am besten mit Ständer) und entspr. Bohrer (0,6-0,8-1,0-1,3 mm)&lt;br /&gt;
:* Schutzhandschuhe, Schutzbrille und eine Schürze (nehm ich aber nie :-) )&lt;br /&gt;
&lt;br /&gt;
[[Bild:LeiterplattenHerstellen-benötigetsMaterial.gif|640px]]&lt;br /&gt;
&lt;br /&gt;
Anfangs kann auch mit sog. Einsteigersets gearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
=== Bestimmung der Belichtungszeit ===&lt;br /&gt;
Die Belichtungszeit ist von vielen Faktoren abhängig:&lt;br /&gt;
:* Stärke und Art der Lichtquelle&lt;br /&gt;
:* Abstand von Lichtquelle zur Platine&lt;br /&gt;
:* Material (unterschiedliches Basismaterial)&lt;br /&gt;
&lt;br /&gt;
Um die richtige Belichungsdauer zu bestimmen, ist es sinnvoll einen sog. Belichtungstest durchzuführen.&lt;br /&gt;
&lt;br /&gt;
Um mit definierten Werten arbeiten zu können ist es zunächst nötig, dass man sich eine Anordnung aufbaut, zunächst Position und Abstand von Platine zur UV-Quelle, welche später immer wieder gleich nachgebildet werden kann. Auch sollte man immer die selbe Folienart verwenden, und den Entwickler immer in der gleichen Konzentration ansetzen.&lt;br /&gt;
&lt;br /&gt;
Nur so kann man gleichwertige Ergebnisse erwarten, und die Platinen gelingen jedes Mal auf Anhieb.&lt;br /&gt;
&lt;br /&gt;
==== Belichtungsteststreifen ====&lt;br /&gt;
&lt;br /&gt;
[[Bild:LeiterplattenHerstellen-Belichtungsteststeifen.gif|400px]]&lt;br /&gt;
&lt;br /&gt;
'''Vorbereitung:''' Für die Nitraphot-Lampe wird noch ein Stativ benötigt, welches die Lampe etwa 25 cm über der Tischfläche/Arbeitsfläche hält. Oder man hat schon ein Belichtungsgerät dann brauch man natürlich kein Stativ.&lt;br /&gt;
&lt;br /&gt;
Das '''Belichten''' kann '''bei normalen Tageslicht''' erfolgen, eine &amp;quot;Dunkelkammer&amp;quot; ist nicht nötig. Direktes Sonnenlicht sollte jedoch vermieden werden.&lt;br /&gt;
&lt;br /&gt;
Diesen Belichtungsteststeifen druckt man sich auf ein transparentes Material aus.&lt;br /&gt;
&lt;br /&gt;
Ich bevorzuge hierbei Transparentpapier. Dass der '''Ausdruck spiegelverkehrt''' ist hat folgenden Grund: &lt;br /&gt;
Wenn man den Ausdruck &amp;quot;seitenrichtig&amp;quot; auf die Fotoschicht legt, ist die Druckfarbe (Toner oder Tinte) direkt auf der Fotolack-Schicht und wird nicht durch die Filmschicht (Pergamentpapier) auf zwar kurzem aber immerhin einen gewissen Abstand gehalten. Bei sehr feinen Leiterbahnen, könnte sonst Streulicht bewirken dass diese Stellen auch (schwach) belichtet werden.&lt;br /&gt;
 &lt;br /&gt;
Nun zieht man die Schutzschicht von der Fotopositiv beschichteten Platine ab, legt darauf den Teststreifen und deckt mit einem zusätzlichen &amp;quot;normalen&amp;quot; Papier die Vorlage bis zur Markierung 3:50 ab, so dass nur 4:00 noch zu sehen ist bzw. belichtet werden kann. Auf diese Platine-Pergament-Papierschicht legt man nun noch eine Glasplatte (eine unbeschichtete klare Bilderrahmen-Glasscheibe), welche die &amp;quot;Filme&amp;quot; duch ihr Eigengewicht  auf der Leiterplatte fixiert. Den Timer stellt man auf 4 Minuten ein.&lt;br /&gt;
Nun schaltet man das Licht ein und startet den Timer, immer nach 10 Sekunden zieht man das Abdeckpapier einen Schritt weiter von dem Film. Aufpassen dass der Film mit dem Teststreifenmuster und die Platine nicht verrutschen. Am Ende, '''Licht ausschalten''' nicht vergessen, hat man dann eine mit verschiedenen Belichtungszeiten belichtete Platine. Diese wird im nächsten Schritt entwickelt.&lt;br /&gt;
&lt;br /&gt;
=== Entwickeln der belichteten Leiterplatte ===&lt;br /&gt;
====Vorarbeiten====&lt;br /&gt;
Hier kann man am meisten und schnell was falsch machen. Eine zu stark angesetzte Entwicklerlösung und eine zu hohe Temperatur können einem alles schnell versauen. Mit der Zeit bekommt man allerdings ein Gefühl hierfür, so dass man ohne Thermometer auskommt. Ich empfehle den Seno Entwickler 4007, der ist für 0,3 Liter Wasser fertig portioniert. Ich verwende meist ein wenig mehr Wasser (0,35 bis 0,4 Liter) um das ganze etwas langsamer entwickeln zu lassen.&lt;br /&gt;
Bei NaOH nimmt man 10g auf 1 Liter Wasser (bei Bungard Platinen 20g/l).&lt;br /&gt;
Nachdem die Lösung sonst nach Herstellerangaben angesetzt hat (50°C) lässt man das ganze wieder gänzlich abkühlen. Der Entwickler '''MUSS''' sich vollständig aufgelöst haben.&lt;br /&gt;
&lt;br /&gt;
Beim Ansetzen der Entwicklerlösung sollte man eine Schutzbrille tragen, da insbesonderen die Chemikalien in fester Form, wenn sie ins Auge gelangen, zur Erblindung führen können.&lt;br /&gt;
&lt;br /&gt;
==== Entwickeln ====&lt;br /&gt;
:*Zunächst legt man die belichtete Leiterplatte in die Schale, beschichtete Seite nach oben&lt;br /&gt;
:*Den Entwickler bringt man auf angenehme Handwärme etwa 25°C bis 30°C&lt;br /&gt;
::(ein paar (30-40) Sekunden in der Mikrowelle bei 600W)&lt;br /&gt;
:*Dann wieder etwas abkühlen lassen und umrühren/schütteln&lt;br /&gt;
:*nun die Entwicklerlösung zu der Platine in die Schale gießen (möglichst soviel wie möglich auf einmal)&lt;br /&gt;
:*nach kurzer Zeit (ein paar Sekunden) sollte der Fotolack an einigen Stellen &amp;quot;Wölkchen&amp;quot; bilden&lt;br /&gt;
:*eine sehr weicher Pinsel und sehr vorsichtiges abstreifen oder eine Bewegung des&lt;br /&gt;
::Entwicklerbades lassen schnell die Konturen erkennen.&lt;br /&gt;
:* Sobald man die Konturen klar erkennen kann (bei dem Testmuster natürlich nur ein Teil der gesamten Fläche) schnell die Platine aus dem Entwicklerbad nehmen und sofort mit klarem Leitungswasser abspülen. (ein paar Tropfen Spülmittel oder Klarspüler (Spülmaschine) lassen das Wasser ohne Fleckenbildung ablaufen)&lt;br /&gt;
:* '''NICHT ABREIBEN''' feine Kratzer sind schneller drin als man meint.&lt;br /&gt;
&lt;br /&gt;
==== Gern gemachte Fehler ====&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Die gesamte Entwicklung sollte nach ca. 30 bis 45 Sek. abgeschlossen sein}}&lt;br /&gt;
&lt;br /&gt;
:*Dauert das entwickeln wesentlich länger (&amp;gt;2:00 Min.), weil der Entwickler zu &amp;quot;schwach&amp;quot; oder zu kalt angesetzte wurde, kann es passieren das die Fotoschicht an ungewünschten Stellen wegen der längeren Tauchzeit &amp;quot;einweicht&amp;quot; und dann beim abspülen zu dünn wird oder sich ganz ablöst. Leiterbahnunterbrechungen wären die Folge.&lt;br /&gt;
&lt;br /&gt;
:*Geschieht die Entwicklung zu schnell und ist fast sofort nach dem einfüllen des Entwicklers abgeschlossen, weil die Lösung zu &amp;quot;scharf&amp;quot; angesetzt wurde oder zu warm ist, hat man meist schon verloren, da auch die unbelichteten Leiterbahnen angegriffen werden. Bis man sein gutes Stück dann aus dem Bad genommen hat ist meist schon alles weg.&lt;br /&gt;
&lt;br /&gt;
:* Wird die Fotoschicht nicht ausreichend Belichtet, kann es passieren dass der Fotolack nicht korrekt entwickelt werden kann. Dies würde zum einen eine längere Entwicklungszeit mit ihren Folgen (s.oben) nach sich ziehen oder zum anderen Kurzschlüsse durch Fotolackreste beim Ätzen verursachen.&lt;br /&gt;
&lt;br /&gt;
==== Die optimale Belichtungszeit ====&lt;br /&gt;
Welche Belichtungszeit nun die optimale ist, lässt sich nun aufgrund des entwickelten Belichtungstestmusters schnell erkennen. Saubere, scharfe Konturen und eine satte Lackschicht an den nicht belichteteten Stellen (Leiterbahnen) geben hierüber Aufschluss.&lt;br /&gt;
&lt;br /&gt;
Je öfter und länger man mit seinem Belichtungsgerät arbeitet, desto schwächer wird dessen UV-Ausbeute. Ist also die UV-Quelle schon länger in Betrieb, können die Belichtungszeiten etwas länger werden. Irgendwann werden die Ergebnisse immer schlechter, da dies ein kriechender Prozess ist und nicht plötzlich auftritt bemerkt man dies nicht sofort. Oft schiebt man die Schuld dann auf den Entwickler oder das Basismaterial, obwohl eigentlich die Lichtquelle die Ursache ist.&lt;br /&gt;
&lt;br /&gt;
=== Ätzen der entwickelten Leiterplatte ===&lt;br /&gt;
Das Ätzen kann entweder in einer Schale erfolgen, ist jedoch wegen der schnellen Abkühlung des Ätzbades nicht besonders schnell, und nur für das Ätzen mit Fe(III)Cl empfehlenswert. Beim Ätzen mit NaPS muß der Ätzprozess in der Schale oft unterbrochen werden und das Ätzmittel wieder auf Temperatur gebracht werden. Eine Ätzküvette mit Heizung ist beim Ätzen mit&lt;br /&gt;
NaPS eine lohnenswerte Anschaffung. &lt;br /&gt;
&lt;br /&gt;
Wie man sich so eine '''Ätzküvette selbst bauen''' kann, ist in den Weblinks zu finden.&lt;br /&gt;
Ansonsten kann man beim ätzen eigentlich nicht viel falsch machen&lt;br /&gt;
:* Ätzbad sollte gemäß den Angaben annähernd die angegenene Temperatur aufweisen und möglichst auch beibehalten werden (das geht in einer Schale natürlich nur bedingt. Aber der Ätzvorgangang kann entgegen dem Entwicklungsvorgang durchaus mehrmals unterbrochen werden)&lt;br /&gt;
:* Bewegen des Ätzbades beschleunigt den Vorgang und begünstigen ein gleichmäßiges abätzen der Kupferschicht&lt;br /&gt;
:: Ätzküvetten sorgen durch einblasen von Luftperlen für eine ständige Umwälzung, ansonsten hat die Luftbeimengung keine Bedeutung (kein zusätzlicher Sauersoff oder sonstige Gimmiks nötig)&lt;br /&gt;
:: sobald die Leiterplatte an den entsprechenden Stellen keine Kupferreste mehr aufweist, kann diese entnommen und sorgfältig gespült werden.&lt;br /&gt;
&lt;br /&gt;
=== Nachbearbeiten der fast fertigen Leiterplatte ===&lt;br /&gt;
Die nun fertig geätzte Platine muss noch etwas nachbearbeitet werden.&lt;br /&gt;
:* Abschnitte durch Sägen und/oder feilen geben  der Platine ihre finale Form (Konturen)&lt;br /&gt;
:* Bohrungen durch die Pad's damit die Bauteile hindurchgesteckt werden können&lt;br /&gt;
:* Entschichten der Platte&lt;br /&gt;
:: den verbleibenen Fotolack mit Stahlwolle unter fließendem Wasser entfernen &lt;br /&gt;
:: und Bohrgrate werden auch geglättet, außerdem werden die Leiterbahnen schön blank&lt;br /&gt;
:* besonders hartnäckige Lackreste oder Fett (Fingerabdrücke) lassen sich mit Aceton entfenen &lt;br /&gt;
:: Vorsicht: Aceton greift die meisten Kunststoffe an&lt;br /&gt;
:* Beschichten mit Lötlack erleichtert zum einen das saubere einlöten der Bauelemente bzw. die Lotannahme&lt;br /&gt;
:: und schüzt zum anderen auch die Leiterbahnen vor Korrosion (Grünspan)&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Darwin.nuernberg|Darwin.nuernberg]] 00:03, 2. Mai 2006 (CEST)&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Aufbewahrung der Chemikalien ==&lt;br /&gt;
Die Ätzlösung und der Entwickler können in den Saugflaschen aufbewahrt werden, diese Saugflaschen eigen sich sehr gut, um die Lösungen aus flachen und tiefen Behältnissen (Schale) trof- und verlustfrei abzusaugen. Natürlich kann auch ein Trichter und andere Beältnisse dafür dienen.&lt;br /&gt;
Die Behälter sollten nicht unbedingt luftdicht verschlossen werden, da diese auch etwas gasen können (kommt auf die Chemikalien an). Außerden  sollten die Lösungen an einem dunklen und kühlen Ort gelagert werden.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Die Ätzlösungen/Chemikalien dürfen nicht in Trinkflaschen &lt;br /&gt;
oder in Gefäßen von Nahrungsmitteln &lt;br /&gt;
oder Gefäße welche diesen ähneln gefüllt werden!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vergiftungsgefahr durch Verwechslung der Gefäße}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Entsorgen der Chemikalien ==&lt;br /&gt;
Die Chemikalien bitte auf gar keinen Fall in das Abwasser leiten.&lt;br /&gt;
Die in den Klärwerken eingesetzten Bakterien können auch durch geringste Mengen der Chemikalien und des darin gelösten Kupfers absterben. Es könnte also mit nur einer Ätzküvette eine kleine Kläranlage zum &amp;quot;kippen&amp;quot; gebracht werden und dann wird es richtig teuer, denn die Kupfersalze hinterlassen Spuren, die auch in sehr kleinen Mengen nachzuverfolgen sind.&lt;br /&gt;
&lt;br /&gt;
Bitte die Chemikalien zur Reststoffverwertung / '''Sondermüllentsorgung''' bringen.&lt;br /&gt;
Dies ist '''für Privatleute meist unentgeltlich''' und erspart einem viel Ärger.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Darwin.nuernberg|Darwin.nuernberg]] 00:03, 2. Mai 2006 (CEST)&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Platinenherstellung]] mit der &amp;quot;Bügelmethode&amp;quot;&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=7415 Projekt im Roboternetz: Bauanleitung für eine Ätzküvette]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bezugsquellen&amp;diff=6894</id>
		<title>Bezugsquellen</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bezugsquellen&amp;diff=6894"/>
				<updated>2006-04-19T13:03:27Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Materialien */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| {{Blaueschmaltabelle}}&lt;br /&gt;
|Hier können Bezugsquellen eingetragen werden! Bitte aber pro Eintrag nicht mehr als '''2 bis 3 Zeilen''', ansonsten muss es ein Moderator kürzen! Dieser Artikel soll nicht als Werbeplattform mißbraucht werden, für Werbung gibts andere [[RN-Wissen:Site_support|Möglichkeiten]]. Er soll eine Hilfe für Bastler sein! &lt;br /&gt;
Bitte auch keine Bewertungen der Lieferanten vornehmen, das ist Sache der Leser &amp;amp; Bastler indem Sie vergleichen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektronikbauteile==&lt;br /&gt;
&lt;br /&gt;
;Conrad - http://www.conrad.de: Fast alle Standardelektronikbauteile, aber teuer&lt;br /&gt;
&lt;br /&gt;
;CSD-Electronic - http://www.csd-electronics.de/: Elektronik&lt;br /&gt;
&lt;br /&gt;
;Kessler-Electronic - http://www.kessler-electronic.de/: ( ehemals Simons ) Diverse Bauelemente (aktiv, passiv, Microcontroller), Literatur, PC-Komponenten, Messgeräte, Hifi, usw. Preisstaffelung für größere Mengen, Mindestbestellwert: 10 Euro&lt;br /&gt;
&lt;br /&gt;
;Distrelec Gruppe - http://www.distrelec.com: Diverse Bauelemente (aktiv, passiv, Microcontroller), Literatur, PC-Komponenten, usw.&lt;br /&gt;
&lt;br /&gt;
;Farnell In One - http://de.farnell.com/: elektronische Bauelemente (aktiv, passiv, Microcontroller), Sensoren, Literatur, Entwicklungskits, Kabel, Steckverbinder, Werkstattbedarf. Auch für privat. Sehr schnell.&lt;br /&gt;
&lt;br /&gt;
;Reichelt - http://www.reichelt.de: Diverse Bauelemente (aktiv, passiv, Microcontroller), Literatur, PC-Komponenten, Lichttechnik, Messtechnik, Software,  Kabel, Steckverbinder, Werkstattbedarf, Werkzeug,  Mindestbestellwert: 10 Euro&lt;br /&gt;
&lt;br /&gt;
;RS-Components - http://www.rsonline.de: Bauelemente: (aktiv, passiv, Microcontroller), Literatur, PC-Komponenten, Lichttechnik, Messtechnik, Software, Kabel, Steckverbinder, Werkzeug&lt;br /&gt;
&lt;br /&gt;
;Ribu Elektronik - http://www.ribu.at: Diverse Bauelemente, ICs, österreichische Seite&lt;br /&gt;
&lt;br /&gt;
==Sensoren==&lt;br /&gt;
&lt;br /&gt;
;Robotikhardware - http://www.robotikhardware.de: Drehgeber, Sharp-Entfernungssensoren, Ultraschallsensoren, Neigungssensoren, Temperatursensoren usw. speziell für Robotik-Bastler&lt;br /&gt;
&lt;br /&gt;
;Micromaus - http://www.micromaus.de: Sharp-Entfernungssensoren, Farbsensoren, Feuchtesensoren, Flexsensoren, Beschleunigungssensoren, Drucksensoren usw.&lt;br /&gt;
&lt;br /&gt;
;Roboter-Teile - http://www.roboter-teile.de/ : Lynxmotion Hexapot, Sensoren, CMU-Cam, AVR, PIC u.v.a.&lt;br /&gt;
&lt;br /&gt;
==Motoren== &lt;br /&gt;
&lt;br /&gt;
;mir-elektronik - http://www.mir-elektronik.de: Schrittmotoren, Endstufen, Bauteile, Literatur und Sonderposten&lt;br /&gt;
;Lemo-Solar - http://lemo-solar.de/: Motoren, Getriebe, Elektronik-Bausätze, Sonderposten u.v.a.&lt;br /&gt;
&lt;br /&gt;
==Platinen==&lt;br /&gt;
&lt;br /&gt;
;Multipcb - http://www.multipcb.de: Platinenservice für gewerbliche Kunden&lt;br /&gt;
&lt;br /&gt;
;PCB-Pool - http://pcb-pool.com: Platinenservice für private und gewerbliche Kunden&lt;br /&gt;
&lt;br /&gt;
==Materialien==&lt;br /&gt;
&lt;br /&gt;
;Metall Store - http://www.metallstore.de/: Schrittmotoren, (Kugel-)Lager, diverse Bauelemente aus Alu, VA, Messing, Bronze, Kupfer, Werkzeuge, Spezialschrauben&lt;br /&gt;
&lt;br /&gt;
;Modulor - http://www.modulor.de/: Diverse Materialien Kunststoff, Gummi, Papier, Pappe, Holz, Metall, Textilien, Plexiglas ...&lt;br /&gt;
&lt;br /&gt;
;Igus - http://www.igus.de/: Gleitlager, Lineargleitlager, Kabelschleppen, Gelenklager, Polymergleitlager, Wellen ...&lt;br /&gt;
&lt;br /&gt;
;Kienzle Plexiglas - http://www.ernst-kienzle.de/: Acrylglas, Polycarbonat, Polyethylenterephtalatglycol (in vielen Farben, auch Formen machbar)&lt;br /&gt;
&lt;br /&gt;
==Roboterboards==&lt;br /&gt;
;Robotikhardware - http://www.robotikhardware.de: Roboterboards, universelle Microcontrollerboards, Sprachboards, Bausätze, Platinen, Schrittmotoren, Sensoren etc. Berückichtigt [[RN-Definitionen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Praxis|!]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bezugsquellen&amp;diff=6893</id>
		<title>Bezugsquellen</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bezugsquellen&amp;diff=6893"/>
				<updated>2006-04-19T12:48:26Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Materialien */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| {{Blaueschmaltabelle}}&lt;br /&gt;
|Hier können Bezugsquellen eingetragen werden! Bitte aber pro Eintrag nicht mehr als '''2 bis 3 Zeilen''', ansonsten muss es ein Moderator kürzen! Dieser Artikel soll nicht als Werbeplattform mißbraucht werden, für Werbung gibts andere [[RN-Wissen:Site_support|Möglichkeiten]]. Er soll eine Hilfe für Bastler sein! &lt;br /&gt;
Bitte auch keine Bewertungen der Lieferanten vornehmen, das ist Sache der Leser &amp;amp; Bastler indem Sie vergleichen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektronikbauteile==&lt;br /&gt;
&lt;br /&gt;
;Conrad - http://www.conrad.de: Fast alle Standardelektronikbauteile, aber teuer&lt;br /&gt;
&lt;br /&gt;
;CSD-Electronic - http://www.csd-electronics.de/: Elektronik&lt;br /&gt;
&lt;br /&gt;
;Kessler-Electronic - http://www.kessler-electronic.de/: ( ehemals Simons ) Diverse Bauelemente (aktiv, passiv, Microcontroller), Literatur, PC-Komponenten, Messgeräte, Hifi, usw. Preisstaffelung für größere Mengen, Mindestbestellwert: 10 Euro&lt;br /&gt;
&lt;br /&gt;
;Distrelec Gruppe - http://www.distrelec.com: Diverse Bauelemente (aktiv, passiv, Microcontroller), Literatur, PC-Komponenten, usw.&lt;br /&gt;
&lt;br /&gt;
;Farnell In One - http://de.farnell.com/: elektronische Bauelemente (aktiv, passiv, Microcontroller), Sensoren, Literatur, Entwicklungskits, Kabel, Steckverbinder, Werkstattbedarf. Auch für privat. Sehr schnell.&lt;br /&gt;
&lt;br /&gt;
;Reichelt - http://www.reichelt.de: Diverse Bauelemente (aktiv, passiv, Microcontroller), Literatur, PC-Komponenten, Lichttechnik, Messtechnik, Software,  Kabel, Steckverbinder, Werkstattbedarf, Werkzeug,  Mindestbestellwert: 10 Euro&lt;br /&gt;
&lt;br /&gt;
;RS-Components - http://www.rsonline.de: Bauelemente: (aktiv, passiv, Microcontroller), Literatur, PC-Komponenten, Lichttechnik, Messtechnik, Software, Kabel, Steckverbinder, Werkzeug&lt;br /&gt;
&lt;br /&gt;
;Ribu Elektronik - http://www.ribu.at: Diverse Bauelemente, ICs, österreichische Seite&lt;br /&gt;
&lt;br /&gt;
==Sensoren==&lt;br /&gt;
&lt;br /&gt;
;Robotikhardware - http://www.robotikhardware.de: Drehgeber, Sharp-Entfernungssensoren, Ultraschallsensoren, Neigungssensoren, Temperatursensoren usw. speziell für Robotik-Bastler&lt;br /&gt;
&lt;br /&gt;
;Micromaus - http://www.micromaus.de: Sharp-Entfernungssensoren, Farbsensoren, Feuchtesensoren, Flexsensoren, Beschleunigungssensoren, Drucksensoren usw.&lt;br /&gt;
&lt;br /&gt;
;Roboter-Teile - http://www.roboter-teile.de/ : Lynxmotion Hexapot, Sensoren, CMU-Cam, AVR, PIC u.v.a.&lt;br /&gt;
&lt;br /&gt;
==Motoren== &lt;br /&gt;
&lt;br /&gt;
;mir-elektronik - http://www.mir-elektronik.de: Schrittmotoren, Endstufen, Bauteile, Literatur und Sonderposten&lt;br /&gt;
;Lemo-Solar - http://lemo-solar.de/: Motoren, Getriebe, Elektronik-Bausätze, Sonderposten u.v.a.&lt;br /&gt;
&lt;br /&gt;
==Platinen==&lt;br /&gt;
&lt;br /&gt;
;Multipcb - http://www.multipcb.de: Platinenservice für gewerbliche Kunden&lt;br /&gt;
&lt;br /&gt;
;PCB-Pool - http://pcb-pool.com: Platinenservice für private und gewerbliche Kunden&lt;br /&gt;
&lt;br /&gt;
==Materialien==&lt;br /&gt;
&lt;br /&gt;
;Metall Store - http://www.metallstore.de/: Schrittmotoren, (Kugel-)Lager, diverse Bauelemente aus Alu, VA, Messing, Bronze, Kupfer, Werkzeuge, Spezialschrauben&lt;br /&gt;
&lt;br /&gt;
;Modulor - http://www.modulor.de/: Diverse Materialien Kunststoff, Gummi, Papier, Pappe, Holz, Metall, Textilien, Plexiglas ...&lt;br /&gt;
&lt;br /&gt;
;Igus - http://www.igus.de/: Gleitlager, Lineargleitlager, Kabelschleppen, Gelenklager, Polymergleitlager, Wellen ...&lt;br /&gt;
&lt;br /&gt;
;Kienzle Plexiglas - http://www.ernst-kienzle.de/: Acrylglas, Polycarbonat, Polyethylenterephtalatglycol (in allen Formen und Farben)&lt;br /&gt;
&lt;br /&gt;
==Roboterboards==&lt;br /&gt;
;Robotikhardware - http://www.robotikhardware.de: Roboterboards, universelle Microcontrollerboards, Sprachboards, Bausätze, Platinen, Schrittmotoren, Sensoren etc. Berückichtigt [[RN-Definitionen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Praxis|!]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Hallo_Welt_f%C3%BCr_AVR_(LED_blinken)&amp;diff=6837</id>
		<title>Hallo Welt für AVR (LED blinken)</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Hallo_Welt_f%C3%BCr_AVR_(LED_blinken)&amp;diff=6837"/>
				<updated>2006-04-14T14:40:45Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das erste C-Programm, das man zu sehen bekommt, ist für die meisten das &amp;quot;Hallo Welt&amp;quot;.&lt;br /&gt;
Bei &amp;quot;Hallo Welt&amp;quot; geht es weniger um die Funktionalität an sich, sondern darum zu lernen,&lt;br /&gt;
wie man überhaupt ein Programm übersetzt und einen Compiler verwendet.&lt;br /&gt;
&lt;br /&gt;
Was für den PC das &amp;quot;Hallo Welt&amp;quot;, ist für einen kleinen Microcontroller der &amp;quot;Hallo Blinky&amp;quot;,&lt;br /&gt;
der einfach nur eine [[Diode|Leuchtdiode]] (LED) blinken lässt.&lt;br /&gt;
&lt;br /&gt;
Im Vergleich zu &amp;quot;Hallo Welt&amp;quot; sieht der Blinky viel komplizierter aus, &lt;br /&gt;
aber eigentlich ist er einfacher, dann es werden keine umfangreichen Funktionen oder&lt;br /&gt;
Black-Boxen benutzt wie etwa &amp;lt;tt&amp;gt;printf()&amp;lt;/tt&amp;gt;. &lt;br /&gt;
Ausser dem eingegebenen Quellcode kommt also kein anderer Code zur Ausführung!&lt;br /&gt;
&lt;br /&gt;
=Beschreibung=&lt;br /&gt;
&lt;br /&gt;
Eine LED an Port B1 wird einmal pro Sekunde an bzw. ausgeschaltet. Die LED blinkt also mit einer Frequenz von 1/2 Hz.&lt;br /&gt;
&lt;br /&gt;
Dazu wird Timer1 so initialisiert, daß er 1000 Interrupts pro Sekunde auslöst. In jedem 1000. Timer1-Interrupt wird dann die LED geschaltet.&lt;br /&gt;
&lt;br /&gt;
=Von der C-Quelle zum hex-File=&lt;br /&gt;
&lt;br /&gt;
Das Beispiel besteht ganz bewusst aus zwei getrennten &lt;br /&gt;
Quelldateien (Modulen) um zu zeigen, &lt;br /&gt;
wie man Code auf mehrere Dateien aufteilen kann um die Übersichtlichkeit&lt;br /&gt;
bei grösseren Projekten zu wahren. &lt;br /&gt;
Eine etwas einfachere Struktur hat die Datei im Abschnitt &amp;quot;[[Hallo Welt für AVR (Blinky)#Alles in einer Datei|Alles in einer Datei]]&amp;quot;, das den Blinky in einer einzigen Datei implementiert.&lt;br /&gt;
&lt;br /&gt;
Ausserdem wird das Übersetzen über Kommandozeilen-Eingaben erledigt und ''nicht''&lt;br /&gt;
über Werkzeuge wie [[make]], &lt;br /&gt;
das die Zusammenhänge eher verschleiert als erhellt,&lt;br /&gt;
und dessen inkorrekte Anwendung eine häufige Fehlerquelle ist.&lt;br /&gt;
&lt;br /&gt;
Nach Speichern der Quelldatein in ein eigenes Verzeichnis enthält dieses die Dateien&lt;br /&gt;
 blinky.c timer1.c timer1.h&lt;br /&gt;
&lt;br /&gt;
==Compilieren==&lt;br /&gt;
&lt;br /&gt;
Zunächst werden die C-Dateien übersetzt. &lt;br /&gt;
Der Übersetzungsvorgang wird gesteuert durch Kommandozeilen-Parameter (siehe [[avr-gcc]]).&lt;br /&gt;
Die Option &lt;br /&gt;
;&amp;lt;tt&amp;gt;-c&amp;lt;/tt&amp;gt;: legt fest, daß nur compiliert wird (und nicht gelinkt), &lt;br /&gt;
;&amp;lt;tt&amp;gt;-o name&amp;lt;/tt&amp;gt;: gibt den Name der Ausgabedatei an. Ohne diese Option heisst die Ausgabedatei immer &amp;lt;tt&amp;gt;a.out&amp;lt;/tt&amp;gt;&lt;br /&gt;
;&amp;lt;tt&amp;gt;-mmcu=atmega8&amp;lt;/tt&amp;gt;: legt den Controllertyp fest, in dem Beispiel den [[ATmega8]]&lt;br /&gt;
;&amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;: erzeugt Debug-Infos und&lt;br /&gt;
;&amp;lt;tt&amp;gt;-Os&amp;lt;/tt&amp;gt;: optimiert auf Codegröße.&lt;br /&gt;
 &amp;gt; avr-gcc blinky.c -c -o blinky.o -Os -g -mmcu=atmega8&lt;br /&gt;
 &amp;gt; avr-gcc timer1.c -c -o timer1.o -Os -g -mmcu=atmega8&lt;br /&gt;
Danach sind zwei neue Dateien entstanden (*.o)&lt;br /&gt;
 blinky.c blinky.o timer1.c timer1.h timer1.o&lt;br /&gt;
&lt;br /&gt;
In der Quelle wird der Wert für das OCR1A-Register aus der Taktfrequenz des&lt;br /&gt;
Controllers (&amp;lt;tt&amp;gt;F_CPU&amp;lt;/tt&amp;gt;) und der Anzahl an Interrupts, die pro Sekunde&lt;br /&gt;
ausgelöst werden sollen (&amp;lt;tt&amp;gt;INTERRUPTS_PER_SECOND&amp;lt;/tt&amp;gt;), berechnet.&lt;br /&gt;
&lt;br /&gt;
Standardmässig sind [[AVR|AVRs]] mit dem internen RC-Oszillator mit ca. 1&amp;amp;nbsp;MHz getaktet.&lt;br /&gt;
Daher wird &amp;lt;tt&amp;gt;F_CPU&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;timer1.c&amp;lt;/tt&amp;gt; zu 1000000 definiert:&lt;br /&gt;
 #ifndef F_CPU&lt;br /&gt;
 #define F_CPU 1000000&lt;br /&gt;
 #endif /* F_CPU */&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Dieser Wert hat rein informativen Charakter und bewirkt ''nicht'', daß der Controller mit einer anderen Frequenz läuft! Das geht über einen anderen Quarz/Oszillator oder andere Fuse-Einstellungen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Hat man den AVR mit einem anderen Takt laufen, dann gibt man diesen einfach in der&lt;br /&gt;
Kommandozeile an, z.B. für 8&amp;amp;nbsp;MHz:&lt;br /&gt;
 &amp;gt; avr-gcc ... -DF_CPU=8000000&lt;br /&gt;
&lt;br /&gt;
Analog kann man mit &amp;lt;tt&amp;gt;INTERRUPTS_PER_SECOND&amp;lt;/tt&amp;gt; verfahren, das auf 1000 gesetzt ist,&lt;br /&gt;
und auch mit der Option &amp;lt;tt&amp;gt;-D&amp;lt;/tt&amp;gt; überschrieben werden kann.&lt;br /&gt;
&lt;br /&gt;
==Linken==&lt;br /&gt;
Die beiden erzeugten Objekte werden nun zusammengebunden, um die Ausgabedatei (*.elf) zu erhalten:&lt;br /&gt;
 &amp;gt; avr-gcc blinky.o timer1.o -o blinky.elf -mmcu=atmega8&lt;br /&gt;
erzeugt die ausführbare Datei (*.elf), die noch zusätzliche Informationen wie&lt;br /&gt;
Debug-Infos etc. beinhaltet mit dem Namen &amp;lt;tt&amp;gt;blinky.elf&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 blinky.c blinky.elf blinky.o timer1.c timer1.h timer1.o&lt;br /&gt;
&lt;br /&gt;
==Umwandeln nach hex==&lt;br /&gt;
&lt;br /&gt;
===Code und Daten===&lt;br /&gt;
Viele Progger wollen die zu ladende Datei im Intel-hex-Format (*.hex bzw. *.ihex).&lt;br /&gt;
Dazu gibt man an&lt;br /&gt;
 &amp;gt; avr-objcopy -j .text -j .data -O ihex blinky.elf blinky.hex&lt;br /&gt;
Damit enthält die hex-Datei die Sections &amp;lt;tt&amp;gt;.text&amp;lt;/tt&amp;gt; (Programm) und &amp;lt;tt&amp;gt;.data&amp;lt;/tt&amp;gt; (Daten).&lt;br /&gt;
Das Verzeichnis beinhaltet jetzt&lt;br /&gt;
 blinky.c blinky.elf blinky.hex blinky.o timer1.c timer1.h timer1.o&lt;br /&gt;
&lt;br /&gt;
===EEPROM===&lt;br /&gt;
Ein hex-File, das den Inhalt des EEPROMs wiederspiegelt, erhält man mit&lt;br /&gt;
 &amp;gt; avr-objcopy -j .eeprom --change-section-lma .eeprom=0 -O ihex blinky.elf blinky_eeprom.hex&lt;br /&gt;
Für das Beispiel ist das EEPROM-File &amp;lt;tt&amp;gt;blinky_eeprom.hex&amp;lt;/tt&amp;gt; leer, &lt;br /&gt;
da wir keine Daten ins EEPROM gelegt haben.&lt;br /&gt;
&lt;br /&gt;
==Listfile erstellen==&lt;br /&gt;
&lt;br /&gt;
Falls man ein Listfile haben möchte, dann geht das mit&lt;br /&gt;
 &amp;gt; avr-objdump -h -S -j .text -j .data blinky.elf &amp;gt; blinky.lst&lt;br /&gt;
Das Listfile ist eine Textdatei, die alle Assembler-Befehle auflistet,&lt;br /&gt;
wie sie letztendlich auf den Controller geladen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;avr-objdump&amp;lt;/tt&amp;gt; gibt seine Ausgabe auf das Terminal aus. &lt;br /&gt;
Diese Ausgabe wird mit '&amp;lt;tt&amp;gt;&amp;amp;gt;&amp;lt;/tt&amp;gt;' in die Datei &amp;lt;tt&amp;gt;blinky.lst&amp;lt;/tt&amp;gt; umgeleitet.&lt;br /&gt;
Hier ein Ausschnitt aus dem Listfile:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0000005c &amp;lt;job_timer1&amp;gt;:&lt;br /&gt;
    uint16_t count;&lt;br /&gt;
&lt;br /&gt;
    /* irq_count um 1 erhöhen und              */&lt;br /&gt;
    /* gegebenenfalls die LED blinken */&lt;br /&gt;
    count = 1+irq_count;&lt;br /&gt;
  5c:   20 91 60 00     lds     r18, 0x0060&lt;br /&gt;
  60:   30 91 61 00     lds     r19, 0x0061&lt;br /&gt;
  64:   2f 5f           subi    r18, 0xFF       ; 255&lt;br /&gt;
  66:   3f 4f           sbci    r19, 0xFF       ; 255&lt;br /&gt;
&lt;br /&gt;
    if (count &amp;gt;= INTERRUPTS_PER_SECOND)&lt;br /&gt;
  68:   83 e0           ldi     r24, 0x03       ; 3&lt;br /&gt;
  6a:   28 3e           cpi     r18, 0xE8       ; 232&lt;br /&gt;
  6c:   38 07           cpc     r19, r24&lt;br /&gt;
  6e:   30 f0           brcs    .+12            ; 0x7c&lt;br /&gt;
    {&lt;br /&gt;
        count = 0;&lt;br /&gt;
  70:   20 e0           ldi     r18, 0x00       ; 0&lt;br /&gt;
  72:   30 e0           ldi     r19, 0x00       ; 0&lt;br /&gt;
        PORT_LED ^= (1 &amp;lt;&amp;lt; PAD_LED);&lt;br /&gt;
  74:   88 b3           in      r24, 0x18       ; 24&lt;br /&gt;
  76:   92 e0           ldi     r25, 0x02       ; 2&lt;br /&gt;
  78:   89 27           eor     r24, r25&lt;br /&gt;
  7a:   88 bb           out     0x18, r24       ; 24&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    irq_count = count;&lt;br /&gt;
  7c:   30 93 61 00     sts     0x0061, r19&lt;br /&gt;
  80:   20 93 60 00     sts     0x0060, r18&lt;br /&gt;
  84:   08 95           ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Links stehen die Adressen, dann die Maschinencodes der Befehle,&lt;br /&gt;
danach die Maschinencodes in Assembler-Darstellung. &lt;br /&gt;
Ganz rechts nach dem Kommentarzeichen '&amp;lt;tt&amp;gt;;&amp;lt;/tt&amp;gt;' stehen die Dezimalcodes von&lt;br /&gt;
Konstanten (z.B. 24 für die 0x18 an Adresse 74) oder die Zieladressen von&lt;br /&gt;
Sprüngen, wie bei dem &amp;lt;tt&amp;gt;brcs&amp;lt;/tt&amp;gt;-Befehl an Adresse 6e, der gegebenenfalls &lt;br /&gt;
12 Bytes überspringt und dann an Adresse 7c landet.&lt;br /&gt;
&lt;br /&gt;
==Mapfile erstellen==&lt;br /&gt;
Ein Mapfile gibt Auskunft darüber, an welcher Adresse Code und Objekte&lt;br /&gt;
landen. Erstellt wird das Mapfile während des Linkens, indem &amp;lt;tt&amp;gt;avr-gcc&amp;lt;/tt&amp;gt;&lt;br /&gt;
ein Option an den Linker weiterreicht, die diesem zum Erstellen eines solchen Files veranlasst:&lt;br /&gt;
 &amp;gt; avr-gcc blinky.o timer1.o -o blinky.elf ... -Wl,-Map,blinky.map&lt;br /&gt;
Dadurch entsteht das Mapfile &amp;lt;tt&amp;gt;blinky.map&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Die Größe ermitteln==&lt;br /&gt;
&lt;br /&gt;
Die Größe der erhaltenen Objekte/Files können mit &amp;lt;tt&amp;gt;avr-size&amp;lt;/tt&amp;gt; ausgegeben werden.&lt;br /&gt;
 &amp;gt; avr-size -x blinky.o timer1.o&lt;br /&gt;
druckt aus:&lt;br /&gt;
   text    data     bss     dec     hex filename&lt;br /&gt;
   0x42     0x0     0x2      68      44 blinky.o&lt;br /&gt;
   0x70     0x0     0x2     114      72 timer1.o&lt;br /&gt;
Das sind die Größen der einzelnen [[avr-gcc#Sections|Sections]].&lt;br /&gt;
Für das Flash relevant ist die Größe von &lt;br /&gt;
&amp;lt;tt&amp;gt;.text&amp;lt;/tt&amp;gt; (Code) + &amp;lt;tt&amp;gt;.data&amp;lt;/tt&amp;gt; (initialisierte Daten),&lt;br /&gt;
für das SRAM relevent ist &amp;lt;tt&amp;gt;.data&amp;lt;/tt&amp;gt; (initialisierte Daten) &lt;br /&gt;
+ &amp;lt;tt&amp;gt;.bss&amp;lt;/tt&amp;gt; (null-initialisierte Daten).&lt;br /&gt;
&lt;br /&gt;
Im Flash werden also 114+68+0+0=182 Bytes belegt, und im SRAM 0+0+2+2=4 Bytes.&lt;br /&gt;
&lt;br /&gt;
Die Gesamtgrösse ergibt sich jedoch erst aus dem elf-File,&lt;br /&gt;
denn auch die Vektortabelle und der Startup-Code belegen Platz:&lt;br /&gt;
 &amp;gt; avr-size -x -A blinky.elf&lt;br /&gt;
druckt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
blinky.elf  :&lt;br /&gt;
section     size       addr&lt;br /&gt;
.text      0x110        0x0&lt;br /&gt;
.data        0x0   0x800060&lt;br /&gt;
.bss         0x4   0x800060&lt;br /&gt;
.noinit      0x0   0x800064&lt;br /&gt;
.eeprom      0x0   0x810000&lt;br /&gt;
.stab      0x798        0x0&lt;br /&gt;
.stabstr   0x6b0        0x0&lt;br /&gt;
Total      0xf5c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Im Flash werden somit 0x110+0=272 Bytes belegt, also 90 Bytes mehr als die Objekte benötigen; davon entfallen z.B. schon 38 Bytes auf die Vektortabelle des [[ATmega8]], &lt;br /&gt;
die 2*19 Bytes groß ist. &lt;br /&gt;
&lt;br /&gt;
Die Größen einzelner Funktionen lassen sich anzeigen mit&lt;br /&gt;
 &amp;gt; avr-nm --size-sort -S blinky.elf&lt;br /&gt;
was nach Größe sortiert ausdruckt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00800060 00000002 b irq_count&lt;br /&gt;
00800062 00000002 b timer1a_job&lt;br /&gt;
00000086 00000018 T main&lt;br /&gt;
0000009e 00000022 T timer1_init&lt;br /&gt;
0000005c 0000002a t job_timer1&lt;br /&gt;
000000c0 0000004e T SIG_OUTPUT_COMPARE_1A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Quellcode=&lt;br /&gt;
Der Quellcode ist für die Version 3.x von [[avr-gcc]]. In der 4er-Version gab es tiefgreifende interne Änderungen im Compiler; er ist noch instabil und kann momentan noch nicht für den Produktiv-Einsatz empfohlen werden (Stand 02/2005).&lt;br /&gt;
&lt;br /&gt;
==blinky.c==&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;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;timer1.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/* PortB.1 blinkt jede Sekunde                */&lt;br /&gt;
/* also mit einer Frequenz von 1/2 Hz         */&lt;br /&gt;
#define DDR_LED DDRB&lt;br /&gt;
#define PORT_LED PORTB&lt;br /&gt;
#define PAD_LED 1&lt;br /&gt;
&lt;br /&gt;
static void ioinit();&lt;br /&gt;
static void job_timer1();&lt;br /&gt;
&lt;br /&gt;
/* Zählt in jedem aufgetretenem IRQ eins hoch */&lt;br /&gt;
static volatile uint16_t irq_count = 0;&lt;br /&gt;
&lt;br /&gt;
/* Diese Funktion ist ein 'Callback'          */&lt;br /&gt;
/* Sie wird an timer1_init() übergeben        */&lt;br /&gt;
/* und von dort aus aufgerufen, und zwar      */&lt;br /&gt;
/* INTERRUPTS_PER_SECOND mal pro Sekunde.     */&lt;br /&gt;
/* Sie wird also auf IRQ-Ebene ausgeführt     */&lt;br /&gt;
void job_timer1()&lt;br /&gt;
{&lt;br /&gt;
    uint16_t count;&lt;br /&gt;
&lt;br /&gt;
    /* irq_count um 1 erhöhen und              */&lt;br /&gt;
    /* gegebenenfalls die LED blinken */&lt;br /&gt;
    count = 1+irq_count;&lt;br /&gt;
&lt;br /&gt;
    if (count &amp;gt;= INTERRUPTS_PER_SECOND)&lt;br /&gt;
    {&lt;br /&gt;
        count = 0;&lt;br /&gt;
        PORT_LED ^= (1 &amp;lt;&amp;lt; PAD_LED);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    irq_count = count;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ioinit()&lt;br /&gt;
{&lt;br /&gt;
    /* Port als Ausgang */&lt;br /&gt;
    DDR_LED |= (1 &amp;lt;&amp;lt; PAD_LED);&lt;br /&gt;
    &lt;br /&gt;
    /* Initialisiert Timer1, um jede Sekunde              */&lt;br /&gt;
    /* INTERRUPTS_PER_SECOND mal die Funktion job_timer1  */&lt;br /&gt;
    /* aufzurufen */&lt;br /&gt;
    timer1_init (job_timer1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
    /* Peripherie initialisieren */&lt;br /&gt;
    ioinit();&lt;br /&gt;
&lt;br /&gt;
    /* Interrupts aktivieren     */&lt;br /&gt;
    sei();&lt;br /&gt;
&lt;br /&gt;
    /* Nach main landen wir in exit(),                    */&lt;br /&gt;
    /* das nur aus einer Endlosschleife besteht (avr-gcc) */&lt;br /&gt;
    /* Der Interrupt lässt die LED weiterhin              */&lt;br /&gt;
    /* im Sekundentakt blinken                            */&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==timer1.h==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef _TIMER1_H_&lt;br /&gt;
#define _TIMER1_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifndef INTERRUPTS_PER_SECOND&lt;br /&gt;
#define INTERRUPTS_PER_SECOND				1000&lt;br /&gt;
#endif /* INTERRUPTS_PER_SECOND */&lt;br /&gt;
&lt;br /&gt;
extern void timer1_init (void (*) (void));&lt;br /&gt;
&lt;br /&gt;
#endif /* _TIMER1_H_ */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==timer1.c==&lt;br /&gt;
&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;avr/signal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;timer1.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 1000000&lt;br /&gt;
#endif /* F_CPU */&lt;br /&gt;
&lt;br /&gt;
/* Test von F_CPU und INTERRUPTS_PER_SECOND */&lt;br /&gt;
/* auf Gültigkeitsbereich                   */&lt;br /&gt;
#if (F_CPU / INTERRUPTS_PER_SECOND -1 &amp;lt; 0) \&lt;br /&gt;
    || (F_CPU / INTERRUPTS_PER_SECOND -1 &amp;gt;= 0x10000)&lt;br /&gt;
#error Werte für F_CPU bzw. INTERRUPTS_PER_SECOND ungeeignet&lt;br /&gt;
#error evtl. muss der Prescaler verwendet werden&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/* Callback-Funktion */&lt;br /&gt;
static void (*timer1a_job) (void);&lt;br /&gt;
&lt;br /&gt;
void timer1_init (void (*job) (void))&lt;br /&gt;
{&lt;br /&gt;
    timer1a_job = job;&lt;br /&gt;
&lt;br /&gt;
#if defined (__AVR_AT90S2313__)&lt;br /&gt;
    /* AVR Classic:                     */&lt;br /&gt;
    /* Timer1 läuft mit vollem Takt     */&lt;br /&gt;
    /* CTC: Clear Timer on CompareMatch */&lt;br /&gt;
    /* Timer1 ist Zähler                */&lt;br /&gt;
    TCCR1A = 0;&lt;br /&gt;
    TCCR1B = (1 &amp;lt;&amp;lt; CS10) | (1 &amp;lt;&amp;lt; CTC1);&lt;br /&gt;
#elif defined (__AVR_ARCH__) &amp;amp;&amp;amp; ((__AVR_ARCH__==4) || (__AVR_ARCH__==5))&lt;br /&gt;
    /* AVR Mega:                                 */&lt;br /&gt;
    /* Mode #4 für Timer1 (ATmega8 Manual S. 97) */&lt;br /&gt;
    /* und voller MCU Takt (Prescale=1)          */&lt;br /&gt;
    TCCR1A = 0;&lt;br /&gt;
    TCCR1B = (1 &amp;lt;&amp;lt; WGM12) | (1 &amp;lt;&amp;lt; CS10);&lt;br /&gt;
#else&lt;br /&gt;
#error Dont know how to setup timer1&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
    /* OutputCompare1A Register setzen        */&lt;br /&gt;
    OCR1A = (uint16_t) ((uint32_t) F_CPU / INTERRUPTS_PER_SECOND -1);&lt;br /&gt;
&lt;br /&gt;
    /* evtl. gesetztes OC1A-Flag zurücksetzen */&lt;br /&gt;
    TIFR = (1 &amp;lt;&amp;lt; OCF1A);&lt;br /&gt;
&lt;br /&gt;
    /* OutputCompare1A Interrupt aktivieren   */&lt;br /&gt;
    TIMSK |= (1 &amp;lt;&amp;lt; OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Die Interrupt Service Routine ruft lediglich */&lt;br /&gt;
/* timer1a_job auf (callback)                   */&lt;br /&gt;
SIGNAL(SIG_OUTPUT_COMPARE1A)&lt;br /&gt;
{&lt;br /&gt;
    timer1a_job();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alles in einer Datei ==&lt;br /&gt;
&lt;br /&gt;
In der folgenden Quelldatei sind alle Routinen in etwas vereinfachter Form zusammengefasst. &lt;br /&gt;
Zum Übersetzen gibt man an (hier für [[ATmega32]]):&lt;br /&gt;
 &amp;gt; avr-gcc blinky-all.c -o blinky-all.elf -mmcu=atmega32 -g -Os&lt;br /&gt;
oder, falls man die Ausgabe im Intel HEX-Format haben möchte:&lt;br /&gt;
 &amp;gt; avr-gcc blinky-all.c -o blinky-all.hex -mmcu=atmega32 -g -Os -Wl,--oformat=ihex&lt;br /&gt;
Möchte man &amp;lt;tt&amp;gt;F_CPU&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;INTERRUPTS_PER_SECOND&amp;lt;/tt&amp;gt; ändern, dann muss das bei diesem Beispiel direkt in der Quelle angepasst werden. &amp;lt;tt&amp;gt;F_CPU&amp;lt;/tt&amp;gt; hat wie immer nur rein informativen Charakter, um zu wissen, wie schnell der AVR läuft. Eingestellt wird die Taktfrequenz über die [[AVR#Die Fusebits|Fuse-Bits]] bzw. Wahl eines entsprechenden Quarzes/Oszillators/Resonators/RC-Glieds.&lt;br /&gt;
&lt;br /&gt;
'''Quelle''' (&amp;lt;tt&amp;gt;blinky-all.c&amp;lt;/tt&amp;gt;):&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;avr/signal.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// PortB.1 blinkt jede Sekunde&lt;br /&gt;
// also mit einer Frequenz von 1/2 Hz&lt;br /&gt;
#define DDR_LED  DDRB&lt;br /&gt;
#define PORT_LED PORTB&lt;br /&gt;
#define PAD_LED  1&lt;br /&gt;
&lt;br /&gt;
// Werte zur Berechnung der Interrupt-Rate bei AVR-Fuses,&lt;br /&gt;
// die auf 1MHz eingestellt sind (Werkseinstellung für internen RC-Oszillator) &lt;br /&gt;
#define F_CPU                 1000000&lt;br /&gt;
&lt;br /&gt;
// 1000 Interrupts pro Sekunde&lt;br /&gt;
#define INTERRUPTS_PER_SECOND 1000&lt;br /&gt;
&lt;br /&gt;
// Prototypen der Funktionen&lt;br /&gt;
void ioinit();&lt;br /&gt;
&lt;br /&gt;
// Wird durch jeden IRQ eins hochgezählt&lt;br /&gt;
static volatile uint16_t irq_count = 0;&lt;br /&gt;
&lt;br /&gt;
// Wert für das OutputCompare-Register (OCR1A)&lt;br /&gt;
#define OCR_VAL          (F_CPU / INTERRUPTS_PER_SECOND -1)&lt;br /&gt;
&lt;br /&gt;
// Initialisierung der Hardware&lt;br /&gt;
void ioinit()&lt;br /&gt;
{&lt;br /&gt;
    // Port als Ausgang&lt;br /&gt;
    DDR_LED |= (1 &amp;lt;&amp;lt; PAD_LED);&lt;br /&gt;
    &lt;br /&gt;
    // Initialisiert Timer1, um jede Sekunde 1000 IRQs auszulösen&lt;br /&gt;
    // ATmega: Mode #4 für Timer1 und voller MCU-Takt (Prescale=1)&lt;br /&gt;
    TCCR1A = 0;&lt;br /&gt;
    TCCR1B = (1 &amp;lt;&amp;lt; WGM12) | (1 &amp;lt;&amp;lt; CS10);&lt;br /&gt;
&lt;br /&gt;
    // OutputCompare1A Register setzen&lt;br /&gt;
    OCR1A = (uint16_t) ((uint32_t) OCR_VAL);&lt;br /&gt;
&lt;br /&gt;
    // OutputCompare1A Interrupt aktivieren&lt;br /&gt;
    TIMSK |= (1 &amp;lt;&amp;lt; OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Das Hauptprogramm (Einsprungpunkt)&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    // Peripherie initialisieren&lt;br /&gt;
    ioinit();&lt;br /&gt;
&lt;br /&gt;
    // Interrupts aktivieren&lt;br /&gt;
    sei();&lt;br /&gt;
&lt;br /&gt;
    // Eine Endlosschleife.  &lt;br /&gt;
    // Der Interrupt lässt die LED weiterhin blinken&lt;br /&gt;
    while (1)&lt;br /&gt;
    {}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Die Interrupt Service Routine (ISR) wird INTERRUPTS_PER_SECOND mal &lt;br /&gt;
// pro Sekunde ausgeführt. irq_count zählt die Aufrufe und blinkt die LED&lt;br /&gt;
// wenn 1 Sekunde vergangen ist.&lt;br /&gt;
SIGNAL(SIG_OUTPUT_COMPARE1A)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t count;&lt;br /&gt;
&lt;br /&gt;
    // irq_count um 1 erhöhen und&lt;br /&gt;
    count = 1+irq_count;&lt;br /&gt;
&lt;br /&gt;
    // alle 1000 IRQs die LED blinken&lt;br /&gt;
    if (count &amp;gt;= INTERRUPTS_PER_SECOND)&lt;br /&gt;
    {&lt;br /&gt;
        count = 0;&lt;br /&gt;
        PORT_LED ^= (1 &amp;lt;&amp;lt; PAD_LED);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    irq_count = count;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für klassische AVRs wie [[AT90S2313]] muss die Initialisierung etwas abgeändert werden, weil sich Bit-Bezeichner unterscheiden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// AVR Classic:&lt;br /&gt;
// Timer1 läuft mit vollem Takt&lt;br /&gt;
// CTC: Clear Timer on CompareMatch&lt;br /&gt;
// Timer1 ist Zähler&lt;br /&gt;
    TCCR1A = 0;&lt;br /&gt;
    TCCR1B = (1 &amp;lt;&amp;lt; CS10) | (1 &amp;lt;&amp;lt; CTC1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wenn man will, alnn man den Code bzw. die Werte noch einem kleinen Gültikeitstest unterziehen.&lt;br /&gt;
// Test von F_CPU und INTERRUPTS_PER_SECOND auf Gültigkeit&lt;br /&gt;
#if (OCR_VAL &amp;lt; 0) || (OCR_VAL &amp;gt;= 0x10000)&lt;br /&gt;
#error Werte für F_CPU bzw. INTERRUPTS_PER_SECOND ungeeignet&lt;br /&gt;
#endif // test OCR_VAL&lt;br /&gt;
&lt;br /&gt;
#ifndef TCNT1&lt;br /&gt;
#error Dieser Controller hat keinen Timer1&lt;br /&gt;
#endif // TCNT1&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Spin-off=&lt;br /&gt;
&lt;br /&gt;
Eine LED blinken zu lassen könnte auch wesentlich einfacher implementert werden,&lt;br /&gt;
also z.B. ohne Funktionsaufrufe oder Interrupt-Programmierung.&lt;br /&gt;
&lt;br /&gt;
Neben der eigentlichen Aufgabe &amp;quot;LED blinken lassen&amp;quot; kann man an dem Code&lt;br /&gt;
aber noch andere Dinge lernen:&lt;br /&gt;
* Programmierung eines Interrupts&lt;br /&gt;
* Initialisierung von Timer1 als Zähler mit &amp;quot;Clear Timer on Compare Match&amp;quot;&lt;br /&gt;
* Bedingte Codeübersetzung/Controllerunterscheidung mit &amp;lt;tt&amp;gt;#ifdef&amp;lt;/tt&amp;gt; (in &amp;lt;tt&amp;gt;timer1_init&amp;lt;/tt&amp;gt;)&lt;br /&gt;
* Abchecken der Güligkeit von Defines durch den Präprozessor&lt;br /&gt;
* Übergabe eines Funktionszeigers, um später eine Funktion indirekt aufzurufen&lt;br /&gt;
* Zusammenlinken mehrerer Module&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[AVR]]&lt;br /&gt;
* [[avr-gcc]]&lt;br /&gt;
* [[Interrupt]]&lt;br /&gt;
* [[:Kategorie:Quellcode C|weitere C-Code Beispiele]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Quellcode C]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Avr-gcc&amp;diff=6836</id>
		<title>Avr-gcc</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Avr-gcc&amp;diff=6836"/>
				<updated>2006-04-14T14:01:54Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Zugiff auf Bytes und Worte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''avr-gcc''' ist ein freier C-[[Compiler]], mit dem man C-Programme zu ausführbaren Programmen übersetzen kann, die auf [[Microcontroller]]n der [[AVR]]-Familie lauffähig sind. &lt;br /&gt;
An Sprachen versteht avr-gcc sowohl C als auch [[#C%2b%2b|C++]]. &lt;br /&gt;
Neben Standard-C bzw. ANSI-C versteht avr-gcc auch GNU-C, das etwas mehr Möglichkeiten und kleinere Spracherweiterungen bietet.&lt;br /&gt;
&lt;br /&gt;
avr-gcc kann auch dazu verwendet werden, um C/C++ Programme nach Assembler zu übersetzen oder um Bibliotheken zu erstellen, die später in unterschiedlichen Projekten verwendet werden können.&lt;br /&gt;
&lt;br /&gt;
Wie bei allen aus der UNIX-Welt kommenden Programmen ist das Kommando-Interface von avr-gcc die Shell bzw. die Kommandozeile, über die Optionen, Parameter, Einstellungen und die Namen der zu übersetzenden Dateien angegeben werden. &lt;br /&gt;
&lt;br /&gt;
=How to Read=&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel bespricht avr-gcc Version 3.x. Er ist kein Tutorial und kein AVR-Handbuch &amp;amp;ndash; das würde den Umfang des Artikels bei weitem sprengen.&lt;br /&gt;
&lt;br /&gt;
Der Artikel ist ein Handbuch zu avr-gcc. Er bespricht zum Beispiel, wie man avr-gcc anwendet und Besonderheiten von avr-gcc-C,&lt;br /&gt;
die nicht zum Sprachumfang von C gehören.&lt;br /&gt;
Dazu zählen die Definition von [[#Interrupts|Interrupt]] Service Routinen ([[ISR|ISRs]]) &lt;br /&gt;
oder wie man Daten ins [[EEPROM]] legt.&lt;br /&gt;
&lt;br /&gt;
Es wird also besprochen, ''wie'' eine ISR zu definieren ist, aber nicht,&lt;br /&gt;
''warum'' das  gegebenenfalls notwendig oder nicht notwendig ist. &lt;br /&gt;
''Warum'' etwas gemacht wird, ist abhängig von der gestellten Aufgabe,&lt;br /&gt;
etwa ''&amp;quot;Initialisiere den [[UART]] zur Benutzung mit 9600 Baud&amp;quot;''.&lt;br /&gt;
Dafür enthält dieser Artikel zusammen mit dem AVR-Handbuch das Rüstzeug, &lt;br /&gt;
bietet aber keine Lösungen für konkrete Aufgaben.&lt;br /&gt;
&lt;br /&gt;
In den [[:Kategorie:Quellcode C|C-Codebeispielen]]&lt;br /&gt;
befindet sich das ausführlichere Beispiel &amp;quot;[[Hallo Welt für AVR (LED blinken)]]&amp;quot;,&lt;br /&gt;
das nur eine [[Diode#Lumineszenzdiode|LED]] blinkt und zeigt, &lt;br /&gt;
wie ein kleines Projekt mit avr-gcc compiliert werden kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt es ein allgemeines [[C-Tutorial]], das jedoch noch unvollständig und teilweise feherhaft ist (Stand 02/2006). Darüber hinaus gibt es ein [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial C-Tutorial bei www.mikrocontroller.net].&lt;br /&gt;
&lt;br /&gt;
=Benutzer-Schnittstelle=&lt;br /&gt;
&lt;br /&gt;
Die Benutzer-Schnittstelle von avr-gcc ist &amp;amp;ndash; wie für alle Programme, die aus der UNIX-Welt kommen &amp;amp;ndash; die Kommandozeile einer Shell, Console bzw. Eingabeaufforderung. &lt;br /&gt;
&lt;br /&gt;
Im einfachsten Fall sieht ein Aufruf von avr-gcc also so aus:&lt;br /&gt;
 &amp;gt; avr-gcc&lt;br /&gt;
Dabei das '&amp;lt;tt&amp;gt;&amp;gt;&amp;lt;/tt&amp;gt;' nicht mittippen, und ein ENTER am Ende der Zeile drücken.&lt;br /&gt;
Die Antwort bei korrekter Installation ist dann&lt;br /&gt;
 avr-gcc: no input files&lt;br /&gt;
Was bedeutet: das Programm avr-gcc wurde vom Betriebssystem gefunden und konnte/durfte gestartet werden. Dann gibt avr-gcc eine Fehlermeldung aus und beendet die Ausführung, weil er keine Eingabedatei(en) bekommen hat &amp;amp;#150; was ja auch stimmt. Soweit ist also alles in Butter.&lt;br /&gt;
&lt;br /&gt;
Um eine C-Datei &amp;lt;tt&amp;gt;foo.c&amp;lt;/tt&amp;gt; mir avr-gcc optimiert zu einem lauffähigen elf-Programm &amp;lt;tt&amp;gt;foo.elf&amp;lt;/tt&amp;gt; für einen [[ATmega32]] zu compileren, würde man angeben&lt;br /&gt;
 &amp;gt; avr-gcc -O2 -mmcu=atmega32 foo.c -o foo.elf&lt;br /&gt;
&lt;br /&gt;
[[GCC]] war immer Kommandozeilen-orientiert und wird es auch immer bleiben, denn das hat gute Gründe:&lt;br /&gt;
* ein Compiler ist ein Compiler ist ein Compiler (und keine grafische Bedienschnittstelle)&lt;br /&gt;
* die Plattformabhängigkeit wird auf ein Minimum reduziert&lt;br /&gt;
* es gibt die Möglichkeit, avr-gcc per Skript oder [[make]] zu starten&lt;br /&gt;
* avr-gcc kann durchaus in eine Umgebung integriert werden: in einen Editor oder in eine GUI wie neuere Versionen von AVR-Studio erfolgreich beweisen, etc. Der avr-gcc-Aufruf kann sogar von einem Server-Socket oder einer Web-Application heraus erfolgen, welche ein C-Programm empfängt, es von avr-gcc übersetzen lässt, und das Resultat zurückschickt oder sonst was damit anstellt.&lt;br /&gt;
* Lizenzgründe: eine Umgebung, die avr-gcc integriert, kann durchaus proprietär oder nicht quelloffen sein und muss nicht der [[Freie Software|GPL]] unterliegen. Wieder ist AVR-Studio ein Beispiel.&lt;br /&gt;
&lt;br /&gt;
=Allgemeine Charakteristika von avr-gcc=&lt;br /&gt;
&lt;br /&gt;
;Groß- und Kleinschreibung: C unterscheidet generell zwischen Groß- und Kleinschreibung, sowohl bei Variablen- und Funktionsnamen, bei Sprungmarken als auch bei Makros, und je nach Betriebssystem auch bei Pfad- und Dateinamen/Dateierweiterungen.&lt;br /&gt;
&lt;br /&gt;
;Größe des Typs int: Der Standard-Typ &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; ist 16 Bit groß&lt;br /&gt;
&lt;br /&gt;
;Größe von Pointern: Ein Pointer (Zeiger) ist 16 Bit groß&lt;br /&gt;
&lt;br /&gt;
;Endianess: avr-gcc implementiert Datentypen als little-endian, d.h. bei Datentypen, die mehrere Bytes groß sind, wird das niederwertigste Byte an der niedrigsten Adresse gespeichert. Dies gilt auch für Adressen und deren Ablage auf dem [[Stack]] sowie die Ablage von Werten, die mehrere Register belegen.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;size_t&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;size_t&amp;lt;/tt&amp;gt; ist &amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt; und immer 16 Bit groß, unabhängig davon , ob mit &amp;lt;tt&amp;gt;-mint8&amp;lt;/tt&amp;gt; übersetzt wird oder nicht.&lt;br /&gt;
&lt;br /&gt;
==Binäre Konstanten==&lt;br /&gt;
Einige Versionen von avr-gcc ermöglichen die Verwendung binärer Konstanten für Ganzzahl-Werte:&lt;br /&gt;
&amp;lt;pre&amp;gt;unsigned char value = 0b00000010;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Davon sollte man absehen, denn zum einen hat man schnell eine 0 zu wenig oder zu viel getippselt, es ist kein Standard-C und man hat die leserlichere Alternative&lt;br /&gt;
&amp;lt;pre&amp;gt;unsigned char value = (1&amp;lt;&amp;lt;1);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Registerverwendung==&lt;br /&gt;
avr-gcc verwendet die Prozessor-Register [[GPR]]s auf eine definierte Art und Weise. Wie die Register verwendet werden, muss man wissen, wenn man Assembler-Funktionen schreibt, die mit durch avr-gcc übersetztem C-Code zusammenpassen sollen. Der &amp;quot;reinen&amp;quot; C-Programmierer muss sich keine Gedanken um die Register-Verwendung machen.&lt;br /&gt;
;R0: ein temporäres Register, in dem man rumwutzen darf&lt;br /&gt;
;R1: enthält immer den Wert 0&lt;br /&gt;
;R1 &amp;amp;#150; R17, R28, R29: allgemeine Register, die durch einen Funktionsaufruf nicht verändert bzw wieder auf den ursprünglichen Wert restauriert werden&lt;br /&gt;
;R0, R18 &amp;amp;#150; R27, R30, R31: können durch Funktionsaufrufe verändert werden, ohne restauriert zu werden&lt;br /&gt;
&lt;br /&gt;
;Framepointer: R28 &amp;amp;#150; R29 (Y-Reg) enthält den Framepointer, sofern benötigt&lt;br /&gt;
;Argument-Register: Die Register R8 bis R25 finden Verwendung zur Übergabe von Funktionsparametern. Für den Ort, an dem das Argument übergeben wird, gilt:&lt;br /&gt;
:* Die Große in Bytes wird zur nächsten geraden Zahl aufgerundet, falls die Argumentgröße ungerade ist.&lt;br /&gt;
:* Ist in den verbleibenden Übergaberegistern kein Platz mehr oder ist das Argument namenlos (varargs), wird es im Memory übergeben und die Adresse als implizites erstes Argument.&lt;br /&gt;
:* Der Registerort fängt mit 26 an.&lt;br /&gt;
:* Von dem Registerort wird die berechete Größe abgezogen und (falls Platz) das Argument in diesen Registern übergeben. Ist das erste Argument z.B. ein &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;, dann erfolgt die Übergabe in den Registern R22, R23, R24 und R25 (LSB zuerst). Danach wird die gerundete Größe des Arguments vom Registerort abgezogen, dieser also auf 22 gesetzt. Ist das nächste Argument ein &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;, wird dessen Größe auf 2 aufgerundet und vom Ort abgezogen. Dieses Argument wird also in R20 übergeben und der Ort auf 20 gesetzt, etc.&lt;br /&gt;
;Return-Register: Ein Return-Wert wird in den gleichen Registern zurückgegeben, die auch für ein gleichgrosses erstes Funktionsargument genommen würden. Liefert eine Funktion ein &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;, dann erfolgt die Rückgabe also in den Registern R22&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;R25 (LSB zuerst). Bei einem &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; sind es die Register R24 und R25.&lt;br /&gt;
&lt;br /&gt;
=Ablauf der Codegenerierung=&lt;br /&gt;
&lt;br /&gt;
Die Code-Erzeugung durch avr-gcc geschieht in mehreren, voneinander unabhängigen Schritten. Diese  Schritte sind für den Anwender nicht immer erkennbar, und es auch nicht unbedingt notwendig, sie zu kennen. Für ein besseres Verständnis der Code-Generierung und zur Einordnung von Fehlermeldungen und Warnungen ist eine Kenntnis aber durchaus hilfreich.&lt;br /&gt;
&lt;br /&gt;
==Übersichts-Grafik==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Avr-gcc-1.png|Zusammenspiel zwischen avr-gcc und binutils]]&lt;br /&gt;
&lt;br /&gt;
==Schritte der Codegenerierung==&lt;br /&gt;
&lt;br /&gt;
Ohne die Angabe spezieller Optionen legt avr-gcc die Zwischenformate nur als temporäre Dateien an, und nach Beenden des Compilers wieder diese wieder gelöscht. Dadurch fällt die Aufgliederung in Unterschritte nicht auf. In diesem Falle müssen Assembler und Linker/Locator auch nicht extra aufgerufen werden, sondern die Aufrufe werden durch avr-gcc verwaltet.&lt;br /&gt;
&lt;br /&gt;
;Precompileren: Alle Preprozessor-Direktiven werden aufgelöst. Dazu gehören Direktiven wie&lt;br /&gt;
:{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;quot;meinzeug.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define MAKRONAME ERSATZTEXT&lt;br /&gt;
&lt;br /&gt;
#if !defined(__AVR__)&lt;br /&gt;
#error einen Fehler ausgeben und abbrechen&lt;br /&gt;
#else&lt;br /&gt;
/* Alles klar, wir koennen loslegen mit C-Code fuer AVR */&lt;br /&gt;
#endif &lt;br /&gt;
&lt;br /&gt;
MAKRONAME&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
:Precompilieren besteht also nur aus reinem Textersatz: Auflösen von Makros, kopieren von anderen Dateien in die Quelle, etc. &lt;br /&gt;
&lt;br /&gt;
;Compilieren: In diesem Schritt geschieht der eigentliche Compilier-Vorgang: avr-gcc übersetzt die reine, precompilierte C-Quelle (*.i): Die Quelle wird auf Syntax-Fehler geprüft, es werden Optimierungen gemacht, und das übersetzte C-Programm als Assembler-Datei in (*.s) gespeichert.&lt;br /&gt;
&lt;br /&gt;
;Assemblieren: Der Assembler (&amp;lt;tt&amp;gt;avr-as&amp;lt;/tt&amp;gt;) übersetzt den Assembler-Code (*.s) in das  AVR-eigene Objektformat elf32-avr (*.o). Das Objekt enthält schon Maschinen-Code. Zusätzlich gibt es aber noch Lücken, die erst später gefüllt werden und Debug-Informationen und ganz viel anderes Zeug.&lt;br /&gt;
&lt;br /&gt;
;Linken und Lokatieren: Der Linker (&amp;lt;tt&amp;gt;avr-ld&amp;lt;/tt&amp;gt;) bindet die angegebenen Objekte (*.o) zusammen und löst externe Referenzen auf. Der Linker entscheidet anhand der Beschreibung im Linker-Script, in welchen Speicheradressen und [[#Sections|Sections]] die Daten landen: er ''lokatiert'' (von location, locate (en)). Module aus Bibliotheken (*.a) werden hinzugebunden (z.B. &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;) und die elf32-avr Ausgabedatei (üblicherweise *.elf) erzeugt.&lt;br /&gt;
&lt;br /&gt;
;Umwandeln ins gewünschte Objekt-Format: Ohne Angabe spezieller [[#Kommandozeilen-Optionen|Optionen]] erzeugen Linker und Assembler ihre Ausgabe im Objektformat elf32-avr. Wird ein anderes Objektformat wie Intel-HEX (*.hex), binary (*.bin) oder srec (*.srec) benötigt, kann &amp;lt;tt&amp;gt;avr-objcopy&amp;lt;/tt&amp;gt; dazu verwendet werden, um diese zu erstellen. Der Inhalt einzelner Sections kann gezielt umkopiert oder ausgeblendet werden, so daß Dateien erstellt werden können, die nur den Inhalt des Flashs (Section &amp;lt;tt&amp;gt;.text&amp;lt;/tt&amp;gt;) oder des [[EEPROM]]s (Section &amp;lt;tt&amp;gt;.eeprom&amp;lt;/tt&amp;gt;) repräsentieren. Durch das Umwandeln in ein anderes Objektformat gehen üblicherweise Informationen wie Debug-Informationen verloren.&lt;br /&gt;
&lt;br /&gt;
:Es ist auch möglich, den Linker mit der Optione &amp;lt;tt&amp;gt;--oformat=...&amp;lt;/tt&amp;gt; zu starten, damit er direkt das gewünschte Ausgabeformat erzeugt. Diese Option lässt man von avr-gcc an den Linker weiterreichen, etwa wenn man direkt eine Intel-HEX-Datei erstellen will und keine elf-Datei braucht, wie sie z.b. beim Debuggen benötigt wird:&lt;br /&gt;
:&amp;lt;pre&amp;gt;&amp;gt; avr-gcc ... -Wl,--oformat=ihex&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Kommandozeilen-Optionen=&lt;br /&gt;
Die Codegenerierung bei avr-gcc wird über Kommandozeilen-Optionen gesteuert. Diese legen fest, für welchen Controller Code zu erzeugen ist, wie stark optimiert wird, ob Debug-Informationen erzeugt werden, etc. Die Optionen teilen sich in zwei Gruppen: Optionen, die für alle GCC-Ports verfürgbar sind und maschinenspezifische Optionen, die nur für AVR verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
Aus der Masse an GCC-Optionen kann hier nur ein kleiner Auszug der wichtigsten und am häufigsten verwendeten Optionen vorgestellt werden. Eine Auflistung aller GCC-Optionen mit Kurzbeschreibung umfasst knapp 1000 Zeilen &amp;amp;#150; ohne undokumentierte Optionen, versteht sich.&lt;br /&gt;
&lt;br /&gt;
==Allgemeine Optionen für GCC==&lt;br /&gt;
; &amp;lt;tt&amp;gt;--help&amp;lt;/tt&amp;gt;: Anzeige der wichtigsten Optionen&lt;br /&gt;
; &amp;lt;tt&amp;gt;--help -v&amp;lt;/tt&amp;gt;: Überschüttet einen mit Optionen&lt;br /&gt;
; &amp;lt;tt&amp;gt;--target-help&amp;lt;/tt&amp;gt;: Anzeige der wichtigsten maschinenspezifischen Optionen&lt;br /&gt;
; &amp;lt;tt&amp;gt;-O0&amp;lt;/tt&amp;gt;: keine Optimierung&lt;br /&gt;
; &amp;lt;tt&amp;gt;-O1&amp;lt;/tt&amp;gt;: Optimierung&lt;br /&gt;
; &amp;lt;tt&amp;gt;-Os&amp;lt;/tt&amp;gt;: optimiert für Code-Größe&lt;br /&gt;
; &amp;lt;tt&amp;gt;-O2&amp;lt;/tt&amp;gt;: stärkere Optimierung für bessere Laufzeit&lt;br /&gt;
; &amp;lt;tt&amp;gt;-g&amp;lt;/tt&amp;gt;: erzeugt Debug-Informationen&lt;br /&gt;
; &amp;lt;tt&amp;gt;-c&amp;lt;/tt&amp;gt;: (pre)compilert und assembliert nur bis zum Objekt (&amp;lt;tt&amp;gt;*.o&amp;lt;/tt&amp;gt;), kein Link-Lauf&lt;br /&gt;
; &amp;lt;tt&amp;gt;-S&amp;lt;/tt&amp;gt;: (pre)compilert nur und erzeugt Assembler-Ausgabe (*.s)&lt;br /&gt;
; &amp;lt;tt&amp;gt;-E&amp;lt;/tt&amp;gt;: nur Precompilat (&amp;lt;tt&amp;gt;*.i&amp;lt;/tt&amp;gt;) erzeugen, kein Compilieren, kein Assemblieren, kein Linken&lt;br /&gt;
; &amp;lt;tt&amp;gt;-o &amp;lt;filename&amp;gt;&amp;lt;/tt&amp;gt;: legt den Name der Ausgabedatei fest&lt;br /&gt;
; &amp;lt;tt&amp;gt;-v&amp;lt;/tt&amp;gt;: zeigt Versionsinformationen an und ist geschwätzig (verbose): Anzeige der aufgerufenen tools&lt;br /&gt;
; &amp;lt;tt&amp;gt;-I&amp;lt;path&amp;gt;&amp;lt;/tt&amp;gt;: Angabe eines weiteren Include-Pfads, in dem Dateien mit &amp;lt;tt&amp;gt;#include &amp;lt;...&amp;gt;&amp;lt;/tt&amp;gt; gesucht werden&lt;br /&gt;
; &amp;lt;tt&amp;gt;-E -dM &amp;lt;filename&amp;gt;&amp;lt;/tt&amp;gt;: Anzeige aller Defines&lt;br /&gt;
; &amp;lt;tt&amp;gt;-MM&amp;lt;/tt&amp;gt;: Für die angegebenen Eingabe-Dateien wird eine Ausgabe erzeugt, die als [[make|Makefile]]-Fragment dienen kann und die Anhängigkeiten (dependencies) der Objekte von den Quellen/Headern beschreibt.&lt;br /&gt;
; &amp;lt;tt&amp;gt;-D&amp;lt;name&amp;gt;&amp;lt;/tt&amp;gt;: Definiert Makro &amp;lt;tt&amp;gt;&amp;lt;name&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
; &amp;lt;tt&amp;gt;-D&amp;lt;name&amp;gt;=&amp;lt;wert&amp;gt;&amp;lt;/tt&amp;gt;: Definiert Makro &amp;lt;tt&amp;gt;&amp;lt;name&amp;gt;&amp;lt;/tt&amp;gt; zu &amp;lt;tt&amp;gt;&amp;lt;wert&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
; &amp;lt;tt&amp;gt;-U&amp;lt;name&amp;gt;&amp;lt;/tt&amp;gt;: Undefiniert Makro &amp;lt;tt&amp;gt;&amp;lt;name&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
; &amp;lt;tt&amp;gt;-save-temps&amp;lt;/tt&amp;gt;: Temporäre Dateien (&amp;lt;tt&amp;gt;*.i&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;*.s&amp;lt;/tt&amp;gt;) werden nicht gelöscht. Teilweise fehlerhaft zusammen mit &amp;lt;tt&amp;gt;-c&amp;lt;/tt&amp;gt;&lt;br /&gt;
; &amp;lt;tt&amp;gt;-Wa,&amp;lt;options&amp;gt;&amp;lt;/tt&amp;gt;: übergibt Komma-getrennte Liste &amp;lt;tt&amp;gt;&amp;lt;options&amp;gt;&amp;lt;/tt&amp;gt; an den Assembler (&amp;lt;tt&amp;gt;avr-as&amp;lt;/tt&amp;gt;)&lt;br /&gt;
:;&amp;lt;tt&amp;gt;-Wa,-a=&amp;lt;filename&amp;gt;&amp;lt;/tt&amp;gt;: Assembler erzeugt ein Listing mit Name &amp;lt;tt&amp;gt;&amp;lt;filename&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
; &amp;lt;tt&amp;gt;-Wp,&amp;lt;options&amp;gt;&amp;lt;/tt&amp;gt;:  übergibt Komma-getrennte Liste &amp;lt;tt&amp;gt;&amp;lt;options&amp;gt;&amp;lt;/tt&amp;gt; an den Preprozessor&lt;br /&gt;
; &amp;lt;tt&amp;gt;-Wl,&amp;lt;options&amp;gt;&amp;lt;/tt&amp;gt;:  übergibt Komma-getrennte Liste &amp;lt;tt&amp;gt;&amp;lt;options&amp;gt;&amp;lt;/tt&amp;gt; an den Linker (&amp;lt;tt&amp;gt;avr-ld&amp;lt;/tt&amp;gt;)&lt;br /&gt;
:;&amp;lt;tt&amp;gt;-Wl,-Map=&amp;lt;filename&amp;gt;&amp;lt;/tt&amp;gt;: Linker erzeugt ein Map-File mit Name &amp;lt;tt&amp;gt;&amp;lt;filename&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
:;&amp;lt;tt&amp;gt;-Wl,--oformat=&amp;lt;format&amp;gt;&amp;lt;/tt&amp;gt;: Linker erzeugt Ausgabe im Format &amp;lt;tt&amp;gt;&amp;lt;format&amp;gt;&amp;lt;/tt&amp;gt;, z.b. &amp;lt;tt&amp;gt;ihex&amp;lt;/tt&amp;gt; für Intel-HEX-File&lt;br /&gt;
:;&amp;lt;tt&amp;gt;-Wl,--section-start=&amp;lt;section&amp;gt;=&amp;lt;address&amp;gt;&amp;lt;/tt&amp;gt;: Linker legt die [[#Sections|Section]] &amp;lt;tt&amp;gt;&amp;lt;section&amp;gt;&amp;lt;/tt&amp;gt; ab Adresse &amp;lt;tt&amp;gt;&amp;lt;address&amp;gt;&amp;lt;/tt&amp;gt;, z.B: &amp;lt;tt&amp;gt;.eeprom=0x810001&amp;lt;/tt&amp;gt;&lt;br /&gt;
; &amp;lt;tt&amp;gt;-Wall&amp;lt;/tt&amp;gt;: gibt mehr Warnungen, aber immer noch nicht alle&lt;br /&gt;
; &amp;lt;tt&amp;gt;-pedantic&amp;lt;/tt&amp;gt;: geht besonders pedantisch mit Code um&lt;br /&gt;
; &amp;lt;tt&amp;gt;-ansi&amp;lt;/tt&amp;gt;: bricht mit einer Fehlermeldung ab, wenn kein ANSI-C verwendet wurde&lt;br /&gt;
; &amp;lt;tt&amp;gt;-ffreestanding&amp;lt;/tt&amp;gt;: Das erzeugte Programm läuft nicht in einer Umgebung wie einer Shell. Der Prototyp von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt; ist&lt;br /&gt;
:&amp;lt;pre&amp;gt;void main (void);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Maschinenspezifische Optionen für avr-gcc==&lt;br /&gt;
Maschinenabhängige Optionen beginnen immer mit '''-m'''&lt;br /&gt;
;-mmcu=xxx: Festlegen des Targets (Zielsystem/Controller), für das Code generiert werden soll. Je nach Target muss avr-gcc unterschiedliche Instruktionen verwendet und andere Startup-Dateien (&amp;lt;tt&amp;gt;crtxxx.o&amp;lt;/tt&amp;gt;) einbinden. avr-gcc setzt spezielle Defines, um auch in der Quelle zwischen den Targets unterscheiden zu können, falls das notwendig sein sollte: &lt;br /&gt;
:{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifdef __AVR_AT90S2313__&lt;br /&gt;
/* Code fuer AT90S2313 */&lt;br /&gt;
#elif defined (__AVR_ATmega8__) || defined (__AVR_ATmega32__)&lt;br /&gt;
/* Code fuer Mega8 und Mega32 */ &lt;br /&gt;
#else&lt;br /&gt;
#error Das ist noch nicht implementiert für diesen Controller!&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Zwar gibt es für alle AVR-Derivate die &amp;lt;tt&amp;gt;avr/io.h&amp;lt;/tt&amp;gt;, aber die AVR-Familien unterscheiden sich in ihrer Hardware; z.B. darin, wie I/O-Register heissen oder wie Hardware zu initialisieren ist. Diese Abhängigkeit kann man in unterschiedlichen Codestücken aufteilen und wie oben gezeigt bedingt übersetzen. Dadurch hat man Funktionalitäten wie &amp;lt;tt&amp;gt;uart_init&amp;lt;/tt&amp;gt; auf unterschiedlichen Controllern und wahrt den Überblick, weil nicht für jede Controller-Familie eine extra Datei notwendig ist.&lt;br /&gt;
{| &lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; &lt;br /&gt;
| &lt;br /&gt;
:{| {{Blauetabelle}}&lt;br /&gt;
|+ '''AVR classic, &amp;amp;lt;= 8 kByte'''&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|mcu || Builtin define&lt;br /&gt;
 |- &lt;br /&gt;
 |avr2 ||&amp;lt;tt&amp;gt;__AVR_ARCH__=2&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |[[AT90S2313|at90s2313]]  ||&amp;lt;tt&amp;gt;__AVR_AT90S2313__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |at90s2323 ||&amp;lt;tt&amp;gt;__AVR_AT90S2323__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |at90s2333 ||&amp;lt;tt&amp;gt;__AVR_AT90S2333__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |at90s2343 ||&amp;lt;tt&amp;gt;__AVR_AT90S2343__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |attiny22 ||&amp;lt;tt&amp;gt;__AVR_ATtiny22__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |attiny26 ||&amp;lt;tt&amp;gt;__AVR_ATtiny26__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |at90s4414 ||&amp;lt;tt&amp;gt;__AVR_AT90S4414__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |at90s4433 ||&amp;lt;tt&amp;gt;__AVR_AT90S4433__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |at90s4434 ||&amp;lt;tt&amp;gt;__AVR_AT90S4434__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |at90s8515 ||&amp;lt;tt&amp;gt;__AVR_AT90S8515__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |at90c8534 ||&amp;lt;tt&amp;gt;__AVR_AT90C8534__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |at90s8535 ||&amp;lt;tt&amp;gt;__AVR_AT90S8535__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |at86rf401 ||&amp;lt;tt&amp;gt;__AVR_AT86RF401__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
 |  &amp;lt;!-----------------------------------------------------------&amp;gt;&lt;br /&gt;
:{| {{Blauetabelle}}&lt;br /&gt;
|+ '''AVR classic, &amp;amp;gt; 8 kByte'''&lt;br /&gt;
|- bgcolor=&amp;quot;#ccccff&amp;quot;&lt;br /&gt;
! |mcu ||Builtin define&lt;br /&gt;
 |- &lt;br /&gt;
 |avr3 ||&amp;lt;tt&amp;gt;__AVR_ARCH__=3&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |atmega103 ||&amp;lt;tt&amp;gt;__AVR_ATmega103__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |atmega603 ||&amp;lt;tt&amp;gt;__AVR_ATmega603__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |at43usb320 ||&amp;lt;tt&amp;gt;__AVR_AT43USB320__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |at43usb355 ||&amp;lt;tt&amp;gt;__AVR_AT43USB355__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |at76c711 ||&amp;lt;tt&amp;gt;__AVR_AT76C711__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&amp;lt;!-----------------------------------------------------------&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
 |- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |&lt;br /&gt;
:{| {{Blauetabelle}}&lt;br /&gt;
|+ '''AVR enhanced, &amp;amp;lt;= 8 kByte'''&lt;br /&gt;
|- bgcolor=&amp;quot;#ccccff&amp;quot;&lt;br /&gt;
!|mcu || Builtin define&lt;br /&gt;
 |- &lt;br /&gt;
 |avr4 ||&amp;lt;tt&amp;gt;__AVR_ARCH__=4&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |[[Atmel Controller Mega8|atmega8]] ||&amp;lt;tt&amp;gt;__AVR_ATmega8__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |atmega8515 ||&amp;lt;tt&amp;gt;__AVR_ATmega8515__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |atmega8535 ||&amp;lt;tt&amp;gt;__AVR_ATmega8535__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
 |&amp;lt;!-----------------------------------------------------------&amp;gt;&lt;br /&gt;
:{| {{Blauetabelle}}&lt;br /&gt;
|+ '''AVR enhanced, &amp;amp;gt; 8 kByte'''&lt;br /&gt;
|- bgcolor=&amp;quot;#ccccff&amp;quot;&lt;br /&gt;
!|mcu ||Builtin define&lt;br /&gt;
 |- &lt;br /&gt;
 |avr5 ||&amp;lt;tt&amp;gt;__AVR_ARCH__=5&amp;lt;/tt&amp;gt; &lt;br /&gt;
 |-&lt;br /&gt;
 |[[Atmel Controller Mega16 und Mega32|atmega16]] ||&amp;lt;tt&amp;gt;__AVR_ATmega16__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |atmega161 ||&amp;lt;tt&amp;gt;__AVR_ATmega161__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |atmega162 ||&amp;lt;tt&amp;gt;__AVR_ATmega162__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |atmega163 ||&amp;lt;tt&amp;gt;__AVR_ATmega163__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |atmega169 ||&amp;lt;tt&amp;gt;__AVR_ATmega169__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |[[Atmel Controller Mega16 und Mega32|atmega32]] ||&amp;lt;tt&amp;gt;__AVR_ATmega32__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |atmega323 ||&amp;lt;tt&amp;gt;__AVR_ATmega323__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |[[ATMega64|atmega64]] ||&amp;lt;tt&amp;gt;__AVR_ATmega64__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |[[Atmel Controller Mega128|atmega128]] ||&amp;lt;tt&amp;gt;__AVR_ATmega128__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |at94k ||&amp;lt;tt&amp;gt;__AVR_AT94K__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&amp;lt;!-----------------------------------------------------------&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:{| {{Blauetabelle}}&lt;br /&gt;
|+ '''AVR, nur Assembler'''&lt;br /&gt;
|- bgcolor=&amp;quot;#ccccff&amp;quot;&lt;br /&gt;
! |mcu ||Builtin define&lt;br /&gt;
 |- &lt;br /&gt;
 |avr1 ||&amp;lt;tt&amp;gt;__AVR_ARCH__=1&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |at90s1200 ||&amp;lt;tt&amp;gt;__AVR_AT90S1200__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |attiny11 ||&amp;lt;tt&amp;gt;__AVR_ATtiny11__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |attiny12 ||&amp;lt;tt&amp;gt;__AVR_ATtiny12__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |attiny15 ||&amp;lt;tt&amp;gt;__AVR_ATtiny15__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |attiny28 ||&amp;lt;tt&amp;gt;__AVR_ATtiny28__&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
; -minit-stack=xxx: Festlegen der Stack-Adresse&lt;br /&gt;
; -mint8: Datentyp &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; ist nur 8 Bit breit, anstatt 16 Bit. Datentypen mit 32 Bit wie  &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt; sind nicht verfügbar&lt;br /&gt;
; -mno-interrupts: Ändert den Stackpointer ohne Interrupts zu deaktivieren&lt;br /&gt;
; -mcall-prologues: Funktions-Prolog und -Epilog werden als Unterroutinen umgesetzt, um die Codegröße zu verkleinern&lt;br /&gt;
; -mtiny-stack: Nur die unteren 8 Bit des Stackpointers werden verändert&lt;br /&gt;
; -mno-tablejump: Für ein &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt;-Statement werden keine Sprungtabellen angelegt&lt;br /&gt;
; -mshort-calls: Verwendet &amp;lt;tt&amp;gt;rjmp&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;rcall&amp;lt;/tt&amp;gt; (begrenzte Sprungweite) auf Devices mit mehr als 8 kByte Flash&lt;br /&gt;
; -msize: Ausgabe der Instruktonslängen im asm-File&lt;br /&gt;
; -mdeb: (undokumentiert) Ausgabe von Debug-Informationen für GCC-Entwickler&lt;br /&gt;
; -morder1: (undokumentiert) andere Register-Allokierung&lt;br /&gt;
; -morder2: (undokumentiert) andere Register-Allokierung&lt;br /&gt;
&lt;br /&gt;
=Builtins=&lt;br /&gt;
&lt;br /&gt;
Zur bedingten Codeerzeugung und zur Erkennung, welcher Compiler sich an der Quelle zu schaffen macht, sind folgende Builtins hilfreich.&lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[#Maschinenspezifische Optionen für avr-gcc|Maschinenspezifische Optionen]]&lt;br /&gt;
&lt;br /&gt;
==Builtin Defines==&lt;br /&gt;
&lt;br /&gt;
===GCC===&lt;br /&gt;
;&amp;lt;tt&amp;gt;__GNUC__&amp;lt;/tt&amp;gt;: X wenn GCC-Version X.Y.Z&lt;br /&gt;
;&amp;lt;tt&amp;gt;__GNUC_MINOR__&amp;lt;/tt&amp;gt;: Y wenn GCC-Version X.Y.Z&lt;br /&gt;
;&amp;lt;tt&amp;gt;__GNUC_PATCHLEVEL__&amp;lt;/tt&amp;gt;: Z wenn GCC-Version X.Y.Z&lt;br /&gt;
;&amp;lt;tt&amp;gt;__VERSION__&amp;lt;/tt&amp;gt;: &amp;quot;X.Y.Z&amp;quot; wenn GCC-Version X.Y.Z&lt;br /&gt;
;&amp;lt;tt&amp;gt;__GXX_ABI_VERSION&amp;lt;/tt&amp;gt;: Version der ABI (Application Binary Interface)&lt;br /&gt;
;&amp;lt;tt&amp;gt;__STDC__&amp;lt;/tt&amp;gt;: Ist 1, wenn Standard-C übersetzt wird&lt;br /&gt;
;&amp;lt;tt&amp;gt;__OPTIMIZE__&amp;lt;/tt&amp;gt;: Optimierung ist aktiviert&lt;br /&gt;
;&amp;lt;tt&amp;gt;__NO_INLINE__&amp;lt;/tt&amp;gt;: Ohne Schalter &amp;lt;tt&amp;gt;-finline&amp;lt;/tt&amp;gt; resp. &amp;lt;tt&amp;gt;-finline-all-functions&amp;lt;/tt&amp;gt; etc.&lt;br /&gt;
;&amp;lt;tt&amp;gt;__ASSEMBLER__&amp;lt;/tt&amp;gt;: Definiert, falls GCC die Eingabe als Assembler-Code betrachtet und nicht compiliert. Weiterleitung an den Assembler.&lt;br /&gt;
;&amp;lt;tt&amp;gt;__cplusplus&amp;lt;/tt&amp;gt;: Es wird C++ übersetzt (Quell-Endung &amp;lt;tt&amp;gt;*.cpp&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;*.c++&amp;lt;/tt&amp;gt; oder Option &amp;lt;tt&amp;gt;-x c++&amp;lt;/tt&amp;gt;).&lt;br /&gt;
;&amp;lt;tt&amp;gt;__FILE__&amp;lt;/tt&amp;gt;: Löst auf zum Dateinamen der Quelldatei, in der das &amp;lt;tt&amp;gt;__FILE__&amp;lt;/tt&amp;gt; steht.&lt;br /&gt;
;&amp;lt;tt&amp;gt;__LINE__&amp;lt;/tt&amp;gt;: Löst auf zur Zeilennummer der Quelldatei, in der das &amp;lt;tt&amp;gt;__LINE__&amp;lt;/tt&amp;gt; steht.&lt;br /&gt;
;&amp;lt;tt&amp;gt;__DATE__&amp;lt;/tt&amp;gt;: Löst auf zum Datum (precompile-date)&lt;br /&gt;
;&amp;lt;tt&amp;gt;__TIME__&amp;lt;/tt&amp;gt;: Löst auf zur Zeit (precompile-time)&lt;br /&gt;
&lt;br /&gt;
===avr-gcc===&lt;br /&gt;
;&amp;lt;tt&amp;gt;__AVR&amp;lt;/tt&amp;gt;: Definiert für Target avr, d.h. avr-gcc ist am Werk&lt;br /&gt;
;&amp;lt;tt&amp;gt;__AVR__&amp;lt;/tt&amp;gt;: dito&lt;br /&gt;
;&amp;lt;tt&amp;gt;__AVR_ARCH__&amp;lt;/tt&amp;gt;: codiert den AVR-Kern, für den Code erzeugt wird (Classic, Mega, ...). &lt;br /&gt;
;&amp;lt;tt&amp;gt;__AVR_XXXX__&amp;lt;/tt&amp;gt;: Gesetzt, wenn &amp;lt;tt&amp;gt;-mmcu=xxxx&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
==Builtin Variablen==&lt;br /&gt;
;&amp;lt;tt&amp;gt;__func__&amp;lt;/tt&amp;gt;: Eine magische Variable, die den aktuellen Funktionsnamen enthält. Gerade so, als hätte man ihn selbst mit &lt;br /&gt;
:&amp;lt;pre&amp;gt;static const char __func__[] = &amp;quot;main&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
:definiert.&lt;br /&gt;
&lt;br /&gt;
=Sections=&lt;br /&gt;
&lt;br /&gt;
Sections sind mit Fächern vergleichbar, in die Daten, Code, Debug-Informationen usw. einsortiert werden. Zur Section &amp;lt;tt&amp;gt;.text&amp;lt;/tt&amp;gt; gehört z.B. der ausführbare Code, welcher letztendlich im Flash landet. Wo genau das ist, braucht man nicht zu wissen und es spielt auch keine Rolle, wo eine bestimmte Funktion landet.&lt;br /&gt;
&lt;br /&gt;
Für 'normalen' Code und 'normale' Daten braucht man sich nicht um die Sections zu kümmern, sie werden von avr-gcc automatisch richtig zugeordnet. Für spezielle Anwendungen kann es aber notwendig sein, die Ablage in eine andere Section zu machen; etwa wenn man Daten im EEPROM lesen/schreiben will. Wie das genau gemacht wird, steht im Abschnitt &amp;quot;[[avr-gcc#Attribute|Attribute]]&amp;quot; und es gibt ein Beispiele in den Abschnitten &lt;br /&gt;
&amp;quot;[[avr-gcc#SRAM, Flash, EEPROM: Datenablage am Beispiel Strings|Datenablage am Beispiel Strings]]&amp;quot; und &amp;quot;[[Zufallszahlen mit avr-gcc|Zufall]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|+ '''Tabelle: Bedeutung der Sections bei avr-gcc'''&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! |Section ||Ablage ||Betrifft ||Beschreibung&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tt&amp;gt;.text&amp;lt;/tt&amp;gt; ||Flash ||Code  ||normaler Programm-Code&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tt&amp;gt;.data&amp;lt;/tt&amp;gt; ||SRAM  ||Daten ||wird vom Startup-Code initialisiert, u.a. aus &amp;lt;tt&amp;gt;.progmem&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;tt&amp;gt;.bss&amp;lt;/tt&amp;gt;  ||SRAM  ||Daten ||wird vom Startup-Code zu 0 initialisiert&lt;br /&gt;
 |- &lt;br /&gt;
 |colspan=&amp;quot;4&amp;quot; bgcolor=&amp;quot;#bbbbff&amp;quot;|&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tt&amp;gt;.progmem&amp;lt;/tt&amp;gt; ||Flash  ||Daten ||wird vom Startup-Code nach &amp;lt;tt&amp;gt;.data&amp;lt;/tt&amp;gt; kopiert&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tt&amp;gt;.eeprom&amp;lt;/tt&amp;gt;  ||EEPROM ||Daten ||Daten im EEPROM&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tt&amp;gt;.noinit&amp;lt;/tt&amp;gt;  ||SRAM   ||Daten ||wird nicht initialisiert&lt;br /&gt;
 |- &lt;br /&gt;
 |colspan=&amp;quot;4&amp;quot; bgcolor=&amp;quot;#bbbbff&amp;quot;|&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tt&amp;gt;.init''n''&amp;lt;/tt&amp;gt; ||Flash ||Code ||wird vor &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt; ausgeführt, ''n'' = 0...9&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tt&amp;gt;.fini''n''&amp;lt;/tt&amp;gt; ||Flash ||Code ||wird nach &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt; ausgeführt, ''n'' = 9...0&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tt&amp;gt;.vectors&amp;lt;/tt&amp;gt;   ||Flash ||Code ||Vektor-Tabelle: Tabelle mit Sprüngen zur jeweiligen ISR&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tt&amp;gt;.bootloader&amp;lt;/tt&amp;gt; ||Flash||Code ||für den Bootloader&lt;br /&gt;
 |}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Der Anfang einer Section kann auch dem Linker mitgegeben werden, etwa wenn wie üblich avr-gcc als Treiber für den Linker verwendet wird:&lt;br /&gt;
 avr-gcc ...  -Wl,--section-start=.eeprom=0x810001&lt;br /&gt;
Damit beginnt Section &amp;lt;tt&amp;gt;.eeprom&amp;lt;/tt&amp;gt; nicht an der (virtuellen) Adresse &amp;lt;tt&amp;gt;0x810000&amp;lt;/tt&amp;gt;, &lt;br /&gt;
sondern ein Byte später. &lt;br /&gt;
Manche AVRs haben einen [[AVR-Errata|Silicon-Bug]], der bei Verwendung der EEPROM-Adresse 0 zu Fehlern führt. &lt;br /&gt;
Mit der obigen Linker-Option wird diese Adresse nicht mehr verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
=Adressen=&lt;br /&gt;
&lt;br /&gt;
Der Speicher der AVR-Mikrocontroller ist in einer Harvard-Struktur organisiert: Der Adressraum ist nicht linear, sondern es gibt unterschiedliche Adressbereiche für SRAM, Flash, EEPROM, externes RAM, etc. Adresse&amp;amp;nbsp;0 hat also eine unterschiedliche Bedeutung, ja nachdem, ob damit die SRAM-Zelle&amp;amp;nbsp;0 gemeint ist (an diese Adresse des SRAM wird Register &amp;lt;tt&amp;gt;r0&amp;lt;/tt&amp;gt; abgebildet) oder zB Flash-Adresse&amp;amp;nbsp;0 (Reset-Einsprungpunkt). &lt;br /&gt;
&lt;br /&gt;
GCC geht jedoch davon aus, daß der Adressraum linear organisiert ist (von-Neumann-Struktur). In GCC gibt es keine Möglichkeit, diese unterschiedlichen Adressbereiche zu kennzeichnen. Zwar gibt es [[#Attribute|Attribute]], um die Lokatierung &amp;amp;ndash; also die Daten/Codeablage &amp;amp;ndash; zu beeinflussen, aber beim Datenzugriff über eine Adresse wird immer in den SRAM gegriffen. Attribute sind leider nicht wirklich geeignet, die verschiedenen Pointer-Arten zu unterscheiden. Dazu wären Qualifier das Mittel der Wahl. Das Einführen neuer Qualifier würde eine Spracherweiterung von C bedeuten und tiefgreifende Änderung in GCC erfordern, die weit über die Backend-Beschreibung für AVR hinausgingen und in absehbarer Zeit nicht zu erwarten sind.&lt;br /&gt;
&lt;br /&gt;
Daher verwendet avr-gcc intern virtuelle Adressen, die erst später in die tatsächlichen Speicheradressen umgewandelt werden. Die Startadressen für die Speicherbereiche sind:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Flash:  ab 0x0&lt;br /&gt;
SRAM:   ab 0x80060&lt;br /&gt;
EEPROM: ab 0x81000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Attribute=&lt;br /&gt;
&lt;br /&gt;
Mit Attributen kann man die Codeerzeugung beeinflussen. Es gibt verschiedene Attribute, die auf Daten, Typen, und/oder Funktionen anwendbar sind.&lt;br /&gt;
&lt;br /&gt;
'''Syntax:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
__attribute__ ((&amp;amp;lt;name&amp;amp;gt;))&lt;br /&gt;
__attribute__ ((&amp;amp;lt;name1&amp;amp;gt;, &amp;amp;lt;name2&amp;amp;gt;, ...))&lt;br /&gt;
__attribute__ ((&amp;amp;lt;name&amp;amp;gt; (&amp;amp;quot;&amp;amp;lt;wert&amp;amp;gt;&amp;amp;quot;)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nützliche Attribute von GCC==&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|+ '''Tabelle: Attribute von GCC''' (Auszug)&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! |Attribut ||Funktionen ||Daten ||Typen ||Beschreibung&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt;tt&amp;gt;section&amp;amp;nbsp;(&amp;quot;&amp;amp;lt;name&amp;amp;gt;&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
!| (x) || (x) || (x)&lt;br /&gt;
 | Lokatiert nach Section &amp;lt;tt&amp;gt;&amp;amp;lt;name&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt;tt&amp;gt;noreturn&amp;lt;/tt&amp;gt;&lt;br /&gt;
!| x ||  ||&lt;br /&gt;
 | Die Funktion wird nie zurückkehren&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tt&amp;gt;inline&amp;lt;/tt&amp;gt;&lt;br /&gt;
!| x  || ||&lt;br /&gt;
 |Funktion wird geinlinet falls möglich&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tt&amp;gt;noinline&amp;lt;/tt&amp;gt;&lt;br /&gt;
!|x  ||  ||&lt;br /&gt;
 |Funktion wird keinesfalls geinlinet&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tt&amp;gt;packed&amp;lt;/tt&amp;gt;&lt;br /&gt;
!| || x || x&lt;br /&gt;
 |Datenablage in Strukturen erfolgt dicht, also ohne eventuelle Füllbytes&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tt&amp;gt;unused&amp;lt;/tt&amp;gt;&lt;br /&gt;
!| || x || &lt;br /&gt;
 |Variable wird nicht verwendet, z.B. bei Funktionsparametern, die nicht gebraucht werden. Vermeidet entsprechende Warnungen.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
==Attribute von avr-gcc==&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|+ '''Tabelle: Attribute von avr-gcc'''&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! |Attribut ||Funktionen ||Daten ||Typen ||Beschreibung &lt;br /&gt;
|-&lt;br /&gt;
 | &amp;lt;tt&amp;gt;progmem&amp;lt;/tt&amp;gt;&lt;br /&gt;
!| x || x || x&lt;br /&gt;
 | Lokatiert ins Flash&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt;tt&amp;gt;naked&amp;lt;/tt&amp;gt;&lt;br /&gt;
!| x || || &lt;br /&gt;
 |Funktion wird ohne Prolog/Epilog erzeugt&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tt&amp;gt;interrupt&amp;lt;/tt&amp;gt;&lt;br /&gt;
!| x || ||&lt;br /&gt;
 |Hier nur wegen der Vollständigkeit erwähnt&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tt&amp;gt;signal&amp;lt;/tt&amp;gt;&lt;br /&gt;
!| x ||  ||&lt;br /&gt;
 |Hier nur wegen der Vollständigkeit erwähnt&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
'''Beispiele:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define EEPROM __attribute__ ((section (&amp;quot;.eeprom&amp;quot;)))&lt;br /&gt;
&lt;br /&gt;
const char EE_HALLO_WELT[] EEPROM = &amp;quot;Hallo Welt&amp;quot;;&lt;br /&gt;
const int EE_wert EEPROM = 0x1234;&lt;br /&gt;
&lt;br /&gt;
void __attribute__ ((noinline))&lt;br /&gt;
foo()&lt;br /&gt;
{&lt;br /&gt;
   /* Code */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Dynamische Speicherallokierung=&lt;br /&gt;
&lt;br /&gt;
[[Bild:Avr-ram.png|right|thumb|RAM-Layout für ein AVR mit 1kByte SRAM]]&lt;br /&gt;
Zur dynamischen Speicherallokierung stehen Standard-Funktionen wie &amp;lt;tt&amp;gt;malloc&amp;lt;/tt&amp;gt; zur Verfügung.&lt;br /&gt;
Damit kann man zur Laufzeit Speicher anfordern und wenn man ihn nicht mehr benötigt, wieder freigeben.&lt;br /&gt;
Funktionen wie &amp;lt;tt&amp;gt;malloc&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;calloc&amp;lt;/tt&amp;gt; sind jedoch recht aufwändig. &lt;br /&gt;
Die allokierten Speicherstücke werden intern in einer verketteten Liste verwaltet,&lt;br /&gt;
und das verbraucht wertvollen Platz im Flash und im SRAM sowie Laufzeit.&lt;br /&gt;
&lt;br /&gt;
Resourcen-schonendere Möglichkeiten, zur Laufzeit an Speicher zu kommen, &lt;br /&gt;
bieteten &amp;lt;tt&amp;gt;__builtin_alloca&amp;lt;/tt&amp;gt; und dynamische Arrays. &lt;br /&gt;
Der Speicher, der damit belegt wird, wird nicht auf dem Heap angelegt, &lt;br /&gt;
sondern im Frame der Funktion. Das ist wesentlich effektiver als die Standard-Methoden,&lt;br /&gt;
denn es muss nur ein Wert zum Framepointer addiert werden.&lt;br /&gt;
Den so erhaltenen Speicher braucht man auch nicht freizugeben. Das geschieht automatisch beim Verlassen der Funktion in deren Epilog, indem der Wert wieder vom Framepointer subtrahiert wird. &lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Von der Verwendung ist der mittels &amp;lt;tt&amp;gt;__builtin_alloca&amp;lt;/tt&amp;gt; und dynamischer Arrays erhaltene '''Speicher also wie eine lokale Variable, mitsamt den bekannten Regeln für den Gültigkeitsbereich'''.&lt;br /&gt;
&lt;br /&gt;
Insbesondere darf dieser Speicher nicht mit &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; an die darüberliegende Funktion zurückgegeben werden, weil er dann nicht mehr gültig ist und ein Zugriff darauf zu einem&lt;br /&gt;
Laufzeitfehler führt!&lt;br /&gt;
&lt;br /&gt;
Der Speicherbereich ist dort gültig, wo auch die Adresse einer 'normalen' lokalen Variablen gültig wäre, wenn diese an der gleichen Stelle definiert würde.&lt;br /&gt;
&lt;br /&gt;
Das Programm/der Algorithmus muss daher beim Beschreiten dieses Wegs darauf angepasst sein.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Verwendung:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void function (size_t num_data)&lt;br /&gt;
{&lt;br /&gt;
   // data_t hat man irgendwo selber definiert, oder es ist ein elementarer Typ&lt;br /&gt;
   data_t * const p = (data_t * const) __builtin_alloca (num_data * sizeof (data_t));&lt;br /&gt;
&lt;br /&gt;
   // Mach was mit p[0] ... p[num_bytes-1]&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
oder mittels eines dynamischen Arrays:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void function (size_t num_data)&lt;br /&gt;
{&lt;br /&gt;
   // data_t hat man irgendwo selber definiert, oder es ist ein elementarer Typ&lt;br /&gt;
   data_t p[num_data];&lt;br /&gt;
&lt;br /&gt;
   // Mach was mit p[0] ... p[num_bytes-1]&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=C++=&lt;br /&gt;
&lt;br /&gt;
Aus Effizienzgründen sollte der Einsatz von C++ sehr kritisch betrachtet werden:&lt;br /&gt;
:''&amp;quot;When programming C++ in space- and runtime-sensitive environments like microcontrollers, extra care should be taken to avoid unwanted side effects of the C++ calling conventions like implied copy constructors that could be called upon function invocation etc. These things could easily add up into a considerable amount of time and program memory wasted. Thus, casual inspection of the generated assembler code (using the &amp;lt;tt&amp;gt;-S&amp;lt;/tt&amp;gt; compiler option) seems to be warranted.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Zudem unterliegt der Einsatz von C++ je nach Compiler/Lib-Version bestimmten Einschränkungen:&lt;br /&gt;
*Einer kompletten C++ Implementierung fehlt die Unterstützung durch die &amp;lt;tt&amp;gt;libstdc++&amp;lt;/tt&amp;gt;, dadurch fehlen Standardfunktionen, -Klassen und -Templates&lt;br /&gt;
* Die Operatoren &amp;lt;tt&amp;gt;new&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;delete&amp;lt;/tt&amp;gt; sind nicht implementiert, ihre Verwendung führt zu unauflösbaren externen Referenzen (Linker-Fehler)&lt;br /&gt;
*Nicht alle Header sind C++-sicher und müssen in &amp;lt;tt&amp;gt;extern &amp;quot;C&amp;quot; {...}&amp;lt;/tt&amp;gt; eingeschlossen werden.&lt;br /&gt;
*Exceptions werden nicht unterstützt und müssen via &amp;lt;tt&amp;gt;-fno-exceptions&amp;lt;/tt&amp;gt; abgeschaltet werden, oder der Linker beschwert sich über eine unauflösbare externe Referenz zu &amp;lt;tt&amp;gt;__gxx_personality_sj0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Als Treiber verwendet man wie immer avr-gcc. Standard-Endungen für C++ sind &amp;lt;tt&amp;gt;.c++&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;.cpp&amp;lt;/tt&amp;gt;. Bei anderen Endungen teilt man mit &amp;lt;tt&amp;gt;-x c++&amp;lt;/tt&amp;gt; mit, daß es sich um C++ Dateien handelt, oder ruft &amp;lt;tt&amp;gt;avr-c++&amp;lt;/tt&amp;gt; direkt auf.&lt;br /&gt;
&lt;br /&gt;
Interrupt-Service-Routinen (ISRs) sind C-Funktionen und werden definiert wie gehabt. Siehe auch [[#Interrupts|Interrupts]].&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;avr/signal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#if defined (__cplusplus)&lt;br /&gt;
extern &amp;quot;C&amp;quot; {&lt;br /&gt;
#endif /* __cplusplus */   &lt;br /&gt;
&lt;br /&gt;
SIGNAL (SIG_NAME)&lt;br /&gt;
{&lt;br /&gt;
   /* machwas */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
INTERRUPT (SIG_NAME)&lt;br /&gt;
{&lt;br /&gt;
   /* mach was */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#if defined (__cplusplus)&lt;br /&gt;
}&lt;br /&gt;
#endif /* __cplusplus */   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;__cplusplus&amp;lt;/tt&amp;gt; ist ein Standard [[#Builtin Defines|GCC-Builtin-Define]].&lt;br /&gt;
&lt;br /&gt;
Globale Konstruktoren werden in [[#Sections|Section]] &amp;lt;tt&amp;gt;.init6&amp;lt;/tt&amp;gt; ausgeführt, die Destruktoren in &amp;lt;tt&amp;gt;.fini6&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Code-Beispiele=&lt;br /&gt;
Dieser Abschnitt enthält Code-Schnippsel für avr-gcc. Es werden Besonderheiten besprochen, die für avr-gcc zu beachten sind. &lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt ist ''kein'' Tutorial zur C-Programmierung und ''keine'' Einführung in die Programmiersprache C im allgemeinen. Dafür sei auf einschlägige Tutorials/Bücher verwiesen.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf Special Function Registers (SFRs)==&lt;br /&gt;
&lt;br /&gt;
===Zugiff auf Bytes und Worte===&lt;br /&gt;
Auf SFRs wird generell über deren Adresse zugegriffen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   // Liest den Inhalt von SREG an Adresse 0x5f&lt;br /&gt;
   unsigned char sreg = *((unsigned char volatile*) 0x5f);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das bedeutet in etwa: &amp;quot;Lies ein flüchtiges (&amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt;) Byte (&amp;lt;tt&amp;gt;unsigned char&amp;lt;/tt&amp;gt;) von Adresse &amp;lt;tt&amp;gt;0x5f&amp;lt;/tt&amp;gt;&amp;quot;. Der Speicherinhalt von SFRs ist flüchtig, denn er kann sich ändern, ohne daß avr-gcc dies mitbekommt. Daher muss bei jedem C-Zugriff auf ein SFR dieses wirklich gelesen/geschrieben werden, was der Qualifier &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; sicherstellt. Ansonst geht der Compiler u.U. davon aus, daß der Inhalt bekannt ist und verwendet einen alten, in einem GPR befindlichen Wert.&lt;br /&gt;
&lt;br /&gt;
Um lesbaren, weniger fehleranfälligen und unter AVRs halbwegs portierbaren Code zu erhalten, gibt es Makrodefinitionen im Controller-spezifischen Header &amp;lt;tt&amp;gt;ioxxxx.h&amp;lt;/tt&amp;gt;, der neben anderen Dingen mit &amp;lt;tt&amp;gt;avr/io.h&amp;lt;/tt&amp;gt; includet wird:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
   // SREG lesen&lt;br /&gt;
   uint8_t sreg = SREG;&lt;br /&gt;
   ...&lt;br /&gt;
   // SREG schreiben&lt;br /&gt;
   SREG = sreg;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Bezeichner der SFRs sind die gleichen wie im Manual. Eventuell verschafft ein Blick in den Header Klarheit. Dieser befindet sich in&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; &amp;amp;lt;AVR_INSTALL_DIR&amp;amp;gt;/avr/include/avr/io****.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Zugriff geht auch für 16-Bit Register wie &amp;lt;tt&amp;gt;TCNT1&amp;lt;/tt&amp;gt;, für die eine bestimmte Reihenfolge für den Zugriff auf Low- und High-Teil eingehalten werden muss: avr-gcc generiert die Zugriffe in der richtigen Reihenfolge.&lt;br /&gt;
  uint16_t tcnt1 = TCNT1;&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Zu beachten ist, daß dieser Zugriff nicht atomar erfolgt. Das Lesen/Schreiben mehrbytiger Werte muss vom Compiler in mehrere Byte-Zugriffe zerlegt werden. Zwischen diesen Zugriffen kann ein [[Interrupt]] auftreten, wenn Interrupts aktiviert sind. Ja nach Programm und welche Aufgaben eine [[ISR]] erledigt, dann dies zu Fehlfunktion führen. In dem Fall müssen diese Code-Stücke atomar gemacht werden, damit sie nicht durch eine [[IRQ]] unterbrochen werden können!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Zugriff auf einzelne Bits===&lt;br /&gt;
Zugriff auf Bits geht wie gewohnt mit den Bitoperationen &lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;amp;amp;&amp;lt;/tt&amp;gt; (and),&lt;br /&gt;
&amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt; (or),&lt;br /&gt;
&amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; (xor) und&lt;br /&gt;
&amp;lt;tt&amp;gt;~&amp;lt;/tt&amp;gt; (not)&lt;br /&gt;
&lt;br /&gt;
Wieder gibt es Defines in den AVR-Headern, mit denen man Masken für den Zugriff erhalten kann, etwa:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* GIMSK / GICR */&lt;br /&gt;
#define INT1    7&lt;br /&gt;
#define INT0    6&lt;br /&gt;
#define IVSEL   1&lt;br /&gt;
#define IVCE    0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Masken ergeben sich durch Schieben von &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; an die richtige Position:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Ports B_0 und B_1 als Ausgang&lt;br /&gt;
DDRB |= (1&amp;amp;lt;&amp;amp;lt;PB0) | (1&amp;amp;lt;&amp;amp;lt;PB1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
erzeugt&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
87 b3           in      r24, 0x17&lt;br /&gt;
83 60           ori     r24, 0x03&lt;br /&gt;
87 bb           out     0x17, r24&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Etwas anders sieht der Code aus, wenn die Bits einzeln gesetzt werden und das Register im bitadressierbaren Bereich liegt (SRAM &amp;lt;tt&amp;gt;0x20&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;0x3f&amp;lt;/tt&amp;gt; resp. I/O &amp;lt;tt&amp;gt;0x0&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;0x1f&amp;lt;/tt&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Ports B_0 und B_1 als Ausgang&lt;br /&gt;
DDRB |= (1&amp;amp;lt;&amp;amp;lt;PB0);&lt;br /&gt;
DDRB |= (1&amp;amp;lt;&amp;amp;lt;PB1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
erzeugt&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
b8 9a           sbi     0x17, 0&lt;br /&gt;
b9 9a           sbi     0x17, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{FarbigerRahmen| &lt;br /&gt;
Auch hier ist zu beachten, daß es Probleme geben kann, wenn nicht atomarer Code erzeugt wird, weil der AVR-Befehlssatz nicht mehr hergibt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// toggle PORT B_0: wechseln 0 &amp;amp;lt;--&amp;amp;gt; 1 &lt;br /&gt;
PORTB ^= (1&amp;amp;lt;&amp;amp;lt;PB0);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ergibt&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
88 b3           in      r24, 0x18&lt;br /&gt;
; Wenn hier ein Interrupt auftritt, in dessen ISR PORTB verändert wird,&lt;br /&gt;
; dann wird die Änderung durch die letzte Instruktion wieder überschrieben!&lt;br /&gt;
91 e0           ldi     r25, 0x01&lt;br /&gt;
; dito&lt;br /&gt;
89 27           eor     r24, r25&lt;br /&gt;
; dito&lt;br /&gt;
88 bb           out     0x18, r24&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}} &amp;lt;!-- /FarbigerRahmen --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auch das Lesen einzelner Port-Pins geht über das Maskieren von SFRs:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DDRB &amp;amp;= ~(1 &amp;lt;&amp;lt; PB2);    // PortB.2 als INPUT &lt;br /&gt;
&lt;br /&gt;
if (PINB &amp;amp; (1 &amp;lt;&amp;lt; PB2))&lt;br /&gt;
   // PortB.2 ist HIGH&lt;br /&gt;
else&lt;br /&gt;
   // PortB.2 ist LOW&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if (!(PINB &amp;amp; (1 &amp;lt;&amp;lt; PB2)))&lt;br /&gt;
   // PortB.2 ist LOW&lt;br /&gt;
else&lt;br /&gt;
   // PortB.2 ist HIGH&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interrupts==&lt;br /&gt;
&lt;br /&gt;
Um zu kennzeichnen, daß es sich bei einer Funktion um eine Interrupt Sevice Routine (ISR) handelt, gibt es spezielle Attribute. Diese brauchen nicht explizit hingeschrieben zu werden, ebensowenig wie die genaue Nummer des Interrupt Requests (IRQ). Dafür gibt es die Includes und die Makros:&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;avr/signal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNAL (SIG_OUTPUT_COMPARE1A)&lt;br /&gt;
{&lt;br /&gt;
   /* ISR-Code */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
INTERRUPT (SIG_OUTPUT_COMPARE1B)&lt;br /&gt;
{&lt;br /&gt;
   /* ISR-Code */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch wird die Funktion mit dem richtigen Prolog/Epilog erzeugt, und es wird ein Eintrag in die Interrupt-Vektortabelle gemacht &amp;amp;#150; bei obigem Beispiel also zwei Einträge.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Die Schreibweise des Signal-Names muss genau die sein wie im Header, das schliesst auch Leerzeichen ein! Nicht alle GCC-Versionen bringen Fehler/Warnung, wenn die Schreibweise nicht stimmt.&lt;br /&gt;
 SIGNAL (SIG_OUTPUT_COMPARE1A )  // !!! Macht NICHT das, was man will (Blank am Ende)!!!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;SIGNAL&amp;lt;/tt&amp;gt;: Mit Ausführung einer ISR deaktiviert die AVR-Hardware die Interrupts, sodaß die ISR nicht durch andere Interrupt-Anforderungen unterbrochen wird. Beim Verlassen der ISR werden Interrupts wieder aktiviert. Tritt während der ISR ein IRQ auf, wird diese erst nach Beenden des ISR-Codes ausgeführt. Der Interrupt geht also nicht verloren. Zwischen zwei ISRs wird zusätzlich mindestens ein Befehl des normalen Programm-Codes abgearbeitet.&lt;br /&gt;
;&amp;lt;tt&amp;gt;INTERRUPT&amp;lt;/tt&amp;gt;: Früh im ISR-Prolog werden mit &amp;lt;tt&amp;gt;sei&amp;lt;/tt&amp;gt; die von der AVR-Hardware temporär deaktivierten Interrupts reaktiviert. Dadurch kann die ISR von einer IRQ unterbrochen werden. Das bietet die Möglichkeit, so etwas wie Interrupt-Priorisierung nachzubilden, was AVRs selbst nicht können. Weiterhin kann man schneller auf bestimmte Ereignisse reagieren. Tritt während der ISR ein anderer IRQ auf, der schnell bedient werden muss, kann sofort der dringende ISR-Code ausgeführt werden. Ansonsten (Verwendung von &amp;lt;tt&amp;gt;SIGNAL&amp;lt;/tt&amp;gt;) würde der Code erst ausgeführt werden, nachdem die aktuelle ISR beendet ist.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|Dauert die ISR zu lange und wird sie nochmals von ihrem eigenen IRQ unterbrochen, stürzt man ab.}} &lt;br /&gt;
&lt;br /&gt;
Nachschlagen kann man den Namen in&lt;br /&gt;
:&amp;lt;tt&amp;gt;&amp;amp;lt;GCC_HOME&amp;amp;gt;/avr/include/avr/ioxxxx.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Interrupts aktivieren===&lt;br /&gt;
&lt;br /&gt;
Damit eine ISR überhaupt zur Ausführung kommt, müssen drei Bedingungen erfüllt sein&lt;br /&gt;
* Interrupts müssen global aktiviert sein&lt;br /&gt;
* Der entsprechen IRQ muss aktiviert worden sein&lt;br /&gt;
* Das zum IRQ gehörende Ereignis muss eintreten&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;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   ...&lt;br /&gt;
   // enable OutputCompareA Interrupt für Timer1&lt;br /&gt;
   TIMSK |= (1 &amp;lt;&amp;lt; OCIE1A);&lt;br /&gt;
&lt;br /&gt;
   // disable OutputCompareA Interrupt für Timer1&lt;br /&gt;
   TIMSK &amp;amp;= ~(1 &amp;lt;&amp;lt; OCIE1A);&lt;br /&gt;
&lt;br /&gt;
   // Interrupts aktivieren&lt;br /&gt;
   sei();&lt;br /&gt;
&lt;br /&gt;
   // Interrupts abschalten&lt;br /&gt;
   cli();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Sperrt man eine Code-Sequenz durch Einschachteln in ein &amp;lt;tt&amp;gt;cli&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;sei&amp;lt;/tt&amp;gt; Paar (man macht das Codestück &amp;quot;atomar&amp;quot;, also ununterbrechbar), gehen währenddessen keine Interrupt-Anforderungen verloren. Die entsprechenden IRQ-Flags bleiben gesetzt, und nach dem &amp;lt;tt&amp;gt;sei&amp;lt;/tt&amp;gt; werden die IRQs in der Reihenfolge ihrer Prioritäten abgearbeitet. Ausnahme ist, wenn in einem atomaren Block der selbe IRQ mehrfach auftritt. Der ISR-Code wird dann trotzdem nur einmal ausgeführt.&lt;br /&gt;
&lt;br /&gt;
===default Interrupt===&lt;br /&gt;
&lt;br /&gt;
Für nicht implementierte Interrupts macht avr-gcc in die Vektortabelle einen Eintrag,&lt;br /&gt;
der zu &amp;lt;tt&amp;gt;__bad_interrupt&amp;lt;/tt&amp;gt; (definiert im Startup-Code &amp;lt;tt&amp;gt;crt*.o&amp;lt;/tt&amp;gt;) springt&lt;br /&gt;
und von dort aus weiter zu Adresse&amp;amp;nbsp;0. &lt;br /&gt;
Dadurch läuft der AVR wieder von neuem los, wenn ein Interrupt auftritt, &lt;br /&gt;
zu dem man keine ISR definiert hat &lt;br /&gt;
&amp;amp;#150; allerdings ohne die Hardware zurückzusetzen wie bei einem echten Reset.&lt;br /&gt;
&lt;br /&gt;
Möchte man diesen Fall abfangen, dann geht das über eine globale Funktion &lt;br /&gt;
namens &amp;lt;tt&amp;gt;__vector_default&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/signal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNAL (__vector_default)&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit wird von &amp;lt;tt&amp;gt;__bad_interrupt&amp;lt;/tt&amp;gt; aus nicht nach Adresse&amp;amp;nbsp;0 gesprungen,&lt;br /&gt;
sondern weiter zu &amp;lt;tt&amp;gt;__vector_default&amp;lt;/tt&amp;gt;, welches durch &amp;lt;tt&amp;gt;SIGNAL&amp;lt;/tt&amp;gt; oder&lt;br /&gt;
&amp;lt;tt&amp;gt;INTERRUPT&amp;lt;/tt&amp;gt; den üblichen ISR-Prolog/Epilog bekommt.&lt;br /&gt;
&lt;br /&gt;
So kann man z.B. eine Meldung ausgeben, eine Warnlampe blinken, in einer Endlosschleife landen, oder über den [[Watchdog]] einen richtigen Hardware-Reset auslösen, siehe auch Abschnitt &amp;quot;[[#Reset auslösen|Reset auslösen]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===ISR mit eigenem Prolog/Epilog===&lt;br /&gt;
&lt;br /&gt;
Wenn man in einer ISR komplett eigenes Zeug machen will, &lt;br /&gt;
dann definiert man eine nackte Funktion.&lt;br /&gt;
Mit &amp;lt;tt&amp;gt;naked&amp;lt;/tt&amp;gt; befreit man die Routine vom Standard-Prolog/Epilog.&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Dabei ist darauf zu achten, daß die ISR mit &amp;lt;tt&amp;gt;reti&amp;lt;/tt&amp;gt; (return from interrupt) &lt;br /&gt;
zurückkehrt und evtl. verwendete Register und den Status (&amp;lt;tt&amp;gt;SREG&amp;lt;/tt&amp;gt;) sichert.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void __attribute__ ((naked)) &lt;br /&gt;
SIG_OVERFLOW0 (void)&lt;br /&gt;
{&lt;br /&gt;
   /* Port B.6 = 0                                                         */&lt;br /&gt;
   /* Diese Instruktion verändert nicht das SREG und kein anderes Register */&lt;br /&gt;
   /* so daß der eigentliche Code nur 1 Befehl lang ist                    */&lt;br /&gt;
   __asm__ __volatile (&lt;br /&gt;
      &amp;quot;cbi %0, %1&amp;quot; &amp;quot;\n\t&amp;quot;&lt;br /&gt;
      &amp;quot;reti&amp;quot;&lt;br /&gt;
         : &lt;br /&gt;
         : &amp;quot;M&amp;quot; (_SFR_IO_ADDR (PORTB)), &amp;quot;i&amp;quot; (6)&lt;br /&gt;
   );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die ISR sieht dann so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
__vector_9:&lt;br /&gt;
   c6 98       	cbi   0x18, 6&lt;br /&gt;
   18 95       	reti&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wiederum kann man als Funktionsname &amp;lt;tt&amp;gt;__vector_default&amp;lt;/tt&amp;gt; nehmen,&lt;br /&gt;
um nicht-implementierte IRQs abzufangen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void __attribute__ ((naked)) &lt;br /&gt;
__vector_default (void)&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SRAM, Flash, EEPROM: Datenablage am Beispiel Strings==&lt;br /&gt;
Die Programmiersprache C kennt selber keine Strings; das einzige, was C bekannt ist, ist der Datentyp &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;, der ein einzelnes Zeichen repräsentiert. &lt;br /&gt;
===Darstellung in C===&lt;br /&gt;
Ein String im Sinne von C ist ein Array von Charactern bzw. ein Zeiger auf den Anfang des Arrays. Die einzelnen Zeichen folgen im Speicher direkt aufeinander und werden in aufsteigenden Adressen gespeichert. Am String-Ende folgt als Abschluss der Character &amp;lt;tt&amp;gt;'\0'&amp;lt;/tt&amp;gt;, um das Ende zu kennzeichnen. Dies ist besonders bei der Berechnung des Speicherplatzes für Strings zu berücksichtigen, denn für die 0 muss auch Platz reserviert werden.&lt;br /&gt;
&lt;br /&gt;
===Bestimmen der Stringlänge===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 /* Bestimmt die Laenge des Strings ohne die abschliessende '\0' zu zaehlen */&lt;br /&gt;
 unsigned int strlength (const char *str)&lt;br /&gt;
 {&lt;br /&gt;
   unsigned int len = 0;&lt;br /&gt;
   &lt;br /&gt;
   while (*str++)&lt;br /&gt;
      len++;&lt;br /&gt;
   &lt;br /&gt;
   return len;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Stringlänge kann auch mit der Standard-Funktion &amp;lt;tt&amp;gt;strlen&amp;lt;/tt&amp;gt; bestimmt werden, deren Prototyp sich in &amp;lt;tt&amp;gt;string.h&amp;lt;/tt&amp;gt; befindet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
 size_t strlen (const char*);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===String im Flash belassen===&lt;br /&gt;
Oftmals werden Strings nur zu Ausgabezwecken verwendet und nicht verändert. Verwendet man Sequenzen der Gestalt&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 char *str1 = &amp;quot;Hallo Welt!&amp;quot;;&lt;br /&gt;
 char str2[] = &amp;quot;Hallo Welt!&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dann werden die Strings im SRAM abgelegt. Im Startup-Code werden die Strings vom Flash ins SRAM kopiert und belegen daher sowohl Platz im SRAM als auch im Flash. Wird ein String nicht verändert, braucht er nicht ins SRAM kopiert zu werden. Das spart Platz im knapp bemessenen SRAM. Allerdings muss anders auf den String zugegriffen werden, denn wegen der Harvard-Architektur des AVR-Kerns kann avr-gcc anhand der Adresse nicht unterscheiden, ob diese ins SRAM, ins Flash oder ins EEPROM zeigt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 #include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 const prog_char str3[] = &amp;quot;Hallo Welt!&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 unsigned int strlen_P (const prog_char *str)&lt;br /&gt;
 {&lt;br /&gt;
    unsigned int len = 0;&lt;br /&gt;
 &lt;br /&gt;
    while (1)&lt;br /&gt;
    {&lt;br /&gt;
       char c = (char) pgm_read_byte (str);&lt;br /&gt;
       if ('\0' == c)&lt;br /&gt;
          return len;&lt;br /&gt;
       len++;&lt;br /&gt;
       str++; &lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void foo()&lt;br /&gt;
 {&lt;br /&gt;
    unsigned int len;&lt;br /&gt;
    len = strlen_P (str3);&lt;br /&gt;
    len = strlen_P (PSTR(&amp;quot;String im Flash&amp;quot;));&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===String ins EEPROM legen===&lt;br /&gt;
Dies geht nach dem gleichen Muster, nach dem Strings ins Flash gelegt werden. Der Zugriff wird vergleichsweise langsam, denn der EEPROM ist langsamer als SRAM bzw. Flash.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 #include &amp;lt;avr/eeprom.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 const char str4[] __attribute__ ((section(&amp;quot;.eeprom&amp;quot;))) = &amp;quot;Hallo Welt!&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 unsigned int strlen_EE (const char *str)&lt;br /&gt;
 {&lt;br /&gt;
    unsigned int len = 0;&lt;br /&gt;
 &lt;br /&gt;
    while (1)&lt;br /&gt;
    {&lt;br /&gt;
       char c = (char) eeprom_read_byte (str);&lt;br /&gt;
       if ('\0' == c)&lt;br /&gt;
          return len;&lt;br /&gt;
       len++;&lt;br /&gt;
       str++; &lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reset auslösen==&lt;br /&gt;
Falls ein Reset per Software ausgelöst werden soll, dann geht das am besten über den [[Watchdog]].&lt;br /&gt;
Einfach nur an den RESET-Punkt an Adresse&amp;amp;nbsp;0 zu springen mit&lt;br /&gt;
 goto *((void**) 0);&lt;br /&gt;
initialisiert zwar den Controller von neuem, aber es macht keinen wirkliches RESET mit Zurücksetzen der Hardware und allen I/O-Registern. &lt;br /&gt;
&lt;br /&gt;
Durch den Watchdog kann man ein 'richtiges' RESET-Signal erzeugen lassen, so daß die AVR-Hardware genau so initialisiert ist, wie nach einem externen RESET. So kann man z.B. via [[UART]] ein RESET-Kommando schicken. Allerdings lässt sich der Watchdog nur minimal auf 15ms einstellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/wdt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
...   &lt;br /&gt;
   cli();                     // Interrupts global abschalten&lt;br /&gt;
   wdt_enable (WDTO_15MS);    // Watchdog aufziehen auf 15ms&lt;br /&gt;
   while (1);                 // warten, bis er zubeisst...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Welches Ereignis einen RESET ausgelöst hat, kann man im Register '''MCUCSR''' (''MCU Control and Status Register'') erfahren. Es gibt 4 mögliche RESET-Quellen:&lt;br /&gt;
* Power-On Reset&lt;br /&gt;
* External Reset&lt;br /&gt;
* Brown-Out Reset&lt;br /&gt;
* Watchdog Reset&lt;br /&gt;
&lt;br /&gt;
Soll der Inhalt von Variablen einen Reset überleben &amp;amp;ndash; eine Variable also nicht initialisiert werden &amp;amp;ndash; dann geht das so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// status informiert z.B. darüber, ob wir selber den Watchdog ausgelöst haben&lt;br /&gt;
// oder nicht, oder andere Informationen&lt;br /&gt;
unsigned char status __attribute__ ((section (&amp;quot;.noinit&amp;quot;)));&lt;br /&gt;
&lt;br /&gt;
void main (void)&lt;br /&gt;
{&lt;br /&gt;
   // Wert von MCUSCR merken, möglichst früh im Programm&lt;br /&gt;
   unsigned char mcucsr = MCUCSR;&lt;br /&gt;
&lt;br /&gt;
   // MCUCSR zurücksetzen&lt;br /&gt;
   MCUCSR = 0;&lt;br /&gt;
&lt;br /&gt;
   // Watchdog-Reset&lt;br /&gt;
   if (mcuscr &amp;amp; (1 &amp;lt;&amp;lt; WDRF))&lt;br /&gt;
   {&lt;br /&gt;
       // status auswerten &lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   // Power-On Reset: status auf definierten Wert setzen&lt;br /&gt;
   if (mcuscr &amp;amp; (1 &amp;lt;&amp;lt; PORF))&lt;br /&gt;
   {&lt;br /&gt;
       status = 0;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   // status auswerten&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;
== Frühe Codeausführung vor main()==&lt;br /&gt;
&lt;br /&gt;
Mitunter ist es notwendig, Code unmittelbar nach dem Reset auszuführen, noch bevor man in &amp;lt;tt&amp;gt;main()&amp;lt;/tt&amp;gt; mit der eigentlichen Programmausführung beginnt. Das kann zB zur Bedienung eines [[Watchdog]]-Timers erforderlich sein.&lt;br /&gt;
&lt;br /&gt;
Nach einen Reset und vor Aufruf von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt; werden Initialisierungen ausgeführt wie&lt;br /&gt;
* setzen des Stackpointers&lt;br /&gt;
* Vorbelegung globaler Datenobjekte: Daten ohne Initializer werden zu 0 initialisert (Section &amp;lt;tt&amp;gt;.bss&amp;lt;/tt&amp;gt;). Für Daten mit Initializer (Section &amp;lt;tt&amp;gt;.data&amp;lt;/tt&amp;gt;) werden die Werte aus dem Flash ins SRAM kopiert.&lt;br /&gt;
* Initialisierung von Registern wie R1, in dem bei avr-gcc immer die Konstante 0 gehalten wird.&lt;br /&gt;
&lt;br /&gt;
Im Linker-Script werden Sections von &amp;lt;tt&amp;gt;.init0&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;.init9&amp;lt;/tt&amp;gt; definiert, die nacheinander abgearbeitet werden. Erst danach wird &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt; betreten. Um Code früh auszuführen, legt man die Funktion in eine dieser Sections:&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
 /* !!! never call this function !!! */&lt;br /&gt;
 void __attribute__ ((naked, section (&amp;quot;.init3&amp;quot;)))&lt;br /&gt;
 code_init3 (void)&lt;br /&gt;
 {&lt;br /&gt;
     /* Code */&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
Zu beachten ist dabei&lt;br /&gt;
* Eine so definierte Funktion darf keinesfalls aufgerufen werden!&lt;br /&gt;
* Zuweisungen wie &amp;lt;tt&amp;gt;i=0;&amp;lt;/tt&amp;gt; ergeben vor &amp;lt;tt&amp;gt;.init3&amp;lt;/tt&amp;gt; inkorrekten Code, da vor Ende von &amp;lt;tt&amp;gt;.init2&amp;lt;/tt&amp;gt; Register R1 noch nicht mit 0 besetzt ist, avr-gcc aber davon ausgeht, daß es eben diesen Wert enthält.&lt;br /&gt;
* Lokale Variablen müssen in Registern liegen, denn vor Ende von &amp;lt;tt&amp;gt;.init2&amp;lt;/tt&amp;gt; ist der Stackpointer noch nicht initialisiert. Zudem ist die Funktion &amp;lt;tt&amp;gt;naked&amp;lt;/tt&amp;gt;, hat also insbesondere keinen Prolog, der den Framepointer (Y-Register) setzen könnte, falls er benötigt wird. &lt;br /&gt;
* Gegebenenfalls ist daher die Verwendung von inline-Assembler angezeigt oder die Implementierung in einem eigenen Assembler-Modul, das dazu gelinkt wird. Der erzeugte Code ist im List-File zu überfrüfen.&lt;br /&gt;
* Werden mehrere Funktionen in die gleiche init-Section gelegt, ist die Reihenfolge ihrer Ausführung nicht spezifiziert und i.a. nicht die gleiche wie in der Quelle.&lt;br /&gt;
Unbenutzte init-Sections haben die Nummern 0, 1, 3 und 5 bis 8. Die verbleibenden werden vom Startup-Code verwendet:&lt;br /&gt;
;&amp;lt;tt&amp;gt;.init2&amp;lt;/tt&amp;gt;: Initialisieren von R1 mit 0 und setzen des Stackpointers&lt;br /&gt;
;&amp;lt;tt&amp;gt;.init4&amp;lt;/tt&amp;gt;: Kopieren der Daten vom Flash ins SRAM (&amp;lt;tt&amp;gt;.data&amp;lt;/tt&amp;gt;) und löschen von &amp;lt;tt&amp;gt;.bss&amp;lt;/tt&amp;gt;&lt;br /&gt;
;&amp;lt;tt&amp;gt;.init6&amp;lt;/tt&amp;gt;: C++ Konstruktoren&lt;br /&gt;
;&amp;lt;tt&amp;gt;.init9&amp;lt;/tt&amp;gt;: Sprung zu &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Programmbeispiel für Code in einer init-Section ist in &amp;quot;[[Speicherverbrauch bestimmen mit avr-gcc#Dynamischer RAM-Verbrauch|Speicherverbrauch bestimmen mit avr-gcc]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=Includes=&lt;br /&gt;
&lt;br /&gt;
Die mit&lt;br /&gt;
 #include &amp;lt;...&amp;gt;&lt;br /&gt;
angegebenen Includes werden von avr-gcc in den &lt;br /&gt;
mit der Option '&amp;lt;tt&amp;gt;-I&amp;lt;/tt&amp;gt;' anegegenen Pfaden gesucht. &lt;br /&gt;
Dem Compiler bekannt ist der Pfad &amp;lt;tt&amp;gt;&amp;lt;GCC_HOME&amp;gt;/avr/include&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Gibt man z.B. an &lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
dann wird automatisch in diesem Verzeichnis nach &amp;lt;tt&amp;gt;stdio.h&amp;lt;/tt&amp;gt; gesucht.&lt;br /&gt;
In dem Verzeichnis stehen Standard-Includes die benötigt werden, wenn man libc-Funktionen &lt;br /&gt;
oder mathematische Funktionen verwendet. &lt;br /&gt;
AVR-spezifische Dinge stehen im Unterverzeichnis &amp;lt;tt&amp;gt;avr&amp;lt;/tt&amp;gt;, etwa:&lt;br /&gt;
 #include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Als Pfad-Separator wird immer ein '''&amp;lt;tt&amp;gt;/&amp;lt;/tt&amp;gt;''' verwendet, auch auf Windows-Betriebssystemen! Also kein '''&amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;'''&amp;amp;nbsp;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Standard==&lt;br /&gt;
&lt;br /&gt;
 ctype.h                   character conversion macros and ctype macros&lt;br /&gt;
 errno.h                   provides symbolic names for various error codes&lt;br /&gt;
 inttypes.h                Use [u]intN_t if you need exactly N bits.&lt;br /&gt;
                           These typedefs are mandated by the C99 standard.&lt;br /&gt;
 math.h                    mathematical functions&lt;br /&gt;
 setjmp.h                  The C library provides the setjmp() and longjmp() functions&lt;br /&gt;
                           to jump directly to another (non-local) function. &lt;br /&gt;
 stdio.h                   Standard IO facilities&lt;br /&gt;
 stdlib.h                  Declares some basic C macros and functions as defined by&lt;br /&gt;
                           the ISO standard, plus some AVR-specific extensions&lt;br /&gt;
 string.h                  perform string operations on NULL terminated strings&lt;br /&gt;
&lt;br /&gt;
==AVR-spezifisch==&lt;br /&gt;
&lt;br /&gt;
Die AVR-spezifischen Includes finden sich wie gesagt im Unterverzeichnis &amp;lt;tt&amp;gt;avr&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Die meisten dort befindlichen Header wird man nie direkt durch Angabe im C-File erhalten,&lt;br /&gt;
sondern durch Angabe von&lt;br /&gt;
 #include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
Dadurch werden z.B. genau der I/O-Header eingebunden, der zum AVR-Modell passt, also&lt;br /&gt;
*&amp;lt;tt&amp;gt;avr/iom8.h&amp;lt;/tt&amp;gt; für [[ATmega8]], &lt;br /&gt;
*&amp;lt;tt&amp;gt;avr/iotn2313.h&amp;lt;/tt&amp;gt; für ATtiny2313, &lt;br /&gt;
*&amp;lt;tt&amp;gt;avr/io2313.h&amp;lt;/tt&amp;gt; für [[AT90S2313]], etc. &lt;br /&gt;
&lt;br /&gt;
Verantwortlich dafür ist der Schalter '&amp;lt;tt&amp;gt;-mmcu=xxx&amp;lt;/tt&amp;gt;'.&lt;br /&gt;
&lt;br /&gt;
Obwohl diese Header nicht explizit angegeben werden müssen, &lt;br /&gt;
kann ein Blick dorthin hilfreich sein, um die Namen von [[SFR|SFRs]] &lt;br /&gt;
oder Signals nachzuschlagen. &lt;br /&gt;
Diese Header werden im folgenden nicht alle einzeln aufgelistet. &lt;br /&gt;
Ihre Namen sind immer &amp;lt;tt&amp;gt;avr/io*.h&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* für ATmega: &amp;lt;tt&amp;gt;avr/iom*.h&amp;lt;/tt&amp;gt; &lt;br /&gt;
* für ATtiny: &amp;lt;tt&amp;gt;avr/iotn*.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avr/boot.h            Bootloader Support&lt;br /&gt;
avr/crc16.h           Prüfsumme CRC16&lt;br /&gt;
avr/delay.h           Verzögerungsschleife - loops for small accurate delays&lt;br /&gt;
avr/eeprom.h          EEPROM-Routinen&lt;br /&gt;
avr/ina90.h           Kompatibilität mit IAR-AVR-Compiler&lt;br /&gt;
avr/interrupt.h       sei(), cli(), ...&lt;br /&gt;
avr/io.h              --&amp;gt; inttypes.h, io*.h&lt;br /&gt;
avr/io*.h             SFRs, SIG_****, SPM_PAGESIZE, RAMEND, XRAMEND, E2END, FLASHEND&lt;br /&gt;
avr/parity.h          Parität&lt;br /&gt;
avr/pgmspace.h        Zugriff aufs Flash: Byte lesen, PROGMEM, prog_char, prog_uint8_t, ...&lt;br /&gt;
avr/portpins.h        Makros für Port-Pins&lt;br /&gt;
avr/signal.h          Makros SIGNAL() und INTERRUPT(), ...&lt;br /&gt;
avr/sleep.h           Power-Safe&lt;br /&gt;
avr/twi.h             I2C&lt;br /&gt;
avr/wdt.h             Watchdog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Optimierungen, Tipps &amp;amp; Tricks=&lt;br /&gt;
&lt;br /&gt;
Beim Programmieren in C möchte man sich möglichst wenig mit der Codeerzeugung selbst auseinandersetzen. Man verwendet ja gerade deshalb einen Compiler und programmiert nicht in Assembler, weil man sich nicht um Register-Belegungen o.ä. kümmern will, sondern nur um die zu lösende Aufgabe.&lt;br /&gt;
GCC erzeugt zwar recht guten Code, aber er ist nicht perfekt. Gerade auf Systemen wie AVR mit nur sehr begrenzten Resourcen muss man daher dem Compiler hilfreich zur Seite stehen, wenn man noch dichteren/schnelleren Code erhalten möchte.&lt;br /&gt;
&lt;br /&gt;
Um das Ergebnis zu beurteilen, hilft ein Blick ins Listfile. &lt;br /&gt;
Siehe dazu auch die Abschnitte &lt;br /&gt;
&amp;quot;[[Hallo Welt für AVR (LED blinken)#Listfile erstellen|Listfile erstellen]]&amp;quot; &lt;br /&gt;
und&lt;br /&gt;
&amp;quot;[[Hallo Welt für AVR (LED blinken)#Die Größe ermitteln|Die Größe ermitteln]]&amp;quot; &lt;br /&gt;
im [[Hallo Welt für AVR (LED blinken)|Hallo Welt für AVR]].&lt;br /&gt;
&lt;br /&gt;
==Optimierungsgrad==&lt;br /&gt;
Als Optimierungsgrad erweist sich &amp;lt;tt&amp;gt;-Os&amp;lt;/tt&amp;gt; (Optimize for Size) als der beste, evtl. noch &amp;lt;tt&amp;gt;-O2&amp;lt;/tt&amp;gt;. Ohne Angabe eines Optimierungsgrades wird nicht optimiert, was gleichbedeutend mit der Option &amp;lt;tt&amp;gt;-O0&amp;lt;/tt&amp;gt; ist. Abzuraten ist von der maximalen Optimierung &amp;lt;tt&amp;gt;-O3&amp;lt;/tt&amp;gt;, die wegen function inlining und loop unrolling zu sehr breitem Code führt und für AVR absolut nicht angesagt ist.&lt;br /&gt;
&lt;br /&gt;
==Vermeide printf, scanf, malloc==&lt;br /&gt;
Funktionen von diesem Kaliber sind die absoluten Platz- und Zeitfresser. &lt;br /&gt;
&lt;br /&gt;
Alternativen findet man reichlich in der &amp;lt;tt&amp;gt;avr-libc&amp;lt;/tt&amp;gt; wie &amp;lt;tt&amp;gt;itoa&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;atoi&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Und für &amp;lt;tt&amp;gt;malloc&amp;lt;/tt&amp;gt; und Konsorten sind dynamische Arrays und das Compiler-Builtin &amp;lt;tt&amp;gt;__builtin_alloca&amp;lt;/tt&amp;gt; effizientere Alternativen, siehe auch im Abschnitt &amp;quot;[[avr-gcc#Dynamische Speicherallokierung|Dynamische Speicherallokierung]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Konstante Strings ins Flash== &lt;br /&gt;
Konstante Strings, wie sie zu Ausgabezwecken Verwendung finden, werden im Programm oft nicht verändert und brauchen nicht SRAM zu belegen (und damit auch Flash, von wo aus sie vom Startup-Code ins SRAM kopiert werden), sondern gehören ins Flash! &lt;br /&gt;
&lt;br /&gt;
Entsprechende Routinen, um auf Strings im Flash zuzugreifen, tragen die Suffix &amp;lt;tt&amp;gt;_P&amp;lt;/tt&amp;gt;, wie z.B. &amp;lt;tt&amp;gt;strcmp_P&amp;lt;/tt&amp;gt; mit dem Prototyp&lt;br /&gt;
 extern int *strcmp_P (char *, const prog_char *)&lt;br /&gt;
Die Implementierungen befinden sich in der &amp;lt;tt&amp;gt;avr-libc&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Anwendung:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const prog_char str_p[]     = &amp;quot;Ein String im Flash&amp;quot;;&lt;br /&gt;
const char str2_p[] PROGMEM = &amp;quot;Noch ein String im Flash&amp;quot;;&lt;br /&gt;
...&lt;br /&gt;
   // String im SRAM mit String im Flash vergleichen&lt;br /&gt;
   if (!strcmp_P (str_sram, str_p))&lt;br /&gt;
   {&lt;br /&gt;
       // mach was bei Gleichheit&lt;br /&gt;
   }&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Sprungtabelle===&lt;br /&gt;
Genauso macht man auch eine Sprungtabelle, um anhand von Kommando-Strings dazugehörige Funktionen ausführen zu lassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int func1 (int arg)&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#define TEXT_LEN 15&lt;br /&gt;
&lt;br /&gt;
// Die Kommandostruktur&lt;br /&gt;
typedef struct &lt;br /&gt;
{&lt;br /&gt;
   int (*func)(int);     // Zeiger auf die auszuführende Funktion&lt;br /&gt;
   int arg;              // das Argument, das mitübergeben wird&lt;br /&gt;
   char text[1+TEXT_LEN]; // Text, maximal TEXT_LEN Zeichen lang&lt;br /&gt;
} command_t;&lt;br /&gt;
&lt;br /&gt;
// Das Array mit den Kommandos.&lt;br /&gt;
// Die funcx sind vom Prototyp (z.B. func1 oben)&lt;br /&gt;
// int funcx (int arg);&lt;br /&gt;
const command_t commands[] PROGMEM =&lt;br /&gt;
{&lt;br /&gt;
   { func1, 0, &amp;quot;Befehl 1&amp;quot; },&lt;br /&gt;
   { func2, 3, &amp;quot;Befehl für func2&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Sucht in commands[] nach text und führt gegebenenfalls&lt;br /&gt;
// die dazugehörige Funktion funcx mit Argument arg aus.&lt;br /&gt;
// Liefert den Rückgabewert von funcx &lt;br /&gt;
// oder -1, falls text nicht gefunden wurde.&lt;br /&gt;
int execute (const char *text)&lt;br /&gt;
{&lt;br /&gt;
   // Schleifenvariable&lt;br /&gt;
   unsigned char i;&lt;br /&gt;
&lt;br /&gt;
   // Wandert durch das Array mit Kommando-Strukturen&lt;br /&gt;
   const command_t * cmd = commands;&lt;br /&gt;
&lt;br /&gt;
   // sizeof wird von gcc ausgewertet und ist wie eine Konstante,&lt;br /&gt;
   // denn beide sizeofs sind zur Compilezeit bekannt&lt;br /&gt;
   for (i=0; i &amp;lt; sizeof(commands) / sizeof(command_t); i++)&lt;br /&gt;
   {&lt;br /&gt;
      // Ist das der gesuchte String? &lt;br /&gt;
      if (strcmp_P (text, cmd-&amp;gt;text))&lt;br /&gt;
      {&lt;br /&gt;
        // Nein, dann weitersuchen&lt;br /&gt;
        cmd++;&lt;br /&gt;
        continue;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Ja&lt;br /&gt;
      int (*func)(int), arg;&lt;br /&gt;
&lt;br /&gt;
      // Dann Funktionszeiger und Argument besorgen,&lt;br /&gt;
      func = (int(*)(int)) pgm_read_word (&amp;amp; cmd-&amp;gt;func);&lt;br /&gt;
      arg  = (int)         pgm_read_word (&amp;amp; cmd-&amp;gt;arg);&lt;br /&gt;
&lt;br /&gt;
      // Funktion ausführen und deren Wert zurückliefern      &lt;br /&gt;
      return func (arg);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   // text ist nicht in commands&lt;br /&gt;
   return -1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nachteil dabei ist, daß jeder String den maximalen Platz von TEXT_LEN+1 Zeichen belegt.&lt;br /&gt;
Falls man da noch weiter sparen will, dann kann man die Strings wieder ins Flash legen und ihre Adresse in der Struktur merken. Dadurch belegt ein String nur noch Länge+3 Zeichen (+3 wegen 1 Endezeichen und 2 Bytes für seine in der Struktur gemerkte Adresse). Die Definition der Tabelle wird aber umständlicher, weil jeder String einzeln angegeben werden muss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Die Kommandostruktur&lt;br /&gt;
typedef struct &lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
   char *text; // Zeiger auf Text&lt;br /&gt;
} command_t;&lt;br /&gt;
&lt;br /&gt;
const prog_char str_1[] = &amp;quot;Befehl 1&amp;quot;;&lt;br /&gt;
const prog_char str_2[] = &amp;quot;Befehl für func2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
const command_t commands[] PROGMEM =&lt;br /&gt;
{&lt;br /&gt;
   { func1, 0, str_1 },&lt;br /&gt;
   { func2, 3, str_2 }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Sucht in commands[] nach text und führt gegebenenfalls&lt;br /&gt;
// die dazugehörige Funktion funcx mit Argument arg aus.&lt;br /&gt;
// Liefert den Rückgabewert von funcx &lt;br /&gt;
// oder -1, falls text nicht gefunden wurde.&lt;br /&gt;
int execute (const char *text)&lt;br /&gt;
{&lt;br /&gt;
   // Schleifenvariable&lt;br /&gt;
   unsigned char i;&lt;br /&gt;
&lt;br /&gt;
   // Wandert durch das Array mit Kommando-Strukturen&lt;br /&gt;
   const command_t * cmd = commands;&lt;br /&gt;
&lt;br /&gt;
   // sizeof wird von gcc ausgewertet und ist wie eine Konstante,&lt;br /&gt;
   // denn beide sizeofs sind zur Compilezeit bekannt&lt;br /&gt;
   for (i=0; i &amp;lt; sizeof(commands) / sizeof (command_t); i++)&lt;br /&gt;
   {&lt;br /&gt;
      const prog_char * text_P;&lt;br /&gt;
&lt;br /&gt;
      // Liest die Startadresse von str_x&lt;br /&gt;
      text_P = (const prog_char *) pgm_read_word (&amp;amp; cmd-&amp;gt;text);&lt;br /&gt;
&lt;br /&gt;
      // Ist das der gesuchte String?	&lt;br /&gt;
      if (strcmp_P (text, text_P))&lt;br /&gt;
      {&lt;br /&gt;
         ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lokale Variablen verwenden==&lt;br /&gt;
&lt;br /&gt;
Beim Manipulieren globaler Variablen kann es günstig sein, diese in eine lokale Variable zu kopieren, dort zu verändern, und sie danach wieder zu schreiben &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
char var;&lt;br /&gt;
&lt;br /&gt;
void foo1()&lt;br /&gt;
{&lt;br /&gt;
   var++;&lt;br /&gt;
   if (var &amp;gt; 10)&lt;br /&gt;
      var = 1;&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dadurch wird einmal unnötig gespeichert (der dritte Befehl kann vermieden werden).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
foo1:&lt;br /&gt;
  lds r24,var        ; *movqi/4	[length = 2]&lt;br /&gt;
  subi r24,lo8(-(1)) ; addqi3/2	[length = 1]&lt;br /&gt;
  sts var,r24        ; *movqi/3	[length = 2]&lt;br /&gt;
  cpi r24,lo8(11)    ; cmpqi/2	[length = 1]&lt;br /&gt;
  brlt .L3           ; branch	[length = 1]&lt;br /&gt;
  ldi r24,lo8(1)     ; *movqi/2	[length = 1]&lt;br /&gt;
  sts var,r24        ; *movqi/3	[length = 2]&lt;br /&gt;
.L3:&lt;br /&gt;
  ret	&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Indem man eine lokale Variable (&amp;lt;tt&amp;gt;var2&amp;lt;/tt&amp;gt;) verwendet für die Änderung von &amp;lt;tt&amp;gt;var&amp;lt;/tt&amp;gt; vermeidet man dies:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
char var;&lt;br /&gt;
&lt;br /&gt;
void foo2()&lt;br /&gt;
{&lt;br /&gt;
   char var2 = var;&lt;br /&gt;
   &lt;br /&gt;
   var2++;&lt;br /&gt;
   if (var2 &amp;gt; 10)&lt;br /&gt;
      var2 = 1;&lt;br /&gt;
      &lt;br /&gt;
   var = var2;&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dadurch wird erst am Ende gespeichert. &amp;lt;tt&amp;gt;var2&amp;lt;/tt&amp;gt; lebt in Register &amp;lt;tt&amp;gt;r24&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
foo2:&lt;br /&gt;
  lds r24, var       ; *movqi/4   [length = 2]&lt;br /&gt;
  subi r24,lo8(-(1)) ; addqi3/2   [length = 1]&lt;br /&gt;
  cpi r24,lo8(11)    ; cmpqi/2    [length = 1]&lt;br /&gt;
  brlt .L2           ; branch     [length = 1]&lt;br /&gt;
  ldi r24,lo8(1)     ; *movqi/2   [length = 1]&lt;br /&gt;
.L2:&lt;br /&gt;
  sts var, r24       ; *movqi/3   [length = 2]&lt;br /&gt;
  ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei diesem einfachen Beispiel spart man lediglich eine Instruktion. Bei komplexeren Rechnungen oder längeren Datentypen kann es aber durchaus lohnender sein, in lokale Register zu kopieren.&lt;br /&gt;
&lt;br /&gt;
==Arithmetik==&lt;br /&gt;
&lt;br /&gt;
=== Daten zerlegen/zusammensetzen ===&lt;br /&gt;
&lt;br /&gt;
In systemnahen Programmen hat man oft was Problem, auf die einzelnen Bytes oder Bitfelder einer grösseren Datenstruktur zuzugreifen. Indem man sich ein Komposit baut, das die gewünschten Strukturen überlagert, kann man effizient z.B. auf Bytes zugreifen. Ausnahme sind Bitfelder, deren Verwendung etwas breiten Code ergibt. Bitfelder &amp;quot;von Hand&amp;quot; zu manipulieren, ist da manchmal effizienter, führt jedoch zu schlecht lesbarem Code.&lt;br /&gt;
&lt;br /&gt;
Oft benötigt wird der Zugriff auf die einzelnen Bytes eines &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;, also der Zugriff auf die Bytes eines 16-Bit-Wertes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
typedef union&lt;br /&gt;
{&lt;br /&gt;
    unsigned char  asByte[2];&lt;br /&gt;
    unsigned short asWord;&lt;br /&gt;
    int            asInt;&lt;br /&gt;
} data16_t;&lt;br /&gt;
&lt;br /&gt;
data16_t data;&lt;br /&gt;
...&lt;br /&gt;
   int foo;&lt;br /&gt;
   uint8_t wert;&lt;br /&gt;
&lt;br /&gt;
   data.asInt = foo;&lt;br /&gt;
   wert = data.asByte[1]; // die oberen 8 Bits von foo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein komplexeres Beispiel, das noch mehr Datentypen überlagert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
typedef ... foo_t;&lt;br /&gt;
&lt;br /&gt;
typedef union&lt;br /&gt;
{&lt;br /&gt;
   unsigned char byte[4];       // Zugriff als Bytes (8 Bit)&lt;br /&gt;
   unsigned short word[2];      // Zugriff als Words (16 Bit)&lt;br /&gt;
   signed long slong;           // Zugriff als signed long (32 Bit)&lt;br /&gt;
&lt;br /&gt;
   struct                       // Zugriff auf einzelne Bitgruppen&lt;br /&gt;
   {&lt;br /&gt;
      unsigned bit_0_3  : 4;    //  4 Bits (0..3)&lt;br /&gt;
      unsigned bit_4_8  : 5;    //  5 Bits (4..8)&lt;br /&gt;
      unsigned bit_9_21 : 13;   // 13 Bits (9..21)&lt;br /&gt;
      unsigned bit_22_31: 10;   // 10 Bits (22..31)&lt;br /&gt;
   };   &lt;br /&gt;
&lt;br /&gt;
   foo_t foo;                   // Zugriff als foo-Struktur&lt;br /&gt;
} data_t;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
{&lt;br /&gt;
   data_t data;&lt;br /&gt;
&lt;br /&gt;
   data.byte[2] = 12;          // setzt byte 2 auf 12&lt;br /&gt;
   data.bit_4_8 = 0x1f;        // setzt bits 4..8 (5 Stück) alle auf 1&lt;br /&gt;
&lt;br /&gt;
   int anInt = data.foo.anInt; // liest ein Feld von foo (hier ein int)&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===libgcc2 verwenden===&lt;br /&gt;
&lt;br /&gt;
In der libgcc2 sind einige Arithmetik-Routinen in Assembler implementiert. Dazu gehören ein paar Algorithmen zu Division (mit Rest) und Multiplikation. &lt;br /&gt;
&lt;br /&gt;
Von diesen Algorithmen werden durch die avr-libc jedoch nur zwei Strukturen und Funktionen veröffentlicht: &amp;lt;tt&amp;gt;div_t&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;ldiv_t&amp;lt;/tt&amp;gt; resp. die Funktionen &amp;lt;tt&amp;gt;div()&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;ldiv()&amp;lt;/tt&amp;gt;. Siehe dazu deine Dokumentation zur avr-libc. Damit kann man Quotient und zusätzlich den Rest bei einer Division 16/16 bzw. 32/32 berechnen lassen; den Rest bekommt man quasi kostenlos als Nebenprodukt. Das ist praktisch, wenn man z.b. eine Zahl in Dezimaldarstellung umwandeln möchte oder von/nach [[BCD]].&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den via avr-libc veröffentlichten Funktionen gibt es aber noch Routinen, die z.B. auf 8-Bit-Werten operieren oder mit &amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt; Typen und dementsprechend effizienter sind.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel: Umwandeln nach Dezimalstring'''&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel, das Division mit Rest für &amp;lt;tt&amp;gt;unsigned short&amp;lt;/tt&amp;gt; verwendet, um eine 16-Bit-Zahl in Dezimaldarstellung zu wandeln:&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 extern udiv_t __udivmodhi4 (unsigned short, unsigned short);&lt;br /&gt;
 #define udiv __udivmodhi4&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Struktur definieren und Funktion bekannt machen&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
	unsigned short quot;&lt;br /&gt;
	unsigned short rem;&lt;br /&gt;
} udiv_t;&lt;br /&gt;
&lt;br /&gt;
extern udiv_t udiv (unsigned short, unsigned short) __asm__(&amp;quot;__udivmodhi4&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// 5 Ziffern (0...65535) und evtl. noch eine führende 0&lt;br /&gt;
#define DIGITS 6&lt;br /&gt;
&lt;br /&gt;
// +1 wegen String-Ende (wird im Startup auf 0 gesetzt)&lt;br /&gt;
char string[DIGITS+1];&lt;br /&gt;
&lt;br /&gt;
// Wandelt zahl in Dezimaldarstellung um.&lt;br /&gt;
// Der return-Wert zeigt irgendwo ins string[]-Array.&lt;br /&gt;
// string[] wird verändert.&lt;br /&gt;
char* toString (unsigned short zahl)&lt;br /&gt;
{&lt;br /&gt;
	// s zeigt auf das Ende von string&lt;br /&gt;
	// string wird von hinten nach vorne gefüllt&lt;br /&gt;
	char *s = string + DIGITS;&lt;br /&gt;
	&lt;br /&gt;
	// qrem enthält Quotient (quot) und Rest (rem) der Divisionen&lt;br /&gt;
	udiv_t qrem = {.quot = zahl};                  &lt;br /&gt;
&lt;br /&gt;
	do&lt;br /&gt;
	{&lt;br /&gt;
		// Division mit Rest durch 10&lt;br /&gt;
		// quot: Ergebnis für den nächsten Durchlauf&lt;br /&gt;
		// rem:  Rest ist die Ziffer im 10er-System&lt;br /&gt;
		qrem = udiv (qrem.quot, 10);&lt;br /&gt;
		&lt;br /&gt;
		// Ziffer in Zeichen wandeln und speichern&lt;br /&gt;
		*(--s) = '0' + qrem.rem;&lt;br /&gt;
	}	&lt;br /&gt;
	while (0 != qrem.quot);&lt;br /&gt;
	&lt;br /&gt;
	// Falls eine führende '0' gespeichert wurde: weg damit&lt;br /&gt;
	// ausser zahl war selbst schon 0&lt;br /&gt;
	if (*s == '0' &amp;amp;&amp;amp; *(s+1) != '\0')&lt;br /&gt;
		s++;&lt;br /&gt;
&lt;br /&gt;
	return s;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls man eine Division und/oder Rest für 8-Bit braucht, dann geht für &amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt; analog. &lt;br /&gt;
&lt;br /&gt;
'''Beispiel: BCD-Umrechnung'''&lt;br /&gt;
&lt;br /&gt;
Wandeln einer 8-Bit-Zahl &amp;lt;tt&amp;gt;0 &amp;lt;= num &amp;lt; 100&amp;lt;/tt&amp;gt; nach [[BCD]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
	unsigned char quot;  // Quotient&lt;br /&gt;
	unsigned char rem;   // Rest (remainder)&lt;br /&gt;
} udiv8_t;&lt;br /&gt;
&lt;br /&gt;
extern udiv8_t udiv8 (unsigned char, unsigned char) __asm__ (&amp;quot;__udivmodqi4&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Wandelt num nach BCD um, 0 &amp;lt;= num &amp;lt;= 99&lt;br /&gt;
// return-Wert ist dann 0x0 &amp;lt;= return &amp;lt;= 0x99&lt;br /&gt;
unsigned char to_bcd (unsigned char num)&lt;br /&gt;
{&lt;br /&gt;
	udiv8_t qrem = udiv8 (num, 10);&lt;br /&gt;
	&lt;br /&gt;
	return (unsigned char) (qrem.quot &amp;lt;&amp;lt; 4) | qrem.rem;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Division durch Multiplikation===&lt;br /&gt;
===Vermeiden von float und double===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Bugs=&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;__builtin_return_address(0)&amp;lt;/tt&amp;gt;: ist entgegen der Spezifikation nicht implementiert und liefert in der Regel ein falsches Ergebnis.&lt;br /&gt;
;gcc 4.x: In der 4er-Version gab es tiefgreifende interne Änderungen im Compiler; er ist noch instabil und kann momentan noch nicht für den Produktiv-Einsatz empfohlen werden (Stand 02/2006).&lt;br /&gt;
&lt;br /&gt;
=Abkürzungen und Bezeichnungen=&lt;br /&gt;
; [[GCC]]: GNU Compiler Collection&lt;br /&gt;
; gcc: GNU C-Compiler&lt;br /&gt;
; GPR: '''G'''eneral '''P'''urpose '''R'''egister&lt;br /&gt;
; [[ISR]]: [[Interrupt|'''I'''nterrupt]] '''S'''ervice '''R'''outine&lt;br /&gt;
; [[IRQ]]: '''I'''nterrupt '''R'''e'''q'''uest&lt;br /&gt;
; Prolog/Epilog: Code am Anfang/Ende jeder Funktionen/ISR, der dazu dient, verwendete Register zu sichern, den Stack-Frame für lokale [[Variable|Variablen]] anzulegen (falls benötigt), Stackpointer zu setzen, zurück zu springen (&amp;lt;tt&amp;gt;ret&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;reti&amp;lt;/tt&amp;gt;), etc.&lt;br /&gt;
; SFR: '''S'''pecial '''F'''unction '''R'''egister&lt;br /&gt;
; Target: Zielsystem, in unserem Falle avr&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[WinAVR]]&lt;br /&gt;
* [[Hallo Welt für AVR (LED blinken)]] - ein erstes Beispiel für avr-gcc&lt;br /&gt;
* [[Fallstricke bei der C-Programmierung]]&lt;br /&gt;
* [[Speicherverbrauch bestimmen mit avr-gcc]]&lt;br /&gt;
* [[Inline-Assembler in avr-gcc|Inline-Assembler]]&lt;br /&gt;
* [[Sourcevergleich]]&lt;br /&gt;
* [[Compiler]]&lt;br /&gt;
* [[AVR]]&lt;br /&gt;
*[[:Kategorie:Quellcode_C|C-Codebeispiele]]&lt;br /&gt;
&lt;br /&gt;
=Weblinks=&lt;br /&gt;
* [http://gcc.gnu.org/ Offizielle Homepage von GCC (en)]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/GNU_Compiler_Collection GCC in der deutschen Wikipedia]&lt;br /&gt;
* [http://sourceforge.net/projects/winavr/ WinAVR-Projekt bei sourceforge.net (en)]&lt;br /&gt;
* [http://cdk4avr.sourceforge.net/ avr-gcc und toolchain als Linux-Paket bei sourceforge.net (en)]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial avr-gcc-Tutorial auf mikrocontroller.net]&lt;br /&gt;
* [http://www.linuxfocus.org/Deutsch/November2004/article352.shtml Tipps zu Build und Installation von avr-gcc, binutils und avr-libc unter Linux bei linuxfocus.org]&lt;br /&gt;
* [http://www.avrfreaks.net/AVRGCC/ avr-gcc bei avrfreaks.net (en)]&lt;br /&gt;
* [http://savannah.nongnu.org/projects/avr-libc/ Nützliche GCC Runtime-Libary]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Autor=&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:SprinterSB|SprinterSB]] 11:27, 7. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Quellcode C|!]]&lt;br /&gt;
[[Kategorie:Software]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Schrittmotoren&amp;diff=6835</id>
		<title>Schrittmotoren</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Schrittmotoren&amp;diff=6835"/>
				<updated>2006-04-14T12:52:43Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Weniger oft notwendige Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Was ist ein Schrittmotor==&lt;br /&gt;
&lt;br /&gt;
Ein Schrittmotor (oft auch ''Stepper'' genannt) ist ein Gleichstrommotor, 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 Reluktanz- 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;
&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;
==Prinzip der Schrittmotoren==&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. 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) muß 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;
&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, wieviel 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;
==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. 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;
&lt;br /&gt;
[[Bild:l298standard.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Widerstand RS1, RS2: 1 oder 0,5 Ohm (bei größerer Belastung)&lt;br /&gt;
 Dioden: schnelle Dioden z.B. BYV27-200&lt;br /&gt;
&lt;br /&gt;
Die Schaltung läßt sich recht einfach auf einer Experimentierplatine  aufbauen. 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 (fett sind die wichtigen Anschlüsse):&lt;br /&gt;
&lt;br /&gt;
'''CW/CCW:'''&lt;br /&gt;
Gibt die Richtung an, in die der Motor bewegt werden soll&lt;br /&gt;
 &lt;br /&gt;
'''Clock:'''&lt;br /&gt;
Durch einen kurzen Impuls auf diese Leitung wird der Motor einen Schritt bewegt. &lt;br /&gt;
In einer Schleife braucht mal also nur diese Leitung kurz ein- und auszuschalten. &lt;br /&gt;
 &lt;br /&gt;
'''Half/Full:'''&lt;br /&gt;
Gewöhnlich legt man den Anschluss auf Masse. Legt man ihn auf 5 V, dann werden  &lt;br /&gt;
immer halbe Schritte durchgeführt, also doppelt soviele Schritte pro Umdrehung&lt;br /&gt;
 &lt;br /&gt;
'''Enable:'''&lt;br /&gt;
Wenn man diesen Anschluss auf Masse legt, wird die Motorspannung ausgeschaltet&lt;br /&gt;
 &lt;br /&gt;
'''Vref:'''&lt;br /&gt;
Hier muß eine Spannung zwischen 0 und 3 Volt angelegt werden. Die Spannung &lt;br /&gt;
legt den maximalen Motorstom fest.&lt;br /&gt;
&lt;br /&gt;
 VRef berechnet sich nach folgender Formel:&lt;br /&gt;
 Vref=I motorstrom * Rs (bei uns 1 Ohm) * 1,41&lt;br /&gt;
 Angenommen, Sie haben einen Motor, der 0,5 A Strom verträgt, in diesem Fall &lt;br /&gt;
 würde die Rechnung so aussehen Vref=0,5*1*1,41 &lt;br /&gt;
 Ergebnis: Vref=0,71 V&lt;br /&gt;
&lt;br /&gt;
Man muß also an Vref eine Spannung von 0,71 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;
Bringt Schrittmotor in Grundstellung (diesen Anschluss kann man meist vernachlässigen und unbelegt lassen)&lt;br /&gt;
 &lt;br /&gt;
'''Control, Sync, Home:'''&lt;br /&gt;
Diese Anschlüsse kann man meist vernachlässigen und unbelegt lassen&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. Ich kann die Schaltung nur empfehlen. &lt;br /&gt;
Ein interessanter Forum Thread zu oberer Schaltung findet man unter [[#Weblinks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:l298eigenbau.jpeg|center|framed|Meine erste Schrittmotoransteuerung. Nicht schön - aber es funktionierte :-)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:schaltungstep298.gif|thumb|Ansteuerung mit L298]]&lt;br /&gt;
&lt;br /&gt;
Hier nochmal ein größerer Schaltplan mit eingezeichnetem Annchlussstecker und Spannungsteiler.&lt;br /&gt;
   &lt;br /&gt;
Ein interessanter Forum Thread zu oberer Schaltung findet man unter [[#Weblinks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist halt 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 dieses 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 Motoren, 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 Roboter Bastler (ebenfalls mit Stromregelung und L298). Das Board RN-Motor beruht auf dieser Schaltung &lt;br /&gt;
&lt;br /&gt;
Ein interessanter Forum Thread zu dieser Schaltung findet man 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;
==Hier nochmal die genaue Phasenbeschreibung der Ansteuerung==&lt;br /&gt;
&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;
&lt;br /&gt;
[[Bild:schrittmotorphasentabelle.gif|center]]&lt;br /&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 das 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 ode rmehrere 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 den Nennspannung verwenden damit der Motor nicht überhitzt.&lt;br /&gt;
&lt;br /&gt;
;Anschlussbelegung: Schrittmotoren haben 4, 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 einzelnen 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 Kennlienienverlauf 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 ohmische 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) bipolaren angesteuertet 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 etwas um den Faktor 1,41 (Wurzel aus 2) verringert werden damit der Motor nicht zu heiß 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äßt, kann man in etwa die notwendige Mindestspannung berechnen.  Wenn bei 5,1V ein Strom von 1 A fließt, so müsste der ohmische Widerstand R=U/i = 5,1V / 1 = '''5,1 Ohm''' betragen. Der Gesamtwiderstand der Reihenschaltung wäre demnach 10,2 Ohm. Wenn wir den Strom von 0,79A erreichen wollen, so müsste U=I*R  = 0,79*10,2 = '''8,06V''' 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 muss der STrom in etwas 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,41A * 2,55 = 3,6V&lt;br /&gt;
Auch da sist 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]]&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;
* [http://www.roboternetz.de/phpBB2/dload.php?action=category&amp;amp;cat_id=2 L298 un L297 Datenblatt]&lt;br /&gt;
* [http://www.roboternetz.de/robotertutorial.html Robotertutorial (Projekt mit Schrittmotor)]&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.roboternetz.de/phpBB2/viewtopic.php?t=2741 Bequeme Schrittmotoransteuerung über RS232 oder I2C]&lt;br /&gt;
* [http://www.nanotec.de/ Nanotec]&lt;br /&gt;
* [http://www-users.rwth-aachen.de/thorsten.ostermann/schritt/sm_faq.htm Schrittmotor_Faq]&lt;br /&gt;
* [http://www.wolfgang-back.com/schrittmotor_demo.php Wolfgang Back´s 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;
&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;
'''Englische Links'''&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;
&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>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Schrittmotoren&amp;diff=6834</id>
		<title>Schrittmotoren</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Schrittmotoren&amp;diff=6834"/>
				<updated>2006-04-14T12:48:35Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Praxisbeispiel für Stromberechnung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Was ist ein Schrittmotor==&lt;br /&gt;
&lt;br /&gt;
Ein Schrittmotor (oft auch ''Stepper'' genannt) ist ein Gleichstrommotor, 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 Reluktanz- 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;
&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;
==Prinzip der Schrittmotoren==&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. 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) muß 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;
&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, wieviel 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;
==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. 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;
&lt;br /&gt;
[[Bild:l298standard.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Widerstand RS1, RS2: 1 oder 0,5 Ohm (bei größerer Belastung)&lt;br /&gt;
 Dioden: schnelle Dioden z.B. BYV27-200&lt;br /&gt;
&lt;br /&gt;
Die Schaltung läßt sich recht einfach auf einer Experimentierplatine  aufbauen. 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 (fett sind die wichtigen Anschlüsse):&lt;br /&gt;
&lt;br /&gt;
'''CW/CCW:'''&lt;br /&gt;
Gibt die Richtung an, in die der Motor bewegt werden soll&lt;br /&gt;
 &lt;br /&gt;
'''Clock:'''&lt;br /&gt;
Durch einen kurzen Impuls auf diese Leitung wird der Motor einen Schritt bewegt. &lt;br /&gt;
In einer Schleife braucht mal also nur diese Leitung kurz ein- und auszuschalten. &lt;br /&gt;
 &lt;br /&gt;
'''Half/Full:'''&lt;br /&gt;
Gewöhnlich legt man den Anschluss auf Masse. Legt man ihn auf 5 V, dann werden  &lt;br /&gt;
immer halbe Schritte durchgeführt, also doppelt soviele Schritte pro Umdrehung&lt;br /&gt;
 &lt;br /&gt;
'''Enable:'''&lt;br /&gt;
Wenn man diesen Anschluss auf Masse legt, wird die Motorspannung ausgeschaltet&lt;br /&gt;
 &lt;br /&gt;
'''Vref:'''&lt;br /&gt;
Hier muß eine Spannung zwischen 0 und 3 Volt angelegt werden. Die Spannung &lt;br /&gt;
legt den maximalen Motorstom fest.&lt;br /&gt;
&lt;br /&gt;
 VRef berechnet sich nach folgender Formel:&lt;br /&gt;
 Vref=I motorstrom * Rs (bei uns 1 Ohm) * 1,41&lt;br /&gt;
 Angenommen, Sie haben einen Motor, der 0,5 A Strom verträgt, in diesem Fall &lt;br /&gt;
 würde die Rechnung so aussehen Vref=0,5*1*1,41 &lt;br /&gt;
 Ergebnis: Vref=0,71 V&lt;br /&gt;
&lt;br /&gt;
Man muß also an Vref eine Spannung von 0,71 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;
Bringt Schrittmotor in Grundstellung (diesen Anschluss kann man meist vernachlässigen und unbelegt lassen)&lt;br /&gt;
 &lt;br /&gt;
'''Control, Sync, Home:'''&lt;br /&gt;
Diese Anschlüsse kann man meist vernachlässigen und unbelegt lassen&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. Ich kann die Schaltung nur empfehlen. &lt;br /&gt;
Ein interessanter Forum Thread zu oberer Schaltung findet man unter [[#Weblinks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:l298eigenbau.jpeg|center|framed|Meine erste Schrittmotoransteuerung. Nicht schön - aber es funktionierte :-)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:schaltungstep298.gif|thumb|Ansteuerung mit L298]]&lt;br /&gt;
&lt;br /&gt;
Hier nochmal ein größerer Schaltplan mit eingezeichnetem Annchlussstecker und Spannungsteiler.&lt;br /&gt;
   &lt;br /&gt;
Ein interessanter Forum Thread zu oberer Schaltung findet man unter [[#Weblinks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist halt 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 dieses 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 Motoren, 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 Roboter Bastler (ebenfalls mit Stromregelung und L298). Das Board RN-Motor beruht auf dieser Schaltung &lt;br /&gt;
&lt;br /&gt;
Ein interessanter Forum Thread zu dieser Schaltung findet man 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;
==Hier nochmal die genaue Phasenbeschreibung der Ansteuerung==&lt;br /&gt;
&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;
&lt;br /&gt;
[[Bild:schrittmotorphasentabelle.gif|center]]&lt;br /&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 das 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 ode rmehrere 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 den Nennspannung verwenden damit der Motor nicht überhitzt.&lt;br /&gt;
&lt;br /&gt;
;Anschlussbelegung: Schrittmotoren haben 4, 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 einzelnen 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 Kennlienienverlauf 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 ohmische Widerstand der Spule angegeben, allerdings nicht immer. Wenn die Nennspannung und der Nennstrom angebenen sind, so kann man sich den Widerstand nach dem ohmischen 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) bipolaren angesteuertet 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 etwas um den Faktor 1,41 (Wurzel aus 2) verringert werden damit der Motor nicht zu heiß 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äßt, kann man in etwa die notwendige Mindestspannung berechnen.  Wenn bei 5,1V ein Strom von 1 A fließt, so müsste der ohmische Widerstand R=U/i = 5,1V / 1 = '''5,1 Ohm''' betragen. Der Gesamtwiderstand der Reihenschaltung wäre demnach 10,2 Ohm. Wenn wir den Strom von 0,79A erreichen wollen, so müsste U=I*R  = 0,79*10,2 = '''8,06V''' 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 muss der STrom in etwas 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,41A * 2,55 = 3,6V&lt;br /&gt;
Auch da sist 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]]&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;
* [http://www.roboternetz.de/phpBB2/dload.php?action=category&amp;amp;cat_id=2 L298 un L297 Datenblatt]&lt;br /&gt;
* [http://www.roboternetz.de/robotertutorial.html Robotertutorial (Projekt mit Schrittmotor)]&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.roboternetz.de/phpBB2/viewtopic.php?t=2741 Bequeme Schrittmotoransteuerung über RS232 oder I2C]&lt;br /&gt;
* [http://www.nanotec.de/ Nanotec]&lt;br /&gt;
* [http://www-users.rwth-aachen.de/thorsten.ostermann/schritt/sm_faq.htm Schrittmotor_Faq]&lt;br /&gt;
* [http://www.wolfgang-back.com/schrittmotor_demo.php Wolfgang Back´s 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;
&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;
'''Englische Links'''&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;
&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>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Schrittmotoren&amp;diff=6833</id>
		<title>Schrittmotoren</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Schrittmotoren&amp;diff=6833"/>
				<updated>2006-04-14T12:39:21Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Weniger oft notwendige Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Was ist ein Schrittmotor==&lt;br /&gt;
&lt;br /&gt;
Ein Schrittmotor (oft auch ''Stepper'' genannt) ist ein Gleichstrommotor, 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 Reluktanz- 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;
&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;
==Prinzip der Schrittmotoren==&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. 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) muß 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;
&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, wieviel 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;
==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. 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;
&lt;br /&gt;
[[Bild:l298standard.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Widerstand RS1, RS2: 1 oder 0,5 Ohm (bei größerer Belastung)&lt;br /&gt;
 Dioden: schnelle Dioden z.B. BYV27-200&lt;br /&gt;
&lt;br /&gt;
Die Schaltung läßt sich recht einfach auf einer Experimentierplatine  aufbauen. 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 (fett sind die wichtigen Anschlüsse):&lt;br /&gt;
&lt;br /&gt;
'''CW/CCW:'''&lt;br /&gt;
Gibt die Richtung an, in die der Motor bewegt werden soll&lt;br /&gt;
 &lt;br /&gt;
'''Clock:'''&lt;br /&gt;
Durch einen kurzen Impuls auf diese Leitung wird der Motor einen Schritt bewegt. &lt;br /&gt;
In einer Schleife braucht mal also nur diese Leitung kurz ein- und auszuschalten. &lt;br /&gt;
 &lt;br /&gt;
'''Half/Full:'''&lt;br /&gt;
Gewöhnlich legt man den Anschluss auf Masse. Legt man ihn auf 5 V, dann werden  &lt;br /&gt;
immer halbe Schritte durchgeführt, also doppelt soviele Schritte pro Umdrehung&lt;br /&gt;
 &lt;br /&gt;
'''Enable:'''&lt;br /&gt;
Wenn man diesen Anschluss auf Masse legt, wird die Motorspannung ausgeschaltet&lt;br /&gt;
 &lt;br /&gt;
'''Vref:'''&lt;br /&gt;
Hier muß eine Spannung zwischen 0 und 3 Volt angelegt werden. Die Spannung &lt;br /&gt;
legt den maximalen Motorstom fest.&lt;br /&gt;
&lt;br /&gt;
 VRef berechnet sich nach folgender Formel:&lt;br /&gt;
 Vref=I motorstrom * Rs (bei uns 1 Ohm) * 1,41&lt;br /&gt;
 Angenommen, Sie haben einen Motor, der 0,5 A Strom verträgt, in diesem Fall &lt;br /&gt;
 würde die Rechnung so aussehen Vref=0,5*1*1,41 &lt;br /&gt;
 Ergebnis: Vref=0,71 V&lt;br /&gt;
&lt;br /&gt;
Man muß also an Vref eine Spannung von 0,71 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;
Bringt Schrittmotor in Grundstellung (diesen Anschluss kann man meist vernachlässigen und unbelegt lassen)&lt;br /&gt;
 &lt;br /&gt;
'''Control, Sync, Home:'''&lt;br /&gt;
Diese Anschlüsse kann man meist vernachlässigen und unbelegt lassen&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. Ich kann die Schaltung nur empfehlen. &lt;br /&gt;
Ein interessanter Forum Thread zu oberer Schaltung findet man unter [[#Weblinks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:l298eigenbau.jpeg|center|framed|Meine erste Schrittmotoransteuerung. Nicht schön - aber es funktionierte :-)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:schaltungstep298.gif|thumb|Ansteuerung mit L298]]&lt;br /&gt;
&lt;br /&gt;
Hier nochmal ein größerer Schaltplan mit eingezeichnetem Annchlussstecker und Spannungsteiler.&lt;br /&gt;
   &lt;br /&gt;
Ein interessanter Forum Thread zu oberer Schaltung findet man unter [[#Weblinks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist halt 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 dieses 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 Motoren, 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 Roboter Bastler (ebenfalls mit Stromregelung und L298). Das Board RN-Motor beruht auf dieser Schaltung &lt;br /&gt;
&lt;br /&gt;
Ein interessanter Forum Thread zu dieser Schaltung findet man 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;
==Hier nochmal die genaue Phasenbeschreibung der Ansteuerung==&lt;br /&gt;
&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;
&lt;br /&gt;
[[Bild:schrittmotorphasentabelle.gif|center]]&lt;br /&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 das 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 ode rmehrere 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 den Nennspannung verwenden damit der Motor nicht überhitzt.&lt;br /&gt;
&lt;br /&gt;
;Anschlussbelegung: Schrittmotoren haben 4, 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 einzelnen 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 Kennlienienverlauf 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 ohmische Widerstand der Spule angegeben, allerdings nicht immer. Wenn die Nennspannung und der Nennstrom angebenen sind, so kann man sich den Widerstand nach dem ohmischen 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) bipolaren angesteuertet werden, so hat man die Wahl jewiels 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 etwas um den Faktor 1,41 (Wurzel aus 2) verringert werden damit der Motor nicht zu heiß 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äßt, kann man in etwa die notwendige Mindestspannung berechnen.  Wenn bei 5,1V ein Strom von 1 A fließt, so müsste der ohmische Widerstand R=U/i = 5,1V / 1 = '''5,1 Ohm''' betragen. Der Gesamtwiderstand der Reihenschaltung wäre demnach 10,2 Ohm. Wenn wir den Strom von 0,79A erreichen wollen, so müsste U=I*R  = 0,79*10,2 = '''8,06V''' 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 muss der STrom in etwas 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,41A * 2,55 = 3,6V&lt;br /&gt;
Auch da sist 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öhnen.&lt;br /&gt;
&lt;br /&gt;
Problematisch kann bei der Parallelschaltung mancher Motoren der niedrige ohmische 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;
&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]]&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;
* [http://www.roboternetz.de/phpBB2/dload.php?action=category&amp;amp;cat_id=2 L298 un L297 Datenblatt]&lt;br /&gt;
* [http://www.roboternetz.de/robotertutorial.html Robotertutorial (Projekt mit Schrittmotor)]&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.roboternetz.de/phpBB2/viewtopic.php?t=2741 Bequeme Schrittmotoransteuerung über RS232 oder I2C]&lt;br /&gt;
* [http://www.nanotec.de/ Nanotec]&lt;br /&gt;
* [http://www-users.rwth-aachen.de/thorsten.ostermann/schritt/sm_faq.htm Schrittmotor_Faq]&lt;br /&gt;
* [http://www.wolfgang-back.com/schrittmotor_demo.php Wolfgang Back´s 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;
&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;
'''Englische Links'''&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;
&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>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Schrittmotoren&amp;diff=6832</id>
		<title>Schrittmotoren</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Schrittmotoren&amp;diff=6832"/>
				<updated>2006-04-14T12:36:00Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Hilfreiche Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Was ist ein Schrittmotor==&lt;br /&gt;
&lt;br /&gt;
Ein Schrittmotor (oft auch ''Stepper'' genannt) ist ein Gleichstrommotor, 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 Reluktanz- 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;
&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;
==Prinzip der Schrittmotoren==&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. 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) muß 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;
&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, wieviel 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;
==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. 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;
&lt;br /&gt;
[[Bild:l298standard.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Widerstand RS1, RS2: 1 oder 0,5 Ohm (bei größerer Belastung)&lt;br /&gt;
 Dioden: schnelle Dioden z.B. BYV27-200&lt;br /&gt;
&lt;br /&gt;
Die Schaltung läßt sich recht einfach auf einer Experimentierplatine  aufbauen. 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 (fett sind die wichtigen Anschlüsse):&lt;br /&gt;
&lt;br /&gt;
'''CW/CCW:'''&lt;br /&gt;
Gibt die Richtung an, in die der Motor bewegt werden soll&lt;br /&gt;
 &lt;br /&gt;
'''Clock:'''&lt;br /&gt;
Durch einen kurzen Impuls auf diese Leitung wird der Motor einen Schritt bewegt. &lt;br /&gt;
In einer Schleife braucht mal also nur diese Leitung kurz ein- und auszuschalten. &lt;br /&gt;
 &lt;br /&gt;
'''Half/Full:'''&lt;br /&gt;
Gewöhnlich legt man den Anschluss auf Masse. Legt man ihn auf 5 V, dann werden  &lt;br /&gt;
immer halbe Schritte durchgeführt, also doppelt soviele Schritte pro Umdrehung&lt;br /&gt;
 &lt;br /&gt;
'''Enable:'''&lt;br /&gt;
Wenn man diesen Anschluss auf Masse legt, wird die Motorspannung ausgeschaltet&lt;br /&gt;
 &lt;br /&gt;
'''Vref:'''&lt;br /&gt;
Hier muß eine Spannung zwischen 0 und 3 Volt angelegt werden. Die Spannung &lt;br /&gt;
legt den maximalen Motorstom fest.&lt;br /&gt;
&lt;br /&gt;
 VRef berechnet sich nach folgender Formel:&lt;br /&gt;
 Vref=I motorstrom * Rs (bei uns 1 Ohm) * 1,41&lt;br /&gt;
 Angenommen, Sie haben einen Motor, der 0,5 A Strom verträgt, in diesem Fall &lt;br /&gt;
 würde die Rechnung so aussehen Vref=0,5*1*1,41 &lt;br /&gt;
 Ergebnis: Vref=0,71 V&lt;br /&gt;
&lt;br /&gt;
Man muß also an Vref eine Spannung von 0,71 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;
Bringt Schrittmotor in Grundstellung (diesen Anschluss kann man meist vernachlässigen und unbelegt lassen)&lt;br /&gt;
 &lt;br /&gt;
'''Control, Sync, Home:'''&lt;br /&gt;
Diese Anschlüsse kann man meist vernachlässigen und unbelegt lassen&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. Ich kann die Schaltung nur empfehlen. &lt;br /&gt;
Ein interessanter Forum Thread zu oberer Schaltung findet man unter [[#Weblinks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:l298eigenbau.jpeg|center|framed|Meine erste Schrittmotoransteuerung. Nicht schön - aber es funktionierte :-)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:schaltungstep298.gif|thumb|Ansteuerung mit L298]]&lt;br /&gt;
&lt;br /&gt;
Hier nochmal ein größerer Schaltplan mit eingezeichnetem Annchlussstecker und Spannungsteiler.&lt;br /&gt;
   &lt;br /&gt;
Ein interessanter Forum Thread zu oberer Schaltung findet man unter [[#Weblinks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist halt 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 dieses 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 Motoren, 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 Roboter Bastler (ebenfalls mit Stromregelung und L298). Das Board RN-Motor beruht auf dieser Schaltung &lt;br /&gt;
&lt;br /&gt;
Ein interessanter Forum Thread zu dieser Schaltung findet man 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;
==Hier nochmal die genaue Phasenbeschreibung der Ansteuerung==&lt;br /&gt;
&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;
&lt;br /&gt;
[[Bild:schrittmotorphasentabelle.gif|center]]&lt;br /&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 das 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 ode rmehrere 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 den Nennspannung verwenden damit der Motor nicht überhitzt.&lt;br /&gt;
&lt;br /&gt;
;Anschlussbelegung: Schrittmotoren haben 4, 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 einzelnen 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 Kennlienienverlauf 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 ohmische Widerstand der Spule angegeben, allerdings nicht immer. Wenn die Nennspannung und der Nennstrom angebenen ist, so kann man sich den Widerstand nach dem ohmischen Gesetz selbst berechnen (R=U/I). Ist 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 durhc diese Angaben bestimmen (P=I²*R)&lt;br /&gt;
&lt;br /&gt;
;Rastmoment: Das Rastmoment ist 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) bipolaren angesteuertet werden, so hat man die Wahl jewiels 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 etwas um den Faktor 1,41 (Wurzel aus 2) verringert werden damit der Motor nicht zu heiß 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äßt, kann man in etwa die notwendige Mindestspannung berechnen.  Wenn bei 5,1V ein Strom von 1 A fließt, so müsste der ohmische Widerstand R=U/i = 5,1V / 1 = '''5,1 Ohm''' betragen. Der Gesamtwiderstand der Reihenschaltung wäre demnach 10,2 Ohm. Wenn wir den Strom von 0,79A erreichen wollen, so müsste U=I*R  = 0,79*10,2 = '''8,06V''' 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 muss der STrom in etwas 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,41A * 2,55 = 3,6V&lt;br /&gt;
Auch da sist 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öhnen.&lt;br /&gt;
&lt;br /&gt;
Problematisch kann bei der Parallelschaltung mancher Motoren der niedrige ohmische 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;
&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]]&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;
* [http://www.roboternetz.de/phpBB2/dload.php?action=category&amp;amp;cat_id=2 L298 un L297 Datenblatt]&lt;br /&gt;
* [http://www.roboternetz.de/robotertutorial.html Robotertutorial (Projekt mit Schrittmotor)]&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.roboternetz.de/phpBB2/viewtopic.php?t=2741 Bequeme Schrittmotoransteuerung über RS232 oder I2C]&lt;br /&gt;
* [http://www.nanotec.de/ Nanotec]&lt;br /&gt;
* [http://www-users.rwth-aachen.de/thorsten.ostermann/schritt/sm_faq.htm Schrittmotor_Faq]&lt;br /&gt;
* [http://www.wolfgang-back.com/schrittmotor_demo.php Wolfgang Back´s 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;
&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;
'''Englische Links'''&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;
&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>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Schrittmotoren&amp;diff=6831</id>
		<title>Schrittmotoren</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Schrittmotoren&amp;diff=6831"/>
				<updated>2006-04-14T12:31:13Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Unverzichtbare Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Was ist ein Schrittmotor==&lt;br /&gt;
&lt;br /&gt;
Ein Schrittmotor (oft auch ''Stepper'' genannt) ist ein Gleichstrommotor, 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 Reluktanz- 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;
&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;
==Prinzip der Schrittmotoren==&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. 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) muß 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;
&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, wieviel 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;
==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. 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;
&lt;br /&gt;
[[Bild:l298standard.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Widerstand RS1, RS2: 1 oder 0,5 Ohm (bei größerer Belastung)&lt;br /&gt;
 Dioden: schnelle Dioden z.B. BYV27-200&lt;br /&gt;
&lt;br /&gt;
Die Schaltung läßt sich recht einfach auf einer Experimentierplatine  aufbauen. 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 (fett sind die wichtigen Anschlüsse):&lt;br /&gt;
&lt;br /&gt;
'''CW/CCW:'''&lt;br /&gt;
Gibt die Richtung an, in die der Motor bewegt werden soll&lt;br /&gt;
 &lt;br /&gt;
'''Clock:'''&lt;br /&gt;
Durch einen kurzen Impuls auf diese Leitung wird der Motor einen Schritt bewegt. &lt;br /&gt;
In einer Schleife braucht mal also nur diese Leitung kurz ein- und auszuschalten. &lt;br /&gt;
 &lt;br /&gt;
'''Half/Full:'''&lt;br /&gt;
Gewöhnlich legt man den Anschluss auf Masse. Legt man ihn auf 5 V, dann werden  &lt;br /&gt;
immer halbe Schritte durchgeführt, also doppelt soviele Schritte pro Umdrehung&lt;br /&gt;
 &lt;br /&gt;
'''Enable:'''&lt;br /&gt;
Wenn man diesen Anschluss auf Masse legt, wird die Motorspannung ausgeschaltet&lt;br /&gt;
 &lt;br /&gt;
'''Vref:'''&lt;br /&gt;
Hier muß eine Spannung zwischen 0 und 3 Volt angelegt werden. Die Spannung &lt;br /&gt;
legt den maximalen Motorstom fest.&lt;br /&gt;
&lt;br /&gt;
 VRef berechnet sich nach folgender Formel:&lt;br /&gt;
 Vref=I motorstrom * Rs (bei uns 1 Ohm) * 1,41&lt;br /&gt;
 Angenommen, Sie haben einen Motor, der 0,5 A Strom verträgt, in diesem Fall &lt;br /&gt;
 würde die Rechnung so aussehen Vref=0,5*1*1,41 &lt;br /&gt;
 Ergebnis: Vref=0,71 V&lt;br /&gt;
&lt;br /&gt;
Man muß also an Vref eine Spannung von 0,71 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;
Bringt Schrittmotor in Grundstellung (diesen Anschluss kann man meist vernachlässigen und unbelegt lassen)&lt;br /&gt;
 &lt;br /&gt;
'''Control, Sync, Home:'''&lt;br /&gt;
Diese Anschlüsse kann man meist vernachlässigen und unbelegt lassen&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. Ich kann die Schaltung nur empfehlen. &lt;br /&gt;
Ein interessanter Forum Thread zu oberer Schaltung findet man unter [[#Weblinks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:l298eigenbau.jpeg|center|framed|Meine erste Schrittmotoransteuerung. Nicht schön - aber es funktionierte :-)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:schaltungstep298.gif|thumb|Ansteuerung mit L298]]&lt;br /&gt;
&lt;br /&gt;
Hier nochmal ein größerer Schaltplan mit eingezeichnetem Annchlussstecker und Spannungsteiler.&lt;br /&gt;
   &lt;br /&gt;
Ein interessanter Forum Thread zu oberer Schaltung findet man unter [[#Weblinks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist halt 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 dieses 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 Motoren, 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 Roboter Bastler (ebenfalls mit Stromregelung und L298). Das Board RN-Motor beruht auf dieser Schaltung &lt;br /&gt;
&lt;br /&gt;
Ein interessanter Forum Thread zu dieser Schaltung findet man 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;
==Hier nochmal die genaue Phasenbeschreibung der Ansteuerung==&lt;br /&gt;
&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;
&lt;br /&gt;
[[Bild:schrittmotorphasentabelle.gif|center]]&lt;br /&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 das 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 ode rmehrere 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 den Nennspannung verwenden damit der Motor nicht überhitzt.&lt;br /&gt;
&lt;br /&gt;
;Anschlussbelegung: Schrittmotoren haben 4, 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 der ein nicht belasteter Schrittmotor anläuft ohne Schritte zu verlieren. Leider findet man auch diese Angabe wohl nur bei etwas teuren 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 einzelnen 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 das das Drehmoment bei der maximalen geplanten Drehzahl auch wirklich für die Aufgabe noch ausreichend ist. Leider wird das Betriebsmoment (also diese Kennlinie) bei vielen Motoren (isnbesondere bei Angeboten, kleineren Motoren usw.) nicht angegeben. Da der Kennlienienverlauf der Schrittmotoren jedoch eine gewisse Grundähnlichkeit aufweist, kann man in der Praxis deshalb oft auch mit der Haltemoment Angabe auskommen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Weniger oft notwendige Daten===&lt;br /&gt;
&lt;br /&gt;
;Widerstand: Manchmal wird der ohmische Widerstand der Spule angegeben, allerdings nicht immer. Wenn die Nennspannung und der Nennstrom angebenen ist, so kann man sich den Widerstand nach dem ohmischen Gesetz selbst berechnen (R=U/I). Ist 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 durhc diese Angaben bestimmen (P=I²*R)&lt;br /&gt;
&lt;br /&gt;
;Rastmoment: Das Rastmoment ist 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) bipolaren angesteuertet werden, so hat man die Wahl jewiels 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 etwas um den Faktor 1,41 (Wurzel aus 2) verringert werden damit der Motor nicht zu heiß 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äßt, kann man in etwa die notwendige Mindestspannung berechnen.  Wenn bei 5,1V ein Strom von 1 A fließt, so müsste der ohmische Widerstand R=U/i = 5,1V / 1 = '''5,1 Ohm''' betragen. Der Gesamtwiderstand der Reihenschaltung wäre demnach 10,2 Ohm. Wenn wir den Strom von 0,79A erreichen wollen, so müsste U=I*R  = 0,79*10,2 = '''8,06V''' 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 muss der STrom in etwas 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,41A * 2,55 = 3,6V&lt;br /&gt;
Auch da sist 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öhnen.&lt;br /&gt;
&lt;br /&gt;
Problematisch kann bei der Parallelschaltung mancher Motoren der niedrige ohmische 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;
&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]]&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;
* [http://www.roboternetz.de/phpBB2/dload.php?action=category&amp;amp;cat_id=2 L298 un L297 Datenblatt]&lt;br /&gt;
* [http://www.roboternetz.de/robotertutorial.html Robotertutorial (Projekt mit Schrittmotor)]&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.roboternetz.de/phpBB2/viewtopic.php?t=2741 Bequeme Schrittmotoransteuerung über RS232 oder I2C]&lt;br /&gt;
* [http://www.nanotec.de/ Nanotec]&lt;br /&gt;
* [http://www-users.rwth-aachen.de/thorsten.ostermann/schritt/sm_faq.htm Schrittmotor_Faq]&lt;br /&gt;
* [http://www.wolfgang-back.com/schrittmotor_demo.php Wolfgang Back´s 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;
&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;
'''Englische Links'''&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;
&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>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Schrittmotoren&amp;diff=6830</id>
		<title>Schrittmotoren</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Schrittmotoren&amp;diff=6830"/>
				<updated>2006-04-14T12:27:48Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Unverzichtbare Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Was ist ein Schrittmotor==&lt;br /&gt;
&lt;br /&gt;
Ein Schrittmotor (oft auch ''Stepper'' genannt) ist ein Gleichstrommotor, 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 Reluktanz- 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;
&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;
==Prinzip der Schrittmotoren==&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. 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) muß 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;
&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, wieviel 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;
==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. 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;
&lt;br /&gt;
[[Bild:l298standard.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Widerstand RS1, RS2: 1 oder 0,5 Ohm (bei größerer Belastung)&lt;br /&gt;
 Dioden: schnelle Dioden z.B. BYV27-200&lt;br /&gt;
&lt;br /&gt;
Die Schaltung läßt sich recht einfach auf einer Experimentierplatine  aufbauen. 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 (fett sind die wichtigen Anschlüsse):&lt;br /&gt;
&lt;br /&gt;
'''CW/CCW:'''&lt;br /&gt;
Gibt die Richtung an, in die der Motor bewegt werden soll&lt;br /&gt;
 &lt;br /&gt;
'''Clock:'''&lt;br /&gt;
Durch einen kurzen Impuls auf diese Leitung wird der Motor einen Schritt bewegt. &lt;br /&gt;
In einer Schleife braucht mal also nur diese Leitung kurz ein- und auszuschalten. &lt;br /&gt;
 &lt;br /&gt;
'''Half/Full:'''&lt;br /&gt;
Gewöhnlich legt man den Anschluss auf Masse. Legt man ihn auf 5 V, dann werden  &lt;br /&gt;
immer halbe Schritte durchgeführt, also doppelt soviele Schritte pro Umdrehung&lt;br /&gt;
 &lt;br /&gt;
'''Enable:'''&lt;br /&gt;
Wenn man diesen Anschluss auf Masse legt, wird die Motorspannung ausgeschaltet&lt;br /&gt;
 &lt;br /&gt;
'''Vref:'''&lt;br /&gt;
Hier muß eine Spannung zwischen 0 und 3 Volt angelegt werden. Die Spannung &lt;br /&gt;
legt den maximalen Motorstom fest.&lt;br /&gt;
&lt;br /&gt;
 VRef berechnet sich nach folgender Formel:&lt;br /&gt;
 Vref=I motorstrom * Rs (bei uns 1 Ohm) * 1,41&lt;br /&gt;
 Angenommen, Sie haben einen Motor, der 0,5 A Strom verträgt, in diesem Fall &lt;br /&gt;
 würde die Rechnung so aussehen Vref=0,5*1*1,41 &lt;br /&gt;
 Ergebnis: Vref=0,71 V&lt;br /&gt;
&lt;br /&gt;
Man muß also an Vref eine Spannung von 0,71 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;
Bringt Schrittmotor in Grundstellung (diesen Anschluss kann man meist vernachlässigen und unbelegt lassen)&lt;br /&gt;
 &lt;br /&gt;
'''Control, Sync, Home:'''&lt;br /&gt;
Diese Anschlüsse kann man meist vernachlässigen und unbelegt lassen&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. Ich kann die Schaltung nur empfehlen. &lt;br /&gt;
Ein interessanter Forum Thread zu oberer Schaltung findet man unter [[#Weblinks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:l298eigenbau.jpeg|center|framed|Meine erste Schrittmotoransteuerung. Nicht schön - aber es funktionierte :-)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:schaltungstep298.gif|thumb|Ansteuerung mit L298]]&lt;br /&gt;
&lt;br /&gt;
Hier nochmal ein größerer Schaltplan mit eingezeichnetem Annchlussstecker und Spannungsteiler.&lt;br /&gt;
   &lt;br /&gt;
Ein interessanter Forum Thread zu oberer Schaltung findet man unter [[#Weblinks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist halt 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 dieses 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 Motoren, 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 Roboter Bastler (ebenfalls mit Stromregelung und L298). Das Board RN-Motor beruht auf dieser Schaltung &lt;br /&gt;
&lt;br /&gt;
Ein interessanter Forum Thread zu dieser Schaltung findet man 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;
==Hier nochmal die genaue Phasenbeschreibung der Ansteuerung==&lt;br /&gt;
&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;
&lt;br /&gt;
[[Bild:schrittmotorphasentabelle.gif|center]]&lt;br /&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 das 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 ode rmehrere 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 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 den Nennspannung verwenden damit der Motor nicht überhitzt.&lt;br /&gt;
&lt;br /&gt;
;Anschlussbelegung: Schrittmotoren haben 4, 6 oder 8 Anschlußdrä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 der ein nicht belasteter Schrittmotor anläuft ohne Schritte zu verlieren. Leider findet man auch diese Angabe wohl nur bei etwas teuren 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 einzelnen 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 das das Drehmoment bei der maximalen geplanten Drehzahl auch wirklich für die Aufgabe noch ausreichend ist. Leider wird das Betriebsmoment (also diese Kennlinie) bei vielen Motoren (isnbesondere bei Angeboten, kleineren Motoren usw.) nicht angegeben. Da der Kennlienienverlauf der Schrittmotoren jedoch eine gewisse Grundähnlichkeit aufweist, kann man in der Praxis deshalb oft auch mit der Haltemoment Angabe auskommen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Weniger oft notwendige Daten===&lt;br /&gt;
&lt;br /&gt;
;Widerstand: Manchmal wird der ohmische Widerstand der Spule angegeben, allerdings nicht immer. Wenn die Nennspannung und der Nennstrom angebenen ist, so kann man sich den Widerstand nach dem ohmischen Gesetz selbst berechnen (R=U/I). Ist 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 durhc diese Angaben bestimmen (P=I²*R)&lt;br /&gt;
&lt;br /&gt;
;Rastmoment: Das Rastmoment ist 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) bipolaren angesteuertet werden, so hat man die Wahl jewiels 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 etwas um den Faktor 1,41 (Wurzel aus 2) verringert werden damit der Motor nicht zu heiß 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äßt, kann man in etwa die notwendige Mindestspannung berechnen.  Wenn bei 5,1V ein Strom von 1 A fließt, so müsste der ohmische Widerstand R=U/i = 5,1V / 1 = '''5,1 Ohm''' betragen. Der Gesamtwiderstand der Reihenschaltung wäre demnach 10,2 Ohm. Wenn wir den Strom von 0,79A erreichen wollen, so müsste U=I*R  = 0,79*10,2 = '''8,06V''' 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 muss der STrom in etwas 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,41A * 2,55 = 3,6V&lt;br /&gt;
Auch da sist 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öhnen.&lt;br /&gt;
&lt;br /&gt;
Problematisch kann bei der Parallelschaltung mancher Motoren der niedrige ohmische 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;
&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]]&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;
* [http://www.roboternetz.de/phpBB2/dload.php?action=category&amp;amp;cat_id=2 L298 un L297 Datenblatt]&lt;br /&gt;
* [http://www.roboternetz.de/robotertutorial.html Robotertutorial (Projekt mit Schrittmotor)]&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.roboternetz.de/phpBB2/viewtopic.php?t=2741 Bequeme Schrittmotoransteuerung über RS232 oder I2C]&lt;br /&gt;
* [http://www.nanotec.de/ Nanotec]&lt;br /&gt;
* [http://www-users.rwth-aachen.de/thorsten.ostermann/schritt/sm_faq.htm Schrittmotor_Faq]&lt;br /&gt;
* [http://www.wolfgang-back.com/schrittmotor_demo.php Wolfgang Back´s 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;
&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;
'''Englische Links'''&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;
&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>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Schrittmotoren&amp;diff=6829</id>
		<title>Schrittmotoren</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Schrittmotoren&amp;diff=6829"/>
				<updated>2006-04-14T12:24:57Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Unverzichtbare Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Was ist ein Schrittmotor==&lt;br /&gt;
&lt;br /&gt;
Ein Schrittmotor (oft auch ''Stepper'' genannt) ist ein Gleichstrommotor, 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 Reluktanz- 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;
&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;
==Prinzip der Schrittmotoren==&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. 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) muß 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;
&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, wieviel 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;
==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. 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;
&lt;br /&gt;
[[Bild:l298standard.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Widerstand RS1, RS2: 1 oder 0,5 Ohm (bei größerer Belastung)&lt;br /&gt;
 Dioden: schnelle Dioden z.B. BYV27-200&lt;br /&gt;
&lt;br /&gt;
Die Schaltung läßt sich recht einfach auf einer Experimentierplatine  aufbauen. 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 (fett sind die wichtigen Anschlüsse):&lt;br /&gt;
&lt;br /&gt;
'''CW/CCW:'''&lt;br /&gt;
Gibt die Richtung an, in die der Motor bewegt werden soll&lt;br /&gt;
 &lt;br /&gt;
'''Clock:'''&lt;br /&gt;
Durch einen kurzen Impuls auf diese Leitung wird der Motor einen Schritt bewegt. &lt;br /&gt;
In einer Schleife braucht mal also nur diese Leitung kurz ein- und auszuschalten. &lt;br /&gt;
 &lt;br /&gt;
'''Half/Full:'''&lt;br /&gt;
Gewöhnlich legt man den Anschluss auf Masse. Legt man ihn auf 5 V, dann werden  &lt;br /&gt;
immer halbe Schritte durchgeführt, also doppelt soviele Schritte pro Umdrehung&lt;br /&gt;
 &lt;br /&gt;
'''Enable:'''&lt;br /&gt;
Wenn man diesen Anschluss auf Masse legt, wird die Motorspannung ausgeschaltet&lt;br /&gt;
 &lt;br /&gt;
'''Vref:'''&lt;br /&gt;
Hier muß eine Spannung zwischen 0 und 3 Volt angelegt werden. Die Spannung &lt;br /&gt;
legt den maximalen Motorstom fest.&lt;br /&gt;
&lt;br /&gt;
 VRef berechnet sich nach folgender Formel:&lt;br /&gt;
 Vref=I motorstrom * Rs (bei uns 1 Ohm) * 1,41&lt;br /&gt;
 Angenommen, Sie haben einen Motor, der 0,5 A Strom verträgt, in diesem Fall &lt;br /&gt;
 würde die Rechnung so aussehen Vref=0,5*1*1,41 &lt;br /&gt;
 Ergebnis: Vref=0,71 V&lt;br /&gt;
&lt;br /&gt;
Man muß also an Vref eine Spannung von 0,71 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;
Bringt Schrittmotor in Grundstellung (diesen Anschluss kann man meist vernachlässigen und unbelegt lassen)&lt;br /&gt;
 &lt;br /&gt;
'''Control, Sync, Home:'''&lt;br /&gt;
Diese Anschlüsse kann man meist vernachlässigen und unbelegt lassen&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. Ich kann die Schaltung nur empfehlen. &lt;br /&gt;
Ein interessanter Forum Thread zu oberer Schaltung findet man unter [[#Weblinks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:l298eigenbau.jpeg|center|framed|Meine erste Schrittmotoransteuerung. Nicht schön - aber es funktionierte :-)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:schaltungstep298.gif|thumb|Ansteuerung mit L298]]&lt;br /&gt;
&lt;br /&gt;
Hier nochmal ein größerer Schaltplan mit eingezeichnetem Annchlussstecker und Spannungsteiler.&lt;br /&gt;
   &lt;br /&gt;
Ein interessanter Forum Thread zu oberer Schaltung findet man unter [[#Weblinks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist halt 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 dieses 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 Motoren, 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 Roboter Bastler (ebenfalls mit Stromregelung und L298). Das Board RN-Motor beruht auf dieser Schaltung &lt;br /&gt;
&lt;br /&gt;
Ein interessanter Forum Thread zu dieser Schaltung findet man 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;
==Hier nochmal die genaue Phasenbeschreibung der Ansteuerung==&lt;br /&gt;
&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;
&lt;br /&gt;
[[Bild:schrittmotorphasentabelle.gif|center]]&lt;br /&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 das 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 ode rmehrere 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 das 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 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 den Nennspannung verwenden damit der Motor nicht überhitzt.&lt;br /&gt;
&lt;br /&gt;
;Anschlussbelegung: Schrittmotoren haben 4, 6 oder 8 Anschlußdrä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 der ein nicht belasteter Schrittmotor anläuft ohne Schritte zu verlieren. Leider findet man auch diese Angabe wohl nur bei etwas teuren 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 einzelnen 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 das das Drehmoment bei der maximalen geplanten Drehzahl auch wirklich für die Aufgabe noch ausreichend ist. Leider wird das Betriebsmoment (also diese Kennlinie) bei vielen Motoren (isnbesondere bei Angeboten, kleineren Motoren usw.) nicht angegeben. Da der Kennlienienverlauf der Schrittmotoren jedoch eine gewisse Grundähnlichkeit aufweist, kann man in der Praxis deshalb oft auch mit der Haltemoment Angabe auskommen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Weniger oft notwendige Daten===&lt;br /&gt;
&lt;br /&gt;
;Widerstand: Manchmal wird der ohmische Widerstand der Spule angegeben, allerdings nicht immer. Wenn die Nennspannung und der Nennstrom angebenen ist, so kann man sich den Widerstand nach dem ohmischen Gesetz selbst berechnen (R=U/I). Ist 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 durhc diese Angaben bestimmen (P=I²*R)&lt;br /&gt;
&lt;br /&gt;
;Rastmoment: Das Rastmoment ist 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) bipolaren angesteuertet werden, so hat man die Wahl jewiels 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 etwas um den Faktor 1,41 (Wurzel aus 2) verringert werden damit der Motor nicht zu heiß 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äßt, kann man in etwa die notwendige Mindestspannung berechnen.  Wenn bei 5,1V ein Strom von 1 A fließt, so müsste der ohmische Widerstand R=U/i = 5,1V / 1 = '''5,1 Ohm''' betragen. Der Gesamtwiderstand der Reihenschaltung wäre demnach 10,2 Ohm. Wenn wir den Strom von 0,79A erreichen wollen, so müsste U=I*R  = 0,79*10,2 = '''8,06V''' 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 muss der STrom in etwas 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,41A * 2,55 = 3,6V&lt;br /&gt;
Auch da sist 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öhnen.&lt;br /&gt;
&lt;br /&gt;
Problematisch kann bei der Parallelschaltung mancher Motoren der niedrige ohmische 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;
&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]]&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;
* [http://www.roboternetz.de/phpBB2/dload.php?action=category&amp;amp;cat_id=2 L298 un L297 Datenblatt]&lt;br /&gt;
* [http://www.roboternetz.de/robotertutorial.html Robotertutorial (Projekt mit Schrittmotor)]&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.roboternetz.de/phpBB2/viewtopic.php?t=2741 Bequeme Schrittmotoransteuerung über RS232 oder I2C]&lt;br /&gt;
* [http://www.nanotec.de/ Nanotec]&lt;br /&gt;
* [http://www-users.rwth-aachen.de/thorsten.ostermann/schritt/sm_faq.htm Schrittmotor_Faq]&lt;br /&gt;
* [http://www.wolfgang-back.com/schrittmotor_demo.php Wolfgang Back´s 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;
&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;
'''Englische Links'''&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;
&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>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Schrittmotoren&amp;diff=6828</id>
		<title>Schrittmotoren</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Schrittmotoren&amp;diff=6828"/>
				<updated>2006-04-14T12:21:55Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Unverzichtbare Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Was ist ein Schrittmotor==&lt;br /&gt;
&lt;br /&gt;
Ein Schrittmotor (oft auch ''Stepper'' genannt) ist ein Gleichstrommotor, 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 Reluktanz- 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;
&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;
==Prinzip der Schrittmotoren==&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. 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) muß 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;
&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, wieviel 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;
==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. 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;
&lt;br /&gt;
[[Bild:l298standard.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Widerstand RS1, RS2: 1 oder 0,5 Ohm (bei größerer Belastung)&lt;br /&gt;
 Dioden: schnelle Dioden z.B. BYV27-200&lt;br /&gt;
&lt;br /&gt;
Die Schaltung läßt sich recht einfach auf einer Experimentierplatine  aufbauen. 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 (fett sind die wichtigen Anschlüsse):&lt;br /&gt;
&lt;br /&gt;
'''CW/CCW:'''&lt;br /&gt;
Gibt die Richtung an, in die der Motor bewegt werden soll&lt;br /&gt;
 &lt;br /&gt;
'''Clock:'''&lt;br /&gt;
Durch einen kurzen Impuls auf diese Leitung wird der Motor einen Schritt bewegt. &lt;br /&gt;
In einer Schleife braucht mal also nur diese Leitung kurz ein- und auszuschalten. &lt;br /&gt;
 &lt;br /&gt;
'''Half/Full:'''&lt;br /&gt;
Gewöhnlich legt man den Anschluss auf Masse. Legt man ihn auf 5 V, dann werden  &lt;br /&gt;
immer halbe Schritte durchgeführt, also doppelt soviele Schritte pro Umdrehung&lt;br /&gt;
 &lt;br /&gt;
'''Enable:'''&lt;br /&gt;
Wenn man diesen Anschluss auf Masse legt, wird die Motorspannung ausgeschaltet&lt;br /&gt;
 &lt;br /&gt;
'''Vref:'''&lt;br /&gt;
Hier muß eine Spannung zwischen 0 und 3 Volt angelegt werden. Die Spannung &lt;br /&gt;
legt den maximalen Motorstom fest.&lt;br /&gt;
&lt;br /&gt;
 VRef berechnet sich nach folgender Formel:&lt;br /&gt;
 Vref=I motorstrom * Rs (bei uns 1 Ohm) * 1,41&lt;br /&gt;
 Angenommen, Sie haben einen Motor, der 0,5 A Strom verträgt, in diesem Fall &lt;br /&gt;
 würde die Rechnung so aussehen Vref=0,5*1*1,41 &lt;br /&gt;
 Ergebnis: Vref=0,71 V&lt;br /&gt;
&lt;br /&gt;
Man muß also an Vref eine Spannung von 0,71 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;
Bringt Schrittmotor in Grundstellung (diesen Anschluss kann man meist vernachlässigen und unbelegt lassen)&lt;br /&gt;
 &lt;br /&gt;
'''Control, Sync, Home:'''&lt;br /&gt;
Diese Anschlüsse kann man meist vernachlässigen und unbelegt lassen&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. Ich kann die Schaltung nur empfehlen. &lt;br /&gt;
Ein interessanter Forum Thread zu oberer Schaltung findet man unter [[#Weblinks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:l298eigenbau.jpeg|center|framed|Meine erste Schrittmotoransteuerung. Nicht schön - aber es funktionierte :-)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:schaltungstep298.gif|thumb|Ansteuerung mit L298]]&lt;br /&gt;
&lt;br /&gt;
Hier nochmal ein größerer Schaltplan mit eingezeichnetem Annchlussstecker und Spannungsteiler.&lt;br /&gt;
   &lt;br /&gt;
Ein interessanter Forum Thread zu oberer Schaltung findet man unter [[#Weblinks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist halt 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 dieses 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 Motoren, 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 Roboter Bastler (ebenfalls mit Stromregelung und L298). Das Board RN-Motor beruht auf dieser Schaltung &lt;br /&gt;
&lt;br /&gt;
Ein interessanter Forum Thread zu dieser Schaltung findet man 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;
==Hier nochmal die genaue Phasenbeschreibung der Ansteuerung==&lt;br /&gt;
&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;
&lt;br /&gt;
[[Bild:schrittmotorphasentabelle.gif|center]]&lt;br /&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 das 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 ode rmehrere 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 wieviel 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 das 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 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 den Nennspannung verwenden damit der Motor nicht überhitzt.&lt;br /&gt;
&lt;br /&gt;
;Anschlussbelegung: Schrittmotoren haben 4, 6 oder 8 Anschlußdrä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 der ein nicht belasteter Schrittmotor anläuft ohne Schritte zu verlieren. Leider findet man auch diese Angabe wohl nur bei etwas teuren 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 einzelnen 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 das das Drehmoment bei der maximalen geplanten Drehzahl auch wirklich für die Aufgabe noch ausreichend ist. Leider wird das Betriebsmoment (also diese Kennlinie) bei vielen Motoren (isnbesondere bei Angeboten, kleineren Motoren usw.) nicht angegeben. Da der Kennlienienverlauf der Schrittmotoren jedoch eine gewisse Grundähnlichkeit aufweist, kann man in der Praxis deshalb oft auch mit der Haltemoment Angabe auskommen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Weniger oft notwendige Daten===&lt;br /&gt;
&lt;br /&gt;
;Widerstand: Manchmal wird der ohmische Widerstand der Spule angegeben, allerdings nicht immer. Wenn die Nennspannung und der Nennstrom angebenen ist, so kann man sich den Widerstand nach dem ohmischen Gesetz selbst berechnen (R=U/I). Ist 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 durhc diese Angaben bestimmen (P=I²*R)&lt;br /&gt;
&lt;br /&gt;
;Rastmoment: Das Rastmoment ist 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) bipolaren angesteuertet werden, so hat man die Wahl jewiels 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 etwas um den Faktor 1,41 (Wurzel aus 2) verringert werden damit der Motor nicht zu heiß 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äßt, kann man in etwa die notwendige Mindestspannung berechnen.  Wenn bei 5,1V ein Strom von 1 A fließt, so müsste der ohmische Widerstand R=U/i = 5,1V / 1 = '''5,1 Ohm''' betragen. Der Gesamtwiderstand der Reihenschaltung wäre demnach 10,2 Ohm. Wenn wir den Strom von 0,79A erreichen wollen, so müsste U=I*R  = 0,79*10,2 = '''8,06V''' 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 muss der STrom in etwas 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,41A * 2,55 = 3,6V&lt;br /&gt;
Auch da sist 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öhnen.&lt;br /&gt;
&lt;br /&gt;
Problematisch kann bei der Parallelschaltung mancher Motoren der niedrige ohmische 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;
&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]]&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;
* [http://www.roboternetz.de/phpBB2/dload.php?action=category&amp;amp;cat_id=2 L298 un L297 Datenblatt]&lt;br /&gt;
* [http://www.roboternetz.de/robotertutorial.html Robotertutorial (Projekt mit Schrittmotor)]&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.roboternetz.de/phpBB2/viewtopic.php?t=2741 Bequeme Schrittmotoransteuerung über RS232 oder I2C]&lt;br /&gt;
* [http://www.nanotec.de/ Nanotec]&lt;br /&gt;
* [http://www-users.rwth-aachen.de/thorsten.ostermann/schritt/sm_faq.htm Schrittmotor_Faq]&lt;br /&gt;
* [http://www.wolfgang-back.com/schrittmotor_demo.php Wolfgang Back´s 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;
&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;
'''Englische Links'''&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;
&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>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Sensorarten&amp;diff=6827</id>
		<title>Sensorarten</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Sensorarten&amp;diff=6827"/>
				<updated>2006-04-14T10:04:18Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* PIR Passiv Infrarot Sensoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Welche Sensorarten gibt es==&lt;br /&gt;
Damit sich ein Roboter in seiner Umgebung bewegen kann, ohne an Hindernisse anzustoßen, und damit er ein Ziel finden und ansteuern kann, muß er irgendwie seine Umwelt &amp;quot;wahrnehmen&amp;quot;. &lt;br /&gt;
Hauptanwendung für diese Informationen aus der Umwelt ist die [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
==Bumpers==&lt;br /&gt;
Als Bumpers bezeichnet man eine Art Stoßstange, die einen Mikro-Switch auslöst. &lt;br /&gt;
&lt;br /&gt;
[[Bild:microschalter.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
Die Auswertung erfolgt am besten digital an einem Pin mit Pull-up Widerstand. Man kann den Eingang pollen (abfragen), aber auch einen Interrupt auslösen lassen. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Whiskers (Fühler)==&lt;br /&gt;
Das sind flexible Kunststoff-Streifen von ca. 10 cm Länge, eigentlich für Datenhandschuhe vorgesehen. Aber man kann sie auch als Fühler einsetzen, und daher auch für die Kollisions-Sensorik verwenden. Beim Verbiegen steigt der Widerstand an.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:flexs_200.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
Um zu messen, wird mit einem zweiten Widerstand ein Spannungsteiler aufgebaut, der dann mit einem Analog-Eingang einen Grad der Verbiegung erkennen läßt. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Incremental-Geber==&lt;br /&gt;
Dienen zur Erfassung von Drehzahl bzw. der Messung von Wegstrecken&lt;br /&gt;
===Drehgeber Sharp GP1A30===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt; http://www.roboternetz.de/wiki/uploads/Main/gp1a30.jpg &amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim Sharp GP1A30 handelt es sich um eine Gabellichtschranke mit inkrementaler Drehgeberfunktion. Im Gegensatz zu herkömmlichen Gabellichtschranken können mit dieser sowohl Drehzahl als auch Drehrichtung ermittelt werden. Notwendig sind dafür nur 2 digitale Ports. Verzichtet man auf die Auswertung der Drehrichtung, reicht nur ein Port.&lt;br /&gt;
Der Sensor hat den Vorteil das die Signale bereits TTL kompatibel sind und direkt an ein Controllerboard angeschlossen werden können. Ein Beispielprogramm zu [[RN-Control]] findet man hier&lt;br /&gt;
&lt;br /&gt;
* [[Beispiel Drehzahlmessung mit RN-Control]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:GP1A30.gif|center]]&lt;br /&gt;
&lt;br /&gt;
Die Auswertung inkrementaler Drehgeber ist recht einfach. Ein Ausgang liefert einen Impuls pro Markierung (Scheibe auf der Welle). Prüft man bei jedem Impuls (Flanke) noch gleichzeitig den aktuellen Pegel des zweiten Ausganges, so kann daraus die Drehrichtung abgeleitet werden. &lt;br /&gt;
&lt;br /&gt;
Der Signalverlauf an den Sensorausgängen ist phasenversetzt:&lt;br /&gt;
&lt;br /&gt;
[[Bild:inkremental1.gif|center]]&lt;br /&gt;
&lt;br /&gt;
==Optische Sensoren==&lt;br /&gt;
===Helligkeit=== &lt;br /&gt;
Die Hauptanwendung solcher Sensoren ist, den hellsten Fleck im Raum zu finden.&lt;br /&gt;
Dies ist auch Teil vieler Roboterwettbewerbe. (Robo Callenge (2002 sic!), 'Ein Platz an der Sonne')&lt;br /&gt;
&lt;br /&gt;
Solche Sensoren können einfache [[LDR]]s oder [[Photodioden]] bzw. [[Phototransistoren]] sein.&lt;br /&gt;
LDRs haben den Vorteil, dass sie relativ hoch aussteuern, der große Nachteil ist aber, dass diese Sensoren ziemlich Wärmeempfindlich und etwas träge.&lt;br /&gt;
Photodioden und Phototransistoren haben den Vorteil, dass sie sehr genau sind, aber nicht besonders hoch aussteuern. Diese sollte man evtl. über einen OpAmp verstärken.&lt;br /&gt;
&lt;br /&gt;
[[Bild:fotowiderstand.jpg|center|framed|Ein typischer Fotowiderstand]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:SFH300.jpg|center|framed|SFH300, ein typischer Phototransistor]]&lt;br /&gt;
&lt;br /&gt;
Die Suche nach dem Hellsten Fleck im Rraum ist wie ich finde ein gutes Einsteigerthema!&lt;br /&gt;
&lt;br /&gt;
===Distanzsensor IS471F===&lt;br /&gt;
&lt;br /&gt;
IS471F - Hindernisserkennung mit Infrarot Distanzsensor&lt;br /&gt;
&lt;br /&gt;
Das hier vorgestellte IC IS471F erlaubt eine einfach und sogar recht preisgünstige Hinternisserkennung per Infarot. Dazu muß im wesentlichen nur noch eine Infrarot-Diode an das IC angeschlossen werden. Das modulierte Licht wird von einem Gegenstand direkt auf das IC zurückgeworfen und somit das Hinterniss erkannt. Tageslicht/Fremdlicht stört den IS471 überhaupt nicht, da das Licht mit einer bestimmten Frequenz moduliert wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:is471.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der normale Schaltungsaufbau sieht also wie oben abgebildet aus! In der Praxis kann das dann in etwa so aussehen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:is471beispiel.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das englische Datenblatt findet man im Roboternetz-Download-Bereich&lt;br /&gt;
&lt;br /&gt;
Die normale Reichweite ist in gewissen Grenzen abhängig von der Farbe des Hinternisses. In der Regel reicht es jedoch durchaus einige cm so das langsame Roboter durchaus sehr gut damit zurecht kommen. Durch besonders helle Infrarot LED´s und durch zusätzlich LED-Fassungen kann man die Reichweite erhöhen. Wem das noch nicht reicht, der kann über einen zusätzlichen Transistor die Strahlungsleistung der LED noch weiter erhöhen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:is471verstaerkung.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://www.roboternetz.de/bilder/mehrereis471.gif&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Sharp Infrarotsensoren===&lt;br /&gt;
&lt;br /&gt;
Sharp hat eine ganz interessante Serie von Bausteinen herausgebracht mit denen ein Roboter sogar recht genau Entfernungen messen kann. Das Messergebnis ist nahezu unabhängig von der Farbe und Helligkeit des gemessenen Objektes. Die Ansteuerung ist sehr einfach, der Sensorausgang kann zum Beispiel direkt an einen analogen Eingang eines Mikrocontrollers angeschlossen werden. Die Sensoren sind unter den Roboter-Bastlern weit verbreitet. &lt;br /&gt;
Bei vielen Händlern erhältlich kosten die Sensoren derzeit je nach Typ und Händlerspanne zwischen 13 bis 25 Euro.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sharpentfernungssensor.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oft werden selbst in kleinen Roboter-Projekten mehrere dieser Sensoren genutzt da sie nur einen äußerst engen Erfassungsbereich haben. Sie eignen sich daher sehr gut zur Vermessung einer Umgebung, insbesondere dann wenn Sie drehbar auf einem Servo montiert werden. Als Kollisionsschutz sind sie wegen dem engen Winkel nur bedingt geeignet, zu diesem Zweck eignen sich zum Beispiel Ultraschallsensoren besser.&lt;br /&gt;
Das Funktionsprinzip der Sensoren ist einfach. Der Sensor besteht aus Sender und Empfänger. Der Sender sendet einen Infrarot-Strahl aus, der vom Hindernis reflektiert wird. Je nach Entfernung trifft der reflektierte Strahl an einer unterschiedlichen Stelle auf den Empfänger (ein sog. Position Sensitive Device, PSD). Der Empfänger setzt den Auftreffpunkt in einen analogen Spannungswert um. Eine schöne Skizze dazu:  &lt;br /&gt;
&lt;br /&gt;
[[Bild:sharpfunktion.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Einige der beliebtesten Bausteine sind:'''&lt;br /&gt;
&lt;br /&gt;
====Sharp GP2D12==== &lt;br /&gt;
Distanz 10 - 80 cm - Entfernung wird durch analoge Spannung am Ausgang übermittelt&lt;br /&gt;
Dies ist der am häufigsten eingesetzte Sharp Typ bei mobilen Robotern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:GP2D12anschluss.gif|center]]&lt;br /&gt;
&lt;br /&gt;
====Sharp GP2YA21YK==== &lt;br /&gt;
Distanz 10 - 80 cm - Entfernung wird durch analoge Spannung am Ausgang übermittelt &lt;br /&gt;
&lt;br /&gt;
====Sharp GP2D120====&lt;br /&gt;
Distanz 4 - 30 cm - Entfernung wird durch analoge Spannung am Ausgang übermittelt&lt;br /&gt;
&lt;br /&gt;
====Sharp GP2Y0A02YK====&lt;br /&gt;
Distanz 20 - 150 cm - Entfernung wird durch analoge Spannung am Ausgang übermittelt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://www.shop.robotikhardware.de/shop/catalog/images/artikelbilder/sensoren/gp2y0a02yk_diagramm.gif&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Sharp GP2D02====&lt;br /&gt;
Distanz 10 - 80 cm - Entfernung wird durch 8 Bit Digitalausgang übermittelt&lt;br /&gt;
&lt;br /&gt;
====Sharp GP2D150====&lt;br /&gt;
Distanz 3-30 cm - 1 Bit Schaltausgang  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datenblätter zu den oberen Sensoren findet man im Download-Bereich des Roboternetz, siehe unter [[#Weblinks]].&lt;br /&gt;
 &lt;br /&gt;
Um die analogen Spannung der Sensoren in eine Entfernung umzurechnen, kann man sich mit Hilfe des Datenblattes oder einfacher Probemessungen Tabellen erstellen, welche dann vom Controller zur Umsetzung genutzt werden.&lt;br /&gt;
Bequemer ist allerdings eine Näherungsformel:&lt;br /&gt;
&lt;br /&gt;
====Formel zur Entfernungsberechnung==== &lt;br /&gt;
 D = A/(X-B) &lt;br /&gt;
&lt;br /&gt;
 D ist die Entfernung &lt;br /&gt;
 X ist der Ausgabewert des Sensors &lt;br /&gt;
 A ist die Steigung der Kurve A/X &lt;br /&gt;
 B ist der Offset der Kurve &lt;br /&gt;
&lt;br /&gt;
Die Konstanten A und B ermittelt man am besten über zwei Probemessungen: &lt;br /&gt;
&lt;br /&gt;
D und X sind die Entfernung und der Ausgabewert der ersten Messung (z.B. bei 20 cm) &lt;br /&gt;
D' und X' sind die Entfernung und der Ausgabewert der zweiten Messung (z.B. bei 60 cm) &lt;br /&gt;
&lt;br /&gt;
 A = ((X' - X) * D' * D) /(D - D' ) &lt;br /&gt;
 B = (D' * X' - D * X) /(D' - D) &lt;br /&gt;
&lt;br /&gt;
====GP2D12 Messkurve====&lt;br /&gt;
&lt;br /&gt;
[[Bild:gpd12kurve.gif|center]]&lt;br /&gt;
&lt;br /&gt;
====GPD120 Messkurve====&lt;br /&gt;
&lt;br /&gt;
[[Bild:gpd120kurve.gif|center]]&lt;br /&gt;
&lt;br /&gt;
==Ultraschall Sensoren== &lt;br /&gt;
===Ultraschallsensoren SRF04 und SRF08===&lt;br /&gt;
Die Firma '''Devantech''' hat eine Serie von sehr günstigen und kleinen Ultraschallsensoren entwickelt, die sich im Bereich &amp;quot;autonome Robotersysteme&amp;quot; durchgesetzt haben. Sie sind sehr verbreitet, da sie auch für &amp;quot;Hobby-Robotiker&amp;quot; erschwinglich sind und es sich nicht lohnen würde vergleichbare Module selber zu bauen, da diese meistens ungenauer und teurer wären.&lt;br /&gt;
&lt;br /&gt;
Bekannt wurde die Serie durch den '''SRF04'''. Mit seinen kleinen Abmessungen, der niedrigen Stromaufnahme und der hohen Genauigkeit ist er für kleine Messaufgaben im Entfernungsbereich von 3cm bis 3m gut geeignet. Der SRF04 kann einen 3cm dicken Besenstiel in 2m Entfernung erkennen und wird durch ein [[PWM]]-Signal ausgewertet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:srf_04a.jpg]] [[Bild:srf_04.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Nachfolger des SRF04 ist der noch erfolgreichere '''SRF08''', der nun über den [[I2C]]-Bus ausgewertet werden kann und über eine Reichweite von 3cm bis 6m verfügt. Er hat eine noch kleinere Stromaufnahme und zusätzlich befindet sich auf der Platinenfront ein Fotowiderstand(LDR) dessen Lichtmesswerte sich ebenfalls über den [[I2C]]-Bus auswerten lassen. Durch den SRF08 wird es möglich auch bis zu 16 Mehrfachechos, von weiter hinten gelegenen Gegenständen, auszuwerten, die bei dem SRF04 ignoriert wurden. Über den [[I2C]]-Bus kann man die Messwerte in cm, zoll und in der Laufzeit µs auslesen und spart sich somit die externe Auswertung der Laufzeit, wie bei dem SRF04. Weiterhin können insgesamt 16 SRF08-Module an einen [[I2C]]-Bus angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:srf08_a.jpg]]  [[Bild:srf08_b.jpg]]&lt;br /&gt;
&lt;br /&gt;
===SRF08 Programmbeispiel===&lt;br /&gt;
SFR08 Programm Beispiel mit [[Bascom]]&lt;br /&gt;
Über die grundsätzliche Behandlung des [[I2C]]-Bus mit [[Bascom]] kann man [[I2C|hier]] nachlesen. &lt;br /&gt;
&lt;br /&gt;
 Const Sf08_adr_0 = &amp;amp;HE0             ' I2C Adresse&lt;br /&gt;
 Const Sf08_c_range = 100            ' Reichweite&lt;br /&gt;
 Const Sf08_c_gain = 1               ' Empfindlichkeit&lt;br /&gt;
&lt;br /&gt;
Die Adresse ist der Default-Wert für den Sensor, und kann eingestellt werden. &lt;br /&gt;
Range und Gain sind anzupassen, die angegeben Werte sind aber mal grundsätzlich verwendbar.&lt;br /&gt;
&lt;br /&gt;
'''Setup'''&lt;br /&gt;
Nach dem Reset sind einmal Range und Gain zu setzen.&lt;br /&gt;
&lt;br /&gt;
'''Setzen Range'''&lt;br /&gt;
&lt;br /&gt;
      I2cstart&lt;br /&gt;
      I2cwbyte Sf08_adr_0   ' Device I2C Adresse&lt;br /&gt;
      I2cwbyte 2            ' register &amp;quot;range&amp;quot;&lt;br /&gt;
      I2cwbyte Sf08_c_range  &lt;br /&gt;
      I2cstop&lt;br /&gt;
 &lt;br /&gt;
'''Setzen Gain'''&lt;br /&gt;
&lt;br /&gt;
      I2cstart&lt;br /&gt;
      I2cwbyte Sf08_adr_0   ' Device I2C Adresse&lt;br /&gt;
      I2cwbyte 1            ' register &amp;quot;gain&amp;quot;&lt;br /&gt;
      I2cwbyte Sf08_c_gain    &lt;br /&gt;
      I2cstop&lt;br /&gt;
&lt;br /&gt;
'''Abfrage Trigger'''&lt;br /&gt;
&lt;br /&gt;
Die Abfrage soll laut Beschreibung in zwei Schritten erfolgen, zwischen denen ca 70 mS gewartet werden soll. Diese Zeit braucht das Gerät zum Messen. &lt;br /&gt;
&lt;br /&gt;
'''Trigger'''  &lt;br /&gt;
      I2cstart&lt;br /&gt;
      I2cwbyte Sf08_adr_0   ' Device I2C Adresse&lt;br /&gt;
      I2cwbyte 0            ' register &amp;quot;Trigger&amp;quot;&lt;br /&gt;
      I2cwbyte 81           ' Meßwert in Zentimetern&lt;br /&gt;
&lt;br /&gt;
      Waitms 70 &lt;br /&gt;
&lt;br /&gt;
'''Ergebnis abholen'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 DIM Lsb as Byte&lt;br /&gt;
 DIM Msb as Byte&lt;br /&gt;
 DIM IVal as word&lt;br /&gt;
&lt;br /&gt;
      I2cstart              ' Repeated Start&lt;br /&gt;
      I2cwbyte Sf08_adr_0   ' Device I2C Adresse&lt;br /&gt;
      I2cwbyte 2            ' Meßwert US&lt;br /&gt;
&lt;br /&gt;
      I2cstart                 ' repeated Start&lt;br /&gt;
      I2cwbyte Sf08_adr_0 + 1  ' Device I2C Adresse READ!&lt;br /&gt;
      I2crbyte Msb , Ack      ' Bit 8-15&lt;br /&gt;
      I2crbyte Lsb , Nack     ' Bit 0-7&lt;br /&gt;
      I2cstop&lt;br /&gt;
&lt;br /&gt;
      Ival = Makeint(lsb , Msb) ' umwandeln in Word (16 Bit)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SRF10 Ultraschallsensor ===&lt;br /&gt;
SRF10 ist quasi der Nachfolger von SRF08. Er bietet die gleiche Leistung und ist sogar gegenüber Spannungschankungen noch etwas unempfindlicher als der Vorgänger. Der größte Vorteil besteht jedoch darin das er ca. 1/3 kleiner als sein Vorgänger ist.   &lt;br /&gt;
&lt;br /&gt;
[[Bild:srf10foto1.jpg]] [[Bild:srf10foto2.gif]]&lt;br /&gt;
&lt;br /&gt;
Die technischen Daten sind ähnlich:&lt;br /&gt;
* Betriebsspannung: 5V &lt;br /&gt;
* Stromaufnahme: ca. 3mA Standby, ca. 15mA während des Messens Frequenz: 40KHz &lt;br /&gt;
* Maximale Reichweite: 6 m &lt;br /&gt;
* Minimale Reichweite: 4 cm &lt;br /&gt;
* Messwerterfassung: intern, kein externer Controller zur Zeitmessung notwendig &lt;br /&gt;
* Interface: Standard – I2C (passend zu zahlreichen Controllerboards, z.B. RN-Control) &lt;br /&gt;
* Ausgabeformat: µs, cm oder Zoll &lt;br /&gt;
* Feature: Analogverstärkung 40 - 700 (einstellbar, 16 Stufen) &lt;br /&gt;
* Abmessungen: 32mm x 15mm x 10mm &lt;br /&gt;
* Hersteller: Devantech Ltd&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[[Ultraschall_SRF10_an_RN-Control|Programmbeispiel in Bascom]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:srf10ausbreitung.gif|center]]&lt;br /&gt;
&lt;br /&gt;
==Kompaß== &lt;br /&gt;
===Kompaß-Modul CMPS03===&lt;br /&gt;
Laut der Doku ist diese Modul speziell für die Bedürnisse von Robotern gestaltet worden. Es mißt seine Lage relativ zum Erdmagnetfeld und liefert diesen Wert&lt;br /&gt;
* Als PWM-Signal &lt;br /&gt;
* Über I2C entweder 0-255 als Byte oder&lt;br /&gt;
* 0-3599 als 16-Bit Wert (MSB first)&lt;br /&gt;
&lt;br /&gt;
In der vorliegenden Doku ist eine fixe I2C-Adresse von 0xC0 angegeben. Was leider noch fehlt, sind Angaben, ob und wie diese Adresse geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Bei waagrechter Montage ist das also ein Kompaß, bei senkrechter Montage dieser Module kann man auch die Neigung in Nord-Süd-Richtung messen. Hierzu sind 2 Module nötig, die zueinander um 90° gedreht angeordnet sein müssen. Die Neigung in Ost-West-Richtung zu messen, ist dagegen leider nicht möglich.&lt;br /&gt;
&lt;br /&gt;
Das Ganze ist eine Anwendung des Philips-KMZ51 Magnet-Feld-Sensors mittels eines PIC16F872&lt;br /&gt;
&lt;br /&gt;
Gelegentlich sollte das Modul kalibriert werden. Das kann über den I2C-Bus, aber auch mittels einen Pins am Modul initiiert werden. Dann muß das Module langsam um 360 Grad gedreht werden. Dabei nimmt das Modul 4 Meßpunkte auf und speichert sie im EEPROM. &lt;br /&gt;
&lt;br /&gt;
[[Bild:cmps3pin.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Beschleunigung==&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
==Temperatur== &lt;br /&gt;
===NTCs===&lt;br /&gt;
===PTCs===&lt;br /&gt;
===Temperatur-Sensor LM75===&lt;br /&gt;
&lt;br /&gt;
[[Bild:lm75.gif|center]]&lt;br /&gt;
&lt;br /&gt;
Dieser Chip von National Semiconductors kann die Umgebungstemperatur mit einer Genauigkeit von 0.5&amp;lt;sup&amp;gt;o&amp;lt;/sup&amp;gt; Grad Celsius messen. Das angegebene Bereich ist -25&amp;lt;sup&amp;gt;o&amp;lt;/sup&amp;gt; bis 100&amp;lt;sup&amp;gt;o&amp;lt;/sup&amp;gt; C. Es wird zweierlei geboten:&lt;br /&gt;
* Ein Schaltausgang - Wenn man also z.B. einen Ventilator einschalten möchte&lt;br /&gt;
* I2C - Der obere Teil der Adresse ist fix 0x9n, die Bits 1-3 kann man mit Jumper einstellbar machen oder fest verdrahten. &lt;br /&gt;
&lt;br /&gt;
Durch einen einfachen I2C-Lesebefehl kann man die Temperatur einlesen (16-Bit), das Format ist allerdings etwas tricky. Das erste Byte (8-Bit) ist die Temperatur in ganzen Grad, als normales signed char, vom zweiten Byte gibt das MSB an, ob noch 0.5&amp;lt;sup&amp;gt;o&amp;lt;/sup&amp;gt; '''dazuzuzählen''' sind (also auch, wenn vorne eine negative Zahl steht)  &lt;br /&gt;
&lt;br /&gt;
Der Grund ist der: die vorzeichenbehaftete 9-Bit Zahl, die da linksbündig in zwei Datenbytes übertragen wird, gibt eigentlich an, wieviel 0.5 Grad - Einheiten gemessen wurden. Rein rechnerisch wäre also Temperatur = Wert * 0.5, das müßte man aber als float durchführen oder erweitern&lt;br /&gt;
&lt;br /&gt;
===Programm-Beispiel für LM75===&lt;br /&gt;
Der LM75 wird über den [[I2C]]-Bus angesprochen&lt;br /&gt;
In BasCom, wo es ja keine signed char gibt, wird das Interpretieren auf sehr unterschiedliche Art empfohlen. &lt;br /&gt;
&lt;br /&gt;
Ich empfehle:&lt;br /&gt;
&lt;br /&gt;
 dim Ival as integer&lt;br /&gt;
 dim Msb as byte&lt;br /&gt;
 dim Lsb as byte&lt;br /&gt;
         I2cstart&lt;br /&gt;
         I2cwbyte &amp;amp;H91   ' Lese-adresse !  &lt;br /&gt;
         If Err = 1 Then&lt;br /&gt;
            I2cstop       ' kein ACK vom LM75 --&amp;gt; irgendein Fehler&lt;br /&gt;
            Ival = 9999   ' Zeichen, daß der Wert ungültig ist !&lt;br /&gt;
         Else&lt;br /&gt;
            I2crbyte Msb , Ack&lt;br /&gt;
            I2crbyte Lsb , Nack&lt;br /&gt;
            I2cstop&lt;br /&gt;
            If Msb.7 = 1 Then&lt;br /&gt;
               Ival = Makeint(msb , &amp;amp;HFF)   ' auffüllen mit den Vorzeichen bits&lt;br /&gt;
            Else&lt;br /&gt;
               Ival = Makeint(msb , &amp;amp;H00)   ' positiv, also bleibt es so&lt;br /&gt;
            End If&lt;br /&gt;
            Ival = Ival * 10                ' erweitern &lt;br /&gt;
            If Lsb.7 = 1 Then&lt;br /&gt;
              Ival = Ival + 5               ' fünf Zehntel Grad dazu &lt;br /&gt;
            End If&lt;br /&gt;
         End if&lt;br /&gt;
&lt;br /&gt;
das ergibt die Temperatur in Zehntel-Grad (Natürlich nur, wenn's keine Fehler gab).&lt;br /&gt;
&lt;br /&gt;
==Resistive Sensoren==&lt;br /&gt;
...&lt;br /&gt;
==Kapazitive Sensoren==&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel für kapazitive Sensoren sind Luftfeuchtigkeitsmesser, die ihre Kapazität entsprechend der Luftfeuchtigkeit ändern. Das Auslesen der Kapazität kann prinzipiell über das Ausmessen von Ladekurven geschehen. Dies ist jedoch bei kleinen Kapazitäten nicht praktisch durchführbar, weshalb man in diesem Falle meist einen Schwingkreis baut, dessen Frequenz man dann misst und so dann zusammen mit der bekannten Induktivität der Spule die Kapazität des Kondensators ausrechnen kann.&lt;br /&gt;
&lt;br /&gt;
==Induktive Sensoren==&lt;br /&gt;
Induktiver Näherungsschalter&lt;br /&gt;
&lt;br /&gt;
Sensoren die ihre Induktivität entsprechend der Messgröße ändern können auch mit Hilfe eines Schwingkreises mit bekannter Kapazität ausgemessen werden.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
==Piezoelektrische Sensoren==&lt;br /&gt;
Hier ist ein Experiment dargestellt das die Funktion von Piezowandlern demonstriert.&lt;br /&gt;
&lt;br /&gt;
Drückt man auf eine längliche Glasplatte (Mikroskopträger Länge 76mm), die an den Enden auf je einem Piezo Wandler gelagert ist, dann ergeben sich Signale, die von den Kräften auf die Wandler abhängig sind. &lt;br /&gt;
&lt;br /&gt;
Die Summe der beiden Kräfte entspricht der Gesamtkraft. Das Verhältnis der beiden Kräfte entspricht dem Verhältnis der Abstände des Druckpunktes zum Wandler. &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://www.roboternetz.de/wissen/images/6/66/Piezowandler.jpg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Im Versuch wurde mit der Frequenz von ca. 4Hz (0,5s/div) von einem Ende bis zum anderen auf die Platte gedrückt. (Tonleiter). Die Signale der beiden Wandler sind im Oszillogramm aufgetragen und die Folge der Druck-Positionen ist auf den ersten Blick schon mal nachvollziehbar.&lt;br /&gt;
&lt;br /&gt;
==PIR Passiv Infrarot Sensoren==&lt;br /&gt;
Hier handelt es sich um Passiv-Infrarot-Bewegungsmelder. Bewegungsmelder regieren beim Eintritt einer Person (Tier) in das Erfassungsfeld des Sensors. Die Anwendungsmöglichkeiten sind nahezu unbegrenzt, man kennt die Technik ja von vielen Terrassenlampen, welche sich beim vorbeigehen automatisch einschalten.&lt;br /&gt;
Reagiert wird also auf Die Körperwärme einer sich im Erfassungsfeld bewegenden Person.&lt;br /&gt;
[[Bild:pir.jpg|right]]&lt;br /&gt;
Zum Prinzip: &lt;br /&gt;
Wärmestrahlen, die einen Erfassungsvorgang auslösen, liegen im Infrarot-Bereich des Wellenspektrums. In diesem Bereich gibt der menschliche Körper seine Wärmestrahlung ab. Leuchtmittel wie Glüh- , Halogen- und Entladungslampen, die für eine Strahlung im sichtbaren Bereich um 0,555 μm entwickelt wurden, geben jedoch auch einen erheblichen Teil an Wärmestrahlung im Infrarot-Bereich ab.&lt;br /&gt;
Im Spektrum oberhalb des sichtbaren Licht, ab 0,780 μm, beginnt der Infrarot-Bereich. Die Wellenlänge&lt;br /&gt;
dieser IR-Strahlung ist abhängig von der Temperatur eines Körpers. Die Wärmestrahlung&lt;br /&gt;
des Menschen hat ihr Maximum zwischen 9 und 10 μm im Infrarot-Bereich.&lt;br /&gt;
Diese Tatsache nutzt der PIR Sensor mittels sogenannter pyroelektrischer IRDetektoren, welche eine hohe Empfindlichkeit im langwelligen Infrarot-Bereich aufweisen. Die Infrarot-&lt;br /&gt;
Strahlung verhält sich ähnlich wie sichtbares Licht. Sie kann reflektiert und durch Linsen&lt;br /&gt;
gebündelt werden.&lt;br /&gt;
Basis eines solchen IR-Detektors (Sensors) sind Lithium-Tantalatkristalle. Diese Kristalle erzeugen,&lt;br /&gt;
bei Wärmeänderung (positive oder negative Temperaturänderung), eine elektrische Spannung.&lt;br /&gt;
Die von den Kristallen abgegebene Spannung liegt im Bereich von einigen μV (μV = millionstel Volt) und ist von folgenden Bedingungen abhängig: &lt;br /&gt;
* Der Intensität der Wärmequelle (Temperatur und Größe)&lt;br /&gt;
* Dem Umgebungsmedium (Temperatur, unterschiedliche Luftfeuchtigkeit)&lt;br /&gt;
* Der Entfernung zwischen Wärmequelle und IR-Sensor&lt;br /&gt;
* Der Bewegungsgeschwindigkeit und Bewegungsrichtung der Wärmequelle&lt;br /&gt;
* Der Empfindlichkeit des PIR-Elementes (frequenzabhängiges Bandpaßverhalten mit Maximum bei ca. 0,1 Hz)&lt;br /&gt;
&lt;br /&gt;
Zur Unterdrückung von Einflüssen aus der Umgebung (übliche wetterbedingte Temperaturänderungen), sind in jedem Sensor 2 Kristalle antiparallel geschaltet. &lt;br /&gt;
Einer der Kristalle gibt, bei Auftreffen von Wärmestrahlung einen positiven, der andere einen negativen Spannungsimpuls ab. Wärmeänderungen die gleichzeitig und mit gleicher Intensität auf beide Kristalle einwirken lösen so keinen Erfassungsvorgang aus, denn die beiden Impulse heben sich gegenseitig auf. Dadurch ist ein Auslösen bei Wärmeänderungen der Umgebung weitgehend ausgeschlossen.&lt;br /&gt;
Anders verhält es sich bei schnellen Bewegungen. Die Lithiumtantalat-Kristalle geben, entsprechend&lt;br /&gt;
der Bewegung und der dadurch hervorgerufenen Wärmeänderung im Erfassungsfeld, ihre&lt;br /&gt;
Impulse zeitversetzt ab. Die beiden Impulse addieren sich zu einer Wechselgröße mit höherer&lt;br /&gt;
Signalamplitude. Dieses elektrische Ausgangssignalist proportional der Wärmeänderung und führt zur Meldung einer Bewegung.&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
* [[Benutzer:PicNick|PicNick]]&lt;br /&gt;
* [[Benutzer:Frank|Frank]] &lt;br /&gt;
* [[Benutzer:Dennis.strehl|Dennis.strehl]]&lt;br /&gt;
* [[Benutzer:Florian|Florian]]&lt;br /&gt;
* Topic&lt;br /&gt;
* [[Benutzer:Manf|Manf]]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
* [[Sensoren]]&lt;br /&gt;
* [[Graycode]]&lt;br /&gt;
* [[Ultraschall SRF10 an RN-Control]]&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
*[http://www.ikm.uni-karlsruhe.de/forschung/pzt_webseiten/de/grundlagen/pyro.html Piezoelektrische Sensoren]&lt;br /&gt;
*[http://www.roboternetz.de/phpBB2/dload.php?action=category&amp;amp;cat_id=2 Datenblätter im Download-Bereich des Roboternetz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Robotikeinstieg]]&lt;br /&gt;
[[Category:Grundlagen]]&lt;br /&gt;
[[Category:Elektronik]]&lt;br /&gt;
[[Category:Sensoren]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Sensorarten&amp;diff=6826</id>
		<title>Sensorarten</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Sensorarten&amp;diff=6826"/>
				<updated>2006-04-14T09:47:46Z</updated>
		
		<summary type="html">&lt;p&gt;BiGF00T: /* Helligkeit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Welche Sensorarten gibt es==&lt;br /&gt;
Damit sich ein Roboter in seiner Umgebung bewegen kann, ohne an Hindernisse anzustoßen, und damit er ein Ziel finden und ansteuern kann, muß er irgendwie seine Umwelt &amp;quot;wahrnehmen&amp;quot;. &lt;br /&gt;
Hauptanwendung für diese Informationen aus der Umwelt ist die [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
==Bumpers==&lt;br /&gt;
Als Bumpers bezeichnet man eine Art Stoßstange, die einen Mikro-Switch auslöst. &lt;br /&gt;
&lt;br /&gt;
[[Bild:microschalter.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
Die Auswertung erfolgt am besten digital an einem Pin mit Pull-up Widerstand. Man kann den Eingang pollen (abfragen), aber auch einen Interrupt auslösen lassen. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Whiskers (Fühler)==&lt;br /&gt;
Das sind flexible Kunststoff-Streifen von ca. 10 cm Länge, eigentlich für Datenhandschuhe vorgesehen. Aber man kann sie auch als Fühler einsetzen, und daher auch für die Kollisions-Sensorik verwenden. Beim Verbiegen steigt der Widerstand an.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:flexs_200.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
Um zu messen, wird mit einem zweiten Widerstand ein Spannungsteiler aufgebaut, der dann mit einem Analog-Eingang einen Grad der Verbiegung erkennen läßt. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Incremental-Geber==&lt;br /&gt;
Dienen zur Erfassung von Drehzahl bzw. der Messung von Wegstrecken&lt;br /&gt;
===Drehgeber Sharp GP1A30===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt; http://www.roboternetz.de/wiki/uploads/Main/gp1a30.jpg &amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim Sharp GP1A30 handelt es sich um eine Gabellichtschranke mit inkrementaler Drehgeberfunktion. Im Gegensatz zu herkömmlichen Gabellichtschranken können mit dieser sowohl Drehzahl als auch Drehrichtung ermittelt werden. Notwendig sind dafür nur 2 digitale Ports. Verzichtet man auf die Auswertung der Drehrichtung, reicht nur ein Port.&lt;br /&gt;
Der Sensor hat den Vorteil das die Signale bereits TTL kompatibel sind und direkt an ein Controllerboard angeschlossen werden können. Ein Beispielprogramm zu [[RN-Control]] findet man hier&lt;br /&gt;
&lt;br /&gt;
* [[Beispiel Drehzahlmessung mit RN-Control]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:GP1A30.gif|center]]&lt;br /&gt;
&lt;br /&gt;
Die Auswertung inkrementaler Drehgeber ist recht einfach. Ein Ausgang liefert einen Impuls pro Markierung (Scheibe auf der Welle). Prüft man bei jedem Impuls (Flanke) noch gleichzeitig den aktuellen Pegel des zweiten Ausganges, so kann daraus die Drehrichtung abgeleitet werden. &lt;br /&gt;
&lt;br /&gt;
Der Signalverlauf an den Sensorausgängen ist phasenversetzt:&lt;br /&gt;
&lt;br /&gt;
[[Bild:inkremental1.gif|center]]&lt;br /&gt;
&lt;br /&gt;
==Optische Sensoren==&lt;br /&gt;
===Helligkeit=== &lt;br /&gt;
Die Hauptanwendung solcher Sensoren ist, den hellsten Fleck im Raum zu finden.&lt;br /&gt;
Dies ist auch Teil vieler Roboterwettbewerbe. (Robo Callenge (2002 sic!), 'Ein Platz an der Sonne')&lt;br /&gt;
&lt;br /&gt;
Solche Sensoren können einfache [[LDR]]s oder [[Photodioden]] bzw. [[Phototransistoren]] sein.&lt;br /&gt;
LDRs haben den Vorteil, dass sie relativ hoch aussteuern, der große Nachteil ist aber, dass diese Sensoren ziemlich Wärmeempfindlich und etwas träge.&lt;br /&gt;
Photodioden und Phototransistoren haben den Vorteil, dass sie sehr genau sind, aber nicht besonders hoch aussteuern. Diese sollte man evtl. über einen OpAmp verstärken.&lt;br /&gt;
&lt;br /&gt;
[[Bild:fotowiderstand.jpg|center|framed|Ein typischer Fotowiderstand]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:SFH300.jpg|center|framed|SFH300, ein typischer Phototransistor]]&lt;br /&gt;
&lt;br /&gt;
Die Suche nach dem Hellsten Fleck im Rraum ist wie ich finde ein gutes Einsteigerthema!&lt;br /&gt;
&lt;br /&gt;
===Distanzsensor IS471F===&lt;br /&gt;
&lt;br /&gt;
IS471F - Hindernisserkennung mit Infrarot Distanzsensor&lt;br /&gt;
&lt;br /&gt;
Das hier vorgestellte IC IS471F erlaubt eine einfach und sogar recht preisgünstige Hinternisserkennung per Infarot. Dazu muß im wesentlichen nur noch eine Infrarot-Diode an das IC angeschlossen werden. Das modulierte Licht wird von einem Gegenstand direkt auf das IC zurückgeworfen und somit das Hinterniss erkannt. Tageslicht/Fremdlicht stört den IS471 überhaupt nicht, da das Licht mit einer bestimmten Frequenz moduliert wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:is471.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der normale Schaltungsaufbau sieht also wie oben abgebildet aus! In der Praxis kann das dann in etwa so aussehen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:is471beispiel.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das englische Datenblatt findet man im Roboternetz-Download-Bereich&lt;br /&gt;
&lt;br /&gt;
Die normale Reichweite ist in gewissen Grenzen abhängig von der Farbe des Hinternisses. In der Regel reicht es jedoch durchaus einige cm so das langsame Roboter durchaus sehr gut damit zurecht kommen. Durch besonders helle Infrarot LED´s und durch zusätzlich LED-Fassungen kann man die Reichweite erhöhen. Wem das noch nicht reicht, der kann über einen zusätzlichen Transistor die Strahlungsleistung der LED noch weiter erhöhen. &lt;br /&gt;
&lt;br /&gt;
[[Bild:is471verstaerkung.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://www.roboternetz.de/bilder/mehrereis471.gif&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Sharp Infrarotsensoren===&lt;br /&gt;
&lt;br /&gt;
Sharp hat eine ganz interessante Serie von Bausteinen herausgebracht mit denen ein Roboter sogar recht genau Entfernungen messen kann. Das Messergebnis ist nahezu unabhängig von der Farbe und Helligkeit des gemessenen Objektes. Die Ansteuerung ist sehr einfach, der Sensorausgang kann zum Beispiel direkt an einen analogen Eingang eines Mikrocontrollers angeschlossen werden. Die Sensoren sind unter den Roboter-Bastlern weit verbreitet. &lt;br /&gt;
Bei vielen Händlern erhältlich kosten die Sensoren derzeit je nach Typ und Händlerspanne zwischen 13 bis 25 Euro.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sharpentfernungssensor.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oft werden selbst in kleinen Roboter-Projekten mehrere dieser Sensoren genutzt da sie nur einen äußerst engen Erfassungsbereich haben. Sie eignen sich daher sehr gut zur Vermessung einer Umgebung, insbesondere dann wenn Sie drehbar auf einem Servo montiert werden. Als Kollisionsschutz sind sie wegen dem engen Winkel nur bedingt geeignet, zu diesem Zweck eignen sich zum Beispiel Ultraschallsensoren besser.&lt;br /&gt;
Das Funktionsprinzip der Sensoren ist einfach. Der Sensor besteht aus Sender und Empfänger. Der Sender sendet einen Infrarot-Strahl aus, der vom Hindernis reflektiert wird. Je nach Entfernung trifft der reflektierte Strahl an einer unterschiedlichen Stelle auf den Empfänger (ein sog. Position Sensitive Device, PSD). Der Empfänger setzt den Auftreffpunkt in einen analogen Spannungswert um. Eine schöne Skizze dazu:  &lt;br /&gt;
&lt;br /&gt;
[[Bild:sharpfunktion.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Einige der beliebtesten Bausteine sind:'''&lt;br /&gt;
&lt;br /&gt;
====Sharp GP2D12==== &lt;br /&gt;
Distanz 10 - 80 cm - Entfernung wird durch analoge Spannung am Ausgang übermittelt&lt;br /&gt;
Dies ist der am häufigsten eingesetzte Sharp Typ bei mobilen Robotern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:GP2D12anschluss.gif|center]]&lt;br /&gt;
&lt;br /&gt;
====Sharp GP2YA21YK==== &lt;br /&gt;
Distanz 10 - 80 cm - Entfernung wird durch analoge Spannung am Ausgang übermittelt &lt;br /&gt;
&lt;br /&gt;
====Sharp GP2D120====&lt;br /&gt;
Distanz 4 - 30 cm - Entfernung wird durch analoge Spannung am Ausgang übermittelt&lt;br /&gt;
&lt;br /&gt;
====Sharp GP2Y0A02YK====&lt;br /&gt;
Distanz 20 - 150 cm - Entfernung wird durch analoge Spannung am Ausgang übermittelt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://www.shop.robotikhardware.de/shop/catalog/images/artikelbilder/sensoren/gp2y0a02yk_diagramm.gif&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Sharp GP2D02====&lt;br /&gt;
Distanz 10 - 80 cm - Entfernung wird durch 8 Bit Digitalausgang übermittelt&lt;br /&gt;
&lt;br /&gt;
====Sharp GP2D150====&lt;br /&gt;
Distanz 3-30 cm - 1 Bit Schaltausgang  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datenblätter zu den oberen Sensoren findet man im Download-Bereich des Roboternetz, siehe unter [[#Weblinks]].&lt;br /&gt;
 &lt;br /&gt;
Um die analogen Spannung der Sensoren in eine Entfernung umzurechnen, kann man sich mit Hilfe des Datenblattes oder einfacher Probemessungen Tabellen erstellen, welche dann vom Controller zur Umsetzung genutzt werden.&lt;br /&gt;
Bequemer ist allerdings eine Näherungsformel:&lt;br /&gt;
&lt;br /&gt;
====Formel zur Entfernungsberechnung==== &lt;br /&gt;
 D = A/(X-B) &lt;br /&gt;
&lt;br /&gt;
 D ist die Entfernung &lt;br /&gt;
 X ist der Ausgabewert des Sensors &lt;br /&gt;
 A ist die Steigung der Kurve A/X &lt;br /&gt;
 B ist der Offset der Kurve &lt;br /&gt;
&lt;br /&gt;
Die Konstanten A und B ermittelt man am besten über zwei Probemessungen: &lt;br /&gt;
&lt;br /&gt;
D und X sind die Entfernung und der Ausgabewert der ersten Messung (z.B. bei 20 cm) &lt;br /&gt;
D' und X' sind die Entfernung und der Ausgabewert der zweiten Messung (z.B. bei 60 cm) &lt;br /&gt;
&lt;br /&gt;
 A = ((X' - X) * D' * D) /(D - D' ) &lt;br /&gt;
 B = (D' * X' - D * X) /(D' - D) &lt;br /&gt;
&lt;br /&gt;
====GP2D12 Messkurve====&lt;br /&gt;
&lt;br /&gt;
[[Bild:gpd12kurve.gif|center]]&lt;br /&gt;
&lt;br /&gt;
====GPD120 Messkurve====&lt;br /&gt;
&lt;br /&gt;
[[Bild:gpd120kurve.gif|center]]&lt;br /&gt;
&lt;br /&gt;
==Ultraschall Sensoren== &lt;br /&gt;
===Ultraschallsensoren SRF04 und SRF08===&lt;br /&gt;
Die Firma '''Devantech''' hat eine Serie von sehr günstigen und kleinen Ultraschallsensoren entwickelt, die sich im Bereich &amp;quot;autonome Robotersysteme&amp;quot; durchgesetzt haben. Sie sind sehr verbreitet, da sie auch für &amp;quot;Hobby-Robotiker&amp;quot; erschwinglich sind und es sich nicht lohnen würde vergleichbare Module selber zu bauen, da diese meistens ungenauer und teurer wären.&lt;br /&gt;
&lt;br /&gt;
Bekannt wurde die Serie durch den '''SRF04'''. Mit seinen kleinen Abmessungen, der niedrigen Stromaufnahme und der hohen Genauigkeit ist er für kleine Messaufgaben im Entfernungsbereich von 3cm bis 3m gut geeignet. Der SRF04 kann einen 3cm dicken Besenstiel in 2m Entfernung erkennen und wird durch ein [[PWM]]-Signal ausgewertet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:srf_04a.jpg]] [[Bild:srf_04.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Nachfolger des SRF04 ist der noch erfolgreichere '''SRF08''', der nun über den [[I2C]]-Bus ausgewertet werden kann und über eine Reichweite von 3cm bis 6m verfügt. Er hat eine noch kleinere Stromaufnahme und zusätzlich befindet sich auf der Platinenfront ein Fotowiderstand(LDR) dessen Lichtmesswerte sich ebenfalls über den [[I2C]]-Bus auswerten lassen. Durch den SRF08 wird es möglich auch bis zu 16 Mehrfachechos, von weiter hinten gelegenen Gegenständen, auszuwerten, die bei dem SRF04 ignoriert wurden. Über den [[I2C]]-Bus kann man die Messwerte in cm, zoll und in der Laufzeit µs auslesen und spart sich somit die externe Auswertung der Laufzeit, wie bei dem SRF04. Weiterhin können insgesamt 16 SRF08-Module an einen [[I2C]]-Bus angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:srf08_a.jpg]]  [[Bild:srf08_b.jpg]]&lt;br /&gt;
&lt;br /&gt;
===SRF08 Programmbeispiel===&lt;br /&gt;
SFR08 Programm Beispiel mit [[Bascom]]&lt;br /&gt;
Über die grundsätzliche Behandlung des [[I2C]]-Bus mit [[Bascom]] kann man [[I2C|hier]] nachlesen. &lt;br /&gt;
&lt;br /&gt;
 Const Sf08_adr_0 = &amp;amp;HE0             ' I2C Adresse&lt;br /&gt;
 Const Sf08_c_range = 100            ' Reichweite&lt;br /&gt;
 Const Sf08_c_gain = 1               ' Empfindlichkeit&lt;br /&gt;
&lt;br /&gt;
Die Adresse ist der Default-Wert für den Sensor, und kann eingestellt werden. &lt;br /&gt;
Range und Gain sind anzupassen, die angegeben Werte sind aber mal grundsätzlich verwendbar.&lt;br /&gt;
&lt;br /&gt;
'''Setup'''&lt;br /&gt;
Nach dem Reset sind einmal Range und Gain zu setzen.&lt;br /&gt;
&lt;br /&gt;
'''Setzen Range'''&lt;br /&gt;
&lt;br /&gt;
      I2cstart&lt;br /&gt;
      I2cwbyte Sf08_adr_0   ' Device I2C Adresse&lt;br /&gt;
      I2cwbyte 2            ' register &amp;quot;range&amp;quot;&lt;br /&gt;
      I2cwbyte Sf08_c_range  &lt;br /&gt;
      I2cstop&lt;br /&gt;
 &lt;br /&gt;
'''Setzen Gain'''&lt;br /&gt;
&lt;br /&gt;
      I2cstart&lt;br /&gt;
      I2cwbyte Sf08_adr_0   ' Device I2C Adresse&lt;br /&gt;
      I2cwbyte 1            ' register &amp;quot;gain&amp;quot;&lt;br /&gt;
      I2cwbyte Sf08_c_gain    &lt;br /&gt;
      I2cstop&lt;br /&gt;
&lt;br /&gt;
'''Abfrage Trigger'''&lt;br /&gt;
&lt;br /&gt;
Die Abfrage soll laut Beschreibung in zwei Schritten erfolgen, zwischen denen ca 70 mS gewartet werden soll. Diese Zeit braucht das Gerät zum Messen. &lt;br /&gt;
&lt;br /&gt;
'''Trigger'''  &lt;br /&gt;
      I2cstart&lt;br /&gt;
      I2cwbyte Sf08_adr_0   ' Device I2C Adresse&lt;br /&gt;
      I2cwbyte 0            ' register &amp;quot;Trigger&amp;quot;&lt;br /&gt;
      I2cwbyte 81           ' Meßwert in Zentimetern&lt;br /&gt;
&lt;br /&gt;
      Waitms 70 &lt;br /&gt;
&lt;br /&gt;
'''Ergebnis abholen'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 DIM Lsb as Byte&lt;br /&gt;
 DIM Msb as Byte&lt;br /&gt;
 DIM IVal as word&lt;br /&gt;
&lt;br /&gt;
      I2cstart              ' Repeated Start&lt;br /&gt;
      I2cwbyte Sf08_adr_0   ' Device I2C Adresse&lt;br /&gt;
      I2cwbyte 2            ' Meßwert US&lt;br /&gt;
&lt;br /&gt;
      I2cstart                 ' repeated Start&lt;br /&gt;
      I2cwbyte Sf08_adr_0 + 1  ' Device I2C Adresse READ!&lt;br /&gt;
      I2crbyte Msb , Ack      ' Bit 8-15&lt;br /&gt;
      I2crbyte Lsb , Nack     ' Bit 0-7&lt;br /&gt;
      I2cstop&lt;br /&gt;
&lt;br /&gt;
      Ival = Makeint(lsb , Msb) ' umwandeln in Word (16 Bit)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SRF10 Ultraschallsensor ===&lt;br /&gt;
SRF10 ist quasi der Nachfolger von SRF08. Er bietet die gleiche Leistung und ist sogar gegenüber Spannungschankungen noch etwas unempfindlicher als der Vorgänger. Der größte Vorteil besteht jedoch darin das er ca. 1/3 kleiner als sein Vorgänger ist.   &lt;br /&gt;
&lt;br /&gt;
[[Bild:srf10foto1.jpg]] [[Bild:srf10foto2.gif]]&lt;br /&gt;
&lt;br /&gt;
Die technischen Daten sind ähnlich:&lt;br /&gt;
* Betriebsspannung: 5V &lt;br /&gt;
* Stromaufnahme: ca. 3mA Standby, ca. 15mA während des Messens Frequenz: 40KHz &lt;br /&gt;
* Maximale Reichweite: 6 m &lt;br /&gt;
* Minimale Reichweite: 4 cm &lt;br /&gt;
* Messwerterfassung: intern, kein externer Controller zur Zeitmessung notwendig &lt;br /&gt;
* Interface: Standard – I2C (passend zu zahlreichen Controllerboards, z.B. RN-Control) &lt;br /&gt;
* Ausgabeformat: µs, cm oder Zoll &lt;br /&gt;
* Feature: Analogverstärkung 40 - 700 (einstellbar, 16 Stufen) &lt;br /&gt;
* Abmessungen: 32mm x 15mm x 10mm &lt;br /&gt;
* Hersteller: Devantech Ltd&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[[Ultraschall_SRF10_an_RN-Control|Programmbeispiel in Bascom]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:srf10ausbreitung.gif|center]]&lt;br /&gt;
&lt;br /&gt;
==Kompaß== &lt;br /&gt;
===Kompaß-Modul CMPS03===&lt;br /&gt;
Laut der Doku ist diese Modul speziell für die Bedürnisse von Robotern gestaltet worden. Es mißt seine Lage relativ zum Erdmagnetfeld und liefert diesen Wert&lt;br /&gt;
* Als PWM-Signal &lt;br /&gt;
* Über I2C entweder 0-255 als Byte oder&lt;br /&gt;
* 0-3599 als 16-Bit Wert (MSB first)&lt;br /&gt;
&lt;br /&gt;
In der vorliegenden Doku ist eine fixe I2C-Adresse von 0xC0 angegeben. Was leider noch fehlt, sind Angaben, ob und wie diese Adresse geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Bei waagrechter Montage ist das also ein Kompaß, bei senkrechter Montage dieser Module kann man auch die Neigung in Nord-Süd-Richtung messen. Hierzu sind 2 Module nötig, die zueinander um 90° gedreht angeordnet sein müssen. Die Neigung in Ost-West-Richtung zu messen, ist dagegen leider nicht möglich.&lt;br /&gt;
&lt;br /&gt;
Das Ganze ist eine Anwendung des Philips-KMZ51 Magnet-Feld-Sensors mittels eines PIC16F872&lt;br /&gt;
&lt;br /&gt;
Gelegentlich sollte das Modul kalibriert werden. Das kann über den I2C-Bus, aber auch mittels einen Pins am Modul initiiert werden. Dann muß das Module langsam um 360 Grad gedreht werden. Dabei nimmt das Modul 4 Meßpunkte auf und speichert sie im EEPROM. &lt;br /&gt;
&lt;br /&gt;
[[Bild:cmps3pin.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Beschleunigung==&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
==Temperatur== &lt;br /&gt;
===NTCs===&lt;br /&gt;
===PTCs===&lt;br /&gt;
===Temperatur-Sensor LM75===&lt;br /&gt;
&lt;br /&gt;
[[Bild:lm75.gif|center]]&lt;br /&gt;
&lt;br /&gt;
Dieser Chip von National Semiconductors kann die Umgebungstemperatur mit einer Genauigkeit von 0.5&amp;lt;sup&amp;gt;o&amp;lt;/sup&amp;gt; Grad Celsius messen. Das angegebene Bereich ist -25&amp;lt;sup&amp;gt;o&amp;lt;/sup&amp;gt; bis 100&amp;lt;sup&amp;gt;o&amp;lt;/sup&amp;gt; C. Es wird zweierlei geboten:&lt;br /&gt;
* Ein Schaltausgang - Wenn man also z.B. einen Ventilator einschalten möchte&lt;br /&gt;
* I2C - Der obere Teil der Adresse ist fix 0x9n, die Bits 1-3 kann man mit Jumper einstellbar machen oder fest verdrahten. &lt;br /&gt;
&lt;br /&gt;
Durch einen einfachen I2C-Lesebefehl kann man die Temperatur einlesen (16-Bit), das Format ist allerdings etwas tricky. Das erste Byte (8-Bit) ist die Temperatur in ganzen Grad, als normales signed char, vom zweiten Byte gibt das MSB an, ob noch 0.5&amp;lt;sup&amp;gt;o&amp;lt;/sup&amp;gt; '''dazuzuzählen''' sind (also auch, wenn vorne eine negative Zahl steht)  &lt;br /&gt;
&lt;br /&gt;
Der Grund ist der: die vorzeichenbehaftete 9-Bit Zahl, die da linksbündig in zwei Datenbytes übertragen wird, gibt eigentlich an, wieviel 0.5 Grad - Einheiten gemessen wurden. Rein rechnerisch wäre also Temperatur = Wert * 0.5, das müßte man aber als float durchführen oder erweitern&lt;br /&gt;
&lt;br /&gt;
===Programm-Beispiel für LM75===&lt;br /&gt;
Der LM75 wird über den [[I2C]]-Bus angesprochen&lt;br /&gt;
In BasCom, wo es ja keine signed char gibt, wird das Interpretieren auf sehr unterschiedliche Art empfohlen. &lt;br /&gt;
&lt;br /&gt;
Ich empfehle:&lt;br /&gt;
&lt;br /&gt;
 dim Ival as integer&lt;br /&gt;
 dim Msb as byte&lt;br /&gt;
 dim Lsb as byte&lt;br /&gt;
         I2cstart&lt;br /&gt;
         I2cwbyte &amp;amp;H91   ' Lese-adresse !  &lt;br /&gt;
         If Err = 1 Then&lt;br /&gt;
            I2cstop       ' kein ACK vom LM75 --&amp;gt; irgendein Fehler&lt;br /&gt;
            Ival = 9999   ' Zeichen, daß der Wert ungültig ist !&lt;br /&gt;
         Else&lt;br /&gt;
            I2crbyte Msb , Ack&lt;br /&gt;
            I2crbyte Lsb , Nack&lt;br /&gt;
            I2cstop&lt;br /&gt;
            If Msb.7 = 1 Then&lt;br /&gt;
               Ival = Makeint(msb , &amp;amp;HFF)   ' auffüllen mit den Vorzeichen bits&lt;br /&gt;
            Else&lt;br /&gt;
               Ival = Makeint(msb , &amp;amp;H00)   ' positiv, also bleibt es so&lt;br /&gt;
            End If&lt;br /&gt;
            Ival = Ival * 10                ' erweitern &lt;br /&gt;
            If Lsb.7 = 1 Then&lt;br /&gt;
              Ival = Ival + 5               ' fünf Zehntel Grad dazu &lt;br /&gt;
            End If&lt;br /&gt;
         End if&lt;br /&gt;
&lt;br /&gt;
das ergibt die Temperatur in Zehntel-Grad (Natürlich nur, wenn's keine Fehler gab).&lt;br /&gt;
&lt;br /&gt;
==Resistive Sensoren==&lt;br /&gt;
...&lt;br /&gt;
==Kapazitive Sensoren==&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel für kapazitive Sensoren sind Luftfeuchtigkeitsmesser, die ihre Kapazität entsprechend der Luftfeuchtigkeit ändern. Das Auslesen der Kapazität kann prinzipiell über das Ausmessen von Ladekurven geschehen. Dies ist jedoch bei kleinen Kapazitäten nicht praktisch durchführbar, weshalb man in diesem Falle meist einen Schwingkreis baut, dessen Frequenz man dann misst und so dann zusammen mit der bekannten Induktivität der Spule die Kapazität des Kondensators ausrechnen kann.&lt;br /&gt;
&lt;br /&gt;
==Induktive Sensoren==&lt;br /&gt;
Induktiver Näherungsschalter&lt;br /&gt;
&lt;br /&gt;
Sensoren die ihre Induktivität entsprechend der Messgröße ändern können auch mit Hilfe eines Schwingkreises mit bekannter Kapazität ausgemessen werden.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
==Piezoelektrische Sensoren==&lt;br /&gt;
Hier ist ein Experiment dargestellt das die Funktion von Piezowandlern demonstriert.&lt;br /&gt;
&lt;br /&gt;
Drückt man auf eine längliche Glasplatte (Mikroskopträger Länge 76mm), die an den Enden auf je einem Piezo Wandler gelagert ist, dann ergeben sich Signale, die von den Kräften auf die Wandler abhängig sind. &lt;br /&gt;
&lt;br /&gt;
Die Summe der beiden Kräfte entspricht der Gesamtkraft. Das Verhältnis der beiden Kräfte entspricht dem Verhältnis der Abstände des Druckpunktes zum Wandler. &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://www.roboternetz.de/wissen/images/6/66/Piezowandler.jpg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Im Versuch wurde mit der Frequenz von ca. 4Hz (0,5s/div) von einem Ende bis zum anderen auf die Platte gedrückt. (Tonleiter). Die Signale der beiden Wandler sind im Oszillogramm aufgetragen und die Folge der Druck-Positionen ist auf den ersten Blick schon mal nachvollziehbar.&lt;br /&gt;
&lt;br /&gt;
==PIR Passiv Infrarot Sensoren==&lt;br /&gt;
Hier handelt es sich um Passiv-Infrarot-Bewegungsmelder. Bewegungsmelder regieren beim Eintritt einer Person (Tier) in das Erfassungsfeld des Sensors. Die Anwendungsmöglichkeiten sind nahezu unbegrenzt, man kennt die Technik ja von viele Terrassenlampen welche sich beim vorbeigehen automatisch einschalten.&lt;br /&gt;
Reagiert wird also auf Die Körperwärme einer sich im Erfassungsfeld bewegenden Person.&lt;br /&gt;
[[Bild:pir.jpg|right]]&lt;br /&gt;
Zum Prinzip: &lt;br /&gt;
Wärmestrahlen, die einen Erfassungsvorgang auslösen, liegen im Infrarot-Bereich des Wellenspektrums. In diesem Bereich gibt der menschliche Körper seine Wärmestrahlung ab. Leuchtmittel wie Glüh- , Halogen- und Entladungslampen, die für eine Strahlung im sichtbaren Bereich um 0,555 μm entwickelt wurden, geben jedoch auch einen erheblichen Teil an Wärmestrahlung im Infrarot-Bereich ab.&lt;br /&gt;
Im Spektrum oberhalb des sichtbaren Licht, ab 0,780 μm, beginnt der Infrarot-Bereich. Die Wellenlänge&lt;br /&gt;
dieser IR-Strahlung ist abhängig von der Temperatur eines Körpers. Die Wärmestrahlung&lt;br /&gt;
des Menschen hat ihr Maximum zwischen 9 und 10 μm im Infrarot-Bereich.&lt;br /&gt;
Diese Tatsache nutzt der PIR Sensor mittels sogenannter pyroelektrischer IRDetektoren, welche eine hohe Empfindlichkeit im langwelligen Infrarot-Bereich aufweisen. Die Infrarot-&lt;br /&gt;
Strahlung verhält sich ähnlich wie sichtbares Licht. Sie kann reflektiert und durch Linsen&lt;br /&gt;
gebündelt werden.&lt;br /&gt;
Basis eines solchen IR-Detektors (Sensors) sind Lithium-Tantalatkristalle. Diese Kristalle erzeugen,&lt;br /&gt;
bei Wärmeänderung (positive oder negative Temperaturänderung), eine elektrische Spannung.&lt;br /&gt;
Die von den Kristallen abgegebene Spannung liegt im Bereich von einigen μV (μV = millionstel Volt) und ist von folgenden Bedingungen abhängig: &lt;br /&gt;
* Der Intensität der Wärmequelle (Temperatur und Größe)&lt;br /&gt;
* Dem Umgebungsmedium (Temperatur, unterschiedliche Luftfeuchtigkeit)&lt;br /&gt;
* Der Entfernung zwischen Wärmequelle und IR-Sensor&lt;br /&gt;
* Der Bewegungsgeschwindigkeit und Bewegungsrichtung der Wärmequelle&lt;br /&gt;
* Der Empfindlichkeit des PIR-Elementes (frequenzabhängiges Bandpaßverhalten mit Maximum bei ca. 0,1 Hz)&lt;br /&gt;
&lt;br /&gt;
Zur Unterdrückung von Einflüssen aus der Umgebung (übliche wetterbedingte Temperaturänderungen), sind in jedem Sensor 2 Kristalle antiparallel geschaltet. &lt;br /&gt;
Einer der Kristalle gibt, bei Auftreffen von Wärmestrahlung einen positiven, der andere einen negativen Spannungsimpuls ab. Wärmeänderungen die gleichzeitig und mit gleicher Intensität auf beide Kristalle einwirken lösen so keinen Erfassungsvorgang aus, denn die beiden Impulse heben sich gegenseitig auf. Dadurch ist ein Auslösen bei Wärmeänderungen der Umgebung weitgehend ausgeschlossen.&lt;br /&gt;
Anders verhält es sich bei schnellen Bewegungen. Die Lithiumtantalat-Kristalle geben, entsprechend&lt;br /&gt;
der Bewegung und der dadurch hervorgerufenen Wärmeänderung im Erfassungsfeld, ihre&lt;br /&gt;
Impulse zeitversetzt ab. Die beiden Impulse addieren sich zu einer Wechselgröße mit höherer&lt;br /&gt;
Signalamplitude. Dieses elektrische Ausgangssignalist proportional der Wärmeänderung und führt zur Meldung einer Bewegung.&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
* [[Benutzer:PicNick|PicNick]]&lt;br /&gt;
* [[Benutzer:Frank|Frank]] &lt;br /&gt;
* [[Benutzer:Dennis.strehl|Dennis.strehl]]&lt;br /&gt;
* [[Benutzer:Florian|Florian]]&lt;br /&gt;
* Topic&lt;br /&gt;
* [[Benutzer:Manf|Manf]]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
* [[Sensoren]]&lt;br /&gt;
* [[Graycode]]&lt;br /&gt;
* [[Ultraschall SRF10 an RN-Control]]&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
*[http://www.ikm.uni-karlsruhe.de/forschung/pzt_webseiten/de/grundlagen/pyro.html Piezoelektrische Sensoren]&lt;br /&gt;
*[http://www.roboternetz.de/phpBB2/dload.php?action=category&amp;amp;cat_id=2 Datenblätter im Download-Bereich des Roboternetz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Robotikeinstieg]]&lt;br /&gt;
[[Category:Grundlagen]]&lt;br /&gt;
[[Category:Elektronik]]&lt;br /&gt;
[[Category:Sensoren]]&lt;/div&gt;</summary>
		<author><name>BiGF00T</name></author>	</entry>

	</feed>