mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 10 Bit / 64 Stufen PWM für LED zu wenig


Autor: Maxim S. (maxim) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bastle an einer Moodlampe rum. Drei RGB-LEDs (Seoul P5) werden jeweils 
von einem Mega8@16MHz angesteuert. Das Programm zählt in zwei Registern 
von 0 bis 1023 hoch und aktiviert bei jedem Überlauf alle PWM-Pins (wenn 
Helligkeitswert ungleich Null). Eine andere Routine fragt ständig ab, ob 
der Zähler den zum Helligkeitswert entsprechenden Wert (abgelegt in 
einer Tabelle) erreicht hat und schaltet den passenden PWM-Pin ab. In 
der Tabelle steigt die Pulsweite exponentiell. Das funktioniert alles 
prima. Die drei Mega8 werden von einem Mega16 durch SPI mit 
Helligkeitswerten gespeißt. An den Mega16 sind auch alle Taster und der 
Drehencoder angeschlossen. (Ich weiß, dass die Mega8 hier ein Overkill 
sind ... aber die Hardware ist schon verlötet und daran ist nichts mehr 
zu ändern).

Jetzt gibt es einen Modus, in welchem die LEDs einer Sinuskurve folgend 
die Helligkeit ändern. Und genau hier stört mich diese relativ grobe 
Auflösung. Hätte nicht gedacht, dass 64 Stufen zu wenig sein könnten. 
Vielleicht könnte ich noch 128 Stufen rausquetschen, aber ab 12 Bit wird 
das Flimmern dann schon erkennbar. Könnte man das mit Spulen beseitigen?

Bevor ich jetzt anfange alles zu verändern, würde ich geren wissen, ob 
128 Stufen überhaupt eine deutliche Besserung gegenüber 64 wären. Welche 
Auflösung sollte man für eine Moodlampe nehmen? Hängt wahrscheinlich 
auch von der maximalen Helligkeit ab, oder?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für einen wirklich fließenden Übergang solltes es schon mindestens 8bit 
sein. Probiers mal aus: Zeige am PC einfach einen Farbbalken an, mit 
jeweils 64, 128 oder 256 Farben. Bei 64 Farben sieht man deutlich die 
Stufen (je nach Monitor natürlich unterschiedlich stark). Bei 256 auch 
noch wenn man genau sucht.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Maxim S. wrote:

> Jetzt gibt es einen Modus, in welchem die LEDs einer Sinuskurve folgend
> die Helligkeit ändern. Und genau hier stört mich diese relativ grobe
> Auflösung.

Der Fehler ist nicht die Auflösung, sondern die Sinusfunktion ansich.

Eine Sinusfunktion widerspricht völlig dem menschlichen 
Helligkeitsempfinden.
Gibt man einen Sinus auf eine LED, hat man zu Anfang einen sehr starken 
Anstieg des Helligkeitseindrucks und dann über weite Bereiche eine fast 
konstante Helligkeit.

Ein Erhöhung der Auflösung nützt also genau 0,nix.


Peter

Autor: Manfred Schön (mandinice)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallöchen

Ich habe vor kurzem auch eine LED gedimmt.
Für das PWM hab ich 10 Bit verwendet.
Um den unlinearen Anstieg der Lichtstärkre auszugeleichen habe ich 
diesen Code verwendet:

-------------------------
' Lichtstärke endlos von 0 auf 100%
If Pwm_level <= 1020 Then
      Select Case Pwm_level
          Case 0 To 768 : Pwm_level = Pwm_level + 16
          Case 769 To 896 : Pwm_level = Pwm_level + 4
          Case 897 To 1023 : Pwm_level = Pwm_level + 2       ' + 1
      End Select
Else
     Pwm_level = 0
End If
-------------------------


Vielleicht hilfts


hmg
Mandi

Autor: Maxim S. (maxim) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Der Fehler ist nicht die Auflösung, sondern die Sinusfunktion ansich.
>
> Eine Sinusfunktion widerspricht völlig dem menschlichen
> Helligkeitsempfinden.
> Gibt man einen Sinus auf eine LED, hat man zu Anfang einen sehr starken
> Anstieg des Helligkeitseindrucks und dann über weite Bereiche eine fast
> konstante Helligkeit.
>
> Ein Erhöhung der Auflösung nützt also genau 0,nix.
>
>
> Peter

Ich weiß, was du meinst. Du hast aber überlesen oder nicht verstanden, 
dass die Helligkeit auf die 64 Stufen nicht linear, sondern exponentiell 
verteilt ist. Erhöht man die Helligkeitsstufe kontinuierlich, so steigt 
auch die wahrgenommene helligkeit etwa linear. Die Sinusfunktion 
steuert nicht die Pulsweite direkt, sondern die Helligkeitsstuffe. Das 
Resultat ist eine wahrnehmbare Sinusfunktion. Außerdem sieht man die 
einzelnen Stufen auch dann, wenn man die Helligkeit selber mit dem 
Drehencoder reguliert.

> Für einen wirklich fließenden Übergang solltes es schon mindestens 8bit
> sein. Probiers mal aus: Zeige am PC einfach einen Farbbalken an, mit
> jeweils 64, 128 oder 256 Farben. Bei 64 Farben sieht man deutlich die
> Stufen (je nach Monitor natürlich unterschiedlich stark). Bei 256 auch
> noch wenn man genau sucht.

8 Bit -> 256 Stufen, klingt verlockend, aber wie soll man das 
realisieren? Das Augen nimmt die Helligkeit logarithmisch wahr. Für 
lineare Helligkeitsverteilung auf die 256 Stufen bräuchte ich eine 
wesentlich höhere PWM-Auflösung, etwa bis 16 Bit. Welche uC schafft es, 
etwa 100 Mal in der Sekunde ein Register von 0 bis 65000 durchzuzählen, 
gleichzeitig drei PWM-Kanäle zu bedienen und noch ein paar kleinere 
Aufgabe zu erledigen? Eine 16-bittige CPU mit etwa 25MHz? Aber es wäre 
eben sehr schade um die Hardware, die ich schon aufgebaut habe.

Also zusammengefasst lohnt sich die Arbeit gar nicht, um auf 128 Stufen 
zu kommen?

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lies dir mal den Wiki Artikel hier von der Seite zum Thema LED-Fading 
durch, da wird eine sehr effiziente software PWM vorgestellt, die deinen 
Ansprüchen genügen sollte.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hauke Radtki wrote:
> Lies dir mal den Wiki Artikel hier von der Seite zum Thema LED-Fading
> durch, da wird eine sehr effiziente software PWM vorgestellt,

Wo ? Ich sehe da nur Hardware PWM.

Autor: Maxim S. (maxim) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hauke Radtki wrote:
> Lies dir mal den Wiki Artikel hier von der Seite zum Thema LED-Fading
> durch, da wird eine sehr effiziente software PWM vorgestellt, die deinen
> Ansprüchen genügen sollte.

Danke für den Hinweis. Meine Lösung ist jedoch noch effizienter, da sie 
ohne Timer auskommt und keinen Takt ungenutzt lässt. In dem Wiki wird 
auch nur eine 8-bittige PWM realisiert ... Ich brauche mindestens 12 
Bit, wenn nicht mehr.

Vor langer Zeit hat jemand mal einen Vorschlag gemacht, die PWM als eine 
Zustandsmaschine zu realisieren. Aber ich habe nicht so recht 
verstanden, wie das funktionieren soll. Geht es wirklich noch 
effizienter, als meine Lösung?

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, hatte ich falsch in Erinnerung, hier der richtige Artikel: 
http://www.mikrocontroller.net/articles/Soft-PWM

Die letzte PWM-Variante ist wohl ziemlich Effizient, auf jeden fall 
effizienter als deine ;)

Autor: Maxim S. (maxim) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hauke Radtki wrote:
> Ups, hatte ich falsch in Erinnerung, hier der richtige Artikel:
> http://www.mikrocontroller.net/articles/Soft-PWM
>
> Die letzte PWM-Variante ist wohl ziemlich Effizient, auf jeden fall
> effizienter als deine ;)

Ja, das ist schonmal was. :) 16.000.000 Hz / 65536 = 244 Hz

Falls diese Rechnung aufgeht, könnte eine 16-bit-PWM bei mehr als 200 Hz 
laufen. Das klingt zu schön, um wahr zu sein. Aber selbst die Hälfte 
wäre super. Dann mach ich mich mal an die Arbeit.

ps: Dieser Ansatz erinnert mich an den Vorschlag mit der 
Zustandsmaschine. Dort sollten ebenfalls Zeitpunkte berechnet werden, 
wann der nächste PWM-Kanal abzuschalten ist ...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Maxim S. (maxim) Benutzerseite

>> Die letzte PWM-Variante ist wohl ziemlich Effizient, auf jeden fall
>> effizienter als deine ;)

Ja, aber 16 Bit kann man da vergessen.

>Ja, das ist schonmal was. :) 16.000.000 Hz / 65536 = 244 Hz

>Falls diese Rechnung aufgeht, könnte eine 16-bit-PWM bei mehr als 200 Hz
>laufen. Das klingt zu schön, um wahr zu sein.

Eben. Ist es auch ;-)

>Zustandsmaschine. Dort sollten ebenfalls Zeitpunkte berechnet werden,
>wann der nächste PWM-Kanal abzuschalten ist ...

Es geht einfacher. Man muss nur den richtigen Artikel erwischen.

LED-Fading
Soft-PWM

8 Bit reicht, 10 Bit ist schon fast Luxus.
Das kann man mit Soft-PWM schaffen.

MFG
Falk

Autor: Maxim S. (maxim) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt ein Problem, wenn ein PWM-Kanal sofort nach dem anderen 
abgeschaltet werden soll (z.B. Rot bei Timer = 35.000 und Blau bei 
35.002), weil der uC in die ISR springt und der Timer nach der Rückkehr 
aus der ISR schon über den Wert des zweiten PWM-Kanals drüber ist. Wenn 
ich den Timer während der ISR anhalte, wird sich das vor allem auf sehr 
kurze Puslweiten auswirken. Die kürzeste Pulsweite wäre also die Dauer 
der ISR und das sind grob geschätzt auch schon mindestens 100 Takte 
(Assembler). 65000/100 oder 650:1 wäre das kleinste Verhältnis und 
entspräche der niedrigsten Leuchtstufe, was in Wirklichkeit aber schon 
ziemlich hell wäre (für die niedrigste Stufe). Trotzdem ist der Ansatz 
vielversprechend, hoffentlich wird's was.

Autor: Maxim S. (maxim) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 8 Bit reicht, 10 Bit ist schon fast Luxus.
> Das kann man mit Soft-PWM schaffen.

Beziehen sich die 8 Bit auf den Zähler oder auf die Helligkeit? 8 Bit 
Helligkeit würde mir ausreichen, immerhin 256 Helligkeitsstufen. Aber um 
diese fürs Auge linear aussehen zu lassen, braucht man dann eben doch 
ein Vielfaches davon. Die Artikel habe ich ja alle schon gelesen.

Autor: Maxim S. (maxim) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sortieren in Assembler (AVR) ist gar nicht so ohne. Mit einem Haufen 
Verzweigungen ist das zwar machbar, aber irgendwie zu einfallslos.

Überlege gerade folgendes:

R-G -> C1 = Carry
R-B -> C2 = Carry
G-B -> C3 = Carry

Nach jeder Operation wird das Carry-Bit gesichert. Die Werte in R, G und 
B sollen vor der Subtraktion in temporäre Register, sodass ihr Wert 
unverändert bleibt. Es zählt ja nur das Carry-Bit, welches gesetzt wird, 
falls bei der Subtraktion ein Underflow stattfindet.

Dann kann man die Bits C1 bis C3 in ein Register schieben und dieses als 
Offset für einen indirekten Sprung nutzen. Beim jeweiligen Sprungziel 
ist dann ja schon bekannt, welche Farbe den höchsten/niedrigsten Wert 
hat. Dann muss nur noch auf Gleichheit geprüft werden (oder vielleicht 
sogar vor dem indirekten Sprung?).

Autor: Maxim S. (maxim) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Damit es klarer wird, ist eine Tabelle im Anhang.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Maxim S. (maxim) Benutzerseite

>> 8 Bit reicht, 10 Bit ist schon fast Luxus.
>> Das kann man mit Soft-PWM schaffen.

>Beziehen sich die 8 Bit auf den Zähler oder auf die Helligkeit?

Auf den Zähler. Damit hat man dann 32 Helligkeitsstufen. Das passt schon 
ganz gut.

> 8 Bit
>Helligkeit würde mir ausreichen, immerhin 256 Helligkeitsstufen.

Das schafft man rein rechnerisch nicht mal mit ner 16 Bit PWM. UNd wie 
bereits gesagt, in Software ist bei ca. 10 Bit Schluss. Siehe Artikel, 
dort ist das vorgerechnet.

>ein Vielfaches davon. Die Artikel habe ich ja alle schon gelesen.

Und auch verstanden?

;-)
Falk

Autor: ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kann auch eine Tabelle mit 256 Hlligkeitsstufen und 10 Bit PWM 
Auflösung benutzen. Allerdings werden dann nicht mehr alle Stufen zu 
verschiedenen PWM Werten führen. Bei den geringen Helligkeiten werden 
ein paar fehlen, aber bei den höheren Helligkeiten passiert nichts.

Mit Hardware PWM wäre auch 16 Bit PWM drin. Aus einem 8 Bit Hardware PWM 
Kanal läßte sicher per Software ein 16 Bit Kanal machen, indem man 
zwischen zwei PWM werten hin und her schaltet so wie sonst beim Soft 
PWM.

Wenn man wirklich beim Software PWM bleiben will, kann man noch fast 1 
Bit gewinnen, wenn man am Anfang einen halb-langen Zeitschritt einfügt. 
Die LEDs fangen dann halt nicht ganz syncron an, sondern zum Teil etwas 
später.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ ulrich (Gast)

>Mit Hardware PWM wäre auch 16 Bit PWM drin. Aus einem 8 Bit Hardware PWM
>Kanal läßte sicher per Software ein 16 Bit Kanal machen, indem man
>zwischen zwei PWM werten hin und her schaltet so wie sonst beim Soft
>PWM.

Nur dass dann die effektive PWM-Frequenz ziemlich niedrig ist, 1 Hz und 
weniger!

MFG
Falk

Autor: Maxim S. (maxim) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ich bin gerade an einer Assembler-Version der "intelligenten Lösung" 
(http://www.mikrocontroller.net/articles/Soft-PWM#I...) 
dran. Möglicherweise haue ich mit Assembler noch etwas an Leistung raus. 
Muss allerdings ziemlich rumtricksen. Vielleicht schaffe ich es, die 
Timer-ISR auf weniger als 10 Takte zu drücken, indem so viel wie möglich 
außerhalb der ISR errechnet wird und in der ISR nur noch ein indirekter 
Sprung und ein OUT-Befehl abgearbeitet werden müssen. Dann dürfte die 
Abweichung wegen des gestoppten Timers während der ISR nicht so große 
Auswirkung auf die niedrigsten Helligkeitsstuffen haben.

Die 65536 Timerwerte verteile ich mit

y=1.044451146^x-1

auf die 256 Helligkeitsstufen:

X  Y gerundet

0  0
1  0
2  0
3  0
4  0
5  0
6  0
7  0
8  0
9  0
10  1
11  1
12  1
13  1
14  1
15  1
16  1
17  1
18  1
19  1
20  1
21  1
22  2
23  2
24  2
25  2
26  2
27  2
28  2
29  3

Y ist also der Timerwert. Die ersten acht Stufen sind also identisch in 
der Helligkeit. So gesehen sind 256 Stufen bei einer intern 16-bittigen 
PWM zu viel. Diese Lösung wird im unteren Helligkeitsbereich also fast 
genauso grob arbeiten, wie die 10-Bit-Variante. Aber bei den höheren 
Helligkeiten sollte es trotzdem besser werden.

Welche ICs können hardwareseitig 16-Bit-PWM? Nur so, für's nächste 
Projekt ...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Maxim S. (maxim) Benutzerseite

>dran. Möglicherweise haue ich mit Assembler noch etwas an Leistung raus.

Ich geb dir mal bestenfalls 30% Einsparung, macht dann 70 statt 100 
Takte.

>Timer-ISR auf weniger als 10 Takte zu drücken, indem so viel wie möglich

Na das wollen wir mal sehen. Allein das Anspringen dauert 4 Takte, das 
Reti ebenso. Bleiben noch 2 für deine "ISR". Ein Out und ein 
Pointerincement ;-)

>Sprung und ein OUT-Befehl abgearbeitet werden müssen. Dann dürfte die
>Abweichung wegen des gestoppten Timers während der ISR nicht so große
>Auswirkung auf die niedrigsten Helligkeitsstuffen haben.

Der Timer muss gar nicht gestoppt werden. Deine PWM ist aber dennoch 
meilenweit von 16 Bit entfernt. Denn 16 MHz/ 10 (Takte / ISR) /100 (Hz) 
= 1600 ISRs pro PWM-Periode. Sind nicht mal 11 Bit Auflösung. Real sind 
wie bereits gesagt bestenfalls 10 Bit drin, alles andere ist schlicht 
nicht machbar. Nimm einen Spezial-IC oder CPLD.

Die 65536 Timerwerte verteile ich mit

>der Helligkeit. So gesehen sind 256 Stufen bei einer intern 16-bittigen
>PWM zu viel. Diese Lösung wird im unteren Helligkeitsbereich also fast

Nicht wahr? Steht sogar im Artikel ;-)

>genauso grob arbeiten, wie die 10-Bit-Variante. Aber bei den höheren
>Helligkeiten sollte es trotzdem besser werden.

Aber genau der Bereich ist unkritisch, der Logarithmus lässt grüssen ;-)

>Welche ICs können hardwareseitig 16-Bit-PWM? Nur so, für's nächste
>Projekt ...

Nimm nen kleinen Tiny2313 für jede LED.

MFg
Falk

Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Nimm nen kleinen Tiny2313 für jede LED.

Gibt's keine kleineren uCs, die 16-bit-PWM können? Ein 8-pinner wäre 
schon deutlich besser. Aber eigentlich müsste es doch speziell dafür 
ausgelegte ICs geben, die gleich mehrere Kanäle haben?!

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wäre es hier nicht einfacher, pro Farbkomponente 2 Ausgänge zu nehmen, 
so dass die Helligkeit nicht nur über PWM geht sondern auch über die 
angesteuerten Ausgänge? Damit hätte man 4 Stufen, wenn man 
unterschiedliche Widerstände nimmt. Der kleiner R würde hell machen und 
der grosse könnte zum Feintunen dienen.

Ist wohl etwas schwerer zu kalibrieren, aber spart das Rumgefrickel in 
der Software.

Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der MBI5030 wäre bestens für solche Aufgaben geeignet, aber ich finde 
niemanden, der ihn in Deutschland verkauft.

Autor: Markus C. (ljmarkus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TLC5946

lg, markus

Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der hat nur eine 12-bittige Auflösung und die Verfügbarkeit scheint auch 
nicht besser zu sein.

Autor: Markus C. (ljmarkus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und 6 bit Konstandstrom hat er noch drin.

oder den TLC5943, der hat 16bit.


lg, markus

Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, der ist interessant. Wo bekomme ich ihn?

Autor: Markus C. (ljmarkus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kannst dir 5 sample bestellen. Oder direct bei Ti bestellen.


lg, markus

Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
5 Samples? Wo? Durch die Webseite von TI habe ich einen Distributor in 
Europa gefunden. Der verkauft allerdings erst ab 50 Stück.

Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab's gefunden. Irgendwie ist das zu schön, um wahr zu sein. Aber 
vielleicht klappt's ja.

Autor: Maxim S. (maxim) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Datenblatt des TLC5943 steht, dass er intern einen Schmitt-Trigger am 
Takteingang hat. Ist also nicht für einen Quarz-Schwingkreis geeignet? 
Wie soll man den Takt dann erzeugen? Extra einen Tiny dafür nehmen?

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.