Forum: Mikrocontroller und Digitale Elektronik LED PWM Dimmer mit Interpolation


von Jürgen B. (hicom)


Lesenswert?

Nabend,
habe hier gerade meinen DMX gesteuerten LED Dimmer fertiggestellt,
4 PWM Kanäle, 970Hz PWM Freguenz - soweit funktioniert das.

Problem ist das Fading.
Wenn per DMX über so ca. 5s gefadet wird ist alle in Ornung und das 
Dimmergebnis sieht sehr gut aus. Bei ca. 2s Fading ist das aber anders.
DMX überträgt bekanntlich 512 Kanäle und braucht dafür ca. 23ms per 
Zyklus.
Wenn jetzt in nur 2s von 0 auf 255 gefadet wird, gibt es logischerweise
größere Lücken im DMX Signal die sich dann in Helligkeitssprüngen 
bemerkbar machen.

Idee ist nun die fehlenden Zwischenwerte vom Dimmer berechnen zu lassen 
und jeweils zwischen zwei DMX Zyklen auszugeben (Zeit dazu ist ja 
genug). Also wenn vom DMX Sender 0,4,8,12.. kommt daraus wieder intern 
0,1,2,3,4.. zu machen.
Nur habe ich noch keinen Ansatz wie ich mir die Werte ezeuge damit das 
Timing auch immer stimmt.

Vielleicht hat jemand schon mal ähnliches gelöst?

Jürgen

: Bearbeitet durch User
von Marco H. (damarco)


Lesenswert?

Es dauert 5,78s wenn man von 0 -> 255 dimmt und bei jeden Frame 
inkrementiert.

Das Problem stellt sich er andersherum wenn man z.Bsp 10min hoch fadet.

Wenn der PWM 8bit Auslösung hat gibt es 255 Schritte die wie erwähnt nur 
alle 22,6ms also pro Frame gesendet werden können. Es gibt ein weiteres 
Problem das break das von 88µ-1sec definiert ist. Lässt sich der Sender 
mehr Zeit dauert es noch länger oder die Werte springen wenn im Sender 
nicht der DMX Frame berücksichtigt wird beim Timing.

Bei sehr langen Zeiten springt der Wert bei 8bit deswegen haben viele 
Dimmer eine Auflösung von 14bit. Sie interpolieren die 8 Bit werte des 
DMX Signal oder benutzen 2 Channels -> 16bit.

Es gibt mehre Wege das interpolieren zu lösen. Der Wert ist nicht das 
alleinige Maß sondern auch die Zeit in dieser sich ändert. Solche Kurven 
sind gut gehütetes Geheimnis von LED Herstellen und nicht selten mit 
Patenten behaftet.


Wenn du alle 44 Frames in der Sekunde auswertest und der Sender dieser 
auch liefert flackert auch nichts bei 2 Sekunden. Das Signal läuft so 
schnell hoch das dies nicht auffällt.

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wenn eine Verzögerung von einem DMX Frame akzeptabel wäre, könnte man 
die PWM Zwischenstufen per PI Regler nachziehen, wobei die Sollwerte von 
DMX vorgegeben werden und der Istwert die aktuelle PWM der LED ist 
(linearisiert hast du sie ja bestimmt schon). Das könnte im 970 Hz Takt 
passieren.

Die P und I Parameter bestimmen dann, wie schnell die LED dem DMX 
folgen.

von Joe F. (easylife)


Lesenswert?

Ich würde einfach über einen DMX Frame (23ms) linear vom letzten Wert 
zum aktuell empfangenen Wert interpolieren.

delta = neuer_wert - alter_wert;

pro PWM Zyklus (970 Hz) addierst du dann 1/22 des deltas dazu (denn du 
hast 22 PWM Zyklen Zeit zwischen den DMX Frames).

Eine (Halogen)Glühlampe würde das ähnlich machen.

Du kannst ja noch eine Threshold einbauen, wenn der neue Wert und der 
alte Wert weiter als sagen wir mal 50 auseinanderliegen, dann wird 
sofort zum neuen Wert gesprungen.
So kann man dann immer noch Blitzlicht machen, beim langsam Faden wird 
aber interpoliert.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Marco H. schrieb:
> Es dauert 5,78s wenn man von 0 -> 255 dimmt und bei jeden Frame
> inkrementiert.

Lineares Dimmen von 0 auf 255 in +1-Schritten ist ziemlich sinnlos, weil 
der Mensch Helligkeitsänderungen relativ wahr nimmt, i.e. (delte I)/I. 
Um dieser logarithmischen Wahrnehmung gerecht zu werden, muss man die 
Helligkeit für einen Zeitschritt um einen festen Faktor erhöhen, also 
z.B. 1, 2, 4, 8, 16, ...

von c-hater (Gast)


Lesenswert?

Jürgen B. schrieb:

> Wenn jetzt in nur 2s von 0 auf 255 gefadet wird, gibt es logischerweise
> größere Lücken im DMX Signal die sich dann in Helligkeitssprüngen
> bemerkbar machen.
>
> Idee ist nun die fehlenden Zwischenwerte vom Dimmer berechnen zu lassen

Typischer Fall von: Wenn ich nur einen Hammer als Werkzeug kenne, sieht 
irgendwie alles wie ein Nagel aus...

Nein: Normaldenkende erkenne in deiner Situation, dass das DMX-Protokoll 
schlicht ungeeignet ist, um deine Anforderungen zu erfüllen. Und sie 
machen dann das, was logisch ist: Sie verwenden KEIN DMX, sondern was 
anderes. Natürlich etwas, was besser für deinen Zweck geeignet ist...

von Jürgen B. (hicom)


Lesenswert?

erst mal danke für die interessanten Antworten.
Ich glaube das mit dem 1/22 (970/44) pro PWM Zyklus addieren
kann ich noch am ehesten verwirklichen, da ja ich ja intern schon mit
11Bit arbeite. Vielleicht kann man ja noch die Frame to Frame time mit 
in die Berechnung einfliessen lassen fals diese nicht konstant ist.

Gruß
Jürgen

von Jürgen B. (hicom)


Lesenswert?

Wolfgang schrieb:
> Marco H. schrieb:
>> Es dauert 5,78s wenn man von 0 -> 255 dimmt und bei jeden Frame
>> inkrementiert.
>
> Lineares Dimmen von 0 auf 255 in +1-Schritten ist ziemlich sinnlos, weil
> der Mensch Helligkeitsänderungen relativ wahr nimmt, i.e. (delte I)/I.
> Um dieser logarithmischen Wahrnehmung gerecht zu werden, muss man die
> Helligkeit für einen Zeitschritt um einen festen Faktor erhöhen, also
> z.B. 1, 2, 4, 8, 16, ...

Das kann der Dimmer aber auch selbst erledigen indem er die linearen DMX 
Signale entprechend verbiegt (Look-up tabelle)

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Jürgen B. schrieb:

> Das kann der Dimmer aber auch selbst erledigen indem er die linearen DMX
> Signale entprechend verbiegt (Look-up tabelle)

Dieser (und jeder ähnliche) Ansatz ist kompletter BLÖDSINN. Der Slave 
kann schließlich niemals wissen, was als nächster Steuerwert über dieses 
unsägliche DMX-Protokoll reinkommt, denn nichts und niemand kann in die 
Zukunft sehen.

D.h.: Jede Massnahme, die für eine Situation eine "Verschönerung" des 
Ergebnisses darstellt, wird für eine (sogar systematisch konstrierbare) 
andere Situation ein suboptimales Ergebnis erbringen.Ganz klar z.B. 
dann, wenn eben kein sanftes Dimming gewünscht wird, sondern tatsächlich 
ein harter Sprung.

Die einzige wirkliche Lösung ist das Abwerfen der Beschränkungen des 
Protokolls! Das kann doch, verdammt noch mal, nicht so schwer zu 
verstehen sein?

von Joe F. (easylife)


Lesenswert?

Jürgen B. schrieb:
> Vielleicht kann man ja noch die Frame to Frame time mit
> in die Berechnung einfliessen lassen fals diese nicht konstant ist.

Ja, gute Idee. Ich vermute, wesentlich langsamer als 44 Hz wird's nicht 
werden, da dies die Vollauslastung mit 512 Kanälen ist.
Aber wenn ich es richtig verstehe, kann man DMX auch mit weniger 
Adressen, und dafür höherer Refreshrate laufen lassen.
Dann könntest du deinen Teiler eben entsprechend (dynamisch) anpassen, 
und ab einer bestimmten Refreshrate macht Interpolieren vermutlich dann 
eh keinen Sinn mehr.

von Joe F. (easylife)


Lesenswert?

c-hater schrieb:
> Die einzige wirkliche Lösung ist das Abwerfen der Beschränkungen des
> Protokolls! Das kann doch, verdammt noch mal, nicht so schwer zu
> verstehen sein?

Ich mach mir die Welt, wiedede wie sie mir gefähälllt...

von c-hater (Gast)


Lesenswert?

Joe F. schrieb:

> Ich mach mir die Welt, wiedede wie sie mir gefähälllt...


Ja, ich glaube auch, dass dein Verständnis der einschlägigen Mathematik 
ungefähr auf Pippi-Langstrumpf-Niveau ist...

Du musstest das nicht unbedingt so explizit darstellen. Aber naja, wenn 
sich einer selber öffentlich als komplett unwissend outen will, sollte 
das meiner Meinung nach durchaus erlaubt sein: auch das ist eine 
schützenswerte Form der Meinungsfreiheit...

Und immerhin: die Erwachsenen haben auch mal was zum Ablachen, das RL 
ist hart genug, da ist sowas mal eine schöne Abwechslung. Also in 
irgendeiner Form doch ein nützliches Posting. Nur leider nicht für den 
TO...

von Joe F. (easylife)


Lesenswert?

c-hater schrieb:
> Aber naja, wenn
> sich einer selber öffentlich als komplett unwissend outen will, sollte
> das meiner Meinung nach durchaus erlaubt sein

Das ist sehr nett von dir.
Dir scheint aber nicht klar zu sein, dass DMX der Standard in der 
Lichttechnik ist, den man nicht eben so mal ändern kann.

Wer einen Dimmer entwickelt, muss ihn so entwickeln, dass er zum 
Standard und den Lichtsteuerpulten passt.

Die technischen Unzulänglichkeiten des Standards sind allerdings nicht 
so unglaublich groß, dass es nicht möglich wäre, mit einfachen Maßnahmen 
deutliche Verbesserungen zu schaffen. Und genau darum geht es hier.

von Joe F. (easylife)


Lesenswert?

Jürgen B. schrieb:
> Vielleicht kann man ja noch die Frame to Frame time mit
> in die Berechnung einfliessen lassen fals diese nicht konstant ist.

Nochmal zurück zu deiner Idee.
Ich denke am meisten Sinn macht es, die Zeit zu messen, die zwischen 2 
DMX Updates des betreffenden Kanals liegt.
z.B. direkt die PWM Zyklen zählen.

Und diesen Wert legst du dann für die Interpolation als Teiler des 
Deltas zugrunde. Du berechnest sozusagen die Steigung des sich ändernden 
Signals nur für den entsprechenden Kanal.

Angenommen du bewegst den Fader mit konstanter Geschwindigkeit.
Wenn für den Kanal selten Daten kommen, hast du ein großes Delta und ein 
großes Zeitintervall.
Wenn die Daten für den Kanal öfter kommen, ist die gemessene Zeit 
kürzer, das Delta aber auch kleiner.

Die Steigung (Delta pro PWM Zyklus) dann also einigermaßen konstant, 
unabhängig vom Update-Intervall, und unabhängig davon, ob eventuell 
andere Kanäle mit einem anderen Update-Intervall versorgt werden.

Du hängst halt immer 1 Update-Zyklus hinterher, bis die LED den neuen 
Wert endgültig erreicht hat.

von Marco H. (damarco)


Lesenswert?

https://github.com/tdicola/LinearInterpolation

Erklärt das Prinzip ziemlich gut. Man schaut eben wie viel PWM Perioden 
vergangen sind und interpoliert das auf den 14bit PWM Bereich.

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.