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
ja. Du musst einfach deinen X-Y-Z-Vektor in den RGB Raum transformieren und dann die Regelung anwenden.
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
So etwa:
1 | //Variablen
|
2 | long xregler = 0; |
3 | long yregler = 0; |
4 | int r,g,b; |
5 | int xdiff, ydiff; |
6 | |
7 | // Sollwert
|
8 | xsoll = irgendwas |
9 | ysoll = irgendwasandres |
10 | |
11 | while (1) { |
12 | |
13 | // Koordinaten im CIE-Chart
|
14 | xist = X/(X+Y+Z) |
15 | yist = Y/(X+Y+Z) |
16 | |
17 | //Regelabweichung
|
18 | xdiff = xsoll - xist |
19 | ydiff = ysoll - yist |
20 | |
21 | // I-Regler für x
|
22 | xregler += xdiff * Ki (mit Begrenzung) |
23 | if (xregler < XREGLER_MIN) |
24 | xregler = XREGLER_MIN; |
25 | if (xregler > XREGLER_MAX) |
26 | xregler = XREGLER_MAX; |
27 | |
28 | |
29 | // I-Regler für y (mit Begrenzung)
|
30 | yregler += ydiff * Ki |
31 | if (yregler < YREGLER_MIN) |
32 | yregler = YREGLER_MIN; |
33 | if (yregler > YREGLER_MAX) |
34 | yregler = YREGLER_MAX; |
35 | |
36 | //Transformation in den RGB-Raum
|
37 | TransformCIE2RGB(xregler * SKALIERUNGSFAKTOR ,yregler * SKALIERUNGSFAKTOR , HELLIGKEIT) |
38 | |
39 | // Schreiben der PWM Register
|
40 | PWM1 = r |
41 | PWM2 = g |
42 | PWM3 = b |
43 | |
44 | warte_bis_10ms_wieder_rum_sind(); |
45 | }
|
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... :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.