Moin, Ich möchte mine LEDs an einem Atmega16 von Hell auf Dunkel und umgekehrt "Faden" lassen. Ein Sanftes Ein und Aussschalten also. Ich dachte ich mache das einfach wie folgt: An= 0.001 Aus = 5 For S = 1 to 5000 Toggle Porta Toggle Portb Toggle Portc Toggle Portd Waitms AusdieMaus Toggle Porta Toggle Portb Toggle Portc Toggle Portd Waitms An An = An + 0.001 Aus = Aus - 0.001 Next S Das Programm schaltet die LED anfangs 0.001 Sekunden An, dann 5ms Aus. Die LED leuchtet daher nur schwach. Jetzt soll er in der For Schleife jedes Mal die An-Zeit erhöhen und gleichzeitig die Aus Zeit verringern. Nach den 5000 Schelifen müsste die LED daher Heller leuchten. Tut sie aber nicht :-( Stattdessen leuchten sie Nach wie vor eine kurze Zeit Dunkel, bis die 5000 Schleifen durchgelaufen sind. Variablen hab ich als "Long" Deklariert. WaitUs wäre überings bessser, allerdings kann man bei Bascom für WaitUs nur Konstanten einsetzen (Weiß der Geier warum) Gruss Alex Gruss alex
Warum keine Hardware-PWM? So verbrätst du doch nur die CPU Zeit. Gruß, Dominik
hallo die lichtstärke ist nicht proportional zur spannung sondern proportional zum strom (http://www.elektronik-kompendium.de/sites/bau/0201111.htm). strom und spannung haben bei dioden einen exponentiellen zusammenhang, daher gilt: pwm[%] != lichtstärke[%] lg
Hallo Alex Du kannst bei Bascom nur Konstanten für WaitUs einsetzen, weil Mikrosekunden eine sehr kurze Zeit sind (1 millionstel Sekunde) und der Prozessor den Wert bereits fix in den Code einbaut. Wenn er erst den Wert aus dem SRAM nachschlagen muss vergeht zuviel Zeit für diesen Overhead. Ich bin wie Dominik der Meinung, eine Hardware-PWM ist praktischer für diesen Zweck. Auch wenn es Anfangs etwas schwieriger ist, mit Interrupts zu arbeiten, es wird dafür nacher um so einfacher. Beispiel: Das PWM-Verhältnis initalisierst du Anfangs so, dass die LED nicht leuchtet (0/100%). Du benutzt einen Interrupt der beim jedem Durchlauf des PWM ausgelöst wird. In dieser Routine veränderst Du Schrittweise das Tastverhältnis Richtung 100/0% wenn im Hauptprogramm LED=1 gültig ist. Weil der Interrupt bei jedem Durchlauf des PWM erfolgt, musst du nur ein bisschen ändern. Wenn das Tastverhältnis nach mehreren Interrupts auf 100/0% steht, leuchtet die LED voll. Wenn die Bedingung LED=0 gilt, ändert Du das Verhältnis wieder sanft zurück zu 0/100%. Wie Du siehst, muss im Hauptprogramm nur die Variable LED von 0 auf 1 und zurück geändert werden, und schon wird Deine LED wie von Geisterhand die Helligkeit ändern. Du musst etwas mit dem Prescaler des PWM spielen um eine flimmerfreie Dimmung zu erreichen. Falls die Änderung der Helligkeit zu trotz dem zu schnell ist, wird es evtl. nötig sein, in der Interruptroutine nur alle paar mal das Verhältnis zu ändern. Hoffe etwas geholfen zu haben.
Moin, Das Problem bei der Hardware PWM ist, dass ich diese nur an wenigen Pots nutzen kann. Ich muss aber 24 LEDs an 24 Ports Dimmen! Trotzdem Danke schoneimal Alex
Hallo Bernd, 24 LEDs dimmen ist nicht ohne! In wievielen Stufen möchtest du die denn dimmen? Um die Verwendung von Timer-Interrupts kommst du hier nicht drum rum. Gruß, Dominik
How about the following simple software PWM method: Create a function that does the following: * Increase a counter by 1. If it reaches 256, reset it back to 0. * For each led: if the counter is smaller than the LED's pwm value (0-255 = 0%-100% on), switch the LED on, otherwise switch it off. You need to run the function above at regular intervals, for example in a timer interrupt. In that case, the main loop can change the LED's pwm values and the interrupt function will make it happen.
Die anderen haben es schon gesagt: Eine Hardware PWM wäre besser. Aber wenn es dir ums lernen geht: So daneben ist dein Gedankengang nicht. > Stattdessen leuchten sie Nach wie vor eine kurze Zeit Dunkel, > bis die 5000 Schleifen durchgelaufen sind. > Variablen hab ich als "Long" Deklariert. Long: Das sind ganze Zahlen. Das bleiben auch ganze Zahlen, egal was du mit ihnen machst. Insbesonder ist 0 + 0.0001 wieder 0, weil wie gesagt: Ganze Zahl ist ganze Zahl.
@hansWurst > strom und spannung haben bei dioden einen exponentiellen zusammenhang, > daher gilt: pwm[%] != lichtstärke[%] So ein Quark. Wenn die LED wie üblich mit Konstantstrom betrieben wird ist das PWM Tastverhältnis wunderbar proportional zur Helligkeit. MFG Falk
Aber nicht zur empfundenen Helligkeit. Leider ist der Mensch nicht linear :-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.