Algorithmus zur optimalen RGB Farbmischung

OP #1828716
Lesenswert?

Hallo

Ich habe hier einen kleinen Print entwickelt welcher eine 3W RGB LED 
ansteuert.

Ich habe ein 3phasen PWM Signal mit einem Attiny25 erzeugt.
Die derzeitig maximalen werte sind 0 - 1024 (software pwm somit 
grundsätzlich erhöhbar!)

Meine frage nun, wie bekomme ich es hin, das ich möglichst alle Farben 
nacheinander in schönen übergängen darstellen kann?

Danke schon mal für eure tipps...
#1828734
Lesenswert?

HSV-Farbmodell benutzen. Saturation und Value kannst du konsant auf 1 
lassen, so dass nur der Hue-Wert durchlaufen werden muss.

hier mal etwas Code, vielleicht nützt es dir was.

Der Code ist so geschrieben, dass die Anzahl der Schritte pro Farbe 
mittels HUE_STEPS geändert werden kann.
Da hier aber nur die Skalierbarkeit nach unten berücksichtigt wurde, 
muss bei Werten größer 256 allerdings die Datentypen verändert werden.

1
#define HUE_STEPS 256
2
#define HUE_MAX (HUE_STEPS * 6)
3
typedef uint16_t Hue_t;
4

5
/**
6
 *  generates the waveform for the green color
7
 */
8
static uint8_t hueWaveform(Hue_t x)
9
{
10
  if(x < HUE_MAX/6){
11
    return x*((HUE_STEPS*6)/HUE_MAX);
12
  }else if(x< (HUE_MAX*3)/6){
13
    return HUE_STEPS-1;
14
  }else if(x< (HUE_MAX*4)/6){
15
    return (((HUE_MAX*4)/6)-1-x)*((HUE_STEPS*6)/HUE_MAX);
16
  }else{
17
    return 0;
18
  }
19
}
20

21

22
/**
23
 * generates rgb from hue with saturation 1 and brightness 1
24
 */
25
void hue2rgb(
26
              Hue_t h,
27
              uint8_t* r, uint8_t* g, uint8_t* b
28
            )
29
{
30
  uint16_t barg = (((uint16_t)h)+2*HUE_MAX/3);
31
  uint16_t rarg = (((uint16_t)h)+HUE_MAX/3);
32

33
  if(barg>=HUE_MAX){
34
    barg-=HUE_MAX;
35
  }
36
  if(rarg>=HUE_MAX){
37
    rarg-=HUE_MAX;
38
  }
39

40
  *g = hueWaveform(h);
41
  *b = hueWaveform( (Hue_t)barg );
42
  *r = hueWaveform( (Hue_t)rarg );
43
}
OP #1828743
Lesenswert?

Vielen dank für den code...

Habe ich das so richtig verstanden,

HUE_Steps gibt die maximale anzahl möglicher farben an.

Und in der funktion hue2rgb übergebe ich einen wert von 0 - 256 ?
mit dem aktuellen code könnte ich dann am schluss wieder von 256 - 0 
richtig?
#1828767
Lesenswert?

Claudio Hediger schrieb:

> HUE_Steps gibt die maximale anzahl möglicher farben an.

Nein.
Du lässt deine Laufvariable von 0 bis HUE_MAX laufen

> Und in der funktion hue2rgb übergebe ich einen wert von 0 - 256 ?
> mit dem aktuellen code könnte ich dann am schluss wieder von 256 - 0
> richtig?

Brauchst du nicht.
Diese Farbräume sind kreisförmig geschlossen.

Hue ist ein 'Farbwert', der von rot über gelb über grün über cyan über 
blau über magenta wieder zurück zu rot führt.

ein Wert von 0 ergibt rot.
Ein Wert von HUW_MAX ergibt wieder rot.

Hast du sicher schon in deversen Malprogrammen gesehen: Ein Ring mit den 
Farben in dieser Reihenfolge.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren