Hallo,
Ich weiß nicht, ob ich hier im richtigen Forum bin, aber ich frag mal...
:)
Ich habe hier einen Farbsensor, der mir die Tristimuluswerte (X,Y,Z) des
aktuell gemessenen Lichts ausgibt. Des weiteren habe ich diesen Sensor
mit einem uC verbunden, der auch eine RGB-LED ansteuert. Die XYZ-Werte
habe ich in der Form 0-1 vorliegen - d.h. ich habe das Verhältnis der
drei Werte zueinander und kann somit den eingestellten Farbort (in xy)
messen. Wie stelle ich das nun an, wenn ich einen Farbort konstant
halten will? Die einzelnen Farben der LED verlieren unterschiedlich an
Helligkeit in Abhängigkeit von Temperatur und Lebensdauer. D.h. ich muss
die PWM-Werte anhand der gemessenen XYZ-Werte immer neu berechnen. Nur
wie?
Kann mir da jemand Tipps geben?
Vielen Dank!
Andy
Kannst Du einen zweiten (identischen) Farbsensor so anbringen, dass er
die Farbe der RGB-LED misst? Dann mache es über einen Regelkreis oder
einer Kalibrierung mit Erstellung dreier Umsetzungstabellen über den
gesamten Bereich nach dem Einschalten. Ansonsten kannst Du noch eine
einmalige Kalibrierung nachdenken, oder die Umsetzungstabellen anhand
von des Datenblattes von Hand kodieren, wenn das Datenblatt genügen
Infos liefert.
Danke mal für deine Antwort. Nur hab ich das mit dem zweiten Sensor
nicht ganz verstanden. Der eine, den ich habe, der misst doch schon die
LED. Ich will nur die Farbe in Abhängigkeit der Temp. stabil halten.
Das habe ich mir schon gedacht, dass das ein regelungstechnisches
Problem ist. Nur habe ich da überhaupt keine Ahnung, wie ich das
mathematisch abbilden soll...
OK, da hatte ich Dein Problem falsch verstanden. Ich dachte, Du willst
eine Farbe reproduzieren.
Hast Du mal eine Bezeichnung oder besser ein Datenblatt von dem
Farbsensor, damit man eine genauere Vorstellung von der Funktionsweise
(reaktionsgeschwindigkeit, Verhalten bei Dunkelheit, Übersättigung
etc..) bekommen kann? Ist z.B. die Summe X + Y + Z konstant oder
abhängig von der Gesamthelligkeit?
Ein sportliches Unterfangen. Sensor und LED muessen natuerlich beide im
Dunkeln sein. Dann sollte man die Farbraeume vergleichen. Eine RGB Led
besteht aus drei Farben, der Sensor liefert Werte fuer drei Farben. Sind
die Farben identisch ?
wie genau soll das ganze sein ? wenn es wirklich bestmögliche ergebniss
ein bezug auf das menschliche auge haben soll brauchst du noch einen
sensor der die absoluten wellenlängen etc. misst
tendentiell, wenn du es einfach machen möchtest rechnest du die x,y,z
werte in passende RGB werte für deien ansteuerung um. nimm am besten
eine konstantstromquelle, da die helligkeit näherungsweise linear zum
strom ist.
dann pro r,g,b kanal einen PI regler und gut..
Hex Oschi schrieb:> Sensor und LED muessen natuerlich beide im> Dunkeln sein.
Guter Einwand! Könnte man das nicht noch ausgleichen, indem man einen 2.
Sensor das Umgebungslicht messen lässt?
Nochmal zur Reaktionsgeschwindigkeit des Sensors:
Wenn der Sensor schnell reagiert, gibt es ein Problem mit der PWM und
der Messwertaufnahme. Der Regelkreis wird evtl. so einfach nicht
funktionieren, denn was der Sensor vielleicht nur messen kann, ist die
Helligkeit bzw. Farbe der LED in der An-Phase, nicht aber die
durchschnittliche Helligkeit bzw. Farbe. Dann könnte meiner Vorstellung
nach die Regel-Logik in etwa so aussehen:
Gegeben ist die Soll-Farbe S als RGB-Triplet mit dem Bereich 0..1 pro
Kanal, die mit maximaler Helligkeit übertragen werden soll.
1. Schalte alle 3 LEDs an.
2. Messe den sich daraus ergebenden Farbwert (RGB (0-1) Triplet X)
3. Schalte alle 3 LEDs aus.
4. Suche den Kanal f, für den (Sf / Xf) am größten ist.
5. Errechne den Basisfaktor k aus diesem Verhältnis und der maximalen
Pulsdauer Wmax:
k = (Wmax * Xf / Sf) / (Maximaler Leistungsverlust der LED als Faktor)
6. Schalte alle 3 LEDs an.
7. Messe den sich daraus ergebenden Farbwert (RGB (0-1) Triplet X)
8. Errechne die Pulsweite W pro Farbkanal aus der Soll-Helligkeit S
(0-1):
Wrot = k * Srot / Xrot
Wgrün = k * Sgrün / Sgrün
Wblau = k * Sblau / Sblau
9. Warte auf entsprechende Zeitpunkte, und schalte LEDs aus.
10. Weiter mit 6.
Weiterhin brauchen wir 3 PWM-Ausgänge, was uns zu einem phatten uC oder
3-Kalnal Soft-PWM führt.
Hallo Andy,
Du kannst das entweder eine Hin-und Rücktransformation in den HSL
Farbraum machen, oder auch direkt. Du willst ja Farbton und Sättigung
konstant halten, und die Helligkeit der LED auf einen festen Wert
stellen (zum Beispiel so hell wie möglich).
Dazu musst Du aus dem gemessenen Istwert deines Sensor sowie aus dem
Sollwert (welche Farbe es sein soll) die Helligkeit durch Normierung
raus rechnen. Die Helligkeit der LED kann man entweder auf einen festen
Wert einstellen, oder so, dass der hellste der 3 RGB Kanäle gerade 100%
stellt.
Also:
Normiere die Helligkeit deines XYZ Sensors. Zum Beispiel so, dass der
Mittelwert 1 ergibt.
Beispiel:
X = 0.2
Y = 0.4
Z = 0.6
Mittelwert M = (X + Y +Z)/3 = 0.4
X' = X / M = 0.5
Y' = Y / M = 1.0
Y' = Y / M = 1.5
Jetzt hast Du immer noch den gleichen Farbton und Sättigung, aber
Helligkeit 1.0
Mach das Gleiche mit deinem Sollwert.
Um zum Beispiel auf Weiss zu regeln wäre der Sollwert:
Xsoll' = Ysoll' = ZSoll' = 1.0
Jetzt brauchst Du nur noch 3 digitale I-Regler in der Form:
Xr = Xr + Ki * (Xsoll' - X')
Da der I-Anteil recht hohe Werte hat, wirst Du den Ausgang nochmals
skalieren, zum Beispiel / 1000.
Und nun musst Du nur noch den größten der 3 Werte ermitteln, und Xr, Yr,
Zr dann so skalieren, dann der genau 100% PWM gibt.
Vielen Dank für die zahlreichen Antworten. Nur glaube ich, dass da was
falsch verstanden wird. X,Y,Z haben nichts direkt mit den
RGB-Einstellungen zu tun. X,Y,Z stellen lediglich den eingestellten
Farbort im CIE-Chart dar. Die Koordinaten werde wie folgt berechnet:
x = X/(X+Y+Z) und y = Y/(X+Y+Z)
D.h. wenn ich nun z.B. nur den Rot-Wert ein bisschen verändere, ändert
sich der Farbort und somit ändern sich auch alle drei Tristimuluswerte -
also X,Y und Z.
D.h. eine Farbänderung hat eine Änderung aller drei Messgrößen zur
Folge. Da sich nun die Farbe zwangsläufig ändern wird, obwohl die
PWM-Werte konstant sind (wegen Temperatur), muss ein Algorithmus her,
der mir sagt, welchen PWM-Kanal ich ändern muss, damit X,Y und Z wieder
auf den Ausgangswert zurückkommen. Und da bräuchte ich Hilfe.
Ich hoffe, ich konnte mich verständlich ausdrücken... :)
lg
Andy
Du kannst aber den Regler auch in deinem Farbraum ansetzen und nur die
Ausgabe nach RGB transformieren.
.... ein Beispiel aus dem praktischen Leben:
Du hast eine alte Dusche mit 2 Regler: Heisswasserhahn und
Kaltwasserhahn. Du willst eine konstante Temperatur und vielleicht auch
konstanten Wasserfluss regeln.
Heisswasserhahn und Kaltwasserhahn entsprechen R-G (und B)
Um das regeln zu können, baut man eine Transformation von Konstanter
Temperatur und Konstanem Fluss zu Heiss-Kaltwasser-Hahn ein.
Diese Transformation kann man mechanisch mit der Mischerbatterie machen.
Jetzt baut man 2 Regler. Einer misst die Temperatur und bewegt über
einen Stellmotor den Hebel der Batterie nach recht/links.
Der 2. Regler musst nur den Durchfluss und regelt über einen 2.
Stellmotor den Heben nach unten/oben.
Genauso kann man im Farbraum regeln. Die Transformation würde ich aber
mathematisch, und nicht mechanisch machen.
Art
und hier:
http://www.brucelindbloom.com/
findest Du unter "Math" die Transformation aus dem xyY Farbraum nach
RGB, also das, was ich in der TransformCIE2RGB() Funktion versteckt
habe.
Hallo,
Vielen Dank für deine Antwort - hat mir schon ein bisschen
weitergeholfen.
Nur hänge ich gerade an der Korrekturmatrix M für die
XYZ-zu-RGB-Transformation. Und zwar ist es bei mir der Fall, dass ich
keinen echten RGB-Farbraum habe, sondern das Grün ist bei mir Cyan. Wie
kann ich nun eine Matrix M speziell für meine Problemstellung berechnen?
Ich hab schon ein bisschen probiert - weiß jedoch nicht, was ich als
reference white annehmen muss...
Vielen Dank!!
mfg
Andy
Art Ickel aus W. schrieb:> Du musst einfach deinen X-Y-Z-Vektor in den RGB Raum transformieren> und dann die Regelung anwenden.
Das geht prinzipiell nicht, da RGB nicht den ganzen CIE Farbraum
abdeckt, sondern nur ein Dreieck. Falls der gewünschte Farbwert
außerhalb des Dreiecks liegt, muß man Kompromisse schließen.
Andy schrieb:> Nur hänge ich gerade an der Korrekturmatrix M für die> XYZ-zu-RGB-Transformation. Und zwar ist es bei mir der Fall, dass ich> keinen echten RGB-Farbraum habe, sondern das Grün ist bei mir Cyan.
Deine LEDs sitzen jeweils auf einem (temperaturabhängigen) Farbort und
spannen im CIE ein Dreieck auf, dass nur einen Teil des Farbraumes
abdeckt. Das Matrix existiert also möglicherweise gar nicht exakt.
OK, danke für eure Hinweise... Ich habs nun in Mathematica geschafft,
das ganze nachzubauen. Und zwar ist das Referenzweiß jener Farbort, der
sich einstellt, wenn alle drei LEDs voll angesteuert werden. Nur ist die
Frage, bei welcher Temperatur dieses Referenzweiß ermittelt werden
muss....
Bin noch am Tüffteln... :)