Forum: Mikrocontroller und Digitale Elektronik Einfache Software PWM für LEDs?


von Bernd (Gast)


Lesenswert?

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

von Bernd (Gast)


Lesenswert?

Moin,
AusdieMaus sollte eigentlich AUS sein ;-)

von Dominik T. (dom) Benutzerseite


Lesenswert?

Warum keine Hardware-PWM? So verbrätst du doch nur die CPU Zeit.

Gruß,
Dominik

von hansWurst (Gast)


Lesenswert?

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

von Uwe G. (gromit)


Lesenswert?

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.

von Bernd (Gast)


Lesenswert?

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

von Dominik T. (dom) Benutzerseite


Lesenswert?

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

von Bertrik S. (bertrik)


Lesenswert?

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.

von Karl heinz B. (kbucheg)


Lesenswert?

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.


von Peter D. (peda)


Lesenswert?

Machs mit nem Timerinterrupt und ner logarithmischen Tabelle:


Beitrag "PWM-Lauflicht"


Peter

von Falk (Gast)


Lesenswert?

@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

von Winfried (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.