www.mikrocontroller.net

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


Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,
AusdieMaus sollte eigentlich AUS sein ;-)

Autor: Dominik T. (dom) Benutzerseite
Datum:

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

Gruß,
Dominik

Autor: hansWurst (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uwe G. (gromit)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dominik T. (dom) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bertrik Sikken (bertrik)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.


Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Machs mit nem Timerinterrupt und ner logarithmischen Tabelle:


Beitrag "PWM-Lauflicht"


Peter

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Winfried (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber nicht zur empfundenen Helligkeit. Leider ist der Mensch nicht 
linear :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.