Forum: Mikrocontroller und Digitale Elektronik RGB Led mit PWM und 120Grad vesatz


von Alex (Gast)


Lesenswert?

Zum kleinen Einstig in die Mikrocontroller wollte ich eine dieser 
Philips Stimmungslampen mit einem Atmega 8 | 32, selber nachbauen.
Die PMW Steuerung um die LEDs dunkler oder heller leuchten zu lassen 
kriege ich hin.
Aber das 120Grad versetzte Aufleuchten und Erlöschen der LEDs ist über 
die AVR Hardware überhaupt nicht machbar. Da jeder OCRnX seinen eigenen 
Counter braucht.
Zuerst dachte ich man kann die Zustände bei denen die OCRn schalten 
sollen in ein Feld 256 packen und  an verschiedenen Punkten Starten 
lassen.
Beispiel LEDs Helligkeit erhöhen:
1
for(tmp=0, tmp2=85; tmp<255; tmp++, tmp2++){
2
        OCR1A = pgm_read_word(&pwmtable_16[tmp]);
3
        OCR1B = pgm_read_word(&pwmtable_16[tmp2]);
4
        delay_ms(50);
5
        }
Leider funktioniert das nicht.

Kennt ihr irgendwelche Softwaretricks mit denen ein 120Grad versetztes 
aufleuchten doch Realist werden kann?

Oder ist das Überhaupt nicht möglich?

von hdd (Gast)


Lesenswert?

Erklärt doch bitte mal etwas genauer, was du mit 120 Grad versetzem 
Aufleuchten meinst, nicht jeder kennt das Produkt das du nachbauen 
willst.
Ansonsten könntest du auch über eine Software-PWM nachdenken, dann 
kannst du dir so viele Kanäle anlegen wie du Portpins hast...

von Alex (Gast)


Lesenswert?

Die Leds sollen so leuchten als ob sie mit an ein  UVW Drehstrom 
angeschlossen wären. (Spannung an Led 2 eilt um 120Grad zu Spannung an 
Led1 nach. Spannung an Led 3 eilt um 120Grad zu Spannung an Led2 nach.)

Wobei die Spannung nicht wirklich nacheilen soll. Sondern das Ein/Aus 
Verhältnis ist dem entsprechend immer anzupassen.

Das meine ich damit.

von Maulwurf (Gast)


Lesenswert?

Einen Durchlaufenden Zähler 0-90 und die LEd's passend mit PWM 
Einschalten

LED 1 bei 0-30
LED 2 bei 30-60
LED 3 bei 60-90

Gruss Bernd

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Maulwurf,
diese Idee hatte ich auch.
Aber es Klappt nicht.

Siehe code.
Ich hab versucht den code dementsprechend anzupassen aber ich scheitere 
bisher.

von Frank K. (fchk)


Lesenswert?

Alex schrieb:

> Oder ist das Überhaupt nicht möglich?

Mit dem passenden Controller schon. Es gibt welche, die speziell für die 
Motorsteuerung (BLDC, Umformer etc) gemacht sind, zB den 
dsPIC33FJ12MC202 (gibts bei Reíchelt für 3.05€). Die haben eine 6-Kanal 
PWM-Einheit, mit der das geht.

fchk

von Maulwurf (Gast)


Lesenswert?

Schreib doch mal was bei deinem Code nicht klappt


Gruss Bernd

von Nik B. (Gast)


Lesenswert?

1
void delay_ms( unsigned int ms )
2
{
3
    unsigned int  i;
4
    unsigned int  j;
5
6
    for ( i = ms;  0<i;  i-- )
7
    {
8
        for ( j = 51;  0<j;  j-- )
9
        {
10
    }
11
    }
12
}

Falls du GCC verwendest, denke ich dass dir diese zwei loops 
wegoptimiert werden. Somit wechseln deine Farben dann ohne delay.

ich würde <util/delay.h> includen und dann deine Funktion durch 
Folgendes ersetzen:
1
void delay_ms( unsigned int ms )
2
{
3
    unsigned int  i;
4
5
    for ( i = ms;  0<i;  i-- )
6
    {
7
        _delay_ms(1);
8
    }
9
}

von Flo (Gast)


Lesenswert?

Schau dir mal die Umrechnung von HSV in RGB an, z.B. hier: 
http://de.wikipedia.org/wiki/HSV-Farbraum. Die Grafik in der Mitte der 
Seite (Illustration der Zusammenhänge zwischen HSV- und RGB-Raum) zeigt 
wie deine 3 PWM Werte aussehen müssen. Die Suchfunktion heir im Forum 
liefert auch einige Ergebnisse dazu.
Gruß Flo

von Alex (Gast)


Lesenswert?

Danke allen für die Hilfe.
@Nik B.
Danke für den Tipp, habe aber die Optimierung schon ausgemacht.
@Flo
Guter Tipp. Anhand dieser Zeichnung versuche ich einen Code zu 
schreiben, müsste Klappen.
Ich setz mich jetzt dran.

von Axel S. (a-za-z0-9)


Lesenswert?

Moin,

Alex schrieb:

> Zum kleinen Einstig in die Mikrocontroller wollte ich eine dieser
> Philips Stimmungslampen mit einem Atmega 8 | 32, selber nachbauen.
> Die PMW Steuerung um die LEDs dunkler oder heller leuchten zu lassen
> kriege ich hin.
> Aber das 120Grad versetzte Aufleuchten und Erlöschen der LEDs ist über
> die AVR Hardware überhaupt nicht machbar. Da jeder OCRnX seinen eigenen
> Counter braucht.

Denkfehler deinerseits. Die Farb-"Rotation" eines solchen Moodlights 
läuft komplett in Software. Die PWM ist lediglich für das Dimmen 
zuständig und läuft um Faktor 1000..100000 schneller. Es ist allerdings 
sinnvoll, den PWM-Takt als Basistakt für das Auf- und Abdimmen der LEDs 
zu verwenden. Wenn man die Helligkeit einer LED mittem im PWM-Zyklus 
ändert kann es sonst nämlich zu häßlichem Flackern kommen.

Ich hab sowas als Fingerübung auch mal gebaut und hier dokumentiert:

Beitrag "noch ein AVR Moodlight"

Das Grundprinzip ist ähnlich, wie von anderen bereits beschrieben: ein 
Zähler Z wird alle 1..32 PWM-Zyklen um eins hochgezählt. Die 
Helligkeiten der LEDs ergeben sich dann aus dem Zählerstand und der 
Anzahl der Helligkeitsstufen. Z.B. für 100 Helligkeitsstufen könnte man 
von Z=1..100 die erste LED von 0 auf 99 aufdimmen, von Z=101..200 die 
LED wieder abdimmen, Z=201..300 die zweite LED aufdimmen etc. Praktisch 
wird man die einzelnen LED aber "überlappen" lassen, was nochmal einen 
Freiheitsgrad ergibt.

Siehe Funktion moodlight_step() in moodlight.c aus obiger Firmware. Da 
implementiere ich zwei Modi mit verschiedener Überlappung und einen 
Modus, der die 7 möglichen Farben hart durchschaltet.


Die Knackpunkte einer solchen Schaltung sind aber andere:

1. die Empfindlichkeitskurve des Auges ist logarithmisch. Man muß also 
für einen "schönen" Effekt eine nichtlineare Kennlinie implementieren 
(aka Gamma-Korrektur).

2. in Verbindung damit reicht eine 8-Bit PWM nicht mehr, weil man damit 
kaum mehr als ca. 50 Stufen schafft, was wiederum zu stufig ist.

3. für 3x 16-Bit PWM braucht man entweder einen XMega oder man muß es in 
Software machen.


XL

von Flo (Gast)


Lesenswert?

Die nichtlineare Kennlinie braucht man nur, falls man eine einzelne LED 
zwischen 0% und 100% Dimmen möchte. Bei Farbverläufen liefert eine 
lineare Änderung den schöneren Effekt.

von ausnahmsweise mal ein LoB (Gast)


Lesenswert?

Habe ich es richtig verstanden dass du die eine RGB LED sowohl in der 
Farbe sanft ändern willst, als auch gleichzeitig Faden willst?



p.s muss sagen, dass mir dieser thread und speziell die Antworten im 
Thread gefallen. Ausnahsmweise  wird hier scheinbar dem TO wirklich 
versucht konstruktiv zu helfen und es endet nicht in einem gegenseitigen 
Niedermachen, wie es leider hier immer öfter der Fall ist.

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.