<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=87.178.97.251</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=87.178.97.251"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/87.178.97.251"/>
	<updated>2026-04-10T21:37:00Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Pulsweitenmodulation&amp;diff=97022</id>
		<title>Pulsweitenmodulation</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Pulsweitenmodulation&amp;diff=97022"/>
		<updated>2017-08-21T19:14:27Z</updated>

		<summary type="html">&lt;p&gt;87.178.97.251: /* Motorsteuerung (ohmsch-Induktiv) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Bei der &#039;&#039;&#039;Pulsweitenmodulation&#039;&#039;&#039; (engl. Pulse Width Modulation, abgekürzt &#039;&#039;&#039;PWM&#039;&#039;&#039;) wird das Verhältnis zwischen der Einschaltzeit und Periodendauer eines Rechtecksignals bei fester Grundfrequenz variiert. Das Verhältnis zwischen der Einschaltzeit &amp;lt;math&amp;gt;t_{ein}&amp;lt;/math&amp;gt; und der Periodendauer &amp;lt;math&amp;gt; T = t_{ein} + t_{aus} &amp;lt;/math&amp;gt; wird als das Tastverhältnis &#039;&#039;&#039;p&#039;&#039;&#039; bezeichnet. (laut DIN IEC 60469-1: Tastgrad) (engl. Duty Cycle, meist abgekürzt DC, nicht zu verwechseln mit Direct Current = Gleichstrom ).&lt;br /&gt;
&lt;br /&gt;
Die Pulsweitenmodulation für ein Signal &amp;lt;math&amp;gt; x(t) &amp;lt;/math&amp;gt; ist für die Dauer einer Periode im Intervall [0,T] wie folgt definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x(t) = \left\{\begin{array}{l l}&lt;br /&gt;
   		0 &amp;amp; \quad t &amp;lt; t_1 \\&lt;br /&gt;
     	          1 &amp;amp; \quad t \ge t_1 \\&lt;br /&gt;
                  0 &amp;amp; \quad t &amp;gt; T&lt;br /&gt;
	         \end{array} \right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:pwmdoc.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; p = \dfrac{t_{ein}}{T} = \dfrac{t_{ein}}{t_{ein}+t_{aus}} &amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Der Wert des Tastverhältnis &#039;&#039;&#039;p&#039;&#039;&#039; kann dabei Werte zwischen 0 und 1 annehmen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der zeitliche &#039;&#039;&#039;Mittelwert&#039;&#039;&#039; der Spannung &amp;lt;math&amp;gt;U(t)&amp;lt;/math&amp;gt; innerhalb eines Intervalls [0,T] ist unten stehend beschrieben.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_m = \frac{1}{T} \int_0^T u(t)dt = \frac{1}{T}\int_0^{t_{ein}} U_{ein}dt + \frac{1}{T} \int_{t_{ein}}^T U_{aus}dt&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_m = U_{aus} + (U_{ein} - U_{aus}) \cdot \frac{t_{ein}}{t_{ein}+t_{aus}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{aus}&amp;lt;/math&amp;gt; ist dabei normalerweise 0V, &amp;lt;math&amp;gt;U_{ein}&amp;lt;/math&amp;gt; die Betriebsspannung &amp;lt;math&amp;gt;V_{CC}&amp;lt;/math&amp;gt;, z.&amp;amp;nbsp;B. 5V. Deshalb kann man vereinfacht schreiben:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_m = V_{CC} \cdot \frac{t_{ein}}{t_{ein}+t_{aus}} = V_{CC} \cdot DC&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele zeigen PWM-Signale mit einem Tastverhältnis von 75% bzw. 25%.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Beispiel 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{ein}=5\,\mathrm{V}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;U_{aus}=0\,\mathrm{V}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;t_{ein}=3\,\mathrm{ms}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;t_{aus}=1\,\mathrm{ms}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_m = 0\,\mathrm{V} + (5\,\mathrm{V} - 0\,\mathrm{V}) \cdot \frac{3\,\mathrm{ms}}{3\,\mathrm{ms}+1\,\mathrm{ms}} = 3,75\,\mathrm{V}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pwm1.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel 2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{ein}=5\,\mathrm{V}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;U_{aus}=0\,\mathrm{V}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;t_{ein}=1\,\mathrm{ms}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;t_{aus}=3\,\mathrm{ms}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_m = 0\,\mathrm{V} + (5\,\mathrm{V} - 0\,\mathrm{V}) \cdot \frac{1\,\mathrm{ms}}{1\,\mathrm{ms}+3\,\mathrm{ms}} = 1,25\,\mathrm{V}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pwm2.png]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die blaue Linie in der Grafik zeigt den mathematischen Mittelwert der sich einstellenden Leistung, wenn jeweils eine volle Periode der PWM-Grundwelle betrachtet wird. In der Realität schwankt der Wert ja nach Betrachtungfester und in der praktischen Umsetzung besonders, da es keine perfekte Mittelung gibt.&lt;br /&gt;
=== Leistungsberechnung ===&lt;br /&gt;
&lt;br /&gt;
Steuert man mit einem pulsweitenmodulierten Signal direkt einen ohmschen Verbraucher an (z.&amp;amp;nbsp;B. Heizdraht), so ist darauf zu achten, dass man zur Bestimmung der Leistung &#039;&#039;&#039;nicht&#039;&#039;&#039; einfach&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;P = \frac{{U_m}^2}{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
rechnen darf, sondern die Leistung während der Ein- und Ausschaltzeit getrennt betrachten muss:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;P = \frac{{U_{ein}}^2}{R} \cdot \frac{t_{ein}}{t_{ein} + t_{aus}} +&lt;br /&gt;
\frac{{U_{aus}}^2}{R} \cdot \frac{t_{aus}}{t_{ein} + t_{aus}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Da praktisch fast immer gilt &amp;lt;math&amp;gt;U_{aus}=0V&amp;lt;/math&amp;gt; sowie &amp;lt;math&amp;gt;U_{ein}=V_{CC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kann man vereinfacht schreiben und damit rechnen.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;P = \frac {{V_{CC}}^2}{R} \cdot DC&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{ein} = 4\,\mathrm{V}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;U_{aus} = 0\,\mathrm{V}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;t_{ein} = 1\,\mathrm{ms}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;t_{aus} = 3\,\mathrm{ms}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;R = 10\,\mathrm{\Omega}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Mittelwert dieser Spannung ist&lt;br /&gt;
:&amp;lt;math&amp;gt;U_m = 1\,\mathrm{V}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Würde man mit diesem Wert die Leistung berechnen, so käme man auf&lt;br /&gt;
:&amp;lt;math&amp;gt;P = \frac{{U_m}^2}{R} = \frac{(1\,\mathrm{V})^2}{10\,\mathrm{\Omega}} = 0{,}1\,\mathrm{W}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der richtige Wert ist jedoch&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;P = \frac{(4\,\mathrm{V})^2}{10\,\mathrm{\Omega}} \cdot \frac{1\,\mathrm{ms}}{4\,\mathrm{ms}} +&lt;br /&gt;
\frac{(0\,\mathrm{V})^2}{10\,\mathrm{\Omega}} \cdot \frac{3\,\mathrm{ms}}{4\,\mathrm{ms}} =&lt;br /&gt;
0{,}4\,\mathrm{W}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Bei 0V lässt sich kürzen:&lt;br /&gt;
:&amp;lt;math&amp;gt;P = \frac{(4\,\mathrm{V})^2}{10\,\mathrm{\Omega}} \cdot \frac{1\,\mathrm{ms}}{4\,\mathrm{ms}}&lt;br /&gt;
=&lt;br /&gt;
0{,}4\,\mathrm{W}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch hier wird wieder eine gemittelte Leistung angegeben, die einem gleichwertigen DC-Wert entspräche. Praktisch ist die Leistung schwankend. Eine korrekte Darstellung würde also noch einen Wert für den AC-Anteil erfordern.&lt;br /&gt;
&lt;br /&gt;
== Anwendungen (Kleinsignal) ==&lt;br /&gt;
&lt;br /&gt;
=== AD-Wandlung mit PWM ===&lt;br /&gt;
Der folgende Tipp stammt noch aus der Zeit, als es keinen Mikroprozessor mit AD-Wandler gab.&lt;br /&gt;
&lt;br /&gt;
Einen recht billigen und einfachen AD-Wandler mit &amp;quot;1-Draht Kommunikation&amp;quot; kann man mit dem IC 556 (NE556 o.ä.) realisieren: der eine Timer des 556 arbeitet als 50% duty-cycle Rechteckgenerator bei beispielsweise 1 kHz und steuert den zweiten Timer an. Dieser besitzt einen Steuereingang zu Beeinflussung des Tastverhältnisses und auf diesen Pin gibt man das analoge Signal. Ein angeschlossener µC oder PC misst bei jedem Impuls die Impulslänge und man erhält so das Messergebnis. Bei einer Frequenz von &amp;gt;10 kHz liesse sich sogar Sprache digital übertragen oder speichern. Allerdings ist dafür eine Auflösung von wenigstens 8 Bit nötig, wodurch 256 Stufen und eine entsprechemde Abstatfrequenz durch den Chip gefordert sind. Ohne Chip lässt sich dies nur mit eimem Logikbaustein und etwas Signalverarbeitung lösen, siehe [[Analog-IO mit digitalen Bausteinen]]. &lt;br /&gt;
&lt;br /&gt;
Für anspruchsvollere Aufgaben verwendet man jedoch besser die [[Pulsdichtemodulation]].&lt;br /&gt;
&lt;br /&gt;
=== DA-Wandlung mit PWM ===&lt;br /&gt;
&lt;br /&gt;
Die meisten Mikrocontroller haben keine DA-Wandler integriert, da diese relativ aufwändig sind. Allerdings kann man mittels eines PWM-Ausgangs auch eine DA-Wandlung vornehmen und eine Gleichspannung bereitstellen. Wird ein PWM-Signal über einen Tiefpass gefiltert (geglättet), entsteht eine Gleichspannung mit Wechselanteil, deren Mittelwert dem des PWM-Signals entspricht und dessen Wechselanteil von der Beschaltung abhängig ist. Nun bleibt das Problem der Dimensionierung des Tiefpasses. Ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
PWM-Takt 1 MHz, 8 Bit Auflösung (256 Stufen), 0/5V.&lt;br /&gt;
-&amp;gt; 3906 Hz PWM Frequenz&lt;br /&gt;
&lt;br /&gt;
RC-Tiefpass 22nF, 100k&amp;amp;Omega;&lt;br /&gt;
-&amp;gt; 72 Hz Grenzfrequenz&lt;br /&gt;
&lt;br /&gt;
(Die Grenzfrequenz errechnet sich über &amp;lt;math&amp;gt;f_c=\frac{1}{2\,\pi\,R\cdot C}&amp;lt;/math&amp;gt; .)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[bild:pwm_filter_1.png]]&lt;br /&gt;
&lt;br /&gt;
Bei diesem Tiefpass mit 72 Hz Bandbreite verbleibt am Ausgang noch ein Ripple auf der Gleichspannung, da die PWM nie ideal gefiltert werden kann. Eine Rechnung bzw. Simulation in PSPICE zeigen ca. 150mV Ripple. Das ist ziemlich viel, da ein idealer 8-Bit DA-Wandler bei 5V Referenzspannung eine Auflösung von 20mV hat. Wir haben hier also ein Störsignal von 150mV/20mv=7,5 LSB. Um den Ripple bis auf die Auflösungsgrenze von 20mV zu reduzieren, muss die Grenzfrequenz auf ca. 10 Hz reduziert werden. Es ist somit effektiv nur ein 390tel der PWM-Frequenz nutzbar. Das ist für einige Anwendungen ausreichend, wo praktisch nur statische Gleichspannungen erzeugt werden sollen, z.&amp;amp;nbsp;B. für programmierbare Netzteile. Für Anwendungen, in denen schneller ändernde Gleichspannungen generiert werden sollen, muss die PWM-Frequenz entsprechend erhöht werden oder ein steilerer Tiefpaß verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==== RC-Filter dimensionieren ====&lt;br /&gt;
&lt;br /&gt;
Allgemein kann man den Ripple eines einfachen RC-Tiefpasses so abschätzen:&lt;br /&gt;
&lt;br /&gt;
Kritischster Punkt ist eine PWM mit 50% Tastverhältnis. Dabei tritt der&lt;br /&gt;
stärkste absolute Ripple auf, weil hier die - am weinigsten gefilterte - Grundschwigung die höchste Amplitude besitzt. Bei diesem Tastverhältnis ist der Kondensator auf 1/2 VCC aufgeladen. Somit liegt auch 1/2 VCC über dem R an und lädt C annähernd mit Konstantstrom.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I = \frac{\frac{1}{2}Vcc}{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über die Definition des Kondensators kann man den Ripple berechnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = \frac{I \cdot t}{U}; [F = \frac{As}{V}]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = \frac{I \cdot t}{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Ladung in As (Amperesekunden) ergeben sich aus der halben PWM-Periode mal I. Damit kann man brauchbar den Ripple abschätzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{Ripple} = \frac{\frac {\frac{1}{2}Vcc}{R} \cdot \frac{1}{2}T_{PWM}}{C} = \frac{ Vcc \cdot T_{PWM}}{4RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Einschwingzeit &amp;lt;math&amp;gt;\!\,t_S&amp;lt;/math&amp;gt; des Signals bei einem neuen PWM-Wert beträgt etwa &amp;lt;math&amp;gt;\!\,5RC&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Abschätzung gilt aber nur dann, wenn der Ausgang des RC-Filter kaum belastet ist, wie z.&amp;amp;nbsp;B. durch einen Operationsverstärker oder einen andern hochohmigen IC-Eingang.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
100 Hz PWM Frequenz(T_PWM=10ms), R=100k&amp;amp;Omega;, C=1&amp;amp;mu;F, Vcc=5V&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{Ripple} = \frac{5V \cdot 10ms}{4 \cdot 100k\Omega \cdot 1 \mu F} = 125 mV&amp;lt;/math&amp;gt;&amp;lt;BR&amp;gt;&amp;lt;BR&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;t_s=5RC=5 \cdot 100k \Omega \cdot 1 \mu F = 500ms&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Bandbreite besser auszunutzen wird ein besseres Filter benötigt. Das Problem des einfachen RC-Tiefpasses ist der relativ langsame Anstieg der Dämpfung oberhalb der Grenzfrequenz. Genauer gesagt steigt die Dämpfung mit 20dB/Dekade. Das heisst, dass ein Signal mit der 10fachen Frequenz (Dekade) um den Faktor 10 (20dB) gedämpft wird. Will man nun eine höhere Dämpfung ereichen, müssen mehrere Tiefpässe in Reihe geschaltet werden. Bei dem gleichen Beispiel erreicht man mit zwei Tiefpässen mit 6,8nF/100k&amp;amp;Omega; eine Grenzfrequenz von ca. 70 Hz, bei gleicher Dämpfung des Ripples auf 20mV. Die Dämpfung dieses sogenannten Tiefpasses 2. Ordnung beträgt 40dB/Dekade. Das heisst, ein Signal mit zehnfacher Frequenz (Dekade) wird um den Faktor 100 (40dB) gedämpft! Damit erzielt man hier bereits die 7fache Bandbreite! Zum Schluss muss beachtet werden, dass die passiven Tiefpässe nur sehr schwach belastet werden können. Hier ist fast immer ein Operationsverstärker als Spannungsfolger nötig, falls der Eingangswiderstand der nachfolgenden Schaltung in der Größenordnung der beiden Widerstände des Filters ist. Der kann auch genutzt werden, um das gefilterte Signal weiter zu verstärken (nichtinvertierender Verstärker).&lt;br /&gt;
&lt;br /&gt;
[[bild:pwm_filter_2.png]]&lt;br /&gt;
&lt;br /&gt;
Geschickter wäre hier eine Widerstandsdimensionierung, bei der R3 etwas größer ist als R2, da somit das zweite RC-Glied das erste weniger belastet.&lt;br /&gt;
&lt;br /&gt;
Mehr Informationen zur Restwelligkeit bei RC Tiefpässen kann man [http://www.mikrocontroller.net/topic/181033#1747063 diesem] Thread entnehmen.&lt;br /&gt;
&lt;br /&gt;
Das Spiel kann noch um einiges gesteigert werden, wenn man Tiefpässe dritter, vierter und noch höherer Ordung einsetzt. Das wird vor allem im Audiobereich gemacht. Dazu werden praktisch Operationsverstärker eingesetzt. In der [[AVR]] Application-Note [http://www.atmel.com/dyn/resources/prod_documents/doc1456.pdf AVR335: Digital Sound Recorder with AVR and DataFlash] wird zum Beispiel ein mit Operationsverstärkern aufgebauter Chebychev-Tiefpass fünfter Ordnung verwendet. Man findet im Audiobereich gelegentlich auch Schaltungen ohne expliziten Tiefpass. Dabei wird der Ausgang eines Class-D Verstärkers (der nichts anderes als ein PWM-Signal erzeugt) über einen Widerstand auf einen Lautsprecher gegeben. Die mechanische Trägheit und die Induktivität der Lautsprecherspule bilden mit dem Widerstand einen Tiefpass.&lt;br /&gt;
&lt;br /&gt;
==== Vollintegrierte Lösungen ====&lt;br /&gt;
&lt;br /&gt;
Wer all den Aufwand nicht betreiben will kauft einen fix und fertigen IC wie z.B.&lt;br /&gt;
&lt;br /&gt;
*[http://www.linear.com/product/LTC2644 LTC2644] von Linear Technology&lt;br /&gt;
*[http://www.linear.com/product/LTC2645 LTC2645] von Linear Technology&lt;br /&gt;
&lt;br /&gt;
== Anwendungen (Leistung) ==&lt;br /&gt;
Bei geeigneten Verstärkerstufen können PWM-Signale auch direkt zur Versorgung und Steuerung von Verbrauchern genutzt werden:&lt;br /&gt;
&lt;br /&gt;
=== Schaltnetzteil (Generator)===&lt;br /&gt;
PWM-Stufen sind ein integraler Bestandteil praktisch aller heute verfügbarer Schaltnetzteile. Nur durch die digitale, pulsartige Entnahme der Ladung aus dem Versorgungsnetz lassen sich mittlere und höhere Leistungen noch effektiv und verlustarm beziehen. Die PWM wird dabei von einer Steuereinheit getrieben, welche die aktuelle Versorgungspannung in Betracht zieht, bzw. auch den Strombedarf des angeschlossenen Verbrauchers berücksichtigt. Damit lassen sich sowohl einfach passive und aktive Phasenanschnittversorgungen realisieren, aber auch voll geregelte Leistungsnetzteile mit sehr geringen effektiven Innenwiderständen aufbauen.&lt;br /&gt;
&lt;br /&gt;
=== Heizung (ohmscher Verbraucher)===&lt;br /&gt;
Eine Heizung (Beispiel) mit 10Ω-Widerstand soll mit bis zu 12 V angesteuert werden. Dazu wird ein 13 V-Netzteil sowie ein linearer Verstärker verwendet (ein linearer Verstärker braucht immer eine etwas höhere Betriebsspannung als die maximale Ausgangsspannung). &lt;br /&gt;
&lt;br /&gt;
Sollen nun 12 V auf die Heizung gegeben werden, fällt (fast) die gesamte Spannung über der Heizung selber ab, der Verstärker &amp;quot;verbraucht&amp;quot; nur 1 V. Es fließen ca. 1,2 A, es werden ca. 14,4 W in der Heizung in Wärme umgesetzt, im Verstärker ca. 1,2 W, der Wirkungsgrad beträgt 92%.&lt;br /&gt;
&lt;br /&gt;
Wenn jetzt aber nur noch 6 V an der Heizung anliegen sollen, muss der lineare Verstärker die &amp;quot;übrigen&amp;quot; 7 V verbrauchen, d.h. von den 13 V, welche konstant vom Netzteil geliefert werden, fallen 7 V über dem Verstärker und 6 V über der Heizung ab. Die Transistoren des linearen Verstärkers sind nur halb durchgesteuert. Es fließt ein Strom von ca. 600 mA, in der Heizung werden ca. 3,6 W in Wärme umgesetzt. Allerdings werden auch 4,2 W im Verstärker in Wärme umgesetzt! Der Wirkungsgrad ist nur noch 46%!&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz dazu sind bei einer PWM die Transistoren des digitalen Verstärkers immer nur entweder voll durchgesteuert oder gar nicht durchgesteuert. Im ersteren Fall fällt nur eine geringe Verlustleistung über dem Transistor ab, da die Sättigungsspannung &amp;lt;math&amp;gt;V_{SAT}&amp;lt;/math&amp;gt; sehr gering ist (meist weniger als 1 V). Im zweiten Fall fällt gar keine Verlustleistung über dem Transistor ab, da kein Strom fließt (P=U*I). Im Fall der 6 V an der Heizung beträgt das notwendige Tastverhältnis 0,23. D.h. nur während 23% der PWM-Periode wird Verlustleistung im digitalen Verstärker erzeugt und zwar ca.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;P_V=DC \cdot \frac {V_{CC}}{R} \cdot V_{SAT} = 0{,}23 \cdot \frac {12V}{10\Omega} \cdot 1V = 0{,}28 W&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Wirkungsgrad liegt bei 92%!&lt;br /&gt;
&lt;br /&gt;
=== Lautsprecher (induktiv) ===&lt;br /&gt;
In jüngster Zeit werden immer häufiger Lautsprechersysteme direkt aus digitalen Leistungsverstärkern betrieben. Dabei wird die Induktivität des Verbrauchers, die im Wesentlichen die Impedanz bestimmt, in Verbindung mit den kleinen ohmschen Widerständen des Ausgangstreibers, der Leitungen und des Lautsprechers als Tiefpass verwendet. Bei PWM-Signalen müssen hierbei jedoch sehr hohe Frequenzen gewählt werden, um Audiosignale in akzeptabler Qualität zu repräsentieren. Auch muss das Signal entsprechend nichtlinear vorverzerrt werden, um zu einem letzlich linearen Verhalten des Verbrauchers zu führen. Siehe 1-Bit-Audio. Für einfache Applikationen und geringen Leistungen ist dies aber eine sehr interessante Option. Für professionelle Audioanwendungen greift man bei digitalen Verstärkern jedoch auf andere Modulationsverfahren wie COM oder PDM zurück.&lt;br /&gt;
&lt;br /&gt;
=== Motorsteuerung (ohmsch-Induktiv) ===&lt;br /&gt;
Eine der wichtigsten Anwendungen für PWM-Stufen ist die direkte Ansteuerung von Motoren. Der große Vorteil von PWM ist auch hier wieder der hohe Wirkungsgrad. Würde man stattdessen einen Digital-Analog-Wandler mit einem nachgeschalteten analogen Verstärker zur Ansteuerung verwenden, würde im Verstärker eine höhere Verlustleistung in Wärme umgewandelt werden. Ein digitaler Verstärker mit PWM hat dagegen geringere Verluste. Die Nachteile der Oberwellen im Signal spielen bei der Motorentechnik in der Regel keine Rolle, da hier noch mechanische Trägheiten zur effektiven Glättung beitragen. Die verwendete Frequenz liegt meist im Bereich von einigen 10kHz. Zur Berechnung der Drehzahl eines Motors kann im Normalfall der Mittelwert der PWM-Spannung als Betriebsspannung angenommen werden.&lt;br /&gt;
&lt;br /&gt;
Bei Leistungsanwendungen spielen die Transienten der ansteuernden Rechteckimpulse jedoch dahingehend eine Rolle, dass sie die Verluste der Schaltelemente (MOSFETs) in die Höhe treiben und die ungefilterten Anteile in den Motoren zu Schwingungen führen, weil Resonanzen angeregt werden können.&lt;br /&gt;
&lt;br /&gt;
=== Dimmen von Leuchtmitteln (ohmsch - kapazitiv)  ===&lt;br /&gt;
Eine spezielle Form der PWM-Anwendung ist die Helligkeitssteuerung. Bei kapazitiven Verbauchern wie Leuchtstoffröhren müssen besondere Randbedingungen beachtet werden, um ein Dimmen zu erzielen. So sind besondere Frequenzen und Anlaufphasen zu applizieren. Mache Verbaucher lassen sich trotzdem überhaupt nicht dimmen. Bei überwiegend ohmschen Verbrauchen wie z.B. Glühbirnen oder Halbleiter-Leuchtdioden, sind die PWM-Signale aber ohne große Regelung anwendbar. &lt;br /&gt;
&lt;br /&gt;
Siehe Artikel:&lt;br /&gt;
* [[LED-Fading]] - LED dimmen mit PWM &lt;br /&gt;
&lt;br /&gt;
== Oft gestellte Fragen (FAQ) ==&lt;br /&gt;
&lt;br /&gt;
=== Mit welcher Frequenz dimmt man? ===&lt;br /&gt;
&lt;br /&gt;
Eine gegebene Antwort dazu war: Bei Glühlampen kannst Du alles über 20Hz nehmen. Die sind derart träge... Über 9kHz sollte man wegen [[EMV]] nicht gehen. Für [[LED]]s ist alles über 1kHz und unter 9kHz gut. (Autor: Travel Rec. (travelrec), Datum: 27.12.2008 11:32)&lt;br /&gt;
&lt;br /&gt;
Dazu ist jedoch zu sagen, daß PWM-Steuerungen bei Glühlampen meisten verwendet werden, um die 50Hz-Thematik zu umgehen. Dabei ist das Brummen relevant und auch ein Blinken bei sehr geringen Frequenzen. Typischerweise wird man daher eher 200Hz aufwärts verwenden. Umgekehrt sind Stromkabel nicht geschirmt und besitzen eine gewisse Kapazität, was Frequenzen im kHz-Bereich nicht sinnvoll erscheinen läßt. Auch LEDs wirken bei hohen Frequenzen kapazitiv, was zu einer unnötigen Strombelastung führt. Ist die LED für Belichtungsaufgaben relevant ist die Dimmungsfrequenz genügend hoch zu wählen, um gegenüber kurzen Belichtungen irrelvant zu sein. Dies ist in der Regel ab 10kHz der Fall. Um bei hohen Strömen einen unnötigen Stossstrom zu vermeiden und damit die LEDs besser ausnutzen zu können - kann eine Drossel mit geringer Induktivität sinnvoll sein, die die Anstiege begrenzt.&lt;br /&gt;
&lt;br /&gt;
=== Wie schätze ich die Verlustleistung am MOSFET im PWM Betrieb ab? ===&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/190878#1862634 Beitrag von Falk]: &lt;br /&gt;
&lt;br /&gt;
Vereinfacht kann man sagen, dass während der Umschaltzeit die Verlustleistung am MOSFET = 1/4 der Verlustleistung am Verbraucher ist, wenn  der eingeschaltet ist (Leistungsanpassung).&lt;br /&gt;
&lt;br /&gt;
Beispiel: 150 Hz PWM = 6,6ms, Schaltzeit 500ns, Verbraucher 60W. Macht 15W Verlust während der zwei Umschaltungen pro Takt, sprich 2x500ns = 1µs. Aber das nur alle 6,6ms, Im Mittel macht das 1us/6,6ms*15W = 2,2mW. Glück gehabt ;-) Bei hohen PWM-Frequenzen im Bereich 20-500kHz, wie sie heute bei Schaltnetzteilen üblich sind, kommt da aber schon richtig viel zusammen.&lt;br /&gt;
&lt;br /&gt;
Etwas genauer: [https://www.mikrocontroller.net/articles/FET#Schalt-Verluste Schaltverluste beim FET]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Pulsdichtemodulation]]&lt;br /&gt;
* [[AVR-Tutorial: PWM]]&lt;br /&gt;
* [[AVR-GCC-Tutorial#PWM (Pulsweitenmodulation)|AVR-GCC-Tutorial: PWM]]&lt;br /&gt;
* [[Soft-PWM]]&lt;br /&gt;
* [[Motoransteuerung mit PWM]]&lt;br /&gt;
* [[LED-Fading]]&lt;br /&gt;
* [[AVR PWM]]&lt;br /&gt;
* [[Ambilight in Hardware]]&lt;br /&gt;
* [[Glättungsfilter für 1-Bit DA-Wandlung|1-Bit Digital-Analog-Wandlung]]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/361429#4054456 Forumsbeitrag]: Audioausgabe mit PWM&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/397337?goto=4590784#4575721 Forumsbeitrag]: H-Bridge 50Hz Sinus - LC Filter dimensionieren&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/385654#4410160 Forumsbeitrag]: Arduino Mega 11 PWM-Pins mit 1kHz &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Signalverarbeitung]]&lt;br /&gt;
[[Kategorie:Leistungselektronik]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
*[http://www.solar-webshop.de/blog/pwm-puls-weiten-modulation-solar/ Was bedeutet PWM?]&lt;br /&gt;
&lt;br /&gt;
*[http://pic-projekte.de/wiki/index.php?title=PIC_Tutorial#Pulsweitenmodulation_.28PWM.29 PWM Modul am PIC]&lt;br /&gt;
&lt;br /&gt;
*[http://www.batsocks.co.uk/readme/art_bcm_1.htm Binary Code Modulation] - Eine Alternative zu PWM?&lt;/div&gt;</summary>
		<author><name>87.178.97.251</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=LED&amp;diff=97021</id>
		<title>LED</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=LED&amp;diff=97021"/>
		<updated>2017-08-21T19:05:50Z</updated>

		<summary type="html">&lt;p&gt;87.178.97.251: Pulsbetrieb&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung == &lt;br /&gt;
&lt;br /&gt;
[[Bild:Ledrgb.jpg|thumb|right|246px|Detailfoto einer RGB-LED [http://www.mikrocontroller.net/topic/109784#990685]]]&lt;br /&gt;
&lt;br /&gt;
Eine LED (engl. &amp;lt;B&amp;gt;L&amp;lt;/B&amp;gt;ight &amp;lt;B&amp;gt;E&amp;lt;/B&amp;gt;mitting &amp;lt;B&amp;gt;D&amp;lt;/B&amp;gt;iode, &#039;&#039;Leuchtdiode&#039;&#039;) besteht aus einem [[Halbleiter]]-PN-Übergang, der durch seine Zusammensetzung Licht eines stark begrenzten Wellenbereiches emittiert, wenn er in Durchlassrichtung von Strom durchflossen wird. Die Helligkeit einer LED ist in erster Näherung proportional zum Strom.&lt;br /&gt;
&lt;br /&gt;
Die Farbe des emittierten Lichts hängt vom verwendeten Halbleitermaterial ab. Es existieren [[Halbleiter | Halbleitermaterialien]] für den gesamten sichtbaren Bereich als auch für den Infrarotbereich und den nahen Ultraviolettbereich. Für kurze Wellenlängen (Blau bis Ultraviolett) ist ein Halbleitermaterial wie z.&amp;amp;nbsp;B. GaN oder InGaN erforderlich (UV &amp;lt; 365nm: AlN). Für die ersten blauen LEDs wurde SiC verwendet, welche aber eine schlechte Effizienz hat (Quelle:Wikipedia).&lt;br /&gt;
&lt;br /&gt;
Weißes Licht oder andere Farbmischungen können erzeugt werden, indem man eine Blau- oder Ultraviolett-LED mit einem Phosphormaterial (weiß: mit Cer dotiertes YAG) beschichtet, welches durch das Licht der LED zur Emission angeregt wird. Die entstehende Farbe wird dabei von der Beschichtung bestimmt.&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
== Flußspannung ==&lt;br /&gt;
&lt;br /&gt;
LEDs haben im Vergleich zu gewöhnlichen [[Diode|Dioden]] eine vergleichsweise hohe, vom Halbleitermaterial abhängige [[Durchlass-Spannung | Flußspannung]]. Bevor diese erreicht wird, fließt nur sehr wenig Strom und die LED leuchtet praktisch nicht. Oberhalb der Flußspannung steigt der Strom schnell an (Diodenkennlinie). Die Flußspannung reicht von ca. 1,2 V bei Infrarot-LEDs bis zu etwa 4 V bei Ultraviolett-LEDs. Auffällig ist die Korrelation zwischen Spannung und der Farbe, die damit zusammenhängt, dass die Emission höherenergetischer Photonen einen größeren Bandabstand (Energiedifferenz) im Halbleitermaterial erfordert, welcher von den Elektronen überwunden werden muss, wenn sie ihre Energie abgegeben. Da anfänglich nur Halbleiter mit geringem Bandabstand produziert wurden und aufgrund von mangelnder Reinheit oft Zwischenniveaurekombination stattfand, waren lange Zeit keine blauen oder gar echte violette LEDs herstellbar. Die ersten verfügbaren LEDs waren naturgemäß auch rot.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:centre&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Farbe || typische&amp;lt;br&amp;gt;Flussspannung [V]&lt;br /&gt;
|-&lt;br /&gt;
| Infrarot || 1,2&lt;br /&gt;
|-&lt;br /&gt;
| Rot || 1,8&lt;br /&gt;
|-&lt;br /&gt;
| Gelb || 2,0&lt;br /&gt;
|-&lt;br /&gt;
| Grün || 2,2&lt;br /&gt;
|-&lt;br /&gt;
| Grün&amp;lt;br&amp;gt;(Ultrahell) || 3,3&lt;br /&gt;
|-&lt;br /&gt;
| Blau || 3,6&lt;br /&gt;
|-&lt;br /&gt;
| Weiß || 3,6&lt;br /&gt;
|-&lt;br /&gt;
| Ultraviolett || 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Durchlassstrom == &lt;br /&gt;
&lt;br /&gt;
Da LEDs durch einen zu hohen Strom zerstört werden, muss der Strom begrenzt werden. Der Maximalstrom einer LED ist bei allen Typen sehr ähnlich und liegt bei 20 -30 mA. Eine Standard-LED wird üblicherweise mit 20 mA betrieben. Moderne LEDs kommen häufig mit sehr viel weniger Strom aus. So benötigt eine Low-Current LED nur 2 mA um sehr hell zu leuchten. In der Praxis werden LEDs oft mit einem weit geringeren als dem maximal zulässigen Durchlassstrom betrieben. Insbesondere im Entwicklungs- und Experimentierumfeld kann eine für maximal 20 mA ausgelegte LED auch mit lediglich 3-5 mA betrieben werden. Der subjektiv wahrgenommene Helligkeitsverlust ist deutlich geringer, als der prozentuale Unterschied der Stromstärke vermuten lässt, siehe Artikel [[LED-Fading]].&lt;br /&gt;
&lt;br /&gt;
=== Warum benötigt man einen Vorwiderstand? ===&lt;br /&gt;
&lt;br /&gt;
Diese Frage wird seit langer Zeit immer wieder gestellt.&lt;br /&gt;
&lt;br /&gt;
Die [https://www.mikrocontroller.net/attachment/151822/LED-Kennlinien.png Kennlinie] einer LED ist stark nichtlinear. Unterhalb der Flußspannung fließt fast kein Strom und die LED leuchtet kaum. Oberhalb der Flußspannung steigt der Stromfluß schon bei kleinen Spannungsänderungen stark an. In der Praxis müsste man nun die Spannung für jede einzelne LED exakt einstellen, um den exakten Strom zu treffen und auch zu halten. Das kann und will man aber nicht. Außerdem unterliegt die Flußspannung sowohl einer Fertigungstoleranz als auch einer negativen Temperaturdrift, d.h. bei höherer Temperatur (Umgebung oder Eigenerwärmung) sinkt die Flußspannung. Alle diese Effekte kann man problemlos mit einem Vorwiderstand soweit abschwächen, dass sie praktisch keine große Rolle mehr spielen, ganz ohne präzise Spannungseinstellung.&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel. In diesem [https://www.mikrocontroller.net/attachment/151822/LED-Kennlinien.png Bild] ist die Kennlinie einer grünen LED mit und ohne Vorwiderstand dargestellt. Die Flußspannung beträgt ca. 2,2V bei 10mA LED-Strom. Wenn man jetzt exakt 2,05V anlegt, fließen 6mA (blaue Kurve). Schwankt jetzt aber die angelegte Spannung um +/-0,2V (10%), dann schwankt der Strom um +14/-5mA! Ganz anders mit Vorwiderstand. Man braucht eine höhere Spannung, hier beispielsweise 4V, wobei auch 6mA fließen (rosa Kurve). Schwankt diese nun um +/-0,4V (10%), schwankt der Strom nur um +/-1mA. Das ist deutlich stabiler!&lt;br /&gt;
&lt;br /&gt;
=== Vorwiderstand ===&lt;br /&gt;
&lt;br /&gt;
Im einfachsten Fall und bei relativ geringfügig variierender Betriebsspannung kann man dazu einen Widerstand einsetzen.&lt;br /&gt;
&lt;br /&gt;
[[bild:led_rv.png|right]]&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R_V=\frac{Vcc-U_\text{LED}}{I_\text{LED}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;R_V&amp;lt;/math&amp;gt;: Vorwiderstand in Ohm&lt;br /&gt;
* Vcc: Betriebsspannung in Volt&lt;br /&gt;
* &amp;lt;math&amp;gt;U_{LED}&amp;lt;/math&amp;gt;: Durchlassspannung der LED in Volt&lt;br /&gt;
* &amp;lt;math&amp;gt;I_{LED}&amp;lt;/math&amp;gt;: Strom durch die LED in Ampere&lt;br /&gt;
&lt;br /&gt;
Bei 6 V Betriebsspannung, einer Durchlassspannung der LED von 2,4 V und einem gewünschten Strom von 20 mA braucht man nach dem ohmschen Gesetz einen Widerstand von 180Ω, bei 12 V Betriebsspannung sind es 480Ω. In der Praxis wird jeweils der nächstgrößere Standardwert gewählt (E-Reihen).&lt;br /&gt;
&lt;br /&gt;
Was passiert nun, wenn die Flußspannung der LED etwas anders ist als angenommen, z.B. durch Fertigungstoleranzen, höheren Strom oder stark veränderte Temperatur? Bleiben wir bei dem Beispiel mit 6V Versorgungsspannung, 2,4V Flußspannung, 20mA und 180 Ohm Vorwiderstand. Es fallen rechnerisch 3,6V am Vorwiderstand ab. Wenn nun die Flußspannung um 0,2V schwankt (realistischer Wert), ändert sich die Spannung über dem Vorwiderstand um diese 0,2V. Bezogen auf 3,6V Spannungsabfall sind das 5,5%. Bei 12V Betriebsspannung und damit 9,6V Spannungsabfall über dem Vorwiderstand sind es nur noch 2%. Daraus erkennt man, dass der Vorwiderstand umso besser als [[Konstantstromquelle]] wirkt, je höher der Spannungsabfall über diesem ist. Eine echte Konstantstromquelle mit aktiven Elementen (Transistoren) erreicht den gleichen Effekt mit deutlich weniger Spannungsabfall.&lt;br /&gt;
&lt;br /&gt;
Mit einem 480-Ohm-Widerstand, welcher für 12 V Betriebsspannung passend ist, würden bei 6 Volt statt 20 mA nur noch 7,5 mA fließen. Mit einem 180-Ohm-Widerstand, welcher für 6 V Betriebsspannung passend ist, würden bei 12 V statt der gewünschten 20 mA allerdings schon 53 mA fließen. &lt;br /&gt;
&lt;br /&gt;
Beachten muss man auch die als Wärme abgegebene &#039;&#039;&#039;Verlustleistung&#039;&#039;&#039; über dem Vorwiderstand, vor allem wenn man LEDs an eine recht hohe Betriebsspannung von 12 V oder gar 24 V anschließt. Die Verlustleistung berechnet sich einfach aus&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;P_\text{RV} = (V_\text{cc}-U_\text{LED}) \cdot I_\text{LED} = I_\text{LED}^2 \cdot R_\text{V}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel mit der 2,4-V-LED und einem Strom von 20 mA heißt das, dass an dem 480-Ohm-Widerstand eine Verlustleistung von 192 mW abfällt. Ein kleiner SMD-Widerstand der Größe 0805 hält das nicht mehr aus (1/8 W = 125 mW maximal).&lt;br /&gt;
&lt;br /&gt;
Wie man aus dem Beispiel erkennt, ist bei stark variierender Betriebsspannung ein Vorwiderstand weniger geeignet. Es sei denn, man nimmt sehr unterschiedliche LED-Ströme und damit LED-Helligkeiten oder möglicherweise die Zerstörung der LED in Kauf.&lt;br /&gt;
&lt;br /&gt;
=== Unsichtbarer Vorwiderstand ===&lt;br /&gt;
&lt;br /&gt;
Bei Batteriebetrieb werden LEDs häufig ohne Vorwiderstand betrieben. So z.B. bei billigen Taschenlampen und Fahrradlampen. Dabei werden oft sogar zwei 1,5V Batterien in Reihe geschaltet und die LED direkt angeschlossen. Der Grund ist, dass das alles nichts kosten darf und man sich auf den Innenwiderstand der Batterie und der LEDs verlässt, um den Strom halbwegs zu begrenzen. Allerdings schwankt damit die Helligkeit der LED stark mit den Toleranzen und dem Ladezustand der Batterien.&lt;br /&gt;
&lt;br /&gt;
=== Konstantstromquelle ===&lt;br /&gt;
&lt;br /&gt;
Bei stark schwankender Versorgungsspannung oder Umgebungstemperatur heißt der Ausweg [[Konstantstromquelle]]. Kriterien für die Auswahl einer Schaltung für die Konstantstromquelle sind hierbei z.&amp;amp;nbsp;B. Betriebsspannungsbereich, erforderliche Genauigkeit und Kosten. Auch hier ist zu beachten, daß die Verlustleistung der Konstantstromquelle von den Bauteilen abgeführt werden muss, mit einer gewissen Ausnahme der Lösungen mit Schaltregler.&lt;br /&gt;
&lt;br /&gt;
== Mehrere LEDs zusammenschalten ==&lt;br /&gt;
&lt;br /&gt;
Diese Frage bewegt immer wieder die Gemüter. Wie schaltet man mehrere LEDs &#039;&#039;&#039;richtig&#039;&#039;&#039; zusammen?&lt;br /&gt;
&lt;br /&gt;
=== Reihenschaltung ===&lt;br /&gt;
&lt;br /&gt;
In einer Reihenschaltung ist der Strom durch alle Verbraucher gleich, ideal für LEDs. Hat man eine ausreichend hohe Versorgungsspannung, kann man mehrere LEDs in Reihe schalten. Dann reicht ein einziger Widerstand bzw. eine [[Konstantstromquelle]]. Allerdings sollte man das nicht übertreiben. 100–150 LEDs direkt an die Netzspannung zu hängen ist nicht möglich, da die LEDs zu viel Sperrspannung abbekommen würden. Auch bei gleichgerichteter Spannung besteht ein Sicherheitsproblem. Als Hobbybastler sollte man sich auch hier auf Spannungen kleiner als 40V beschränken.&lt;br /&gt;
&lt;br /&gt;
=== Parallelschaltung ===&lt;br /&gt;
&lt;br /&gt;
Das direkte Parallelschalten von LEDs ist sehr kritisch und muss vermieden werden. Grund ist die exponentielle Diodenkennlinie, welche bewirkt, dass eine kleine Spannungsänderung eine große Stromänderung hervorruft. Schaltet man nun zwei LEDs mit verschiedenen Durchlassspannung parallel, bekommt die mit der niedrigeren Durchlassspannung DEUTLICH mehr Strom ab, dadurch wird sie nicht nur deutlich heller sondern auch wärmer. Das führt zum 2. Problem, denn mit steigender Temperatur sinkt die Durchlassspannung zusätzlich, wodurch sich der Effekt weiter verstärkt! LEDs verschiedener Farben haben sehr unterschiedliche Durchlassspannungen, hier ist ein direktes Parallelschalten vollkommen unmöglich. Aber selbst LEDs mit gleicher Farbe und aus einem Produktionsdurchlauf (Lot) weisen herstellungsbedingt bisweilen erhebliche Streuungen der Durchlassspannung auf!&lt;br /&gt;
&lt;br /&gt;
Richtig Parallelschalten kann man LEDs aber durch&lt;br /&gt;
&lt;br /&gt;
* Vorwiderstand/Konstantstromquelle für jede einzelne LED&lt;br /&gt;
* Auswählen von ausgemessenen LEDs mit sehr ähnlicher Flußspannung&lt;br /&gt;
&lt;br /&gt;
Letztere Methode wird von professionellen Herstellern verwendet, um bei grösseren Anzeigen LEDs direkt parallel schalten zu können. Die Unterschiede in der Flußspannung bei Nennstrom sollten dabei kleiner als 10mV(?) sein. Das gilt natürlich auch für das Parallelschalten von LED-Strängen, also Reihenschaltungen von LEDs.&lt;br /&gt;
&lt;br /&gt;
=== Reihen- plus Parallelschaltung ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:LED_array_Iconst.png|framed|LED-Array mit Konstantstromquelle]]&lt;br /&gt;
Eine Kombination aus Serien- und Parallelschaltung ist weniger kritisch, da sich die unterschiedlichen Kennlinien statistisch mitteln. Z.B. kann man 20 LEDs in Reihe und mehrere solcher Stränge parallel schalten. Eine einzelne Diode mit geringerer Durchlaßspannung wird im Strom durch 9 andere begrenzt. Der Stromanstieg infolge der Unterschiede der einzelnen Stränge erzeugt an allen Bahnwiderständen der Dioden einen Spannungsabfall, der die ungleiche Stromverteilung begrenzt. Dieses Array von LEDs kann man nun mit einer leistungsstarken [[Konstantstromquelle]] speisen. Da LEDs mit bis zu 20% in ihrer effektiven Leuchtkraft bei gleichem Strom streuen, sollte man wenigstens 10 LEDs in Reihe schalten und diese auch nur zu 70% auslasten, um optische Schwankungen auf ein Maß der Nichtsichtbarkeit zu senken und Mitkopplungseffekte infolge von Erwärmung zu begrenzen. Statistisch streuen die Helligkeiten dann nur noch im Bereich einiger Prozente. Allerdings hat diese Verschaltung einen Nachteil. Fällt in einem Strang eine LED mit Unterbrechung aus, verteilt sich der konstante Gesamtstrom auf die restlichen Stränge, diese werden somit stärker belastet, im Extremfall überlastet.&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
[[bild:LED_array_Uconst.png|framed|LED-Array an Konstantspannung]]&lt;br /&gt;
Möchte man das vermeiden, nutzt man sinnvollerweise pro Strang einen möglichst großen Vorwiderstand oder noch besser gleich eine [[Konstantstromquelle]] auf Basis eines LM317 oder ähnlich und speist das Array mit einer Konstant&#039;&#039;&#039;spannungs&#039;&#039;&#039;quelle (normales Netzteil). Damit sind die Stromschwankungen auf Grund der Tolereranz der Flußspannungen sicher beseitig. Dabei muss man beachten, daß die Versorgungsspannung hoch genug gewählt wurde, um die Toleranzen auszugleichen. Die einzelnen Vorwiderstände bzw. Konstanzstromquellen haben den Vorteil, daß beim Ausfall einer Kette die anderen Ketten nicht zusätzlich belastet werden.&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
== Pulsbetrieb an Überspannung ==&lt;br /&gt;
LEDs können kurzzeitig über dem Nennstrom betrieben werden, um eine höhere Lichtausbeute zu erzielen, wenn 3 Bedingungen beachtet werden:&lt;br /&gt;
* die maximale Spannung darf nicht zu hoch werden, um die Feldstärke im Bauelement, ab der eine Atomwanderung auftritt nicht zu überschreiten. Kommt die LED in die Nähe dieses Punktes, so setzt eine Alterung ein&lt;br /&gt;
* der Pulsstrom darf nicht zu hoch werden, um die LED kapazititv nicht zu überladen. Diese Gefahr besteht bei rechteckicken Stromimpulsen, weil die LED hochfrequente Signale gut aufnehmen kann. Die Ladungen sammeln sich dann in der Raumladungszone und erzeugen ein hohes Gegenfeld, welches einen Strom zur Folge hat.&lt;br /&gt;
* mittlere Leistung darf nicht überschritten werden, damit es zu keinem Wärmetod der LED kommt.&lt;br /&gt;
&lt;br /&gt;
Besagte Probleme sind insbesondere bei Leistungs-LED im Pulsbetrieb zu beobachten, weil trotz PWM-Dimmung zwar ein mathematisch kleinerer Strom fliesst, die kapazitiven Ströme und Umschaltverluste aber zu insgesamt mehr Belastung führen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Direktbetrieb an 230V ==&lt;br /&gt;
&lt;br /&gt;
Eine Methode, LEDs an 230V direkt zu betreiben, ist die Strombegrenzung mit einem spannungsfesten Kondensator [https://www.mikrocontroller.net/articles/Controller_an_230V#Versorgung_.C3.BCber_Vorwiderstand.2FKondensator Kondensatornetzteil], der in Reihe zur eigentlichen LED-Schaltung liegt, die aus einem 4-Wege-Gleichrichter, einem ELKO und einer Anzahl als Array verschalteter LEDs besteht. Die LEDs können wie im obigen Beispiel auf 20V oder 24V ausgelegt werden und sollten mit zwei antiseriell geschalteten Z-Dioden auf 24/28V begrenzt werden, um Spannungsspitzen abzufangen. Die Kapazität richtet sich nach der Stromaufnahme der LED-Stränge. Eine andere Möglichkeit befindet sich im Artikel [[LED-Glühbirne]].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Tutorial: IO-Grundlagen#Hardware]]&lt;br /&gt;
* [[LED-&amp;quot;Birnen&amp;quot;]]&lt;br /&gt;
* [[LED-Matrix]]&lt;br /&gt;
* [[LED-Fading]]&lt;br /&gt;
* [[Lichtsensor / Helligkeitssensor#LED]]&lt;br /&gt;
* [[Ambilight in Hardware]]&lt;br /&gt;
* [[Konstantstromquelle]] &lt;br /&gt;
* [[Konstantstromquelle fuer Power LED]]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/158836?goto=2759782#2759782 Forumsbeitrag]: LEDs an 230V Netzspannung mit Konstantstromquelle&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/219681#2197034 Forumsbeitrag]: Darstellung der Toleranzen von LEDs und deren Wirkung, oder &amp;quot;Warum man einen Vorwiderstand braucht&amp;quot;&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/74169#618682 Forumsbeitrag]: 16-Segment Ganganzeige ohne Mikrocontroller&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267113#2788848 Forumsbeitrag]: Unbekannte LEDs ausmessen.&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/280991?goto=2966997#2966820 Forumsbeitrag]: Konstantstromquelle für LED an 40-420VDC&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/290710?goto=3106790#3106790 Forumsbeitrag]: Graphische Ermittlung des LED-Stroms und der Toleranzen&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/311454#new Forumsbeitrag]: Glühbirnen ungepulst betreiben?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/289238#3073788 Forumsbeitrag]: 2 LEDs mit einem Portpin steuern&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261525?goto=new#new Forumsbeitrag]: Samsung Hochvolt AC LED Erfahrungen?&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/goto_post/4153684 Forumsbeitrag]: Berechung des Spannungsabfalls an langen LED-Ketten&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/390644#new Forumsbeitrag]: Messung von LEDs und Statistik&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/389174#4459604 Forumsbeitrag]: Dokumente zu Lasern im Pulsbetrieb&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://de.wikibooks.org/wiki/Arbeiten_mit_LEDs/_Grundlagen Wikibooks Arbeiten mit LEDs: Grundlagen] - Sehr gute Erklärung, auch für Anfänger&lt;br /&gt;
* [http://www.theledlight.com/technical.html www.theledlight.com] - LED Information and Technical Data (englisch)&lt;br /&gt;
* [http://forum.electronicwerkstatt.de/phpBB/faq/led/ LED FAQ für Anfänger]&lt;br /&gt;
* [http://members.misty.com/don/ledx.html Don Klipstein&#039;s LED Main Page (engl.)]&lt;br /&gt;
* [http://www.robotroom.com/LEDTester.html Selecting a LED] - LED Tester von David Cook (Beginnerprojekt)&lt;br /&gt;
* [http://www.evilmadscientist.com/article.php/throw Some thoughts on throwies] von Windell H. Oskay von www.evilmadscientist.com&lt;br /&gt;
*[http://www.led-rechner.de www.led-rechner.de]&lt;br /&gt;
*[http://catalog.osram-os.com/catalogue/catalogue.do?act=downloadFile&amp;amp;favOid=02000002000040ac000100b6 Vergleich von LED-Schaltungen ] - Applikationsschrift von OSRAM, engl.&lt;br /&gt;
* [http://catalog.osram-os.com/catalogue/catalogue.do;jsessionid=CBC285EE73F7A4DA3956223C87D46516?act=downloadFile&amp;amp;favOid=0200000200004264000100b6 Ansteuerung von Power TOPLEDs] - Applikationsschrift von OSRAM, engl.&lt;br /&gt;
*[http://catalog.osram-os.com/catalogue/catalogue.do;jsessionid=CBC285EE73F7A4DA3956223C87D46516?act=downloadFile&amp;amp;favOid=0200000200001b48000200b6 Verhalten von InGaN LEDs in Parallelschaltungen] - Applikationsschrift von OSRAM, engl.&lt;br /&gt;
*[https://en.wikipedia.org/?title=Light-emitting_diode Leuchtdiode]&lt;br /&gt;
*[http://electronics-electrical.exportersindia.com/lighting-displays/led-lights.htm LED-Leuchten Hersteller]&lt;br /&gt;
&lt;br /&gt;
[[Category:Bauteile]]&lt;br /&gt;
[[Category:Grundlagen]]&lt;br /&gt;
[[Category:Displays und Anzeigen| ]]&lt;/div&gt;</summary>
		<author><name>87.178.97.251</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=LED-Matrix&amp;diff=97020</id>
		<title>LED-Matrix</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=LED-Matrix&amp;diff=97020"/>
		<updated>2017-08-21T18:47:33Z</updated>

		<summary type="html">&lt;p&gt;87.178.97.251: Nachteile&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In einer [[LED]]-Matrix sind jeweils die Kathoden und Anoden der LEDs in Zeilen bzw. Spalten verbunden. Der Vorteil besteht darin, dass weniger Kontakte nach außen geführt und angesteuert werden müssen, ebenso sinkt der Verdrahtungsaufwand im Modul bzw. auf der Platine. Die Ansteuerung erfolgt dabei im sogenannten Multiplexbetrieb. Prinzipiell kann man sowohl die Zeilen als auch die Spalten multiplexen. Die nachfolgende Beschreibung bezieht sich auf das Multiplexen von Spalten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:LEDmatrix_5x7.png|right|thumb|220px|Eine 5&amp;amp;times;7 LED-Matrix]]&lt;br /&gt;
&lt;br /&gt;
==Multiplexbetrieb==&lt;br /&gt;
Der Trick bei einer LED-Matrix besteht darin, dass jeweils immer nur eine Spalte wirklich leuchtet. Die anderen sind jeweils ausgeschaltet. Wird nun in schneller Folge jede Spalte einmal angeschaltet, so entsteht aufgrund der Trägheit des menschlichen Auges ein scheinbar vollständiges Bild, bei dem alle angesteuerten LEDs gleichzeitig leuchten. Wird dieser Zyklus schnell genug durchlaufen, ist das Bild bei ruhigem Auge weitgehend flimmerfrei, was ab ca. 100Hz erreicht wird. In Ausnahmefällen kann jedoch eine stark bewegte LED-Matrix auch bei höheren Multiplexfrequenzen als 100Hz noch flimmernd erscheinen, z.&amp;amp;nbsp;B. LED-Bremsleuchten, LED-Anzeigen an Zügen oder Strassenbahnen.&lt;br /&gt;
&lt;br /&gt;
Aufgrund der im Mittel geringeren Leuchtdauer der aktiven LEDs ist eine gezielte Stromüberhöhung der LEDs möglich und auch zur Sichtbarmachung auch nötig, um eine ausreichende Helligkeit zu erzielen. Damit sind dem Prinzip jedoch Grenzen hinsichtlich der maximalen Helligkeit und auch Matrixgröße gesetzt. Bei starken Stromüberhöhungen sind auch zusätlziche Kapazitäten nötig, um die Ladung zu transportieren, z.B. bei großen LED-Feldern. Weiter ist zu berücksichtigen, daß die Lebensdauer pulsartig angesteuerter LEDs sinken kann.&lt;br /&gt;
&lt;br /&gt;
Der Ablauf der Steuerung ist recht einfach:&lt;br /&gt;
&lt;br /&gt;
#alle Spalten ausschalten, Muster für Spalte C1 an Zeilen R1..R7 anlegen, Spalte C1 einschalten&lt;br /&gt;
# Spaltenmultiplexzeit warten&lt;br /&gt;
#alle Spalten ausschalten, Muster für Spalte C2 an Zeilen R1..R7 anlegen, Spalte C2 einschalten&lt;br /&gt;
# Spaltenmultiplexzeit warten&lt;br /&gt;
#alle Spalten ausschalten, Muster für Spalte C3 an Zeilen R1..R7 anlegen, Spalte C3 einschalten&lt;br /&gt;
# Spaltenmultiplexzeit warten&lt;br /&gt;
#alle Spalten ausschalten, Muster für Spalte C4 an Zeilen R1..R7 anlegen, Spalte C4 einschalten&lt;br /&gt;
# Spaltenmultiplexzeit warten&lt;br /&gt;
#alle Spalten ausschalten, Muster für Spalte C5 an Zeilen R1..R7 anlegen, Spalte C5 einschalten&lt;br /&gt;
# Spaltenmultiplexzeit warten&lt;br /&gt;
# Zyklus beginnt bei 1.&lt;br /&gt;
&lt;br /&gt;
Praktisch wird man dazu einen [[Timer]] per [[Interrupt]] verwenden, keine Warteschleifen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:LEDmatrix_timing.png|left|thumb|700px|Multiplexzeitdiagramm]]&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; margin:1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!LEDs  ||  IOs  ||  Vorwiderstände &lt;br /&gt;
|-&lt;br /&gt;
|16    ||    8  ||      4      &lt;br /&gt;
|-&lt;br /&gt;
|64    ||   16  ||      8     &lt;br /&gt;
|-&lt;br /&gt;
|1024  ||   64  ||     32     &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Durch Einsatz der Multiplexverfahrens können mit relativ wenigen Ansteuerbauteilen (IO-Pins, Transistoren, Stromquellen) sehr viele LEDs gesteuert werden. Während bei direkter Ansteuerung für jede LED ein IO-Pin sowie eine Stromquelle bzw. Vorwiderstand benötig würde,  ist in einer zweiachsigen LED-Matrix der Aufwand für die Bauteile deutlich geringer:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\text{Anzahl der Bauteile} = 2\text{Anzahl der LEDs pro Reihe}&amp;lt;/math&amp;gt;&lt;br /&gt;
(bei quadratischer Matrix)&lt;br /&gt;
:&amp;lt;math&amp;gt;\text{Anzahl der Bauteile} = \text{Anzahl der LEDs pro Reihe }+\text{ Anzahl der LEDs pro Spalte }&amp;lt;/math&amp;gt;&lt;br /&gt;
(bei rechteckiger Matrix)&lt;br /&gt;
&lt;br /&gt;
Siehe auch: [http://de.wikipedia.org/wiki/Multiplexverfahren Multiplexverfahren (Wikipedia)]&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
==Ansteuerung==&lt;br /&gt;
&lt;br /&gt;
Der verringerte Aufwand an Bauteilen kommt jedoch nicht ohne Nachteile. Da jede Spalte in einer Matrix mit N Spalten immer nur für 1/N der Zeit für einen vollen Bildaufbau aktiv ist, muss in dieser Zeit die gleiche Lichtmenge (=Energie) abgegeben werden, damit die genauso hell erscheint, wie wenn sie konstant mit Strom versorgt wird. Dazu muss der N-fache Strom fliessen. Demensprechend müssen die Vorwiderstände bzw. Stromquellen dimensioniert sein. Doch das führt zu zwei Problemen.&lt;br /&gt;
&lt;br /&gt;
# Der Pulsstrom durch eine LED kann nicht beliebig gesteigert werden. Genaue Angaben dazu gibt es im Datenblatt. Als grobe Abschätzung kann man sagen, dass die meisten LEDs bis etwa 1:10 gemuxt werden können, darüberhinaus werden die Pulsströme zu hoch (20mA Betriebsstrom =&amp;gt; 200 mA Pulsstrom!). Die Steuerung von mehr als 10 Spalten ist dann zwangsweise mit einer Helligkeitsreduktion verbunden, hilft aber, große Matrizen quadratischer zu machen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
# Die hohen Pulsströme verkraften die LEDs wirklich nur ganz kurz, sie brauchen die Ausschaltzeit um wieder abzukühlen! D.H. Die Ansteuerung des Multiplex darf NIE stehen bleiben, sonst brennen die LEDs durch! Für die Testphase der Matrix sowie Softwareentwicklung sollte man deshalb die Ströme stark verringern, die LEDs sind dann zwar wesenlich dunkler, überleben aber einen Softwareabsturz der Steuerung. Wenn am Ende alles getestet ist und man sich sicher ist daß die Steuerung funktioniert, kann man den Strom der Matrix wieder auf das volle Niveau erhöhen. Um ganz sicher zu gehen kann man einen Watchdog mit minimaler Laufzeit oder ein [[Monoflop]] verwenden, um im Fehlerfall die Stromversorgung bzw. Ansteuerung der LEDs abzuschalten.&lt;br /&gt;
&lt;br /&gt;
Um die Helligkeit der LEDs im Multiplexbetrieb voll zu nutzen muss meistens ein höherer Strom geschaltet werden, als Mikrocontroller es können. Eine [[LED]] muss aufgrund ihrer Kennlinie an einer Stromquelle betrieben werden. Im einfachsten Fall ist das ein in Reihe geschalteter Widerstand an einer Spannungsquelle. Ob man die Zeilen oder Spalten einer Matrix multiplext ist im Prinzip egal, aber manchmal ist es schlicht logisch sinnvoller. So ist z.B. bei einer LED-Laufschrift mit 8 Zeilen und 40 Spalten es sinnvoll, die Zeilen mit 1:8 zu multiplexen und nicht die Spalten mit 1:40! Generell kann man das in einer Schaltung so erkennen. Die gemultiplexte Dimension hat vor den Leistungsschaltern keine Vorwiderstände bzw. Konstantstromquellen sondern geht direkt an die LEDs. &lt;br /&gt;
&lt;br /&gt;
=== Direktbetrieb ===&lt;br /&gt;
&lt;br /&gt;
In einigen Projekten im Internet sieht man LED-Matritzen, die direkt per Mikrocontroller angesteuert werden, ohne Transistoren zwischenzuschalten. Das geht praktisch nur mit Low-Current-LEDs, da reguläre LEDs aufgrund des geringen Stroms sonst zu dunkel wären.&lt;br /&gt;
&lt;br /&gt;
=== Transistoren ===&lt;br /&gt;
&lt;br /&gt;
Das ist der Normalfall. Man kann diskrete [[Transistor|Transistoren]] (z.&amp;amp;nbsp;B. BC846, BC337) benutzen.&lt;br /&gt;
&lt;br /&gt;
Eine praktische Umsetzung kann man hier sehen. Q1-Q8 arbeiten als Emitterfolger ([[Transistor#Kollektorschaltung_(Emitterfolger)|Kollektorschaltung]]), darum gibt es hier auch keine [[Basiswiderstand | Basiswiderstände]]. Q9-Q13 arbeiten ganz einfach in [[Transistor#Emitterschaltung|Emitterschaltung]]. Dadurch braucht man nur NPN Transistoren,  die Schaltung ist dadurch auch relativ schnell. Einziger Nachteil ist ein um ca. 0,5 V höherer Spannungsverlust an Q1-Q8 im Vergleich zu PNP-Transistoren in Emitterschaltung. Das spielt hier aber keine große Rolle, weil bei den roten LEDs mit 2,2V Uf noch ausreichend Spannung für den Vorwiderstand bleibt. Werden z.B. blaue LEDS mit bis zu 4V Uf eingesetzt, dann verbleibt für den Widerstand zuwenig Spannung. Dadurch ändert sich schon bei kleinsten Versorgungsspannungsschwankungen der Strom recht stark.&lt;br /&gt;
&lt;br /&gt;
Ein Schieberegister ist im Prinzip ein Seriell-Parallel-Wandler.&lt;br /&gt;
Das hat mit Multiplexbetrieb eigentlich nichts direkt zu tun, es ist vielmehr eine Erweiterung der IO-Pins (siehe auch [[Porterweiterung mit SPI]] und [[AVR-Tutorial: Schieberegister]]). Wird ein Schieberegister &#039;&#039;nur&#039;&#039; zur Spaltenansteuerung verwendet, ergibt sich der angenehme Sonderfall, dass:&lt;br /&gt;
* Nur zum Weiterschalten der Spalte genau &#039;&#039;ein&#039;&#039; Schiebetakt erforderlich ist&lt;br /&gt;
** spart (etwas) Prozessorzeit&lt;br /&gt;
* die Daten- und Taktleitung für das Schieberegister für zwei weitere Matrix-Spalten zur Verfügung steht&lt;br /&gt;
** spart E/A-Anschlüsse am Mikrocontroller&lt;br /&gt;
** man kommt so einfach auf Spaltenzahl 10 (maximale Lichtausbeute der meisten LEDs) oder 18 (für RGB durch 3 teilbare Spaltenzahl)&lt;br /&gt;
** beim Umschaltvorgang per Zeilentreiber dunkeltasten sollte man ja sowieso&lt;br /&gt;
* ein einfaches Schieberegister ohne Ausgangslatch, etwa 74HC164, verwendet werden kann&lt;br /&gt;
** spart (etwas) Geld und Platz&lt;br /&gt;
&lt;br /&gt;
Eine weitere Schaltung mit Schieberegistern ist im &amp;quot;Retro-Spiel zum Selberbauen&amp;quot; [http://www.elo-web.de/elo/entwicklung-und-projekte/ping-pong Ping-Pong] von Burkhard Kainka verwendet worden. Hier werden die 10 Zeilen mit Atmega8-Portpins über 100 &amp;amp;Omega; Widerstände [http://www.elo-web.de/elo/mikrocontroller-und-programmierung/ping-pong/ping-pong-selbst-programmieren] gegen 12 Schieberegister-Spalten zweier 4094D CMOS-ICs geschaltet, um eine Matrix aus 120 roten SMD-LEDs zu steuern.&lt;br /&gt;
&lt;br /&gt;
[[Bild:LED_Matrix_8x5.png|thumb|right|250px|Multiplexansteuerung mit Schieberegistern und Transistoren]]&lt;br /&gt;
&lt;br /&gt;
==== Berechnung ====&lt;br /&gt;
&lt;br /&gt;
Will man nun seine Schaltung optimal betreiben, muss man ausrechnen wieviel Strom geschaltet werden muss. Wie oben bereits beschrieben, teilt sich der gemultiplexte Strom im Verhältnis 1:N auf die LEDs auf, in diesem Beispiel hier 1:5. Der Treiber für die Zeilen muss diesen im Extremfall kontinuierlich an jedem Ausgang zur Verfügung stellen, wenn nämlich alle LEDs der Matrix aktiv sind. Der Treiber für die Spalten ist pro Kanal nur 1:N der Multiplexzeit aktiv, muss aber währenddessen den gesamten Nennstrom der Matrix schalten können! Das sind schnell mal ein paar Ampere, wie die nachfolgenden Beispiele zeigen!&lt;br /&gt;
&lt;br /&gt;
Gegeben:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Nenn}&amp;lt;/math&amp;gt;: Nennstrom der LEDs: 4mA&lt;br /&gt;
*&amp;lt;math&amp;gt;U_{F}&amp;lt;/math&amp;gt;: Flußspannung der LEDs: 2,2V&lt;br /&gt;
*&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;: Multiplexverhältnis (Spalten): 1:5&lt;br /&gt;
*&amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;: Zeilen in der Matrix: 8&lt;br /&gt;
* &amp;lt;math&amp;gt;U_{Sat}&amp;lt;/math&amp;gt;: Sättigungsspannung des Low Side Transistors, hier Q9-Q13 mit ca. 0,7V&lt;br /&gt;
* &amp;lt;math&amp;gt;U_{BE}&amp;lt;/math&amp;gt;: Basis-Emitter-Spannung des High Side Transistors, hier Q1-Q8 ca. 0,7V&lt;br /&gt;
&lt;br /&gt;
Gesucht:&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Zeil}&amp;lt;/math&amp;gt;: Dauerstrom der Zeilentreiber = Pulsstrom der LEDs&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Spl}&amp;lt;/math&amp;gt;: Pulsstrom der Spaltentreiber&lt;br /&gt;
*&amp;lt;math&amp;gt;R_V&amp;lt;/math&amp;gt;: Vorwiderstand für LED-Zeilen &lt;br /&gt;
*&amp;lt;math&amp;gt;P_V&amp;lt;/math&amp;gt;: Verlustleistung der Vorwiderstände&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{Zeil} = I_{Nenn} \cdot N = 4mA \cdot 5 = 20mA&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{Spl} = I_{Nenn} \cdot N \cdot S = 4mA \cdot 5 \cdot 8 = 160mA&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_V = \frac{U}{I} = \frac{Vcc - U_{Sat} - U_{BE}-U_F}{I_{Nenn} \cdot N}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_V=\frac{5V-0,7V-0,7V-2,2V}{4mA \cdot 5} \approx 68 \Omega&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P_V=I_{Zeil}^2 \cdot R = 20mA^2 \cdot 68 \Omega = 27mW&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
=== Treiber ===&lt;br /&gt;
&lt;br /&gt;
Bei großen Anzeigen mit vielen LEDs werden die Pulsströme bisweilen schon recht hoch. Hier wird man dann mehr auf Treiber (z.&amp;amp;nbsp;B. ULN2803) zurück greifen. Vor allem die Schalter für die gemultiplexte Dimension, hier im Beispiel die Zeilen, müssen sehr große Ströme schalten.&lt;br /&gt;
&lt;br /&gt;
[[bild:LED-Matrix-ULN-UDN.png|thumb|right|250px|Multiplexansteuerung mit integrierten Treibern]]&lt;br /&gt;
&lt;br /&gt;
==== „Gemeinsame“ Katode oder Anode? ====&lt;br /&gt;
In einigen Fällen hat man die Wahl, ob man die Katoden oder die Anoden multiplext.&lt;br /&gt;
In einem solchen Fall ist grundsätzlich &amp;lt;i&amp;gt;die&amp;lt;/i&amp;gt; Seite zu multiplexen (= „Spalte“, die Seite &amp;lt;i&amp;gt;ohne&amp;lt;/i&amp;gt; Widerstände), bei der der Bahnwiderstand der Schaltelemente (Mikrocontroller-Ausgänge, Transistoren oder MOSFETs) &amp;lt;i&amp;gt;kleiner&amp;lt;/i&amp;gt; ist.&lt;br /&gt;
&lt;br /&gt;
Benutzt man als Spalten- und Zeilentreiber bipolare Transistoren oder MOSFETs (NPN bzw. n-Kanal für die Katoden und PNP bzw. p-Kanal für die Anoden), so sollten &amp;lt;i&amp;gt;„gemeinsame“ Katoden&amp;lt;/i&amp;gt; gewählt werden, da NPN-Transistoren bzw. n-Kanal-MOSFETs grundsätzlich, sogar als Pärchen, die kleineren Bahnwiderstände haben.&lt;br /&gt;
Die größeren Bahnwiderstände der anderen Seite („Zeilen“) fallen dann nicht ins Gewicht, weil dort ohnehin Vorwiderstände erforderlich sind. In den drei nebenstehenden Schaltplänen ist es auch genau so gemacht.&lt;br /&gt;
&lt;br /&gt;
Die Endlichkeit der Spalten-Bahnwiderstände führen zu Abhängigkeiten der Helligkeit einer LED zu den benachbarten LEDs, und dies ist selbstverständlich zu minimieren.&lt;br /&gt;
&lt;br /&gt;
==== Berechnung ====&lt;br /&gt;
&lt;br /&gt;
Gegeben:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Nenn}&amp;lt;/math&amp;gt;: Nennstrom der LED-Stränge: 15mA&lt;br /&gt;
*&amp;lt;math&amp;gt;U_{F}&amp;lt;/math&amp;gt;: Flußspannung der LED-Stränge: 7V&lt;br /&gt;
*&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;: Multiplexverhältnis (Zeilen): 1:4&lt;br /&gt;
*&amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;: Spalten in der Matrix 8&lt;br /&gt;
* &amp;lt;math&amp;gt;U_{IC1}&amp;lt;/math&amp;gt;: Sättigungsspannung des Low Side Switch, hier IC1 mit ca. 1V&lt;br /&gt;
* &amp;lt;math&amp;gt;U_{IC2}&amp;lt;/math&amp;gt;: Sättigungsspannung des High Side Switch, hier IC2 mit ca. 2V&lt;br /&gt;
&lt;br /&gt;
Gesucht:&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Spl}&amp;lt;/math&amp;gt;: Dauerstrom der Spaltentreiber = Pulsstrom der LEDs&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Zeil}&amp;lt;/math&amp;gt;: Pulsstrom der Zeilentreiber&lt;br /&gt;
*&amp;lt;math&amp;gt;R_V&amp;lt;/math&amp;gt;: Vorwiderstand für LED-Spalten&lt;br /&gt;
*&amp;lt;math&amp;gt;P_V&amp;lt;/math&amp;gt;: Verlustleistung der Vorwiderstände &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{Spl} = I_{Nenn} \cdot N = 15mA \cdot 4 = 60mA&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{Zeil} = I_{Nenn} \cdot N \cdot S = 15mA \cdot 4 \cdot 8 = 480mA&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_V = \frac{U}{I} = \frac{Vcc - U_{IC1} - U_{IC2}-U_F}{I_{Nenn} \cdot N}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_V=\frac{12V-1V-2V-7V}{15mA \cdot 4}=33 \Omega&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P_V=I_{Spl}^2 \cdot R_V = 60mA^2 \cdot 33 \Omega = 119mW&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
60mA kann IC2 dauerhaft auf jedem Kanal liefern, 500mA Pulsstrom sind für IC1 schon die absolute Grenze laut Datenblatt. Der Spannungsverlust &amp;lt;math&amp;gt;U_{IC1}&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;U_{IC2}&amp;lt;/math&amp;gt; ist bei diesen relativ alten ICs recht hoch, mit modernen MOSFETs erreicht man hier deutlich kleinere Werte und damit auch kleinere Verlustleistungen bzw. höhere Ströme.&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
=== MOSFETs ===&lt;br /&gt;
&lt;br /&gt;
Bei Strömen über 1A nimmt man heute meist [[FET|MOSFETs]].&lt;br /&gt;
&lt;br /&gt;
[[bild:LED-Matrix-MOSFET.png|thumb|right|250px|Multiplexansteuerung mit MOSFETs]]&lt;br /&gt;
&lt;br /&gt;
==== Berechnung ====&lt;br /&gt;
&lt;br /&gt;
Die Berechnung erfolgt analog zum vorherigen Beispiel, nur mit dem Unterschied, daß die MOSFETs deutlich kleinere Spannungsabfälle zu verzeichnen haben. Damit die MOSFETs schnell schalten werden [[MOSFET-Übersicht| MOSFET-Treiber]] eingesetzt. Zur Not tun es aber auch Mikrocontroller-Ausgänge, die allerdings mit 5 V Speisespannung laufen sollten. Für die P-Kanal MOSFETs nutzt man hier im Beispiel einen echten [[MOSFET-Übersicht##Mosfet-Treiber | MOSFET-Treiber]], die N-Kanal MOSFETS kann man hier mit einem einfachen CMOS-Inverter ansteuern. Das geht bei kleinen Logic Level MOSFETs mit 1-2 nF Gatekapazität noch ausreichend schnell, bei größeren MOSFETs ist auch hier ein echter MOSFET-Treiber nötig. Der berühmt-berüchtigte Gatewiderstand {Serienwiderstand, typisch 22 Ω} kann hier entfallen, die Ausgänge einfacher CMOS-Inverter sind bereits hochohmig genug, um parasitäre Schwingungen zu dämpfen. Nimmt man für den Inverter einen HCT-Typ, so wirkt er gleichzeitig als [[Pegelwandler]] und die Matrix kann mit 3,3-V-Signalen angesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Gegeben:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Nenn}&amp;lt;/math&amp;gt;: Nennstrom der LED-Stränge: 25 mA&lt;br /&gt;
*&amp;lt;math&amp;gt;U_{F}&amp;lt;/math&amp;gt;: Flußspannung der LED-Stränge: 9 V&lt;br /&gt;
*&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;: Multiplexverhältnis (Zeilen): 1:8&lt;br /&gt;
*&amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;: Spalten in der Matrix: 8&lt;br /&gt;
*&amp;lt;math&amp;gt;R_{DS-ON, high}&amp;lt;/math&amp;gt;: Einschaltwiderstand der High Side MOSFETs : 0,25 Ω&lt;br /&gt;
*&amp;lt;math&amp;gt;R_{DS-ON, low}&amp;lt;/math&amp;gt;: Einschaltwiderstand der Low Side MOSFETs: 0,13 Ω&lt;br /&gt;
&lt;br /&gt;
Gesucht:&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Spl}&amp;lt;/math&amp;gt;: Dauerstrom der Spaltentreiber = Pulsstrom der LEDs&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Zeil}&amp;lt;/math&amp;gt;: Pulsstrom der Zeilentreiber&lt;br /&gt;
*&amp;lt;math&amp;gt;R_V&amp;lt;/math&amp;gt;: Vorwiderstand für LED-Spalten &lt;br /&gt;
*&amp;lt;math&amp;gt;P_V&amp;lt;/math&amp;gt;: Verlustleistung der Vorwiderstände&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{Spl} = I_{Nenn} \cdot N = 25mA \cdot 8 = 200mA&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{Zeil} = I_{Nenn} \cdot N \cdot S = 25mA \cdot 8 \cdot 8 = 1600mA&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_V = \frac{U}{I} = \frac{Vcc - I_{Spl} \cdot R_{DS-ON, high} - I_{Zeil} \cdot R_{DS-ON, low} -U_F}{I_{Spl}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_V=\frac{12V - 0,2A \cdot 0,25 \Omega - 1,6A \cdot 0,13 \Omega -9V}{0,2A} \approx 13 \Omega&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P_V=I_{Spl}^2 \cdot R_V = 200mA^2 \cdot 13 \Omega = 520mW&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der gesparte Spannungsabfall über den MOSFETs genutzt, um LEDs mit höherer Flußspannung in Reihe schalten, womit der Wirkungsgrad ansteigt. Liegt die LED-Betriebsspannung über 15V braucht man einen sogenannten [[Treiber | High Side Driver]], weil dann die Gates der P-Kanal MOSFETs nicht mehr direkt angesteuert werden können. Ein einfaches Beispiel findet man [http://www.mikrocontroller.net/attachment/34752/P_FET.png hier].&lt;br /&gt;
&lt;br /&gt;
===Dimmen===&lt;br /&gt;
&lt;br /&gt;
Multiplexen kann auch mit [[PWM]] kombiniert werden. Dabei ist die Multiplexzeit einer Spalte gleich der PWM-Periodendauer. Allerdings kann hier der Rechenaufwand für die CPU schon recht hoch werden, da die meisten Mikrocontroller nicht so viele PWM-Kanäle in Hardware zur Verfügung stellen und die PWM in Software nachgebildet werden muss ([[Soft-PWM]]).&lt;br /&gt;
&lt;br /&gt;
Falls die Multiplexzeit klein genug gewählt wird, kann man in Grenzen auch per gezieltem Ein- und Abschalten in Grenzen eine Dimmfunktion erreichen. Um hier allerdings noch flimmerfreie Ergebnisse zu erzielen, sollte die Multiplexfrequenz mit den geplanten Dimmstufen multipliziert werden (bspw. 16 Dimmstufen bei 100 Hz Multiplexfrequenz = 1600 Hz angepasste Multiplexfrequenz), was die Rechenzeit wiederum schnell in die Höhe treiben kann. Dimmen selbst erreicht man dann mit entsprechend angepassten Schaltzeiten (bspw. 25% Helligkeit = 4x LED an, 12x LED aus bei insgesamt 16 Dimmstufen, dann von vorne).&lt;br /&gt;
&lt;br /&gt;
In Anbetracht ausgeklügelter Soft-PWM-Algorithmen spielt dieser zweite Lösungsansatz nur eine untergeordnete Rolle, etwa:&lt;br /&gt;
* um Code zu sparen&lt;br /&gt;
* um Gate-Umladevorgänge bei geringen Helligkeiten zu minimieren&lt;br /&gt;
&lt;br /&gt;
=== Spezielle ICs ===&lt;br /&gt;
&lt;br /&gt;
Neben den typischen Treiberbausteinen für möglichst hohe Ströme, die weiter unten aufgeführt sind, gibt es auch noch integrierte Lösungen für das direkte Betreiben einer LED-Matrix an der [[SPI]] oder [[I2C]]-Schnittstelle. Beispiele sind hier MAXIM 7219 und 7221 oder AS1100-08/15-18 für 8x8 LED-Matrizen oder 8x8-Segmentanzeigen. Zwischen beiden Modi wird per Software gewechselt. Die ICs bieten einige Vorteile, wie automatische Dimmung und großzügiges Freischaufeln von CPU-Kapazität auf dem Mikrocontroller. Außerdem können die ICs dank SPI kaskadiert werden wie normale [[AVR-Tutorial: Schieberegister|Schieberegister]] und somit eine nahezu unbegrenzte Zahl an LEDs ansteuern. Allerdings ist der Strom für die integrierten Stromsenken auf etwa 50 mA begrenzt, was bei einigen Displays zu wenig sein kann. Hier muss man wieder Vor- und Nachteile abwägen. Weitere ICs bei [http://www.maxim-ic.com Maxim] umfassen Standardfälle wie 5x7 Matrizen oder 7-, 10-, 14-Segment LED-Anzeigen mit 4 bis 16 Stellen. Diese ICs gibt es dann allerdings leider nicht bei den [[Elektronikversender|Standardversandhändlern]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bauteil                  || Beschreibung                          || Bezugsquelle&lt;br /&gt;
|-&lt;br /&gt;
|ULN2803                  || 8fach NPN-Transistorarray, 500mA      || Conrad&lt;br /&gt;
|-&lt;br /&gt;
|ULN2003                  || 7fach NPN-Transistorarray, 500mA      ||&lt;br /&gt;
|-&lt;br /&gt;
|UDN2981                  || 8fach High Side Treiber, 500mA        || Unter dem Namen: MIC2981 zu finden&lt;br /&gt;
|-&lt;br /&gt;
|TLC5921                  || 16 Bit-Schieberegister plus Latch&amp;lt;BR&amp;gt; mit Konstantstromsenken, max. 80mA pro Ausgang       ||&lt;br /&gt;
|-&lt;br /&gt;
|TLC5922                  &lt;br /&gt;
|| 16 Bit-Schieberegister plus Latch mit Konstantstromsenken, max. 80mA pro Ausgang&amp;lt;BR&amp;gt;Dimmung jedes einzelnen Kanals mit 7 Bit möglich, pinkompatibel zum TLC5921      ||&lt;br /&gt;
|-&lt;br /&gt;
|TLC5940 || 16 Bit-Schieberegister plus Latch mit Konstantstromsenken, max. 120mA pro Ausgang&amp;lt;BR&amp;gt;Dimmung jedes einzelnen Kanals mit 6 Bit plus 12 Bit PWM möglich, kompatibel mit AS1112 || mouser.com, [https://hbe-shop.de]&lt;br /&gt;
|-&lt;br /&gt;
|CAT4016&lt;br /&gt;
|| 16 Bit-Schieberegister/Latch mit Konstantstromsenken(max. 100mA), günstig || Farnell&lt;br /&gt;
|-&lt;br /&gt;
|TPIC6B595&lt;br /&gt;
|| 8-Bit Schieberegister + Leistungstreiber, 500mA      || Reichelt&lt;br /&gt;
|-&lt;br /&gt;
|IRF7304                  || 2fach P-Kanal MOSFET, 3,5A, SO-8 Gehäuse ||&lt;br /&gt;
|-&lt;br /&gt;
|MAX7219                  || Seriell angesteuerter 8x8 Matrizentreiber, kompatibel mit AS110x ||&lt;br /&gt;
|-&lt;br /&gt;
|MAX7221                  || Seriell angesteuerter 8x8 Matrizentreiber, kompatibel mit AS110x ||&lt;br /&gt;
|-&lt;br /&gt;
|AS1100-08                || Seriell angesteuerter 8x8 Matrizentreiber, kompatibel mit MAX72xx || [http://www.austriamicrosystems.com/AS1106 AS1106]&lt;br /&gt;
|-&lt;br /&gt;
|AS1115/17                || I²C angesteuerter 8x8 Matrizentreiber mit Diagnose &amp;amp; Tastenerkennung|| [http://www.austriamicrosystems.com/AS1115 AS1115]&lt;br /&gt;
|-&lt;br /&gt;
|AS1116/18                || Seriell angesteuerter 8x8 Matrizentreiber mit Diagnose|| [http://www.austriamicrosystems.com/AS1116 AS1116]&lt;br /&gt;
|-&lt;br /&gt;
|AS1119            || I²C angesteuerter 144LEDs Matrizentreiber mit Animationsspeicher, Diagnose und ChargePump||[http://www.austriamicrosystems.com/AS1119 AS1119]&lt;br /&gt;
|-&lt;br /&gt;
|AS1130            || I²C angesteuerter 132 LEDs Matrizentreiber mit Animationsspeicher, Scroll Funktion &amp;amp; Diagnose||[http://www.austriamicrosystems.com/AS1130 AS1130]&lt;br /&gt;
|-&lt;br /&gt;
|AS1112            || 15V 16Kanal LED Treiber, max. 100mA pro Ausgang&amp;lt;BR&amp;gt;Dimmung jedes einzelnen Kanals mit 6 Bit plus 12 Bit PWM möglich, Diagnosefunktion, kompatibel mit TLC594x ||[http://www.austriamicrosystems.com/AS1112 AS1112]&lt;br /&gt;
|-&lt;br /&gt;
|AS1121            || 30V 16Kanal LED Treiber, max. 40mA pro Ausgang&amp;lt;BR&amp;gt;Dimmung jedes einzelnen Kanals mit 6 Bit plus 12 Bit PWM möglich, Diagnosefunktion ||[http://www.austriamicrosystems.com/AS1121 AS1121]&lt;br /&gt;
|-&lt;br /&gt;
|AS1123            || 5V 16Kanal LED Treiber, max. 40mA pro Ausgang&amp;lt;BR&amp;gt;Low Power, Diagnosefunktion ||[http://www.austriamicrosystems.com/AS1123 AS1123]&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.starchips.com.tw/pdf/datasheet/SCT2024V01_03.pdf SCT2024]            || 17V 16Kanal LED Konstantstrom Treiber, max. 45mA pro Ausgang&amp;lt;BR&amp;gt; ||tme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[bild:LED-Matrix-TLC5921.png|thumb|right|250px|Multiplexansteuerung mit Special-ICs]]&lt;br /&gt;
&lt;br /&gt;
==== Berechnung ====&lt;br /&gt;
&lt;br /&gt;
Der TLC5921 und seine zahlreichen [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=analog&amp;amp;familyId=480&amp;amp;uiTemplateId=NODE_STRY_PGE_T Kollegen] von [http://www.ti.com Texas Instruments] bieten eine komfortable Möglichkeit zur Ansteuerung von LED-Matrizen. Der TLC5921 besitzt 16 Ausgänge, welche als [[Konstantstromquelle]] arbeiten. Der Konstantstrom wird dabei über einen Widerstand eingestellt. Es entfallen somit die Vorwiderstände. Der Vorteil ist, dass Schwankungen der LED-Flußspannung oder Versorgungsspannung ausgeglichen werden, ohne dass die Helligkeit der LEDs sich dabei ändert. Außerdem erlauben die besseren Typen der Baureihe wie z.B. der TLC5922 eine Dimmung der einzelnen Kanäle. Doch Vorsicht! Die zulässige Verlustleistung des ICs ist groß, ca. 4W mit ausreichender [[Kühlkörper#Die_Platine_als_Kühlkörper |Kühlung]], aber nicht endlos. Denn die Restspannung aus Betriebsspannung minus LED-Flußspannung fällt über dem IC ab! Als Minimum gilt je nach Strom 0,5-1V, welches über dem TLC5921 abfallen muss, damit er korrekt arbeitet. Nach oben wird die Grenze durch die Verlustleistung und max. Spannung von 17V gesetzt. Weiterhin ist zu beachten, dass hier das Multiplexing der Zeilen und Spalten vertauscht wurde.&lt;br /&gt;
&lt;br /&gt;
Gegeben&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Nenn}&amp;lt;/math&amp;gt;: Nennstrom der LED-Stränge: 10mA&lt;br /&gt;
*&amp;lt;math&amp;gt;U_{F}&amp;lt;/math&amp;gt;: Flußspannung der LED-Stränge: 9V&lt;br /&gt;
*&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;: Multiplexverhältnis (Zeilen): 1:8&lt;br /&gt;
*&amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;: Spalten in der Matrix: 8&lt;br /&gt;
*&amp;lt;math&amp;gt;R_{DS-ON, high}&amp;lt;/math&amp;gt;: Einschaltwiderstand der High Side MOSFETs : &amp;lt;math&amp;gt;0,25\Omega&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gesucht:&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Spl}&amp;lt;/math&amp;gt;: Dauerstrom der Spaltentreiber = Pulsstrom der LEDs&lt;br /&gt;
*&amp;lt;math&amp;gt;I_{Zeil}&amp;lt;/math&amp;gt;: Pulsstrom der Zeilentreiber&lt;br /&gt;
*&amp;lt;math&amp;gt;P_V&amp;lt;/math&amp;gt;: Verlustleistung des TLC5921&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{Spl} = I_{Nenn} \cdot N = 10mA \cdot 8 = 80mA&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{Zeil} = I_{Nenn} \cdot N \cdot S = 10mA \cdot 8 \cdot 8 = 640mA&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P_V=I_{Spl} \cdot S \cdot U_{Rest} = I_{Spl} \cdot S \cdot (Vcc - U_F - I_{Zeil} \cdot R_{DS-ON, high})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P_V= 80mA \cdot 8 \cdot (12V - 9V - 640mA \cdot 0,25 \Omega) = 1{,}82W&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[LED]]&lt;br /&gt;
* [[LED cube]]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/209988#new Forenbeitrag]: Nachleuchten beim Multiplexen vermeiden&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/343254#3789125 Forumsbeitrag]: TLC5947 flackert bei der Ansteuerung&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/353071?goto=3947567#3947567 Forumsbeitrag:] TLC5947 und ATmega16 Bitmanipulation&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/405432?goto=4707793#4707793 Forumsbeitrag]: Beispiele für die Retro-Spielkonsole PONG&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/search?query=%2Bled+%2Bmatrix&amp;amp;forums%5B%5D=1&amp;amp;forums%5B%5D=2&amp;amp;forums%5B%5D=4&amp;amp;forums%5B%5D=6 Beiträge zum Thema LED-Matrix im Forum]&lt;br /&gt;
* [http://www.ps-blnkd.de/LED-Matrix.htm Modulare 16x16 RGB-LED-Matrix] &lt;br /&gt;
* [http://members.ziggo.nl/electro1/avr/dotmatrix.htm Dotmatrix mit ATtiny2313 ansteuern, engl.]&lt;br /&gt;
* [http://www.braindrum.de/tools/leddotmatrix/leddotmatrix.htm LED-Dotmatrix mit ATmega16 ansteuern]&lt;br /&gt;
* Open Project [http://www.tiletoy.org/ TileToy] is a modular, electronic game prototype for tangible LED game tiles (PIC). [http://www.youtube.com/watch?v=XVmhlLvJNHc Youtube-Video]&lt;br /&gt;
* [http://www.kalanda.com/scroller-de-7x5-leds-basado-en-micro-attiny2313.html Eine 5x7 Matrix mit ATtiny2313 angesteuert, spanisch]&lt;br /&gt;
* [http://www.saccade.com/writing/projects/Puzzlemation/Puzzlemation.html Modulare Dotmatrixanzeige, engl.]&lt;br /&gt;
* [http://spritesmods.com/?art=ledmatrix Dotmatrix, engl.]&lt;br /&gt;
* [http://www.harbaum.org/till/ledmatrix/ Große LED-Matrix mit RS232 Ansteuerung, engl.]&lt;br /&gt;
* [https://www.das-labor.org/wiki/Blinken_Borgs Blinken_Borgs] Diverse Projekte von &#039;&#039;Das Labor&#039;&#039;&lt;br /&gt;
* [http://www.werkzeugh.at/intern/deflatable-led-matrix/ Eine aufblasbare LED-Matrix! (404)]&lt;br /&gt;
* [http://metalab.at/wiki/MetaLEDs 8x48 LED-Matrix]&lt;br /&gt;
* [http://www.das-labor.org/wiki/Blinken_Borgs LED-Würfel mit 5^3 RGB-LEDs]&lt;br /&gt;
* [http://www.ulrichradig.de/home/index.php/avr/avr-mega-dis LED-Matrix bei Ulrich Radig]&lt;br /&gt;
* [http://www.elo-web.de/elo/entwicklung-und-projekte/ping-pong/laufschrift Eine kleine Laufschrift auf der Ping-Pong-Platine] von Sascha Bader (C, Atmega8)&lt;br /&gt;
* [http://www.sparkfun.com/tutorials/47 12 Fuß (3,6m) Wanduhr auf Sparkfun.com]&lt;br /&gt;
* [http://www.decadecounter.com/vta/articleview.php?item=879 Gigantic 5x7 LED Matrix] by AnubisTTP&lt;br /&gt;
* [http://klautesblog.blogspot.com/search/label/LED%20Matrix Mikes LED Matrix (21 x 21 LEDs)] by klaute&lt;br /&gt;
* [http://blinkenlights.net/ Blinkenlights] keine LEDs, aber groß (CCC)!&lt;br /&gt;
* Die riesige LED Tafel am [http://money.howstuffworks.com/nasdaq-marketsite-tower.htm Time Square] in New York, 105m hoch und 1 MW Spitzenverbrauch!&lt;br /&gt;
* Nochmal ein Artikel zur [http://bits.blogs.nytimes.com/2008/11/20/towering-led-sign-will-light-times-square/ Time Square LED-Wand] &lt;br /&gt;
* [http://wiki.niftylight.de niftylight] open-source Software um LED Matrix Ansteuerung zu erleichtern&lt;br /&gt;
* [http://www.dsw-elektronik.de/Dot-mat1.html DSW-Elektronik], Hersteller elektromechanischer Matrixelemente&lt;br /&gt;
* [http://www.crafted.de/photonenbanner.php LULI Photonenbanner 96x24]&lt;br /&gt;
* [http://www.ehajo.de/baus%C3%A4tze/smd-baus%C3%A4tze/blinkenlights-led-matrix.html Blinkenlights-Bausatz von eHaJo, Atmega32u2 mit 8x8 LEDs]&lt;br /&gt;
* [https://sites.google.com/site/artcfox/demystifying-the-tlc5940 demystifying-the-tlc5940] Umfassende Erklärung zur Ansteuerung eines TLC5940, engl.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Displays und Anzeigen]]&lt;/div&gt;</summary>
		<author><name>87.178.97.251</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=97019</id>
		<title>STM32</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=STM32&amp;diff=97019"/>
		<updated>2017-08-21T18:40:56Z</updated>

		<summary type="html">&lt;p&gt;87.178.97.251: stückzahlen nur bei Grossabnehmern günstig&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STM32 ist eine Mikrocontroller-Familie von [http://www.st.com/mcu/inchtml-pages-stm32.html ST] mit einer 32-Bit [[ARM]] Cortex-M0/M3/M4 CPU. Diese Architektur ist speziell für den Einsatz in Mikrocontrollern neu entwickelt und löst damit die bisherigen ARM7-basierten Controller weitestgehend ab. Den STM32 gibt es von ST in unzähligen Varianten mit variabler Peripherie und verschiedenen Gehäusegrößen und -formen. Durch die geringe Chipfläche des Cores ist es ST möglich, eine 32 Bit-CPU für weniger als 1&amp;amp;nbsp;€ anzubieten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:stm32F103xc.png|thumb|right|340px|Blockdiagramm STM32F103xC/D/E]]&lt;br /&gt;
&lt;br /&gt;
== STM32-Familien ==&lt;br /&gt;
&lt;br /&gt;
Bisher gibt es elf STM32-Familien:&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f0-series.html STM32F0]&lt;br /&gt;
** Cortex M0&lt;br /&gt;
** Mikrocontroller zum Einstieg&lt;br /&gt;
** Bis 48MHz (38 DMIPS)&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f1-series.html STM32F1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 72MHz (61 DMIPS)&lt;br /&gt;
**Verschiedene Unterfamilien:&lt;br /&gt;
*** Connectivity line&lt;br /&gt;
*** Performance line&lt;br /&gt;
*** USB Access line&lt;br /&gt;
*** Access Line&lt;br /&gt;
*** Value line&lt;br /&gt;
* [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1575 STM32F2]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Bis 120MHz (150 DMIPS)&lt;br /&gt;
** Wie die STM32F1 Serie, Camera-Interface, 32-Bit Timer, Crypto-Engine...&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f3-series.html STM32F3]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 72MHz (90 DMIPS)&lt;br /&gt;
** Fast 12-bit 5 MSPS and precise 16-bit sigma-delta ADCs&lt;br /&gt;
** Touch sensing controller (TSC)&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series.html STM32F4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU&lt;br /&gt;
** Bis 180MHz (225 DMIPS)&lt;br /&gt;
** Bis zu 2MB Flash&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f7-series.html STM32F7]&lt;br /&gt;
** Cortex M7&lt;br /&gt;
** DSP und FPU (Single/Double Precision)&lt;br /&gt;
** Bis 216MHz (462 DMIPS)&lt;br /&gt;
** Mehr Peripherie: SPDIF-IN/OUT, SAI, HDMI-CEC, Dual Quad SPI&lt;br /&gt;
** On-Chip Grafik-LCD-Controller&lt;br /&gt;
** DMAs auch für Ethernet, USB und Chrom-ART&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l0-series.html STM32L0]&lt;br /&gt;
** Cortex M0+&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (26 DMIPS)&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l1-series.html STM32L1]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** Low Power &lt;br /&gt;
** mit LCD Treiber&lt;br /&gt;
** Bis 32MHz (33 DMIPS)&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32l4-series.html STM32L4]&lt;br /&gt;
** Cortex M4F&lt;br /&gt;
** DSP und FPU (Single Precision)&lt;br /&gt;
** Ultra Low Power (bis zu 8nA mit I/O Wake-Up)&lt;br /&gt;
** Bis 80MHz (100 DMIPS)&lt;br /&gt;
** 128KB...1MB Flash, 64/128KB SRAM&lt;br /&gt;
** optional Segment-LCD Treiber&lt;br /&gt;
** Quarzloser Betrieb auch mit CAN (1% ab Werk) oder USB (Synch über Host) möglich&lt;br /&gt;
** Digital-Filter für ΣΔ-Modulatoren&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32t-series.html STM32T]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** 72MHz&lt;br /&gt;
** Touch Sensing&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32w-series.html STM32W]&lt;br /&gt;
** Cortex M3&lt;br /&gt;
** BIS 24MHz&lt;br /&gt;
** RF-MCU &lt;br /&gt;
[http://www.st.com/web/en/catalog/mmc/FM141/SC1169 Hier eine Übersicht zum Auswählen eines STM32Fxxx]&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
* Cortex-M0 / Cortex-M3 / Cortex-M4F / Cortex-M7 Kern (mit FPU)&lt;br /&gt;
* 16KB ... 2MB  [[Flash-ROM]]&lt;br /&gt;
* 4KB ... 512KB [[Speicher#SRAM|SRAM]]&lt;br /&gt;
* 2KB ... 16KB [[Speicher#EEPROM|EEPROM]] (STM32L)&lt;br /&gt;
* SDRAM-Controller bei den [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1577/LN1806 STM32F42xxx und STM32F43xxx], bis 512 MByte externer SDRAM addressierbar&lt;br /&gt;
* 512 one-time programmable Bytes(STM32F2/4)&lt;br /&gt;
* [[IC-Gehäuseformen | Gehäuse]] 20 ... 216 Pins als LCSP, TSSOP, QFN, LQFP und BGA&lt;br /&gt;
* Derzeit sind &#039;&#039;&#039;über 700&#039;&#039;&#039; [http://www.st.com/web/en/catalog/mmc/FM141/SC1169 STM32 Derivate/Varianten verfügbar]&lt;br /&gt;
* Bis 72MHz CPU-Takt, bis 120MHz beim STM32F2xx, bis 168/180 MHz beim STM32F4xx, wobei eine spezielle Prefetch-Hardware bis 120/168 MHz eine Geschwindigkeit erzielt, die 0 Wait-States entspricht. Der CPU-Takt wird über einen Multiplikator aus dem internen RC-Takt oder einem externen Quarz-Takt abgeleitet. Bis 216MHz CPU-Takt bei STM32F7xx.&lt;br /&gt;
* Externes Businterface (nur bei Gehäusen ab 100 Pin und nur bei STM32F4, STM32F2 und STM32F1 Performance line)&lt;br /&gt;
* LCD Treiber für bis zu 8x40 Segmente (nicht beim STM32F2xx)&lt;br /&gt;
* TFT Treiber bei [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f429-439.html STM32F429/STM32F439] [http://www2.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f469-479.html STM32F469/STM32F479]&lt;br /&gt;
* Spannungsbereich 1,65 ... 3,6V, nur eine Betriebsspannung nötig&lt;br /&gt;
* Temperaturbereich bis 125 °C&lt;br /&gt;
* Bis zu 168 IOs, viele davon [[Pegelwandler|5V-tolerant]]&lt;br /&gt;
* Interner, kalibrierter RC-Oszillator mit 8MHz (16MHz bei STM32F2/F4xx)&lt;br /&gt;
* Externer Quarz&lt;br /&gt;
* Real Time Clock mit eigenem Quarz und separater Stromversorgung&lt;br /&gt;
* Bis zu 16 [[Timer]], je Timer bis zu 4 IC/OC/PWM Ausgänge. Davon 2x Motion Control Timer (bei STM32F103xF/G), (bis zu 32 PWM Ausgänge)&lt;br /&gt;
* Systick Counter&lt;br /&gt;
* Bis zu 3 12-Bit [[AD-Wandler]] mit insgesamt 24 AD-Eingängen, integrierter [[Temperatursensor]], Referenzspannung Vrefint und VBatt Spannungsmessung (STM32F4xx)&lt;br /&gt;
* Bis zu 2 12-Bit [[DA-Wandler]] (bis zu 3 beim STM32F3xx)&lt;br /&gt;
* Bis zu 2 [[DMA]] Controller mit bis zu 12 Kanälen (16 beim STM32F2/4xx)&lt;br /&gt;
* Bis zu 2x [[I2C|I²C]]&lt;br /&gt;
* Bis zu 5x [[UART|USART]] mit LIN, IrDA und Modem Control (bis zu 8 beim STM32F2/F4xx)&lt;br /&gt;
* Bis zu 3x [[SPI]] (bis zu 6 beim STM32F4xx)&lt;br /&gt;
* Bis zu 2x [[I2S|I²S]]&lt;br /&gt;
* Bis zu 3x [[CAN#STMicroelectronics STM32 (Cortex M3/M4)|CAN]]&lt;br /&gt;
* Hardware [[CRC]] Unit, bei der STM32F3xx Serie mit einem einstellbaren Polynom &lt;br /&gt;
* Unique device ID register (96 Bits)&lt;br /&gt;
* TRNG - True Random Number Generator (STM32F2/4xx), basierend auf analoger Schaltung&lt;br /&gt;
* Cryptographic Processor (CRYP) (STM32F2/4xx)&lt;br /&gt;
* Hash Processor (HASH) (STM32F2/4xx)&lt;br /&gt;
* Kamera-Interface (DCMI) (STM32F2/4xx)&lt;br /&gt;
* [[USB]] 2.0 Full Speed / OTG&lt;br /&gt;
* [[USB]] 2.0 Hi Speed OTG mit extra PHY-Chip (STM32F2/4xx)&lt;br /&gt;
* SDIO Interface (z.B. SD-Card Reader)&lt;br /&gt;
* Ethernet&lt;br /&gt;
* Watchdog mit Window-Mode&lt;br /&gt;
* Jedes Peripheriemodul ist separat einschaltbar, wodurch sich erheblich [[Ultra low power|Strom sparen]] lässt&lt;br /&gt;
* [[JTAG]] und SWD (Serial Wire Debug) Interface&lt;br /&gt;
* Bis zu 6 Hardware-Breakpoints für Debuggen&lt;br /&gt;
* und vieles mehr ...&lt;br /&gt;
&lt;br /&gt;
== Struktur der Dokumentation ==&lt;br /&gt;
Die Dokumentation der STM32 ist im Vergleich zur [[AVR]]-Familie umfangreicher und komplexer. Sie teilt sich in mehrere Dokumente auf.&lt;br /&gt;
Als Beispiel der Dokumentation soll stellvertretend der [http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1031/LN1565/PF164486 STM32F103RC] genannt werden. Die Seite von ST beinhaltet alle nötigen Informationen passend zu diesem Prozessor.&lt;br /&gt;
&lt;br /&gt;
Diese Dokumente von ST beschreiben den Controller:&lt;br /&gt;
&lt;br /&gt;
* Im [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00191185.pdf STM32F103xC/D/E Datasheet] sind die speziellen Eigenschaften einer bestimmten Modellreihe beschrieben und die exakten Daten und Pinouts aufgeführt, sowie die Zuordnung Chipname - Flash/RAM-Größe. Die Peripheriemodule werden nur aufgeführt, nicht detailliert beschrieben.&lt;br /&gt;
* Im [http://www.st.com/content/ccc/resource/technical/document/reference_manual/59/b9/ba/7f/11/af/43/d5/CD00171190.pdf/files/CD00171190.pdf/jcr:content/translations/en.CD00171190.pdf Reference Manual (RM0008)] sind alle Peripheriemodule der jeweiligen STM32-Controllerfamilie im Detail beschrieben.&lt;br /&gt;
* Das [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0403c/index.html ARMv7M Architecture Reference Manual] beschreibt detailliert den Prozessorkern, wie das Exception Model, die CPU Instruktionen inklusive Encoding, etc.&lt;br /&gt;
* Das [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/programming_manual/CD00228163.pdf STM32 Cortex-M3 Programming Manual] ist eine Zusammenfassung des ARMv7M Architecture Reference Manual bezogen auf die STM32.&lt;br /&gt;
* Wer nicht die ST Firmware-Library verwendet, der benötigt zusätzlich das [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/programming_manual/CD00283419.pdf Flash Programming Manual] für die Betriebsart des Flash-ROMs, d.h. die frequenzabhängige Konfiguration der Waitstates.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich sollten auch die [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00197763.pdf Errata Sheets] beachtet werden. Empfohlen sei auch die Appnote &amp;quot;[http://www.st.com/web/en/resource/technical/document/application_note/CD00164185.pdf AN2586 Getting started with STM32F10xxx hardware development]&amp;quot;.&lt;br /&gt;
Die jeweiligen Dokumentations-PDFs sind auf der Produktseite von ST eines jeden Mikrocontrollers verlinkt.&lt;br /&gt;
&lt;br /&gt;
== Hardware Zugriffs-Libraries ==&lt;br /&gt;
=== CMSIS ===&lt;br /&gt;
&lt;br /&gt;
Die CMSIS (ARM® &#039;&#039;&#039;C&#039;&#039;&#039;ortex™ &#039;&#039;&#039;M&#039;&#039;&#039;icrocontroller &#039;&#039;&#039;S&#039;&#039;&#039;oftware &#039;&#039;&#039;I&#039;&#039;&#039;nterface &#039;&#039;&#039;S&#039;&#039;&#039;tandard) ist eine Library von ARM für den Zugriff auf die herstellerübergreifenden Funktionen des ARM-Cores. Hierzu gehört bei den Cortex-M4F-Cores auch die DSP und Floating-Point Funktionalität. Weiterhin existieren eine Zahl von Helferfunktionen für den NVIC, den Sys-Tick-Counter, sowie eine SystemInit-Funktion, welche sich um die PLL kümmert. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen des CMSIS-Standards ([http://www.onARM.com www.onARM.com]) wurden die Headerdateien standardisiert, der Zugriff auf die Register erfolgt per &#039;&#039;&#039;Peripheral-&amp;gt;Register&#039;&#039;&#039;. Die CMSIS C-Dateien bzw. Header enthalten auch Anpassungen für die verschiedenen Compiler. Die Portierung eines Real-Time-Betriebsystems sollte unter Verwendung der CMSIS, für Chips der verschiedenen Hersteller, stark vereinfacht möglich sein (z.B. einheitliche Adressen für Core-Hardware/Sys-Tick-Counter).&lt;br /&gt;
&lt;br /&gt;
Die CMSIS ist im Download der ‎STM32 Standard Peripheral Library enthalten. Die Compiler-Hersteller liefern eine jeweils zur ihrer Tool-Version passende bzw. geprüfte Library (incl. CMSIS) aus. Diese Libs können, gegenüber den Downloads beim Chip-Hersteller, auch ältere Version beinhalten.&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32 Standard Peripheral Library ===&lt;br /&gt;
&lt;br /&gt;
ST bietet für jede Controller-Familie eine umfangreiche zur CMSIS passende Peripherie-Bibliothek. Alle Funktionen um die Peripherie zu benutzen sind gekapselt in einfache Strukturen und Funktionsaufrufe. Somit muss man sich nicht selbst um die Peripherie-Register kümmern. Diese Library und ihre Dokumentation setzen das grundlegende Verständnis der Funktion des jeweiligen Peripheriemoduls voraus, wie es die o.a. Referenz und diverse Appnotes vermitteln. Die Library beinhaltet außerdem für fast jede Peripherie mehrere Beispiele.&lt;br /&gt;
Für die USB Schnittstelle gibt es noch eine extra Library, genauso wie für Ethernet.&lt;br /&gt;
&lt;br /&gt;
Auf der &amp;quot;Design Resources&amp;quot; Seite der Produktseite von ST eines jeden STM32 Mikrocontrollers kann die Library für den jeweiligen Controller heruntergeladen werden, z.B. [http://www.st.com/web/en/catalog/tools/PF257890 hier für den o.g. STM32F103RC].&lt;br /&gt;
&lt;br /&gt;
Library für STM32F4xx: [http://www.st.com/web/en/catalog/tools/PF257901# STSW-STM32065 STM32F4 DSP and standard peripherals library]&lt;br /&gt;
&lt;br /&gt;
=== ‎STM32Cube / HAL ===&lt;br /&gt;
&lt;br /&gt;
Wird in Zukunft die Standard Library ablösen.&lt;br /&gt;
* http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/LN1897&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Zur Programmierung der STM32 gibt es verschiedene Möglichkeiten, sowohl kommerzielle proprietäre als auch mit Freier Software.&lt;br /&gt;
&lt;br /&gt;
Der GCC (in seinen verschiedenen Binärdistributionen) ist der einzige ARM Compiler der [http://de.wikipedia.org/wiki/C%2B%2B11 C++11] unterstützt.&lt;br /&gt;
&lt;br /&gt;
=== Freie Software/Freeware ===&lt;br /&gt;
==== Selber zusammenstellen ====&lt;br /&gt;
Man nehme...:&lt;br /&gt;
* Eine Entwicklungsumgebung nach Wahl:&lt;br /&gt;
** [http://www.eclipse.org Eclipse] mit [http://www.eclipse.org/cdt/ C/C++ Development Tooling] und [http://gnuarmeclipse.livius.net/blog/ GNU ARM Plug-in] (Bei Verwendung vom GCC-ARM-Embedded als Toolchain &amp;quot;Sourcery G++ Lite&amp;quot; auswählen, dieser sieht für eclipse gleich aus) (Linux, Windows)&lt;br /&gt;
** [http://netbeans.org/ Netbeans] mit [http://plugins.netbeans.org/plugin/37426/gdbserver GDBserver-Plugin] (Linux, Windows)&lt;br /&gt;
** [http://www.kdevelop.org/ KDevelop] (Linux, Windows)&lt;br /&gt;
** [http://www.geany.org/ Geany] (Linux, Windows)&lt;br /&gt;
** Oder ein einfacher Texteditor&lt;br /&gt;
* Einen C,C++ Compiler:&lt;br /&gt;
** Eine der [[ARM_GCC#GCC_Bin.C3.A4rdistributionen|GCC-Binärdistributionen]], siehe auch [[#GCC|GCC]] (je nach Distribution Linux, Windows)&lt;br /&gt;
* Programmiersoftware zum Flashen des Target:&lt;br /&gt;
** [http://openocd.sourceforge.net/ OpenOCD] unterstützt viele Debug/Programmier-Adapter (Linux, Windows)&lt;br /&gt;
** [https://github.com/texane/stlink Texane stlink] funktioniert gut mit den ST-Link Adaptern wie sie zB. auf den STM32 Discovery Boards zu finden sind (Linux)&lt;br /&gt;
** Turtelizer2 oder andere JTAG Programmieradapter&lt;br /&gt;
** Bei Verwendung eines Segger J-Link, den [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf Segger GDB-Server] in Verbindung mit dem beim GCC mitgelieferten GDB (Linux, Windows).&lt;br /&gt;
&lt;br /&gt;
==== Komplette IDEs ====&lt;br /&gt;
* [https://developer.mbed.org/platforms ARM mbed Developer Site] ist der ultimative Compiler für denjenigen, der nur mal schnüffeln will. Doppelklick auf das gewünschte Board, Beispielprogramm (rechts am Rand auswählen), kompilieren und über USB hochladen. Schon blinkt es! Wenn man ein Projekt dann lieber doch lokal bearbeiten möchte (z.B. um einen Debugger zu benutzen) dann kann man die Projekte über die Export-Funktion herunterladen. Es werden verschiedene IDE sowie ein gcc-Kommandozeilenprojekt unterstützt. Die mbed-Library ist quelloffen und auf github gehostet.&lt;br /&gt;
* [http://www.codesourcery.com/sgpp/lite_edition.html Codesourcery Lite Edition] Mit dieser Umgebung muss man sich anfreunden können, was mir bisher nicht gelungen ist. Es sind nur wenig Beispielprojekte verfügbar. Nicht mehr kostenlos verfügbar.&lt;br /&gt;
* [http://www.coocox.org/ Coocox Eclipse IDE] kostenlose IDE für STM32F0/F1/F2/F3/F4. Basiert auf der ARM-GCC-Toolchain und es gibt eine breite Unterstützung. Es ist sogar ein freies RTOS verfügbar. Beim Start der IDE muss man geduldig sein, was jedoch für alle Eclipse-basierten IDEs gilt. Eine gute Wahl ohne Limits mit breiter Debugger-Unterstützung. Hilfreiche Infos gibt es [http://www.mikrocontroller.net/topic/214719?goto=new#2228482 hier] und [http://www.mikrocontroller.net/topic/214719?goto=new#2229943 hier] im Forum, Artikel: [[STM32 CooCox Installation]] &lt;br /&gt;
* [http://emide.org/ emIDE] kostenlose IDE von Segger. Die emIDE basiert auf Code::Blocks. Sie ist auf ARM-GCC aufgebaut und unterstützt eine große Zahl an unterschiedlichen JTAG/SWD-Debuggern - natürlich auch den J-Link aus gleichem Hause.  &lt;br /&gt;
* [http://www.emblocks.org EmBlocks] kostenlose IDE, Code::Blocks basiert, unterstützt STM32 L1/F0/F1/F2/F3/F4/W, integrierter Compiler (ARM-GCC), integrierter GDB-Debugger, Jlink/ST-Link, System view (Peripherie-Register anzeigen) beim Debuggen, Project-Wizard (Eigene Wizards können mit Squirrel geschrieben werden), Basiert auf Code::Blocks und gefällt mir recht gut da man ihn fast so gut nutzen kann wie die µVision von Keil, jedoch ohne deren Limit, http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks]&lt;br /&gt;
** heißt jetzt EmBitz -&amp;gt; https://www.embitz.org&lt;br /&gt;
* [http://cms.seng.de/service-support/downloads/ Entwicklungsumgebung GNU/Linux] für STM32F1 mit OpenOCD und Olimex ARM-USB-OCD-H, Bedienung über Eclipse-IDE oder Kommandozeile.&lt;br /&gt;
* [http://www.openstm32.org/blog1-System-Workbench-for-STM32 System Workbench for STM32] (SW4STM32) ist eine uneingeschränkte und kostenlose IDE. Sie wird von [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF261797 ST] offiziell unterstützt. Die Entwicklungsumgebung ist in der Version 1.0 seit 5.2.2015 erhältlich. Seit Februar 2016 ist eine Version für Linux verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Andere Programmiersprachen ====&lt;br /&gt;
&lt;br /&gt;
* [http://mecrisp.sourceforge.net Mecrisp-Stellaris], eine native Forth-Implementation für ARM Cortex M0/M3/M4. Es werden bereits mehrere STM32 Targets unterstützt und neue Portierungen sind herzlich willkommen. Auch Chips von TI, NXP und Freescale sind im aktuellen Paket enthalten.&lt;br /&gt;
&lt;br /&gt;
=== Kommerzielle Umgebungen ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.keil.com/arm/mdk.asp Keil µVision] (Demo max. 32KB Code/Free für STM32F0/STM32L0): Die sehr komfortable µVison IDE ist neben dem ARM Compiler per Menue auch für einen beliebigen GNU-Compiler konfigurierbar. Damit besteht das 32k-Limit nur noch für den integrierten Debugger / Simulator. In Verbindung mit einem ULINK2 ist die Umgebung schon sehr einfach zu bedienen - leider ist der Compiler mit großen Abstand der langsamste den ich je nutzte, da er keine parallel Option wie der GNU-CC besitzt. Mit der µVision lässt sich kein fremdes File in den Controller in den Flashspeicher des Controllers schreiben. Für den Anfänger eine gute Wahl. Der Preis ist jedoch ein guter Grund auf andere freie IDEs zu wechseln. µVison selbst kann kostenlos mit dem MDK-Evaluationkit heruntergeladen werden. [https://www.keil.com/arm/demo/eval/arm.htm#DOWNLOAD download] Wer sich nur auf STM32 Cortex M0/L0 beschränkt kann die Keil MDK auch ohne 32K Begrenzung frei nutzen. [http://www2.keil.com/stmicroelectronics-stm32/mdk download]&lt;br /&gt;
* [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR-Embedded-Workbench] (Demo max. 32KB Code) [http://supp.iar.com/Download/SW/?item=EWARM-EVAL download]&lt;br /&gt;
* [http://www.isystem.com/download/winideaopen winIDEAOpen] Keine Code Limitierung, GCC und Testwerkzeug beinhaltet. Läuft mit dem iTag50 Adapter, Segger J-Link und dem ST-Link&lt;br /&gt;
* [http://www.raisonance.com Raisonance Ride7] (GCC Compiler, kostenlose Version auf Debugging von max. 32KB Code limitiert, keine Limitierung beim Complilieren)&lt;br /&gt;
* [http://www.atollic.com Atollic TrueStudio], auf Eclipse/GCC basierend. Aktuell ist V 5.4, diese hat kein Codesize Limit. Eingeschränkt sind Debug Optionen wie Variablen LiveWatch oder Tracing, was aber auch &#039;bessere&#039; Debugprobes erforderlich macht. Das Semihosting (printf über SWD/JTAG) fällt leider auch unter die Restriktionen der Lite Version. Atollic TrueStudio unterstützt viele verschiedene Hersteller von ARM MCUs, dadurch ist das Paket sehr umfangreich. In der Lite Version muss man sich beim Start für ein paar Sekunden einen Dialog mit dem Upgrade Angebot gefallen lassen.&lt;br /&gt;
* [http://www.rowley.co.uk/arm/ Rowley Crossworks] (Demo 30 Tage unbeschränkt, 150$ für nichtkommerzielle Nutzung, auf GCC basierend). Mir ist nicht klar warum man für diese IDE Geld bezahlen soll. Der GNU-Compiler ist frei und die Entwicklungsumgebungen die auf Eclipse basieren, ebenfalls. Allerdings ist diese Einstellungsarbeit schon was für den etwas erfahrenen Entwickler.&lt;br /&gt;
* [http://www.code-red-tech.com Code Red] (GCC basierend)&lt;br /&gt;
* [http://www.sisy.de/index.php?id=17&amp;amp;no_cache=1 SiSy ARM oder SiSy Micrcontroller++] (Demo verfügbar keine Gößenbegrenzung, basiert auf GNU-Compiler, grafische Programmierung mit UML möglich, integrierter Debugger)&lt;br /&gt;
* [http://www.comsytec.eu/epsdebugger.php EPS Debugger Plugin, für STM32 Development mit Code::Blocks]&lt;br /&gt;
* [http://www.mikroe.com MikroE bietet neben Pascal und Basic auch C mit kompletter Oberfläche mit Compiler etc. pp relativ günstig]&lt;br /&gt;
* [http://www.visualgdb.com VIsualGDB] Wer vom Atmel Studio kommt oder sonst viele mit Visual Studio arbeitet bekommt hier ein Plugin, das wirklich Spaß macht und funktioniert. Es werden nicht nur STM32 unterstützt. Einfach kostenlose Trial-Version anschauen und probieren.&lt;br /&gt;
&lt;br /&gt;
=== STM32CubeMX ===&lt;br /&gt;
Dies ist eine Software von ST selbst, die die Auswahl und Konfiguration von STM32-Mikrocontrollern vereinfacht:&lt;br /&gt;
* Auswahl der Controller oder Entwicklungsboards mit einer parametrischen Suche&lt;br /&gt;
* grafische Konfiguration der Pins und Alternate Functions (inkl. Überprüfung auf Kollisionen - bei Entwicklungsboards sind gewisse Pins schon vorkonfiguriert und werden angezeigt)&lt;br /&gt;
* grafische Konfiguration des Clock-Trees&lt;br /&gt;
* Generierung von C-Code entsprechend der grafischen Konfiguration. Dieser funktioniert nur mit den neuen STM32CubeFx Libraries, nicht mit den alten Standard Peripheral Libraries.&lt;br /&gt;
* Simulation des Strom-Verbrauchs unter Auswahl verschiedenster Stromquellen und Batterien&lt;br /&gt;
STM32CubeMX ist Java-basiert und läuft daher problemlos auf Windows, OS X und Linux. In der Zip-Datei welche [https://my.st.com/content/my_st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html bei ST heruntergeladen] werden kann befinden sich entsprechende Installer für die einzelnen Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
=== Tutorials für diverse Tool-Kombinationen ===&lt;br /&gt;
* [[STM32 Eclipse Installation|Windows,Linux, Eclipse + Yagarto/CodeSourcery + OpenOCD/ST-Link]]&lt;br /&gt;
* [[STM32 Eclipse JLink Linux/Windows|Windows,Linux, Eclipse + GCC-ARM-Embedded + JLink]]&lt;br /&gt;
* [[Linux auf STM32|Linux auf STM32 (ucLinux)]]&lt;br /&gt;
&lt;br /&gt;
* Windows&lt;br /&gt;
** Eclipse&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/216554 Windows, Eclipse, codesourcery, st-link ]&lt;br /&gt;
*** [http://www.firefly-power.de/ARM/debugging.html Eclipse Plugin &amp;quot;GDB Hardware Debugging&amp;quot; mit OpenOCD]&lt;br /&gt;
** Code::Blocks&lt;br /&gt;
*** [http://www.mikrocontroller.net/topic/265600 Windows, Code::Blocks, STM32F4]&lt;br /&gt;
** STM32 mit EmBlocks&lt;br /&gt;
*** [http://www.emblocks.org/web/downloads-main Download EmBlocks]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=coHPJylnzC8 Video STM32 Project Wizzard in EmBlocks]&lt;br /&gt;
** Atollic TrueSTUDIO&lt;br /&gt;
*** [[STM32 LEDBlinken AtollicTrueStudio|Atollic TrueSTUDIO Installation + Demo]]&lt;br /&gt;
** MDK-ARM Lite mit Einstellungen für STM32F0/F4-Discovery Board&lt;br /&gt;
*** [https://www.keil.com/demo/eval/arm.htm KEIL MDK-ARM Download]&lt;br /&gt;
*** [https://www.youtube.com/watch?v=RXOOxby5nns&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;index=1 Installations Video STM32F4 Discovery Board]&lt;br /&gt;
*** [https://www.youtube.com/watch?annotation_id=annotation_203294&amp;amp;feature=iv&amp;amp;index=4&amp;amp;list=PL6-W3FoUyb48WFI5PQv3SDJj2G1t2FonV&amp;amp;src_vid=sN4gDZ7H8gw&amp;amp;v=BeZcQjXxk9A Einstellungen STM32F0 Discovery Board Video]&lt;br /&gt;
** SiSy ARM, STM32&lt;br /&gt;
*** Download: [http://www.sisy.de/index.php?id=59 SiSy DEMO] kein Begrenzung der Codegröße&lt;br /&gt;
*** [http://www.youtube.com/watch?v=84Y3jYLWYpo Videobeispiel]&lt;br /&gt;
** Microsoft Visual Studio&lt;br /&gt;
*** [http://visualgdb.com/tutorials/arm/stm32/f4_discovery/ &amp;quot;STM32F4-Discovery tutorial with Visual Studio&amp;quot;]&lt;br /&gt;
* Ubuntu&lt;br /&gt;
** [http://cms.seng.de/service-support/downloads/ Installing a toolchain for Cortex-M3/STM32 on GNU/Linux] - How-to manual, für STM32F1 unter GNU/Linux mit OpenOCD und Olimex ARM-USB-OCD-H. Integrierte Make files, Linker Skripte, Startup-Code, diverse Tools und Demo-Projekt/Programm. Einbindung in Eclipse IDE oder Bedienung über Kommandozeile.&lt;br /&gt;
** [http://fun-tech.se/stm32/index.php Ubuntu, Selbstcompilierter GCC, STM32/Cortex-M3]&lt;br /&gt;
** [http://thetoolchain.com The ToolChain] - Automatisch installierende Entwicklungsumgebung mit eigenen und externen Treibern, Unterstützt QtCreator als IDE, Flexibel erweiterbar über Shellskripte&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/214719 Tipps für Installation mit Eclipse]&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter===&lt;br /&gt;
* [http://www.segger.com/jlink-model-overview.html SEGGER J-LINK / J-TRACE] für u.a. alle ARM7/9/11, Cortex-M0/M1/M3/M4/A5/A8/A9/R4 als [http://www.segger.com/cms/j-link-edu.html Non-Commercial] J-LINK-EDU für ca. 50€ zu haben, läuft in µVision, IAR, GDB (Linux &amp;amp; Windows über einen eigenen [http://www.segger.com/admin/uploads/productDocs/UM08005_JLinkGDBServer.pdf GDB-Server]), Keil, ... Der J-Link ist mit Abstand der schnellste Debugger, den ich bisher testen konnte. Wer es beim Debuggen eilig hat, liegt mit dem J-Link von Segger richtig.&lt;br /&gt;
* Keil [http://www.keil.com/ulinkme/ ULINK-ME], [http://www.keil.com/arm/ulink2/ ULINK2], [http://www.keil.com/arm/ulinkpro/ ULINK pro] Wenn man die die µVision IDE nicht verlassen mag, kann man sich mit diesen Adaptern anfreunden, denn sie arbeiten nur mit dieser IDE zusammen. Sie benötigen keine USB-Treiber, da sie geschickt das HID-Device des Betriebssystems nutzen. Es lässt sich kein fremdes Binary oder Hex-File flashen. Der ULINK2 kostet genau soviel wie ein Segger J-Link Basic bei gleichem Funktionsumfang, der sich jedoch auch in Verbindung mit anderen IDEs (GDB, usw) einsetzen lässt.&lt;br /&gt;
* [http://www2.st.com/content/st_com/en/products/development-tools/hardware-development-tools/development-tool-hardware-for-mcus/debug-hardware-for-mcus/debug-hardware-for-stm32-mcus/st-link.html ST-LINK],  [http://www2.st.com/content/st_com/en/products/development-tools/hardware-development-tools/development-tool-hardware-for-mcus/debug-hardware-for-mcus/debug-hardware-for-stm32-mcus/st-link-v2.html ST-LINK/V2]&lt;br /&gt;
* Jedes STM32 NUCLEO und DISCOVERY board hat einen ST-LINK für Programmierung/Debugging per SWD on-board (teilweise abbrechbar), welcher auch für eigene STM32 Target Hardware benutzt werden kann (ca. 12,- bis 19,-€, je nach Typ). Zwar ist er mit 1.8MHz Takt ein sehr langsamer Vertreter seiner Art, jedoch lassen sich mit ihm fremde Hex- und Binary-Files sowohl Debuggen als auch Flashen. Er unterstützt aber nur MCUs von ST. NXP, Atmel oder TI lassen sich damit nicht programmieren. Diese ST-LINK-Variante beherrscht nur SWD, kein JTAG und hat keine Treiber, die den Programmierprozessor vom Zielsystem galvanisch entkoppeln. Der ST-Link in der Adapterversion mit Gehäuse hat diese Nachteile nicht und kostet auch nur um 20€.  Unter Linux kann der Virtuellen COM-Port des ST-LINK/V2 mit Hilfe des cdc-acm Treibers aus dem Kernel angesprochen werden ([https://embeddedmicro.com/forum/viewtopic.php?t=82 siehe hier]). &#039;&#039;&#039;UPDATE:&#039;&#039;&#039; Die ST-LINK/V2-1 auf den NUCLEO und Discovery-Boards können jetzt auch auf J-Link OB geflasht werden. Details und Hinweise dazu [https://www.segger.com/jlink-st-link.html hier].&lt;br /&gt;
* [http://www.raisonance.com/rlink.html Raisonance RLink]&lt;br /&gt;
* [http://www.isystem.com/products/itag iTag] für 50€ bei [http://www.amazon.de/dp/B009XAQ9BW Amazon] bestellbar, alternativ als [http://isystem.com/products/hardware/cortex-debugger/itag/itag-instruction Eigenbauversion (offenes Design)] läuft mit der freien winIDEAiTag version (siehe oben)&lt;br /&gt;
&lt;br /&gt;
In der Regel haben die [[JTAG]] Adapter einen 20-poligen Stecker, den man direkt auf die Demo-Boards mit 20-poligem [[JTAG]]-Anschluss einstecken kann. Die Pinbelegung ist genormt, siehe Artikel [[JTAG]]. Die Discovery-Boards haben keinen separaten JTAG-Stecker, aber man kann sich zumindest für das STM32F4 Discovery einen Adapter Pinheader-&amp;gt;JTAG Stecker leicht selbst bauen.&lt;br /&gt;
&lt;br /&gt;
ST-Link Adapter können jetzt auch unter Linux mit neuer Firmware geflasht werden: [http://www2.st.com/content/st_com/en/products/embedded-software/development-tool-software/stsw-link007.html Download]. &lt;br /&gt;
&lt;br /&gt;
Andere [[JTAG]] Adapter wie z.B. der ULink2 von Keil funktionieren nur mit dem Keil Compiler. Leider kann dieser auch kein fremdes Binary oder Hex-File in den Controller schreiben.&lt;br /&gt;
&lt;br /&gt;
===Programmieradapter Open-Source===&lt;br /&gt;
&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG-COOCOX/ ARM-JTAG-COOCOX], CoLinkEX Nachbau von Olimex, unterstützt JTAG sowie SWD&lt;br /&gt;
** [http://www.coocox.org/wiki/coocox/CoLinkEx/CoLinkEx-Support unterstützte uC]&lt;br /&gt;
** unterstütze IDEs: [http://www.keil.com/arm/mdk.asp Keil MDK-ARM 4.03] oder neuer, [http://www.iar.com/en/Products/IAR-Embedded-Workbench/ IAR Embedded Workbench 5.xx] oder neuer sowie die [http://www.coocox.org/CooCox_CoIDE.htm CooCox CoIDE]&lt;br /&gt;
* [https://www.olimex.com/Products/ARM/JTAG/ Olimex] ARM-USB-OCD (ca. 60.-, hat zusätzlich einen Spannungsausgen und einen COM Port)&lt;br /&gt;
* [https://github.com/texane/stlink Stlink]&lt;br /&gt;
* [http://www.randomprojects.org/wiki/Floss-JTAG FLOSS-JTAG]&lt;br /&gt;
&lt;br /&gt;
Der Controller hat auch einen fest eingebauten Boot-Lader. Damit läßt er sich auch über eine gewöhnliche serielle Schnittstelle programmieren, ohne dass man einen JTAG-Adapter benötigt. Dies erfordert ggf. entsprechende Konfiguration über die BOOTx-Pins und/oder die Option-Bytes, und ein Programm wie [https://code.google.com/p/stm32flash/ stm32flash].&lt;br /&gt;
&lt;br /&gt;
=== Demo-Projekte ===&lt;br /&gt;
&lt;br /&gt;
* Einführung in die GPIO Programmierung der STM32F10x und STM32F30x Prozessoren am Beispiel des STM32F3 Discovery Boards und Vergleich zur AVR IO Registerstruktur [http://www.mikrocontroller.net/topic/300472#new]&lt;br /&gt;
* [[prog_bsp_timer_1_timer2|Programmbeispiel für die Verwendung von Timer2 zusammen mit dem Interrupt]]&lt;br /&gt;
* [http://www.firefly-power.de/ARM/printf.html Printf() debugging mit minimalem Aufwand]&lt;br /&gt;
* [[STM32_BLDC_Control_with_HALL_Sensor|Programmbeispiel für BLDC Motoransteuerung (Timer 1) mit HALLSensor (Timer 3)]]&lt;br /&gt;
* [[Cortex_M3_OCM3U]]&lt;br /&gt;
* Martin Thomas hat ein umfangreiches Projekt erstellt, in der die Eclipse Einstellungen enthalten sind:&lt;br /&gt;
** [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html &amp;quot;ChaN&#039;s FAT-Module with STM32 SPI&amp;quot;]&lt;br /&gt;
* [[STM32 USB-FS-Device Lib]]&lt;br /&gt;
* Modellbau-Sender auf STM32-Basis mit vielen Treibern [http://www.rcos.eu www.rcos.eu]&lt;br /&gt;
* Ausführliches [https://github.com/jkerdels/stm32edu Einstiegs-Tutorial] in Codeform für das [http://www.st.com/internet/evalboard/product/252419.jsp STM32F4 discovery board]&lt;br /&gt;
* [http://www.redacom.ch/keillab/ Schweizer Gondelbahnsteuerung über Webserver auf ETT STM32F ARM KIT Board in Keil RTOS] mit Webcam&lt;br /&gt;
* Die [http://ethernut.svn.sourceforge.net/viewvc/ethernut/trunk/ Ethernut SVN Version] unterstützt inzwischen viele STM32 Typen, viele Devices und einige STM32 Demoboards&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=744 Uwe Becker&#039;s Libraries für den STM32F4]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3290 Uwe Becker&#039;s STM32F429 Discovery Board Oszilloskop], hier der [http://www.mikrocontroller.net/topic/319831#new Thread]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net/wordpress/?page_id=3424 Uwe Becker&#039;s STM32F429 Discovery Board ZX-Spectrum Emulator]&lt;br /&gt;
&lt;br /&gt;
== Debug- und Trace-Interface (CoreSight™ Debug and Trace Technologie)==&lt;br /&gt;
&lt;br /&gt;
Übersicht über beide Funktionalitäten und den Schnittstellen:&lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_cs_core_sight.htm&lt;br /&gt;
&lt;br /&gt;
Die Coresight-Debug-Architektur ermöglicht ein nicht-invasives Debugging, d.h. es können während des Betriebes (meistens) ohne Beeinflussung des Prozessors Daten vom Speicher gelesen und in selbigen geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Debugger Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Der Debugger-Teil besitzt drei Funktionen:&lt;br /&gt;
* Run Control: z.B. Programm-Start, Stopp und Einzel-Schritte.&lt;br /&gt;
* (Program) Break Points: Ein Programm hält an, wenn der Programm Counter eine bestimmte Programm-Adresse erreicht.&lt;br /&gt;
** Die maximale Anzahl der gleichzeitig möglichen Break Points ist begrenzt (z.B. 6 bei einem STM32).&lt;br /&gt;
** Die Anzahl der Break Points ist nahezu unbegrenzt, wenn ein Debugger über den Memory Access (s.u.) sogenannte Flash Break Points unterstützt. Dabei wird ein geladenes Programm im Flash umprogrammiert, um den Debugger anzuhalten. Diese Funktionalität ist meistens ein kostenpflichtiges Zusatz-Feature des Debugger-Herstellers. &lt;br /&gt;
** Beinhaltet keine Data Watch Funktionalität, welche im Trace-Teil (DWT) realisiert wird.&lt;br /&gt;
* Memory Access: Lesen und Schreiben von Speicheradressen. &lt;br /&gt;
** Diese Funktionalität beinhaltet keine direkte Flash-Programmierung. Der Programmiervorgang für einen Flash ist herstellerspezifisch und muss von dem verwendeten Debugger unterstützt werden.&lt;br /&gt;
&lt;br /&gt;
=== Trace Funktionen ===&lt;br /&gt;
Die Trace-Funktionalität wird in drei Funktionen aufgeteilt:&lt;br /&gt;
* ETM (Embedded Trace Macrocell): Optional, nicht jede CPU besitzt diese Hardware (Kostenfaktor, Ausstattung).&lt;br /&gt;
* ITM (Instrumentation Trace Macrocell): Über diesen Kanal kann ein vereinfachtes Trace des Core ermöglicht werden, sowie &amp;quot;printf-ähnlich&amp;quot; Daten über den ITM Channel 0 geschickt und im Debugger ausgegeben werden.&lt;br /&gt;
* DWT (Data Watchpoint &amp;amp; Trace Unit): &lt;br /&gt;
** Data Watch: 4 Access-Break-Points ( z.B. der Debugger bleibt stehen, wenn das Programm auf einen Speicher zugreift oder der Wert einer Variablen einen bestimmten Wert annimmt). &lt;br /&gt;
** Trace Unit: Programmverlauf (durch Lesen des Program Counters) und Interrupt Aufrufe verfolgen, sowie Zeitmessungen.&lt;br /&gt;
&lt;br /&gt;
Einige der Trace-Funktionalitäten können über die JTAG-Schnittstelle angesprochen werden. Die schnelle Trace-Funktionalität (mit 4 bit Parallel-Port) steht nur mit der erweiterten DEBUG + ETM Schnittstelle zur Verfügung. Im Gegensatz zum Debugger-Teil (Run Control, Break Points und Memory Access) werden Trace-Funktionen nicht von allen Debuggern unterstützt. Debugger mit der vollen Trace-Funktionalität kosten deutlich mehr.&lt;br /&gt;
&lt;br /&gt;
* Beispiele für Trace-Port-Aktivierungen für verschiedene Hersteller: http://www.keil.com/support/man/docs/jlink/jlink_capture_tracedata.htm&lt;br /&gt;
&lt;br /&gt;
Die Aktivierung des parallelen Trace-Ports erfordert, je nach CPU Hersteller, zusätzliche Debugger-Makros für die Aktivierung und Port-Freischaltung. Zusätzlich sind die Schnittstellenauswahl und Einstellung (Frequenzen) im Entwicklungs-Tool (IDE) wichtig, um erfolgreich den Programm-Verlauf &amp;quot;tracen&amp;quot; zu können.&lt;br /&gt;
&lt;br /&gt;
=== Debug und Trace-Schnittstellen ===&lt;br /&gt;
Als Debug Interface stehen zwei Varianten zur Auswahl:&lt;br /&gt;
* [[JTAG]]: Dafür sind mindestens 6 Steuerleitungen nötig. Unterstützt Device Chaining: Mehrere verbundene Geräte können mit einem Debugger/Programmer gleichzeitig angesteuert werden.&lt;br /&gt;
* SWD (Serial Wire Debug): Hier mindestens 2  Steuerleitungen (3 mit SWO, zzgl GND und 3,3V). Die SWD Schnittstelle ist in der Regel schneller und kann auch Funktionen aus dem Trace-Teil beinhalten (z.B. ITM, dafür wird der SWO-Pin benötigt). Device Chaining ist mit dieser Schnittstelle nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standard-JTAG Steckerbelegungen: &lt;br /&gt;
http://www.keil.com/support/man/docs/ulink2/ulink2_hw_connectors.htm&lt;br /&gt;
&lt;br /&gt;
=== Der 10polige JTAG-Stecker von mmvisual ===&lt;br /&gt;
mmvisual hat mit dieser Steckerbelegung die Standard JTAG Schnittstelle erweitert:&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Part in den Artikel [http://www.mikrocontroller.net/articles/JTAG#Der_10-polige_JTAG_Stecker_von_mmvisual JTAG] verschoben.&lt;br /&gt;
Hinzu gekommen ist die Adapterplatine 10-Polig auf Standard JTAG 20 Polig mit TTL/V24 Wandler. [http://www.mikrocontroller.net/articles/JTAG#Die_Adapterplatine Siehe hier.]&lt;br /&gt;
&lt;br /&gt;
== Hardware-Beschaltung ==&lt;br /&gt;
&lt;br /&gt;
Der STM32 benötigt für den Betrieb nur (Minimalbeschaltung):&lt;br /&gt;
&lt;br /&gt;
* VCC 2..3,3V (je nach Typ)&lt;br /&gt;
* AVCC 2..3,3V (sehr wichtig, der STM32 lässt sich ohne diese Spannung nicht programmieren)&lt;br /&gt;
* GND&lt;br /&gt;
* Reset Pin 100nF nach GND (ein Pull-Up Widerstand von ca. 40k ist intern vorhanden)&lt;br /&gt;
* [[#Bootmodi|Boot-Pins]]&lt;br /&gt;
&lt;br /&gt;
ansonsten nur ein paar einzelne Cs 100nF an VCC/GND.&lt;br /&gt;
&lt;br /&gt;
Um Programmieren zu können wird entweder noch die serielle Schnittstelle (Programmieren über den vorprogrammierten Bootloader) oder JTAG oder die SWD Schnittstelle benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Bootmodi ===&lt;br /&gt;
Unterschiedliche Bootmodi lassen sich mittels der PINs BOOT0 und BOOT1 auswählen. Siehe Application Note [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Attachments/18225/AN2606.pdf AN2606]. Außer F1 besitzen neuere Familien ein SYSCFG_MEMR Register. In dieses Register kann man die gewünschten Boot0/1 Werte schreiben und nach einem Core-Reset (!= System_Reset) startet der Prozessor im gewünschten Mode. Eine Neu- bzw. Deinitialisierung der Peripherie empfiehlt sich! &lt;br /&gt;
&lt;br /&gt;
==== Boot from FLASH ====&lt;br /&gt;
Startadresse wird von 0x08000004 geladen&lt;br /&gt;
 BOOT0 Lo&lt;br /&gt;
 BOOT1 X &lt;br /&gt;
&lt;br /&gt;
==== Boot from SRAM ====&lt;br /&gt;
PC Startadresse wird an 0x200001E0 direkt angesprungen.&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Hi&lt;br /&gt;
Da der interne FLASH der stm32f1x laut Datenblatt nur für 1000 Schreibvorgänge ausgelegt ist, kann mittels BOOT0 (High) und BOOT1 (High) auch aus dem zuvor mit dem Debugger (JTAG/SWD) beschriebenen SRAM booten. &lt;br /&gt;
Hierbei gilt zu beachten:&lt;br /&gt;
 VTOR auf die NVIC Tabelle im SRAM vor dem auslösen des ersten Interrupts remappen.&lt;br /&gt;
&lt;br /&gt;
 Um ein vergleichbares Startverhalten zum FLASH zu erreichen, empfiehlt es sich,&lt;br /&gt;
 0xF1E0F85F an 0x200001E0 zu schreiben. Diese implizite Ausführung von &amp;quot;ldr.w pc,&lt;br /&gt;
 [pc, #-0x01E0]&amp;quot; beim Start erzwingt ein laden der Startadresse von 0x20000004.&lt;br /&gt;
&lt;br /&gt;
==== Boot from SYSMEM (RS232, CAN und USB) ====&lt;br /&gt;
PC Startadresse wird von 0x1FFFF004 geladen&lt;br /&gt;
 BOOT0 Hi&lt;br /&gt;
 BOOT1 Lo&lt;br /&gt;
&lt;br /&gt;
Ab F2 gibt es auch ein SYSCFG_MEMRMR Register. Schreibt man hier den Wert für &amp;quot;System Flash&amp;quot; und macht einen Corereset (keinen Systemreset), so landet man auch im Bootloader, unabhängig vom Wert der Boot Pins.&lt;br /&gt;
&lt;br /&gt;
Auch ohne JTAG lässt sich ein STM32 programmieren (Bootloader-Aktivierung). Dabei stehen, je nach CPU-Typ, verschiedene Möglichkeiten zur Verfügung:&lt;br /&gt;
* RS-232 (bisher alle STMs)&lt;br /&gt;
* USB (alle USB fähigen CPUs &amp;gt; F103)&lt;br /&gt;
* CAN (wie USB nur in bestimmten MCUs)&lt;br /&gt;
&lt;br /&gt;
3 zusätzliche Verbindungen müssen auf dem Board gepatcht werden. Für einen Test geht es auch mit Tastern für RESET und BOOT0.&amp;lt;br&amp;gt;&lt;br /&gt;
RESET=RTS (L-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT0=DTR (H-aktiv)&amp;lt;br&amp;gt;&lt;br /&gt;
BOOT1=LOW&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Details sind hier im Forum: [http://www.mikrocontroller.net/topic/141711 STM32 Programmiertool]&lt;br /&gt;
&lt;br /&gt;
Tools für den Download über den STM32-Bootloader:&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/PF257525 STSW-MCU005 STM32 and STM8 Flash loader demonstrator]&lt;br /&gt;
* [https://sourceforge.net/projects/stm32flash/ stm32flash] - Open source flash program (RS-232)&lt;br /&gt;
* [http://dfu-util.sourceforge.net/ dfu-util] - Open source flash program (USB)&lt;br /&gt;
&lt;br /&gt;
== Bewertung ==&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber ARM7:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Interrupt-Controller jetzt Teil des Prozessors (als Core Peripheral), die Vector Table ist jetzt eine echte Vektortabelle, keine Sprungliste wie bei ARM7. Durch Automatismen zwischen Core und NVIC (auto register save r0..r3, lr, sp, pc) bei Interrupt Entry wird eine deutlich schnellere Ausführungszeit bei Interrupts erreicht. Der Interrupt Code muss sich nicht mehr selbst um die Sicherung der o.g. Register kümmern und eine besondere Konfiguration der Handler im Compiler entfällt. Sind vor Beendigung einer ISR (d.h. Rücksprung zum User Code) weitere Interrupts pending, so werden diese ausgeführt, ohne dass eine komplette pop-push-sequenz der Register notwendig ist. Schön beschrieben ist es hier im [http://www.hitex.com/fileadmin/pdf/insiders-guides/stm32/isg-stm32-v18d-scr.pdf Insider&#039;s Guide] unter 2.4.5 / Seite 20 (der Link funktioniert nicht mehr, direkt nach isg-stm32-v18d-scr.pdf googlen kann helfen...).&lt;br /&gt;
* Thumb-2 Befehlssatz, deutlich schneller als Thumb-1 und ebenso kompakt&lt;br /&gt;
* Weniger Pins für Debugging benötigt durch SWD&lt;br /&gt;
* Mehr Hardware Breakpoints machen debuggen einfacher&lt;br /&gt;
* Software ist einfacher weil die Umschaltung zwischen ARM Mode und Thumb Mode wegfällt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber LPC1700 und LPC1300:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Flexiblere Gehäuseformen mit mehr Peripherie bei kleinen Gehäusen&lt;br /&gt;
* FW-Lib für alle STM32 gleich, alle AppNotes/Demos beziehen sich auf diese eine FW-Lib was die Entwicklung der eigenen Applikation sehr beschleunigt.&lt;br /&gt;
* Genauerer und flexiblerer ADC, insbesondere gegenüber LPC1300&lt;br /&gt;
* Flexiblere Varianten der Peripherie &amp;gt;&amp;gt; bei weniger einen deutlichen Preisvorteil&lt;br /&gt;
* ab 0,85 EUR (Stand 2010) Allerdings gibts den LPC1100 mit Cortex-M0 schon ab 0,65 $!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber SAM3/4:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fast alle Pins sind 5-Volt tolerant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile gegenüber anderen &amp;quot;Kleinen&amp;quot; wie z.B. PIC, Atmel usw.&#039;&#039;&#039;&lt;br /&gt;
* nahezu gleicher Preis bei Hobby Anwendungen&lt;br /&gt;
* 32 Bit ohne Umwege in Assembler rechenbar&lt;br /&gt;
* Schnelle direkte Offset-Adressierung ermöglicht effizienten Zugriff auf Stack-Variablen, lokal gespeicherte Flash-Konstanten, struct/Array-Elemente&lt;br /&gt;
* Einfache einheitliche Adressierung des gesamten Adressraums, d.h. Pointer auf Peripherieregister, RAM &amp;amp; Flash können exakt gleich behandelt werden, keinerlei Banking/Umschalt-Mechanismen erforderlich auch bei großem Flash/RAM&lt;br /&gt;
* Interrupt-Prioritäten und Prioritätsgruppen&lt;br /&gt;
* Effiziente Pointerarithmetik da Registerbreite=Adressbreite&lt;br /&gt;
* bessere Peripherie wie USB, Ethernet, Vielzahl an Timern&lt;br /&gt;
* der ARM-Core hat eine höhere Taktfrequenz und kann gleichzeitig mehr in weniger Takten berechnen&lt;br /&gt;
* Hardware-Division, bei einigen FPU zur effizienten float-Berechnung&lt;br /&gt;
* Mit größerem Flash/RAM verfügbar&lt;br /&gt;
* Code kann direkt aus dem RAM ausgeführt werden, Speicherschutz und privilegierter Ausführungsmodus können &amp;quot;Kernel&amp;quot;- vor &amp;quot;Anwendungs&amp;quot;-Code schützen, somit wird das dynamische Nachladen von Anwendungen aus externem Speicher effizient &amp;amp; sicher möglich&lt;br /&gt;
* ... und weitere 1000 Punkte ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links&#039;&#039;&#039;&lt;br /&gt;
* [http://www.arm.com/files/pdf/ARM_Microcontroller_Code_Size_%28full%29.pdf Code Size Analyse zwischen verschiedenen µC]&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil gegenüber LPC1700:&#039;&#039;&#039;&lt;br /&gt;
* STM32F1xx: nur 72 MHz statt 100 MHz (LPC1759: 120 MHz) Taktfrequenz; STM32F2xx hat diesen Nachteil nicht (ebenfalls 120MHz, STM32F4xx mit 180MHz)&lt;br /&gt;
* Der LPC1700 besitzt deutlich mehr Mechanismen, um die Auswirkung der Waitstates des Flash-ROMs auf Code- und Datenzugriffe zu reduzieren und das bedeutet mehr Performance bei gleicher Taktfrequenz. Beim STM32F2 entfällt dieser Nachteil wohl aufgrund des ART Accelerators. &lt;br /&gt;
* Alle LPC1xxx haben 32 Bit Timer. Bei den STM32 haben das nur die STM32F2xx und STM32F4xx (2 Stück)&lt;br /&gt;
* I2S Einheit von ST hat keinen FIFO und im 24/32Bit Modus müssen 2x16Bit Halbwörter übertragen werden. Wobei allgemein bei neuen ARM Prozessoren die vorhandenen DMA-Kanäle (basierend auf eigenen BUS-Kanälen und Speicherzugriffen) FIFO in beliebiger Größe bedeutet. (Gilt nicht bei bestimmten STM32F4xx)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil für Hobby-Anwender&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Nicht direkt &amp;quot;Steckbrettauglich&amp;quot;, da kein DIL Gehäuse verfügbar. Der ebay-Shop dipmicro führt jedoch sehr günstige Lötadapter für Umsetzung von LQFP48 auf DIP48. QFP64 in 0.5mm Pinabstand und nicht 0.8mm wie AVR. Von NXP gibt es Cortex-M0 µC im DIL Gehäuse.&lt;br /&gt;
&lt;br /&gt;
* Viel Peripherie, Clocks müssen alle richtig eingestellt werden, ggf. Anpassung des Startup Codes usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Preis-Leistungs-Verhältnis in der Regel schlechter, da geringere Verkaufsstückzahlen&lt;br /&gt;
&lt;br /&gt;
== Errata, Tipps und Tricks ==&lt;br /&gt;
=== Hardware ===&lt;br /&gt;
* AD-Wandler PA0: Im Errata steht, dass hier Fehler in der Wandlung entstehen könnten, also einen anderen Pin verwenden.&lt;br /&gt;
* CAN-Bus PD0/PD1: Remap geht erst ab der 100-Pin-Version. Steht im RM0008 unter 9.3.3.: &amp;quot;CAN1 alternate function remapping&amp;quot;. Alle Infos von RM0008 9.3.x sind interessant&lt;br /&gt;
* CAN und USB sind bei der F1 Serie nur bei der &amp;quot;◦Connectivity-Line&amp;quot; gleichzeitig nutzbar. Siehe Datenblätter.&lt;br /&gt;
* Mit internem RC-Oszillator kann die CPU mit maximal 64MHz betrieben werden. Mit einem externen Quarz sind dann 72MHz möglich.&lt;br /&gt;
* Für USB Betrieb muss die CPU mit 48MHz oder 72MHz betrieben werden (bei STM32F1xx).&lt;br /&gt;
* Der Idle Interrupt vom Usart wird zwar ausgelöst, aber nicht vom entsprechenden Statusflag angezeigt&lt;br /&gt;
* Der DMA fängt beim aktivieren immer von vorn an zu zählen, auch wenn er nur kurz angehalten wurde&lt;br /&gt;
* STM32F2xx hat kein Flash Size Register, bei STM32F4xx ist zwar ein flash Size Register beschrieben, kollidiert aber in der Adresse mit einem anderen Register&lt;br /&gt;
* Derivate mit internem EEPROM und nur einer Speicherbank haben das &amp;quot;Feature&amp;quot; bei write/erase des Data-Flashes (EEPROM) einen kompletten stall der code execution zu verursachen (inkl. ISRs, DMA). Desgleichen bei write/erase des internen Flash (ISP-routinen, EEPROM-Emulation).&lt;br /&gt;
* Der I2C hat diverse Fehler, welche im Errata des jeweiligen Modells (z.B. [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/errata_sheet/CD00238166.pdf STM32F105xx and STM32F107xx Errata sheet] ) zu finden sind. Workarounds hierzu finden sich in der Application Note [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00209826.pdf AN2824]. Am Besten benutzt man jedoch die I2C Communication peripheral application library (CPAL) von ST ([http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF258336 STSW-STM32127])&lt;br /&gt;
* [http://blog.frankvh.com/category/stm32/ weitere undokumentierte Features]&lt;br /&gt;
* Interrupt-Flags in Statusregistern der diversen Peripherals wie der Timer müssen zu &#039;&#039;&#039;Beginn&#039;&#039;&#039; (bzw. möglichst weit vor dem Return) der ISR zurückgesetzt werden, da die ISR sonst eventuell 2x ausgeführt wird (Siehe [https://my.st.com/public/Faq/Lists/faqlst/DispForm.aspx?ID=143&amp;amp;level=1&amp;amp;objectid=141 STM32 FAQ] und [http://www.mikrocontroller.net/topic/312393#new Forum]).&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
==== Allgemein ====&lt;br /&gt;
Standard-GPIOs des STM32 und im speziellen das BSRR&lt;br /&gt;
* Die Register bestehen aus zwei Teilen, der obere Teil BR0-15 signalisiert durch ein gesetztes Bit die zu löschenden Bits im IO-ODR-Register,der untere Teil BS0-15 signalisiert durch ein gesetztes Bit die zu setzenden Bits. Besonders ist, wenn beide Bits (oberer und unterer Teil) gesetzt sind hat das Set-Bit Priorität. Durch eine geschickte Kombination von oberen und unteren Teil kann man Speicherzugriffe Sparen. z.B. kann man solch ein Konstrukt zum ändern der unteren 8 Bit des IO-ODR-Registers &amp;quot;uint32_t temp = GPIOC-&amp;gt;ODR &amp;amp; 0xff00; GPIOC-&amp;gt;ODR = temp | (Eingabe &amp;amp; 0x00ff)&amp;quot; um einen Speicherzugriff verkürzen zu &amp;quot;GPIOC-&amp;gt;BSRR = (Eingabe &amp;amp; 0x00ff) | ((0x00ff) &amp;lt;&amp;lt; 16)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== GCC ====&lt;br /&gt;
Um den GCC direkt zu verwenden (zB. mit selbstgebautem makefile), falls man das nicht von einer Entwicklungsumgebung machen lässt, siehe zunächst [[ARM GCC]]. STM32-spezifisches ist:&lt;br /&gt;
* Wird die [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] und ein Quarz verwendet, so muss noch per Präprozessor-Definition die Frequenz des Quarzes angegeben werden mittels z.B. -DHSE_VALUE=8000000 für 8MHz (wie auf dem STM32F4 Discovery).&lt;br /&gt;
&lt;br /&gt;
===== Startupcode &amp;amp; Linkerscript =====&lt;br /&gt;
* Damit der compilierte Code an den richtigen Stellen im Controller landet (d.h. dem Flash) muss man dem Linker ein Linkerscript mitgeben. Dies geht per &amp;quot;-T &#039;&#039;pfad_zum_linkerscript.ld&#039;&#039;&amp;quot; an den Linker-Befehl. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Linkerscript für die Atollic TrueSTUDIO IDE, dieses kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich das Script im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Project/STM32F4xx_StdPeriph_Templates/TrueSTUDIO/STM324x7I_EVAL/stm32_flash.ld&amp;quot; des Archives.&lt;br /&gt;
* Damit beim Starten die richtigen Initialisierungen vorgenommen werden (wie globale Variablen und bei C++ Konstruktoren globaler Objekt-Instanzen) muss als erstes ein Startupcode laufen, der dann die main()-Funktion aufruft. Der Startupcode ist meistens in Assembler geschrieben, C-Code ist aber auch möglich. Im Archiv der [[#.E2.80.8ESTM32_Standard_Peripheral_Library|STM32 Standard Peripheral Library]] befindet sich ein Beispiel-Startupcode für die Atollic TrueSTUDIO IDE, dieser kann direkt mit dem GCC verwendet werden. Beispielsweise für den STM32F4 befindet sich der Code in Assemblerform im Pfad &amp;quot;/STM32F4xx_DSP_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/TrueSTUDIO/startup_stm32f40xx.s&amp;quot; des Archives. Der Assemblercode kann per arm-none-eabi-as (Flags s.o.) assembliert werden, die resultierende .o -Datei normal mitgelinkt.&lt;br /&gt;
&lt;br /&gt;
Zusammen bieten die beiden Dateien der Anwendung ein Standard-C-Interface, d.h. man kann wie gewohnt globale Variablen verwenden und seinen Code in die main()-Funktion schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Tipps für Umsteiger von Atmel/PIC/8051 ===&lt;br /&gt;
* Prozessortakt hat unterschiedliche Taktquellen und eine PLL.&lt;br /&gt;
* Alle Peripheriemodule haben einen extra Clock, den man aktivieren muss.&lt;br /&gt;
* Wenn man z.B. einen UART benutzen möchte, so muss man den Clock vom UART, Alternate Function IO (AFIO) und den GPIO-Port aktivieren.&lt;br /&gt;
* Ansonsten hat man nahezu doppelt so viele Möglichkeiten in den Peripheriemodulen.&lt;br /&gt;
* Interrupt-Flags müssen in der ISR selber gelöscht werden&lt;br /&gt;
* Forum zu [http://www.mikrocontroller.net/topic/175888 Interrupts vs. Events]&lt;br /&gt;
&lt;br /&gt;
=== Errata vom STM32F4xx die nicht im Errata von ST stehen ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/267439#2788478 Aktivieren von DMA], wenn mehr als 3 DMA Kanäle aktiviert werden, kann es sein dass die nicht alle korrekt bedient werden. Auch klappt der DMA mit dem FSMC nicht immer zuverlässig. [https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FWarning%20limit%20simultaneous%20DMAs%20to%202&amp;amp;FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&amp;amp;currentviews=811 siehe hier] [http://blog.frankvh.com/2012/01/13/stm32f2xx-stm32f4xx-dma-maximum-transactions/ und hier]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/260637#2700761 Nerviger Bug in &amp;quot;stm32f4xx.h&amp;quot;] Änderung Struktur GPIO_TypeDef&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/261690#2714754 Batterie wird leer gezogen], nur bei manchen Chips mit Rev. A&lt;br /&gt;
* [http://www.efton.sk/STM32/STM32F4xx_doc_errors.txt Liste von Dokumentations-Fehlern]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
&lt;br /&gt;
=== Controller ===&lt;br /&gt;
&lt;br /&gt;
Versand Europaweit im endasmedia.ch Shop&lt;br /&gt;
* STM32F105 Controller für 2.50€ [http://shop.endasmedia.ch/index.php?id_product=8&amp;amp;controller=product&amp;amp;id_lang=1 shop.endasmedia.ch]&lt;br /&gt;
&lt;br /&gt;
Versandhäuser für Privatpersonen&lt;br /&gt;
* [http://www.reichelt.de/STM-Controller/2/index.html?;ACTION=2;LA=2;GROUPID=2950; Reichelt]&lt;br /&gt;
* [http://darisusgmbh.de/shop/index.php?cat=c2692_ARM-Cortex.html Darisus]&lt;br /&gt;
* [http://www.hbe-shop.de HBE (Farnell Programm für Private)] &lt;br /&gt;
* [http://www.sander-electronic.de/be00069.html Sander]&lt;br /&gt;
* [http://www.tme.eu/de/katalog/index.phtml#cleanParameters%3D1%26search%3DSTM32F10%26bf_szukaj%3D+ TME] &lt;br /&gt;
* [http://teske-electronics.de/index.php?cPath=3_9_53 Teske electronics]&lt;br /&gt;
* [http://de.rs-online.com/web/c/halbleiter/prozessoren-und-mikrocontroller/mikrocontroller/?sort-by=default&amp;amp;sort-order=default&amp;amp;applied-dimensions=4294417325&amp;amp;lastAttributeSelectedBlock=4294425895 RS-Online]&lt;br /&gt;
&lt;br /&gt;
Gewerblich liefern natürlich viele wie EBV, [http://de.futureelectronics.com Future Electronics], Mouser, Farnell, Digikey usw...&lt;br /&gt;
&lt;br /&gt;
=== Evaluation Boards ===&lt;br /&gt;
* Siehe [[:Kategorie:ARM-Boards]]&lt;br /&gt;
* [http://shop.embedded-projects.net/index.php?module=artikel&amp;amp;action=gruppe&amp;amp;id=14 Im Shop von Embedded Projects]&lt;br /&gt;
* [http://www.watterott.com/de/Boards-Kits/ARM/ARM-Cortex-M3 Cortex M3 bei Watterott]&lt;br /&gt;
* [http://www.raisonance.com/~primer-starter-kits__microcontrollers__tool~tool__T018:4enfvamuxbtp.html Primer und Primer2 von Raisonance]&lt;br /&gt;
* [http://www.sander-electronic.de/es0028.html Sander Electronic]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/MP32F103-Stick:_Ein_Mini-Mikrocontroller-Board_mit_USB_und_bis_zu_4MB_Datenspeicher Artikel im Wiki, ARM mit USB und 4MB Speicher]&lt;br /&gt;
* [http://www.futurlec.com/STM32_Development_Board.shtml Futurlec Evalboard, ebenso Header-Board]&lt;br /&gt;
* [http://www.propox.com/products/t_174.html Propox, Header-Boards für 103R und 103V sowie Trägerplatine dafür]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Cortex_M3_OCM3U Cortex M3 Artikel im Wiki]&lt;br /&gt;
* [http://olimex.com/dev/index.html STM32 bei Olimex]&lt;br /&gt;
* [http://de.farnell.com/jsp/displayProduct.jsp?sku=1824325&amp;amp;action=view&amp;amp;CMP=GRHS-1000962 STM32Discovery bei Farnell] Mikrocontroller Board (STM32F100RBT6B) mit onboard USB-Programming Interface für ca. 12,50€&lt;br /&gt;
* [http://www.de.rs-online.com/web/p/products/7458434/ STM32Discovery bei RS-Components] 12,65 € +MwSt.&lt;br /&gt;
* [http://www.segor.de/#Q=STM32 VL DISCOVERY] STM32 Discovery bei Segor&lt;br /&gt;
* [http://www.watterott.com/de/STM32F4Discovery STM32F4DISCOVERY] STM32F4 Cortex M4 Controller mit JTAG-Debugger auf der Platine bei Watterott für 16,66EUR.&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/443910/ STM32F4 Discovery Kit bei Conrad] 17,11 €&lt;br /&gt;
* [http://www.ST.com/stm32l152c-discovery STM32 L1 Discovery] mit kleiner LCD-Anzeige; [http://www.ST.com/web/en/catalog/tools/PF250990 Weitere Informationen dazu]&lt;br /&gt;
* [http://www.mcu-raisonance.com/~open4-development-platform__microcontrollers__tool~tool__T018:g65gu6ghg2n.html/ Open 4 oder auch genannt Evo-Primer]&lt;br /&gt;
* [http://www.wayengineer.com/index.php?main_page=index&amp;amp;cPath=50_66&amp;amp;page=1&amp;amp;sort=3a WayEngineer]&lt;br /&gt;
* [http://thinkembedded.ch/ST-STMicroelectronics:::24.html Im Thinkembedded Shop] in der Schweiz / DiscoveryF4, div. ETT und Olimex Boarde ab 20,18 CHF / 16,15 EUR (inkl. MwSt.) zzgl. Versandkosten&lt;br /&gt;
* [http://shop.myavr.de/ARM-Produktlinie/STM32F4-Discovery.htm?sp=article.sp.php&amp;amp;artID=200072 Im myAVR Shop] DiscoveryF4 mit möglichem Zubehör 16,45 EUR (inkl. MwSt.) zzgl. Versandkosten&lt;br /&gt;
* [http://www.keil.com/boards/cortexm.asp Keil/ARM Demoboards]&lt;br /&gt;
* [http://www.phytec.de Phytec]&lt;br /&gt;
* [http://shop.myavr.de/index.php?sp=artlist_kat.sp.php&amp;amp;katID=37 verschiedene ARM Produkte und Erweiterungen bei myAVR]&lt;br /&gt;
* [http://re.reworld.eu/de/produkte/s64dil-405/index.htm S64DIL-405 STM32Fxxx ARM Cortex M3 Mikrocontrollermodul mit USB-Schnittstelle, Steckbretttauglich] (Leerplatine eignet sich auch für STM32F1xx Prozessoren.)&lt;br /&gt;
* [http://www.amazon.de/STM32F4-DISCOVERY-STM32F429-Cortex-M4-Development/dp/B00HGG0KHY STM32F429 DISCOVERY Cortex M4 mit 2,4&amp;quot; Touch-TFT, 3-Achs Sensor, 64 MBit SDRAM ab ~25 EUR bei Amazon, Ebay u.a.]&lt;br /&gt;
&lt;br /&gt;
== Weblinks, Foren, Communities, Tutorials ==&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks STM32 - Einstieg mit Em::Blocks Tutorial]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/173753 Diskussion zum Artikel]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/mikrocontroller-elektronik?filter=ARM*+STM32*+Cortex* Suche im Forum]&lt;br /&gt;
* [[STM32 für Einsteiger]]&lt;br /&gt;
* [[STM32 CooCox Installation]]&lt;br /&gt;
* http://www.openstm32.org/System+Workbench+for+STM32&lt;br /&gt;
* [https://my.st.com/public/STe2ecommunities/mcu/Lists/ARM%20CortexM3%20STM32/AllItems.aspx Forum auf der ST Homepage] &lt;br /&gt;
* [http://www.stm32circle.com/hom/index.php STM32 Community] &lt;br /&gt;
*[http://joe-c.de/pages/posts/einstieg_mikrocontroller_stm32f103_101.php Einstieg:  STM32board mit Kamera (deutsch)] &lt;br /&gt;
* [http://www.ebv.com/fileadmin/products/Press_Print/Brochures/Product_Brochures/EBV_Cortex%20Collection_V2.pdf Übersicht der Cortex Prozessoren und deren Hersteller (nicht nur ST, von EBV)]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/258652 Tutorial]&lt;br /&gt;
* [http://diller-technologies.de/stm32_wide.html STM32 Tutorial in Deutsch von Diller Technologies]&lt;br /&gt;
* [http://mySTM32.de STM32 C und C++ Tutorial in Deutsch ]&lt;br /&gt;
* [http://mikrocontroller.bplaced.net STM32F4 Quellcode-Librarys und CooCox-Projekte in Deutsch ]&lt;br /&gt;
* [http://myugl.de Tutorial für Grafik-Librarys und SiSy-Projekte in Deutsch ]&lt;br /&gt;
* [http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF251717 MicroXplorer MCU graphical configuration tool ]&lt;br /&gt;
* [http://www.harerod.de/docs/CoreMark_STM32.pdf Testbericht über CoreMark 1.0 auf Cortex-M3/M4 mit verschiedenen Compiler- und MCU-Einstellungen]&lt;br /&gt;
* [http://klaus4.blogspot.com/2014/05/stm32f4-discovery-mit-opensource.html STM32-Toolchain mit Eclipse CDT 4.3, GnuArmEclipse, OpenOCD 0.8.0, Gnu Arm GCC 4.8, STM32CubeMX]&lt;br /&gt;
* [http://libopencm3.org/wiki/Main_Page libopenmc3 OpenSource libs für STM32 und ähnliche] &lt;br /&gt;
* [https://www.mikrocontroller.net/topic/423300#new Totzeitrechner für STM32]&lt;br /&gt;
* [https://leanpub.com/mastering-stm32 Download-Buch in englisch, min. 25$ &amp;quot;Mastering STM32&amp;quot;]&lt;br /&gt;
* [http://stefanfrings.de/stm32/index.html Notizen zu ARM Cortex M3 Mikrocontrollern der STM32F1 Serie]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Kategorie:ARM]]&lt;br /&gt;
[[Kategorie:STM32]]&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>87.178.97.251</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Digitaler_Rauschgenerator_im_FPGA&amp;diff=97018</id>
		<title>Digitaler Rauschgenerator im FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Digitaler_Rauschgenerator_im_FPGA&amp;diff=97018"/>
		<updated>2017-08-21T18:36:43Z</updated>

		<summary type="html">&lt;p&gt;87.178.97.251: /* Signalverarbeitung */ Anwendung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein digitaler Rauschgenerator basierend auf Zufallsbits&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;von [[Benutzer:engineer|J.S.]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel beschreibt eine Möglichkeit, tatsächlich zufällige, nicht vorhersagbare Bitfolgen zu erzeugen, die prinzipiell gleichverteilt sind und keinerlei Präferenzen besitzen. Damit lassen sich tatsächliche Zufallszahlen erzeugen, die wiederum als Rauschen verwendbar sind.&lt;br /&gt;
&lt;br /&gt;
Für die Realisation in VHDL müssen noch Buffer eingesetzt- sowie Schaltungsteile mittels &amp;quot;keep&amp;quot; erhalten werden. Die Lösung ist so gewählt, dass keine PLLs oder eine externe Verschaltungen benötigt werden.&lt;br /&gt;
&lt;br /&gt;
==Historie==&lt;br /&gt;
Die Schaltung funktionierte seinerzeit mit CMOS-Invertern und einem Binärzähler der 4000er Serie. Das letzten Bits diente als Umschalter zwischen den unterschiedlich langen Inverterketten.&lt;br /&gt;
&lt;br /&gt;
==Prinzip==&lt;br /&gt;
Die Idee beruht auf der Abtastung eines sich asynchron zur Zieldomain bewegenden Taktes, der sich praktisch während jedes denkbaren Abtastvorgangs ändern und damit vollkommen zufällige Werte annehmen kann. Die so abgetasteten Bits werden dann unabhängig von einander zu Bytes zusammengebaut, wodurch prinzipiell auch lange Einsen- und Nullfolgen entstehen können. Dazu muss der asynchrone Takt allerdings vergleichsweise langsam abgetastet werden.&lt;br /&gt;
&lt;br /&gt;
===Der freilaufende Zähler===&lt;br /&gt;
Eine einfache Schaltung für den Bitgenerator in VHDL ergibt sich durch einen Zähler, von dem ein Takt (hier 1/8-tel - es klappt oft auch 1/4-tel) abgeleitet wird und der sich infolge der aynchronen Rückkopplung auch noch verzählen kann:&lt;br /&gt;
&lt;br /&gt;
signal toggle : std_logic_vector(2 downto 0) := &amp;quot;000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
signal clock  : std_logic;&lt;br /&gt;
&lt;br /&gt;
p_osc : process (toggle)&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  toggle &amp;lt;= toggle + &amp;quot;1&amp;quot;;&lt;br /&gt;
  clock &amp;lt;= toggle (2);&lt;br /&gt;
end process;&lt;br /&gt;
&lt;br /&gt;
Die Teilung des Taktes ist bei manchen FPGAs nicht nötig, allerdings wird eine simple Rückkopplung vom Typ  toggle &amp;lt;= not toggle;  mitunter nicht erzeugt, bzw. sie ist zu schnell, um einen sauberen Takt zu erzeugen. Je breiter der Vektor &amp;quot;toggle&amp;quot; angesetzt wird, desto grösser ist die Wahrscheinlichkeit, dass der Zähler falsch zählt und Periodensprünge vollzieht. Die Ausgangsfrequenz wird allerdings geringer. Diese einfache Formulierung führt aber zu sehr technologieabhängigen Implementierungen, die von Synthesedurchlauf zu Synthesedurchlauf schwankt. Ein Beispiel findet sich im Farbmultiplex-Modul meines VGA-Cores.&lt;br /&gt;
&lt;br /&gt;
Besser ist ein gezielter Aufbau eines selbstschwingenden Systems auf Technologieniveau:&lt;br /&gt;
&lt;br /&gt;
===Einfacher Ringoszillator===&lt;br /&gt;
Der naheliegende Ansatz ist ein selbstschwingender Ringoszillator, der unabhängig von der Zieldomain arbeitet und im Prinzip jeden Flankenzustand darstellen kann. Derartige Oszillatoren lassen sich leicht durch rückgekoppelte Inverterketten bilden, die vom Prinzip nie in einen stabilen Zustand schwingen können und daher immer oszillieren. Gegenüber dem Zähler werden höhere Taktraten erzielt. Die Erfahrung zeigt aber, dass solch ein einfacher Oszillator meistens nicht genügend jittert, um über venüftige Zeiträume wirklich alle erdenklichen Kombinationen erzeugen zu können, da sich in der kurzfristigen Betrachtung immer eine Interferenz zu dem Abtasttakt einstellen wird. Ausserdem zeigt sich, dass solche Ringoszillatoren dazu neigen, sich auf benachbarte Schaltungsteile zu synchronisieren. Wenn diese mit dem Lesetakt getriggert werden, entstehen beobachtbare Spektren in den erzeugten Bitfolgen.&lt;br /&gt;
&lt;br /&gt;
===Mehrfach-Ringoszillator===&lt;br /&gt;
Eine deutliche Verbesserung stellt die Verwendung zweier Oszillatoren dar, die miteinander interferieren und je nach zeitlicher Überlagerung durch Verknüpfung mit einem EXOR ein z.T. sehr schnell toggelndes Bit ergeben, das schon gute Zufallswerte generiert, wenn es selten genug abgetastet wird. Je mehr solche Oszillatoren zugeschaltet werden, desto größer ist die Wahrscheinlichkeit eines Bitwechsels im Bereich der abtastenden Flanke. Leider neigt aber auch diese Anordnung von Ringoszillatoren dazu, sich auf Einflüsse der Restschaltung zu synchronisieren, was sich in der FFT-Analyse und Häufungsmessung des erzeugten Ausgangsignal äussert.&lt;br /&gt;
&lt;br /&gt;
===Desynchronisierte Ringoszillatoren===&lt;br /&gt;
Eine effektive Möglichkeit, etwaige Synchronisationsneigungen zu unterdrücken, ist es, die Frequenzen der Oszillatoren permanent umzuschalten, sodass keiner von ihnen eine stabile Phasenlage einnehmen kann. Genau, wie zu Beginn der Einschwingphase, benötigt der Oszillator nach dem Umschalten nämlich einige Schwingungen, um halbwegs stabil zu werden. Dies gilt insbesondere, wenn er sich auf irgendein externes Ereignis einstellen möchte. Wenn rechtzeitig umgeschaltet wird, hat der Oszillator keine Chance, sich auf Nachbarschaltungen einzuschwingen.&lt;br /&gt;
&lt;br /&gt;
Die Umschaltung funktioniert so, dass die Länge der Inverterkette verändert wird, indem ein Steuersignal einen Multiplexer treibt, der zwischen zwei Pfaden auswählt. Im einfachsten Fall schaltet man einfach 2 Inverter mehr dazu, wodurch sich etwas die Frequenz senkt. Je nach Technologie sind 4 Inverter besser, da dies einen deutlicheren Frquenzhub zur Folge hat. Entscheidend ist bei der Methode auch, dass durch das Umschalten ein Phasensprung erzeugt wird. Sollte der Oszillator begonnen haben, sich auf ein Ereignis zu synchronisieren, wird die massgebliche Taktflanke dadurch sofort wieder auf einen anderen Punkt gesetzt.&lt;br /&gt;
&lt;br /&gt;
===selbstdesynchronisierende Ringoszillatoren===&lt;br /&gt;
Eine Erweiterung der Lösung von oben ist es nun, die Zeitpunkte der Umschaltung ebenfalls zufällig bestimmen zu lassen. Dies geschieht am einfachsten durch einen ähnlich aufgebauten Gegenpart, der seinerseits wieder zufällig gesteuert wird. Im ersten Schritt entsteht der nachfolgend beschriebene 2fach- gekoppelte OSC. Mit drei deratig ringförmig verketteten, selbstschwingenden Oszillatoren bekommt man ein nahezu zufälliges Verhalten der Phase, da sich immer einer der Oszillatoren im Einschwingvorgang befindet und sich sein Beitrag zum Exor stark verschiebt, sodass auch in der lokalen Betrachtung keine sichtbaren Interferenzmuster mehr auftreten.&lt;br /&gt;
&lt;br /&gt;
==Realisationsvorschlag==&lt;br /&gt;
Hier eine konkrete Lösung mit 2 gekoppelten Oszillatoren:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Js-Vhdl-noise-bit-generator-schematic.gif]]&lt;br /&gt;
&lt;br /&gt;
Jeder der beiden OSC wird über eine Inverterkette mit einer insgesamt ungeraden Anzahl von Invertern gebildet, wobei die geradzahligen Inverterstufen ein delay bilden. Die Rückführung erfolgt über einen Multiplexer, welcher umschaltbar ist. So liegen beispielsweise einmal 7 und einmal 9 inverter in der Kette, bei dem anderen z.B. 11 oder 13.&lt;br /&gt;
&lt;br /&gt;
Jeder der beiden Oszillatoren treibt einen eigenen Zähler an, der bis 13 bzw. 27 zählt. Das jeweilige höchste Bit des Zählers wird zum Umschalten der Kettenlänge des anderen Oszillators benutzt. Durch die asymmetrische Verteilung 8/13 zu 5/13 bzw. 16/27 zu 11/27 wird erreicht, dass es eine längere und eine kürzere Phase gibt. Während der längeren Phase schaltet man die niedrigere Frequenz, während der längeren die höhere Frequenz. Damit ergibt sich für die Kettenlänge die Folge:&lt;br /&gt;
&lt;br /&gt;
OSC1 : ...7.7.7.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.7.7.7.7.7.7.7.7.7.7.7.9.9.9.9.....&lt;br /&gt;
&lt;br /&gt;
OSC2 : ....13.13.11.11.11.11.11.11.11.11.13.13.13.13.13.11.11.11.11.11.11.11.11.13.13...&lt;br /&gt;
&lt;br /&gt;
Oszillator 1 darf also abwechselnd eine längere Periode mit der etwas niedrigeren Frequenz schwingen und danach eine kürzere Periode mit der höheren. Irgendwann dazwischen schaltet er die Frequenz des zweiten um. Da sich der andere ebenso verhält, ergeben sich grob 4 Frequenzkombinationen, die unterschiedlich und veränderlich überlappen. Durch die langen Phasen von mindestens &amp;gt;5 Takten ist sichergestellt, dass auch bei schnellen Technologien der jeweilige OSC wieder anschwingt, falls beim Umschalten mitten in einen Zustandswechsel gesprungen wurde. Genau dies verschiebt die Phasen immer wieder sehr zufällig, sodass die Frequenz nicht lange stabil ist und sich die Oszillatoren auf nicht auf Umgebungseinflüsse synchronisieren können. Die Ausgänge werden mit Exor gemischt, wodurch bei einer Abtastung durch eine andere Domain noch bis zu 5-10 MHz vollkommen zufällige Bits entstehen.&lt;br /&gt;
&lt;br /&gt;
===Realisation für Consumerqualität===&lt;br /&gt;
16Bit-Rauschwerte bekommt man gemäß der Methode oben dann mit etwa 500kHz, in dem man kontinuierlich samplet und die Werte in SR schiebt. Für meine Audioworkstation benutze ich eine Abtastrate von ~4,5MHz und generiere daraus 24 Bit-Werte mit 192kHz Samplefrequenz. Muster im Bereich der Audiofrequenzen sind im Spektrum nicht erkennbar.&lt;br /&gt;
&lt;br /&gt;
Anfänglich hatte ich auch noch mehrere Generatoren parallel aufgebaut und die 24 Bit-Werte gemischt, fand aber keine Verbesserung mehr.  Allerdings hatte ich teilweise den Fall, dass statistisch mehr Nullen rauskamen (53%:47%). Ich habe dann einfach zwei ähnliche Generatoren aufgebaut (andere Kettenlängen) und einen Kanal invers zugemischt. Für meine Zwecke reicht das jetzt vollkommen aus. Für messtechnische Zwecke müsste man es näher untersuchen. Wenn man irgendwelche Rauschquellen mischen möchte, sollte man eine Extraquelle aufbauen, statt die erste mit anzuzapfen, es sei denn, dies ist signalverarbeitungstechnisch notwenig. Bei den Tongeneration von Schlagzeugklängen bekam ich vereinzelt seltsame metallisch klingende Auslöschungen, wenn zwei Instrumente (per Filter erzeugt) gleichzeitig erklangen. Einfache Abhilfe schafft ein Bitvertauscher.&lt;br /&gt;
&lt;br /&gt;
===Realisation für Messtechnik===&lt;br /&gt;
Für messtechnische Applikationen sollte man genügend niedrig abtasten, z.B. 1/MHz/bit. Für jedes weitere bit bzw MHz kommt ein weiterer Generator hinzu, der anders parametriert ist. Das stellt platzmäßig nur ein geringes Problem dar, da je nach Realisation nur 50-100 Logikelemente benötigt werden. Die Rauschgeneratoren sollten an verschiedenen Stellen im FPGA sitzen und sich keine Logikzellen teilen -&amp;gt; FPGA-Editor für das mapping / constraints benutzen.&lt;br /&gt;
&lt;br /&gt;
Ein eventuelles 1:0-Verteilungsproblem sollte mit zwei komplementären Rauschquellen zu lösen sein, während man die Zuordnung der Rauschbits ebenfalls noch ändern kann, indem man einen weiteren Oszillator nutzt, der zyklisch Adressen generiert, die einen von mehreren Multiplexern mit wechselndem Bitmapping auswählt. Auch lassen sich mehrere Rauschgeneratoren überlagern, um die Auflösung zu erhöhen. wobei das Problem auftritt, dass Ergebnisse im mittleren Wertebereich dann wahrscheinlicher sind, als Werte am Rand. Will man das verhindern, sind die Werte immer über EXOR bitweise zu verknüpfen.&lt;br /&gt;
&lt;br /&gt;
====Bauvorschlag / Beispiel====&lt;br /&gt;
Ein array von 2x32 Rauschquellen (ca. 500 LEs) wird mit einem PLL-basierten Takt von 1MHz in 64 Registern asynchron eingelesen. Über einen 64:64-Bitvertauscher mit zufällig wechselndem Mapping werden diese zu zwei 32 2-Bit-Werten zusammengesetzt, die mit einem Exor und einem Inverter von einander subtrahiert / komplementär addiert werden. Die Ergebnisse gehen auf einen synchronen asymmetrischen 32:8-FiFo, der 8-bit Rauschwerte mit 4MHz produziert, die statistisch vollkommen gleichverteilt sind.&lt;br /&gt;
&lt;br /&gt;
==Einschätzung der Qualität==&lt;br /&gt;
===Simulation===&lt;br /&gt;
Bereits mit festen Werten für die Inverterverzögerungen, die ja real starken Zufällen unterworfen sind, produziert eine ModelSIM-Simulation für die 2fach-Lösung ein sehr komplexes Muster mit geringer Wiederholrate. In der Realität lässt sich ein entsprechender Jitter messen, der mehrere Perioden des abtastenden Taktes überstreicht.&lt;br /&gt;
&lt;br /&gt;
Mit einer analogen Simulation können minimale Änderungen des Schaltverhaltens untersucht werden. Variiert man z.B. die Steilheit nur eines Inverterausgangs eines Oszillators um 0,5% ergibt sich bereits nach wenigen Schwingungen ein qualitativ verändertes Bild, weil die Umschaltpunkte des anderen Oszillators ein wenig wandern, wodurch sich eine andere Phasenkonstellation ergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;2 Fälle verkoppelter Oszillatoren&amp;quot; widths=&amp;quot;600&amp;quot; heights=&amp;quot;300&amp;quot; perrow=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
Datei:Lut-based-oscillator-js.gif|;Die beiden blauen Oszillatoren variieren minimal, was anhand des sich ergebenden 2Bit Codes (Visualisierung der Zustandsfolge) = violette Kurve schon sichtbar wird. Der mit einem EXOR gebildete Signal-Wert (türkis), wird mit einem willkürlichen Takt im FPGA (rot) gesampelt, sodass der grüne Ausgangswert entsteht. Eine kleine Änderung im Verhalten eines Inverters bedingt bereits ein anderes Ausgangsmuster;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probleme der realen Schaltung ===&lt;br /&gt;
Leider ergibt sich das Problem, dass bei zusammenfallenden Flankenwechseln kein eindeutiges Signal am Ausgang des XOR-Gatters erzeug wird und das abtastende FF der Zieldomain einen Zwischenwert sieht. Aufgrund der nicht 100%-symmetrischen Schaltungstopologie in CMOS-Schaltungen liegt die Schaltschwelle für den FF-Eingang nicht auf dem 50%-Niveau, sodass mitunter ein Zustand (0 oder 1) bevorzugt wird und häufiger auftritt. Dieses Prblem lässt sich durch einen Twister lösen:&lt;br /&gt;
&lt;br /&gt;
==== Twister als Symmetierhilfe ====&lt;br /&gt;
&lt;br /&gt;
Durch Zuschaltung eines weiteren ca Faktor 8-16 langsamer laufenden Zufallsbitgenerators wird die Bedeutung eines Bits bei Zustand 1 invertiert, was durch ein weiteres XOR realisiert wird. Damit unterdrückt eine hohe Zahl von Einsen sich selbst. Die statistische Verteilung der Zahlen wird damit quasi umgeklappt. Angenommen, ein asymmetrischer Generator liefert zu 60% Einsen und nur 40% Nullen, so würde ein weiterer Generator derselben Art jeweils 60% der Bits invertieren. Es ergäben sich also:&lt;br /&gt;
&lt;br /&gt;
* 60% * 60% = 36% zu 0 (1 verändert)&lt;br /&gt;
* 40% * 60% = 24% zu 1 (0 verändert)&lt;br /&gt;
* 60% * 40% = 24% zu 1 (1 unverändert)&lt;br /&gt;
* 40% * 40% = 16% zu 0 (0 unverändert)&lt;br /&gt;
&lt;br /&gt;
im Ergebnis also 36%+16% = 52% Nullen und 48% Einsen und damit erheblich symmetrischer, als die Eingangsannahme. Der Twister hat sich in einem anderen Zusammenhang praktisch bereits vervorragend bewährt und eigenet sich auch für andere Formen von Zufallsgeneratoren.&lt;br /&gt;
&lt;br /&gt;
=== Messungen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;FFT-Analyse von 2 gekoppelten Oszillatoren&amp;quot; widths=&amp;quot;600&amp;quot; heights=&amp;quot;300&amp;quot; perrow=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
Datei:Vga-spectrum-analyzer-altera-fft-noise.jpg|;Das Bild (Screenshot) zeigt eine FFT-Analyse von künstlich erzeugtem 16Bit-Rauschen aus zwei gekoppelten Oszillatoren. Der blaue Bereich zeigt die spiegelsymmetische 1024 FFT bei 16Mhz. Links sind Min, Max, Mittelwert und Standardabweichung automatisch markiert. Der verkleinerte türkise Bereich zeigt die um Faktor 2 verkleinerten über 16 Messungen gemittelten Werte.;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tauglichkeit als Zufallszahlengenerator===&lt;br /&gt;
Die so erzeugten Zufallsbits reichen in aller der Regel bereits für gute Zufallszahlen aus, wie sie in Simulationen für technische Anwendungen benötigt werden. Sie entstehen durch einfaches Aneinanderreihen von mehreren Bits mit einem Schieberegister. &lt;br /&gt;
&lt;br /&gt;
==== Gleichverteilung ====&lt;br /&gt;
Das Aneinanderreihen von Bits bevorzugt keine Zahl. Theoretisch kommt jede Zahl mit derselben Häufigkeit vor. Ausnahmen sind wie oben beschrieben technologisch bedingt und durch den Symmetrierer zu verbessern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Verteilung der erzeugten Zahlen&amp;quot; widths=&amp;quot;600&amp;quot; heights=&amp;quot;300&amp;quot; perrow=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
Datei:Js-histogramm-rauschgenerator-verteilung.gif|;Die Grafik zeigt die Verteilung von Zahlen, die mit einem Rauschgenerator generiert wurden. Mit 8 zusammengehängten Bits werden Zahlen erzeugt und deren Häufung mitgezählt, wobei dieselbe Zahl innerhalb von 4096 &amp;quot;Würfen&amp;quot; schwerpunktmäßig etwa 10-40x vorkommt. Wird das Experiment fortgesetzt und weitersummiert, gleichen sich Unsymmetrien wieder etwas aus und die Kurve wird glatter. Bei 15000 Würfen beträgt die Dynamik zwischen seltenen und häufigen Zahlen ca. 60-120.  Die Varianz beträgt letzlich nach &amp;gt;250.000 Würfen noch etwa +/- 12%. Aus Platzgründen sind nur die ersten 128 Zahlen dargestellt.;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Normalverteilung ====&lt;br /&gt;
Durch das Addieren von Rauschwerten kommen Werte in der Mitte des Zahlenraums naturgemäß häufiger häufiger vor, weil es mehrere Kombinationsmöglichkeiten gibt, wie sie entstehen können. Werte am Randbereich sind sehr selten. &lt;br /&gt;
[[Datei:Js-histogramm-rauschgenerator-summe.gif]]&lt;br /&gt;
&lt;br /&gt;
Um den 8-Bit Zahlenraum abzudecken, wurde für den Rundungsfehler eine weitere Zahl addiert. Damit ist der Zahlenraum 0...255 darstellbar. Ansonsten wären nur 16x15 = 240 erreichbar.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Verteilungen====&lt;br /&gt;
Will man gezielte Verteilungen generieren und sicherstellen, dass Zahlen nach bestimmten Zeiten mindestens einmal auftreten, muss noch ein wenig mehr getan werden. Siehe [[Digitaler Zufallszahlengenerator in VHDL]].&lt;br /&gt;
&lt;br /&gt;
===Verbesserungsmöglichkeiten===&lt;br /&gt;
Um die Zufälligkeit weiter zu erhöhen, lässt sich die Schleife eines oder mehrerer Oszillatoren über externe Pins bilden, was zu starken Temperatur und Exemplarschwankungen führt. Dies ist vor allem bei der Nutzung nur eines Oszillators vorteilhaft. Allerdings reduziert sich dadurch die maximale Frequenz des Generators.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
&lt;br /&gt;
===Tauglichkeit als Rauschgenerator===&lt;br /&gt;
Aufgrund der echten Zufälligkeit der Werte können keine Aussagen über das Spektralverhalten gemacht werden, womit sich das System als nichtdeterministischer Rauschgenerator eignet. Im Test wurden keine bevorzugt erzeugten Frequenzen beobachtet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Anwendungen ==&lt;br /&gt;
=== Signalverarbeitung ===&lt;br /&gt;
Zufallszahlen werden oft als Startwerte für deterministische Zufallszahlengeneratoren verwendet. Solche Generatoren kommen z.B. bei der Codierung versteckter Signale zur Anwendung. Um sie aber praktisch auch nutzen zu können, müssen sie für die Verwendung als Codierhilfe beiden Stellen bekannt sein.&lt;br /&gt;
&lt;br /&gt;
=== Bildverarbeitung ===&lt;br /&gt;
Rauschgeneratoren werden in der Bildverarbeitung zur Verbesserung der Bildqualität eingesetzt, indem z.b. mittels der &amp;quot;salt and pepper&amp;quot;-Methode Kanten infolge von Abtastungsartefakten geglättet werden.&lt;br /&gt;
&lt;br /&gt;
=== Beiträge zum Thema ===&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/245078 Noisegenerator im FPGA]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/243241 Pseudozufallsgenerator mittels VHDL]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/191427 Rauschgenerator in VHDL]&lt;br /&gt;
&lt;br /&gt;
=== externe Weblinks ===&lt;br /&gt;
&lt;br /&gt;
* Wikipediaartikel Rauschgenerator: http://de.wikipedia.org/wiki/Rauschgenerator&lt;br /&gt;
* Wikipediaartikel Zufallszahlengenerator: http://de.wikipedia.org/wiki/Zufallszahlengenerator&lt;br /&gt;
* Patent bezüglich der EXOR-Verwendung 1999: https://www.google.ch/patents/DE19926640A1&lt;br /&gt;
* Weiteres Patent zur EXOR-Verwendung 1982: https://www.google.ch/patents/US5153532&lt;/div&gt;</summary>
		<author><name>87.178.97.251</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:Digitaler_Rauschgenerator_im_FPGA&amp;diff=97017</id>
		<title>Diskussion:Digitaler Rauschgenerator im FPGA</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:Digitaler_Rauschgenerator_im_FPGA&amp;diff=97017"/>
		<updated>2017-08-21T18:12:23Z</updated>

		<summary type="html">&lt;p&gt;87.178.97.251: /* Beispiel Codes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Beispiel Codes =&lt;br /&gt;
Gibt es dazu Beispiel Codes in VHDL oder Verilog?&lt;br /&gt;
&lt;br /&gt;
= Patent =&lt;br /&gt;
Ist das nun patentiert oder nicht?&lt;/div&gt;</summary>
		<author><name>87.178.97.251</name></author>
	</entry>
</feed>