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


von Maxim (maxim) Benutzerseite


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?

von Benedikt K. (benedikt)


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.

von Peter D. (peda)


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

von Manfred S. (mandinice)


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

von Maxim (maxim) Benutzerseite


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?

von Hauke R. (lafkaschar) Benutzerseite


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.

von Benedikt K. (benedikt)


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.

von Maxim (maxim) Benutzerseite


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?

von Hauke R. (lafkaschar) Benutzerseite


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 ;)

von Maxim (maxim) Benutzerseite


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 ...

von Falk B. (falk)


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

von Maxim (maxim) Benutzerseite


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.

von Maxim (maxim) Benutzerseite


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.

von Maxim (maxim) Benutzerseite


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?).

von Maxim (maxim) Benutzerseite


Angehängte Dateien:

Lesenswert?

Damit es klarer wird, ist eine Tabelle im Anhang.

von Falk B. (falk)


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

von ulrich (Gast)


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.

von Falk B. (falk)


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

von Maxim (maxim) Benutzerseite


Lesenswert?

Ja ich bin gerade an einer Assembler-Version der "intelligenten Lösung" 
(http://www.mikrocontroller.net/articles/Soft-PWM#Intelligenter_L.C3.B6sungsansatz) 
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 ...

von Falk B. (falk)


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

von Maxim (Gast)


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?!

von Johann L. (gjlayde) Benutzerseite


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.

von Maxim (Gast)


Lesenswert?

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

von Markus C. (ljmarkus)


Lesenswert?

TLC5946

lg, markus

von Maxim (Gast)


Lesenswert?

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

von Markus C. (ljmarkus)


Lesenswert?

und 6 bit Konstandstrom hat er noch drin.

oder den TLC5943, der hat 16bit.


lg, markus

von Maxim (Gast)


Lesenswert?

Ja, der ist interessant. Wo bekomme ich ihn?

von Markus C. (ljmarkus)


Lesenswert?

kannst dir 5 sample bestellen. Oder direct bei Ti bestellen.


lg, markus

von Maxim (Gast)


Lesenswert?

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

von Maxim (Gast)


Lesenswert?

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

von Maxim (maxim) Benutzerseite


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?

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.