<?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=84.167.173.75</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=84.167.173.75"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/84.167.173.75"/>
	<updated>2026-04-13T12:02:30Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=LED-Fading&amp;diff=66681</id>
		<title>LED-Fading</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=LED-Fading&amp;diff=66681"/>
		<updated>2012-06-05T12:28:09Z</updated>

		<summary type="html">&lt;p&gt;84.167.173.75: /* FAQ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Das Problem ==&lt;br /&gt;
&lt;br /&gt;
Die Aufgabe klingt eigentlich recht einfach. Eine [[LED]] soll mittels [[PWM]] in ihrer Helligkeit gesteuert werden. Und weils so schön ist, möchte man sie geheimnisvoll aufleuchten lassen, sprich langsam heller und dunkler werden lassen. Der Fachmann nennt das Fading. Das Problem zeigt sich allerdings recht schnell. Wenn man eine 8-Bit PWM linear zwischen 0..255 laufen lässt, dann scheint die LED nicht linear gedimmt zu werden. Sie wird relativ schnell hell und bleibt lange hell.&lt;br /&gt;
&lt;br /&gt;
== Die Erklärung ==&lt;br /&gt;
&lt;br /&gt;
Des Rätsels Lösung liegt in der Kennline des menschlichen Auges. Diese ist nichtlinear, genauer gesagt: sie ist nahezu logarithmisch. Das ermöglicht die Wahrnehmung eines sehr großen Helligkeitsbereichs, angefangen von Vollmond mit ~1/4 [http://de.wikipedia.org/wiki/Lux_%28Einheit%29 Lux] über eine normale Schreibtischbeleuchtung mit ca. 750 Lux bis zu einem hellen Sommertag mit bis zu 100.000 Lux. Solche hochdynamischen Signale sind nur mit einer logarithmischen Kennlinie in den Griff zu kriegen, auch von Mutter Natur und Erfinder Papa.&lt;br /&gt;
&lt;br /&gt;
=== Die Kennlinie des Auges genau betrachtet ===&lt;br /&gt;
&lt;br /&gt;
Die Kennlinie des menschlichen Auges ist annähernd logarithmisch. Das wurde vor langer Zeit durch das [http://de.wikipedia.org/wiki/Weber-Fechner-Gesetz Weber-Fechner-Gesetz] beschrieben. Genauere Untersuchungen zur [http://de.wikipedia.org/wiki/Gammakorrektur Gammakorrektur] führten jedoch zur [http://de.wikipedia.org/wiki/Stevenssche_Potenzfunktion Stevenschen Potenzfunktion]. Diese beschreibt das menschliche Auge etwas besser. (s. auch [[Talk:LED-Fading#Diskussion wissenschaftl.-technischer Hintergrund|Diskussionsseite]]). Die Unterschiede sind jedoch marginal.&lt;br /&gt;
&lt;br /&gt;
Praktisch heißt das, daß wir unserem Auge große physikalische Helligkeitsunterschiede präsentieren müssen, damit es das als lineare Helligkeitsteigerung erkennt. Etwas wissenschaftlicher formuliert heißt das, wir müssen durch Verkettung der logarithmischen Kennlinie des Auges mit einer exponentiellen Kennlinie eine physiologisch lineare Helligkeitsverteilung erzielen.&lt;br /&gt;
&lt;br /&gt;
Berechnet werden kann eine passende Tabelle beispielsweise mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;y=\frac{b^{\frac{x}{r_x}}-1}{b-1}\cdot r_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei sind x und y die Ein-, bzw. Ausgabewerte der Funktion, jeweils im Bereich von 0 bis r-1. b ist die Basis der Exponentialfunktion und bestimmt, wann und wie stark die Kurve ansteigen soll. Hier ist etwas ausprobieren erforderlich, gute Ergebnisse liefern Werte im Bereich 10-100.&lt;br /&gt;
&lt;br /&gt;
== Das Demoprogramm ==&lt;br /&gt;
&lt;br /&gt;
Das wird in dem unten gezeigten Beispielprogramm gemacht. Dabei wird die Wirkung verschiedener PWM-Auflösungen demonstriert. Eine 8-Bit PWM wird mit 4/8/16 und 32 nichtlinearen Stufen betrieben, welche über eine Exponentialfunktion berechnet wurden. Dazu dient die [[media:pwm_table.zip|Exceltabelle]] (Anmerkung: Bitte die Exceltabelle nochmal erklären, die Werte in der Tabelle stimmen nicht mit denen im Programm überein). Die einzelnen benachbarten Werte haben zueinander ein konstantes Verhältnis, das in der Exceltabelle als &#039;Factor&#039; berechnet wird. Ausserdem werden eine 10-Bit PWM mit 64 Stufen sowie, als die Königsklasse, eine 16-Bit PWM mit 256 Stufen betrieben.&lt;br /&gt;
&lt;br /&gt;
Das Programm ist ursprünglich auf einem [[AVR]] vom Typ &#039;&#039;&#039;ATmega32&#039;&#039;&#039; entwickelt und getestet. Aber es ist leicht auf jeden AVR portierbar, welcher eine PWM zur Verfügung hat. Der AVR muss mit etwa 8 MHz getaktet werden, egal ob mit internem Oszillator oder von aussen mit Quarz. Man muss nur noch eine LED mittels Vorwiderstand von ca. 1 kOhm an Pin PD5 anschliessen und los gehts. Es sollte hier noch erwähnt werden, dass das Programm mit eingeschalteter Optimierung compiliert werden muss, sonst stimmen die Zeiten der Warteschleifen nicht.&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung der LEDs auf dem STK500 bzw. bei der Verwendung von invertierenden Treiberstufen ist das &amp;quot;#define STK500 false&amp;quot; durch &amp;quot;#define STK500 true&amp;quot; zu ersetzen.&lt;br /&gt;
&lt;br /&gt;
Das Programm durchläuft alle 6 PWMs und lässt dabei die LED jeweils 3 mal glimmen. Mit 4 Schritten Auflösung ist das natürlich ruckelig, mit 8 schon wesentlich besser. Mit 16 Stufen sieht man bei langsamen Änderungen noch Stufen, dreht man die Ein- und Ausblendzeiten runter ist der Übergang schon recht flüssig. Die 8-Bit PWM mit 32 Stufen unterscheidet sich praktisch nicht von der 10-Bit PWM mit 64 Stufen, es sei denn, man macht extrem langsame Einblendungen. Hier schlägt die Stunde der 16-Bit PWM. Diese wird bewußt sehr langsam ausgeführt um zu demonstrieren, daß hiermit praktisch keine Stufen mehr sichtbar sind, egal wie langsam gedimmt wird. Wie man auch sieht sind die drei höherauflösenden PWMs im unteren Bereich an ihrer Auflösungsgrenze, da einige PWM-Werte mehrfach vorkommen. Da heißt gleichzeitig, daß eine Steigerung der Stufenanzahl relativ sinnlos ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//*****************************************************************************&lt;br /&gt;
//*&lt;br /&gt;
//*  LED fading test&lt;br /&gt;
//*  uses exponential PWM settings to achive visual linear brightness&lt;br /&gt;
//*&lt;br /&gt;
//*  ATmega32 @ 8 MHz&lt;br /&gt;
//*  &lt;br /&gt;
//*                  &lt;br /&gt;
//*****************************************************************************&lt;br /&gt;
&lt;br /&gt;
#define F_CPU 8000000L&lt;br /&gt;
&lt;br /&gt;
#define true 1&lt;br /&gt;
#define false 0&lt;br /&gt;
&lt;br /&gt;
#define STK500 false&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// global variables&lt;br /&gt;
&lt;br /&gt;
uint16_t pwmtable_8A[4]   PROGMEM = {0, 16, 64, 255};&lt;br /&gt;
uint16_t pwmtable_8B[8]   PROGMEM = {0, 4,  8, 16, 32, 64,  128, 255};&lt;br /&gt;
uint16_t pwmtable_8C[16]  PROGMEM = {0, 2, 3, 4, 6, 8, 11, 16, 23, 32, 45, 64,&lt;br /&gt;
                                    90, 128, 181, 255};&lt;br /&gt;
uint16_t pwmtable_8D[32]  PROGMEM = {0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11,&lt;br /&gt;
                                    13, 16, 19, 23, 27, 32, 38, 45, 54, 64, 76,&lt;br /&gt;
                                    91, 108, 128, 152, 181, 215, 255};&lt;br /&gt;
&lt;br /&gt;
uint16_t pwmtable_10[64]  PROGMEM = {0, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5,&lt;br /&gt;
                                    5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17,&lt;br /&gt;
                                    19, 21, 23, 26, 29, 32, 36, 40, 44, 49, 55,&lt;br /&gt;
                                    61, 68, 76, 85, 94, 105, 117, 131, 146, 162,&lt;br /&gt;
                                    181, 202, 225, 250, 279, 311, 346, 386, 430,&lt;br /&gt;
                                    479, 534, 595, 663, 739, 824, 918, 1023};&lt;br /&gt;
&lt;br /&gt;
uint16_t pwmtable_16[256] PROGMEM = {0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,&lt;br /&gt;
                                     2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,&lt;br /&gt;
                                     4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6,&lt;br /&gt;
                                     6, 7, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11,&lt;br /&gt;
                                     11, 12, 12, 13, 13, 14, 15, 15, 16, 17, 17,&lt;br /&gt;
                                     18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,&lt;br /&gt;
                                     29, 31, 32, 33, 35, 36, 38, 40, 41, 43, 45,&lt;br /&gt;
                                     47, 49, 52, 54, 56, 59, 61, 64, 67, 70, 73,&lt;br /&gt;
                                     76, 79, 83, 87, 91, 95, 99, 103, 108, 112,&lt;br /&gt;
                                     117, 123, 128, 134, 140, 146, 152, 159, 166,&lt;br /&gt;
                                     173, 181, 189, 197, 206, 215, 225, 235, 245,&lt;br /&gt;
                                     256, 267, 279, 292, 304, 318, 332, 347, 362,&lt;br /&gt;
                                     378, 395, 412, 431, 450, 470, 490, 512, 535,&lt;br /&gt;
                                     558, 583, 609, 636, 664, 693, 724, 756, 790,&lt;br /&gt;
                                     825, 861, 899, 939, 981, 1024, 1069, 1117,&lt;br /&gt;
                                     1166, 1218, 1272, 1328, 1387, 1448, 1512,&lt;br /&gt;
                                     1579, 1649, 1722, 1798, 1878, 1961, 2048,&lt;br /&gt;
                                     2139, 2233, 2332, 2435, 2543, 2656, 2773,&lt;br /&gt;
                                     2896, 3025, 3158, 3298, 3444, 3597, 3756,&lt;br /&gt;
                                     3922, 4096, 4277, 4467, 4664, 4871, 5087,&lt;br /&gt;
                                     5312, 5547, 5793, 6049, 6317, 6596, 6889,&lt;br /&gt;
                                     7194, 7512, 7845, 8192, 8555, 8933, 9329,&lt;br /&gt;
                                     9742, 10173, 10624, 11094, 11585, 12098,&lt;br /&gt;
                                     12634, 13193, 13777, 14387, 15024, 15689,&lt;br /&gt;
                                     16384, 17109, 17867, 18658, 19484, 20346,&lt;br /&gt;
                                     21247, 22188, 23170, 24196, 25267, 26386,&lt;br /&gt;
                                     27554, 28774, 30048, 31378, 32768, 34218,&lt;br /&gt;
                                     35733, 37315, 38967, 40693, 42494, 44376,&lt;br /&gt;
                                     46340, 48392, 50534, 52772, 55108, 57548,&lt;br /&gt;
                                     60096, 62757, 65535};&lt;br /&gt;
&lt;br /&gt;
// long delays&lt;br /&gt;
&lt;br /&gt;
void my_delay(uint16_t milliseconds) {&lt;br /&gt;
    for(; milliseconds&amp;gt;0; milliseconds--) _delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// 8-Bit PWM with only 4 different settings&lt;br /&gt;
&lt;br /&gt;
void pwm_8_4(uint16_t delay){&lt;br /&gt;
&lt;br /&gt;
    int16_t tmp;&lt;br /&gt;
&lt;br /&gt;
#if STK500&lt;br /&gt;
    TCCR1A = 0xC1;          // inverted PWM on OC1A, 8 Bit Fast PWM&lt;br /&gt;
#else&lt;br /&gt;
    TCCR1A = 0x81;          // non-inverted PWM on OC1A, 8 Bit Fast PWM&lt;br /&gt;
#endif&lt;br /&gt;
    TCCR1B = 0x08;&lt;br /&gt;
&lt;br /&gt;
    TCCR1B &amp;amp;= ~0x7;         // clear clk setting&lt;br /&gt;
    TCCR1B |= 4;            // precaler 256 -&amp;gt; ~122 Hz PWM frequency&lt;br /&gt;
&lt;br /&gt;
    for(tmp=0; tmp&amp;lt;=3; tmp++){&lt;br /&gt;
      OCR1A =  pgm_read_word(pwmtable_8A+tmp);&lt;br /&gt;
      my_delay(delay);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for(tmp=3; tmp&amp;gt;=0; tmp--){&lt;br /&gt;
      OCR1A = pgm_read_word(pwmtable_8A+tmp);&lt;br /&gt;
      my_delay(delay);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// 8-Bit PWM with 8 different settings&lt;br /&gt;
&lt;br /&gt;
void pwm_8_8(uint16_t delay){&lt;br /&gt;
&lt;br /&gt;
    int16_t tmp;&lt;br /&gt;
&lt;br /&gt;
#if STK500&lt;br /&gt;
    TCCR1A = 0xC1;          // inverted PWM on OC1A, 8 Bit Fast PWM&lt;br /&gt;
#else&lt;br /&gt;
    TCCR1A = 0x81;          // non-inverted PWM on OC1A, 8 Bit Fast PWM&lt;br /&gt;
#endif&lt;br /&gt;
    TCCR1B = 0x08;&lt;br /&gt;
&lt;br /&gt;
    TCCR1B &amp;amp;= ~0x7;         // clear clk setting&lt;br /&gt;
    TCCR1B |= 4;            // precaler 256 -&amp;gt; ~122 Hz PWM frequency&lt;br /&gt;
&lt;br /&gt;
    for(tmp=0; tmp&amp;lt;=7; tmp++){&lt;br /&gt;
      OCR1A = pgm_read_word(pwmtable_8B+tmp);&lt;br /&gt;
      my_delay(delay);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    for(tmp=7; tmp&amp;gt;=0; tmp--){&lt;br /&gt;
      OCR1A = pgm_read_word(pwmtable_8B+tmp);&lt;br /&gt;
      my_delay(delay);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// 8-Bit PWM with 16 different settings&lt;br /&gt;
&lt;br /&gt;
void pwm_8_16(uint16_t delay){&lt;br /&gt;
&lt;br /&gt;
    int16_t tmp;&lt;br /&gt;
&lt;br /&gt;
#if STK500&lt;br /&gt;
    TCCR1A = 0xC1;          // inverted PWM on OC1A, 8 Bit Fast PWM&lt;br /&gt;
#else&lt;br /&gt;
    TCCR1A = 0x81;          // non-inverted PWM on OC1A, 8 Bit Fast PWM&lt;br /&gt;
#endif&lt;br /&gt;
    TCCR1B = 0x08;&lt;br /&gt;
&lt;br /&gt;
    TCCR1B &amp;amp;= ~0x7;         // clear clk setting&lt;br /&gt;
    TCCR1B |= 4;            // precaler 256 -&amp;gt; ~122 Hz PWM frequency&lt;br /&gt;
&lt;br /&gt;
    for(tmp=0; tmp&amp;lt;=15; tmp++){&lt;br /&gt;
      OCR1A = pgm_read_word(pwmtable_8C+tmp);&lt;br /&gt;
      my_delay(delay);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for(tmp=15; tmp&amp;gt;=0; tmp--){&lt;br /&gt;
      OCR1A = pgm_read_word(pwmtable_8C+tmp);&lt;br /&gt;
      my_delay(delay);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// 8-Bit PWM with 32 different settings&lt;br /&gt;
&lt;br /&gt;
void pwm_8_32(uint16_t delay){&lt;br /&gt;
&lt;br /&gt;
    int16_t tmp;&lt;br /&gt;
&lt;br /&gt;
#if STK500&lt;br /&gt;
    TCCR1A = 0xC1;          // inverted PWM on OC1A, 8 Bit Fast PWM&lt;br /&gt;
#else&lt;br /&gt;
    TCCR1A = 0x81;          // non-inverted PWM on OC1A, 8 Bit Fast PWM&lt;br /&gt;
#endif&lt;br /&gt;
    TCCR1B = 0x08;&lt;br /&gt;
&lt;br /&gt;
    TCCR1B &amp;amp;= ~0x7;         // clear clk setting&lt;br /&gt;
    TCCR1B |= 4;            // precaler 256 -&amp;gt; ~122 Hz PWM frequency &lt;br /&gt;
&lt;br /&gt;
    for(tmp=0; tmp&amp;lt;=31; tmp++){&lt;br /&gt;
      OCR1A = pgm_read_word(pwmtable_8D+tmp);&lt;br /&gt;
      my_delay(delay);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for(tmp=31; tmp&amp;gt;=0; tmp--){&lt;br /&gt;
      OCR1A = pgm_read_word(pwmtable_8D+tmp);&lt;br /&gt;
      my_delay(delay);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// 10-Bit PWM with 64 different settings&lt;br /&gt;
&lt;br /&gt;
void pwm_10_64(uint16_t delay){&lt;br /&gt;
&lt;br /&gt;
    int16_t tmp;&lt;br /&gt;
&lt;br /&gt;
#if STK500&lt;br /&gt;
    TCCR1A = 0xC3;          // inverted PWM on OC1A, 10 Bit Fast PWM&lt;br /&gt;
#else&lt;br /&gt;
    TCCR1A = 0x83;          // non-inverted PWM on OC1A, 10 Bit Fast PWM&lt;br /&gt;
#endif&lt;br /&gt;
    TCCR1B = 0x08;&lt;br /&gt;
&lt;br /&gt;
    TCCR1B &amp;amp;= ~0x7;         // clear clk setting&lt;br /&gt;
    TCCR1B |= 3;            // precaler 64 -&amp;gt; ~122 Hz PWM frequency&lt;br /&gt;
&lt;br /&gt;
    for(tmp=0; tmp&amp;lt;=63; tmp++){&lt;br /&gt;
      OCR1A = pgm_read_word(pwmtable_10+tmp);&lt;br /&gt;
      my_delay(delay);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for(tmp=63; tmp&amp;gt;=0; tmp--){&lt;br /&gt;
      OCR1A = pgm_read_word(pwmtable_10+tmp);&lt;br /&gt;
      my_delay(delay);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// 16-Bit PWM with 256 different settings&lt;br /&gt;
&lt;br /&gt;
void pwm_16_256(uint16_t delay){&lt;br /&gt;
&lt;br /&gt;
    int16_t tmp;&lt;br /&gt;
&lt;br /&gt;
#if STK500&lt;br /&gt;
    TCCR1A = 0xC2;          // inverted PWM on OC1A, 16 Bit Fast PWM&lt;br /&gt;
#else&lt;br /&gt;
    TCCR1A = 0x82;          // non-inverted PWM on OC1A, 16 Bit Fast PWM&lt;br /&gt;
#endif&lt;br /&gt;
    TCCR1B = 0x18;&lt;br /&gt;
    ICR1 = 0xFFFF;          // TOP for PWM, full 16 Bit&lt;br /&gt;
&lt;br /&gt;
    TCCR1B &amp;amp;= ~0x7;         // clear clk setting&lt;br /&gt;
    TCCR1B |= 1;            // precaler 1 -&amp;gt; ~122 Hz PWM frequency&lt;br /&gt;
&lt;br /&gt;
    for(tmp=0; tmp&amp;lt;=255; tmp++){&lt;br /&gt;
      OCR1A = pgm_read_word(pwmtable_16+tmp);&lt;br /&gt;
      my_delay(delay);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for(tmp=255; tmp&amp;gt;=0; tmp--){&lt;br /&gt;
      OCR1A = pgm_read_word(pwmtable_16+tmp);&lt;br /&gt;
      my_delay(delay);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    int16_t i;&lt;br /&gt;
    int16_t step_time=400;      // delay in millisecond for one fading step&lt;br /&gt;
&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;PD5);           // LED uses OC1A&lt;br /&gt;
&lt;br /&gt;
    // test all fading routines&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
&lt;br /&gt;
      for(i=0; i&amp;lt;3; i++) pwm_8_4(step_time);&lt;br /&gt;
      my_delay(1000);&lt;br /&gt;
      for(i=0; i&amp;lt;3; i++) pwm_8_8(step_time/2);&lt;br /&gt;
      my_delay(1000);    &lt;br /&gt;
      for(i=0; i&amp;lt;3; i++) pwm_8_16(step_time/4);&lt;br /&gt;
      my_delay(1000);&lt;br /&gt;
      for(i=0; i&amp;lt;3; i++) pwm_8_32(step_time/8);&lt;br /&gt;
      my_delay(1000);&lt;br /&gt;
      for(i=0; i&amp;lt;3; i++) pwm_10_64(step_time/16);&lt;br /&gt;
      my_delay(1000);&lt;br /&gt;
      for(i=0; i&amp;lt;3; i++) pwm_16_256(step_time/16);&lt;br /&gt;
      my_delay(1000);&lt;br /&gt;
&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
&lt;br /&gt;
=== Wieso geht die LED nie ganz aus? ===&lt;br /&gt;
&lt;br /&gt;
Es ist normal, dass die LED selbst bei OCR1A = 0 immer noch ganz schwach leuchtet. Die Hardware PWM funktioniert so, dass bei einem Timerwert von 0 auf jeden Fall der Ausgang ein geschaltet wird. Danach kommt der Compare Match bei 0 und schaltet gleich wieder aus. Daher ist der Ausgang für einen [[PWM]]-Takt eingeschaltet. Um das zu ändern muss man entweder invertierte PWM nutzen, dann ist allerdings der Ausgang nie zu 100% High, sondern hat immer einen Takt Low beim maximalem PWM-Wert. Oder man schaltet bei 0 einfach die PWM-Funktion ab und und setzt den Ausgang normal auf Low. [http://www.mikrocontroller.net/topic/200173#1965686].&lt;br /&gt;
&lt;br /&gt;
=== Wieso dimmt man eine LED nicht besser mit einer variablen Stromquelle? ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Wieso flimmern LEDs bei Autorücklichtern? Wieso werden diese nicht mit Stromquellen betrieben? ===&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[PWM]]&lt;br /&gt;
* [[AVR-GCC-Tutorial#PWM (Pulsweitenmodulation)|AVR-GCC-Tutorial: PWM]]&lt;br /&gt;
* [[Soft-PWM]] - optimierte Software-PWM in C&lt;br /&gt;
* [http://www.b-kainka.de/bastel108.htm Eine LED weich blinken lassen ohne Mikrocontroller]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Projekte]]&lt;br /&gt;
[[Category:Displays und Anzeigen]]&lt;/div&gt;</summary>
		<author><name>84.167.173.75</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=LED&amp;diff=66674</id>
		<title>LED</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=LED&amp;diff=66674"/>
		<updated>2012-06-05T12:02:18Z</updated>

		<summary type="html">&lt;p&gt;84.167.173.75: /* Vorwiderstand */&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. InGaN oder GaN erforderlich. 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 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;
== Durchlassspannung ==&lt;br /&gt;
&lt;br /&gt;
LEDs haben im Vergleich zu gewöhnlichen [[Diode|Dioden]] eine vergleichsweise hohe, vom Halbleitermaterial abhängige [[Durchlass-Spannung]]. Bevor diese erreicht wird, fließt nur sehr wenig Strom und die LED leuchtet fast nicht. Oberhalb der Durchlassspannung (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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! Farbe || typ. Flußspannung [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;
| Weiss || 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. Typische Maximalwerte liegen abhängig von der LED z.&amp;amp;nbsp;B. bei 2 mA (low current) oder 20 mA. Genaue Angaben dazu finden sich in entsprechenden Datenblättern.&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;
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;
:&amp;lt;math&amp;gt;RV=\frac{Vcc-U_\text{LED}}{I_\text{LED}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* RV: 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;
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_{RV} = (Vcc-U_\text{LED}) \cdot I_\text{LED} = I_\text{LED}^2 \cdot RV&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;
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 verlässt.&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;
=== Betriebsstrom ===&lt;br /&gt;
&lt;br /&gt;
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;
== 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 Diodekennlinie, welche bewirkt, dass eine kleine Spannungsänderung eine grosse 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 verschiedender 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;
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.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Tutorial: IO-Grundlagen#Hardware]]&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 fuer Power LED]]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/goto_post/1553359 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;
&lt;br /&gt;
== Weblinks ==&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;
&lt;br /&gt;
[[Category:Bauteile]]&lt;br /&gt;
[[Category:Grundlagen]]&lt;br /&gt;
[[Category:Displays und Anzeigen| ]]&lt;/div&gt;</summary>
		<author><name>84.167.173.75</name></author>
	</entry>
</feed>