3W RGB LED Controller mit AVR mega8

#847601
Lesenswert?

Hallo zusammen,

ich habe gestern abend mit der Hilfe von nem Kollegen meinen 3W RGB LED 
controller fertig gestellt.

Auf der Selbsterstellten Platine ist eine 3W ACULED von Perkin Elmer.
Die Led wird über PWM von einem mega8 indirekt angesteuert.
Die LED bekommt ihre Spannung/Strom von einem 500mA LEDtreiber von 
Infineon.

Die software wurde in C geschrieben und beinhaltet folgende modi:
-Blinken (weiss)
-dauerfarben (rgb, cyan, magenta, gelb)
-rainbow effekt

die software wird die tage noch angepasst und weitere modis hinzugefügt.

hier nun erstmal nen video wo die einzelnen modi gefahren werden.

http://de.youtube.com/watch?v=NxcDOgWYago

mfg nuss
Gast #847912
Lesenswert?

Hallo,

ich habe auch noch eine "nette kleine" RGB-LED (Seoul 3x1W oder noch 
bisschen mehr) herumliegen. Software hab ich dafür schon geschrieben, 
allerdings will die noch nicht so recht.

Da die LED wirklich bestialisch hell ist, läuft per Software ein 14-Bit 
PWM mit >500Hz (ich bin ziemlich flacker-empfindlich).

Problem ist: der PWM läuft alles andere als sauber.
Ich verwende ähnlichen Code wie das fnordlicht, nur funktioniert meiner 
nicht ;)
Meine Software stellt den 16-Bit-Timer jeweils auf die Pause zur 
nächsten PWM-Position ein und wenn diese erreicht wurde (IRQ), wird die 
LED geschaltet.
Das große Problem an der Sache: wenn zwei PWM-Positionen relativ nah 
beieinander liegen, kommt die Farbe falsch bzw. der PWM schmiert mehr 
oder weniger ab. (ist schon bisschen länger her).

Wenn interesse besteht, kann ich den Code mal posten. Bzw. hat jemand 
von euch PWM-Code (am liebsten natürlich C bzw. ASM mit C-Interface ;) 
), der den hohen Anforderungen (3 Kanäle, 12-14 Bit, >500Hz Frequenz) 
entspricht?

Viele Grüße

hownottobeseen
Gast #848647
Lesenswert?

... hm, schlechtes video mit nichtfunktionierender SW (kein sanfter 
farbübergang etc) - worin besteht jetzt der sinn dieses postings, 
julian?

(falls du es nicht verstehst-ich für meinen teil kann gleich 50 ähniche 
postings schleudern, mit meinen nicht gelungenen entwicklungen)
Gast #848705
Lesenswert?

Hey mann der arme Julian! Er wird doch wohl stoltz sein können und sein 
krelles Lämpchen posten dürfen! Früher im Sandkasten haste auch nicht 
einfach jemanden rausschmeißen können, denn sonst wäre(diesmal ohne h) 
die liebe Mami gekommen und hätte dich "geschimpft".
Ich erinnere mich aber, dass man gespielt hat. Naja

Kommt das Lämpchen noch irgendwo rein, oder bleibt die so nackig, wie 
sie von meinem CRT aus schimmert.

>(falls du es nicht verstehst-ich für meinen teil kann gleich 50 ähniche
>postings schleudern, mit meinen nicht gelungenen entwicklungen)

Also ich kann dir eher mehr Funktionierende Entwicklungen posten, als 
misslungene. Ich weis ja nicht wie schnell du aufgibst...

lovely greets
#849535
Lesenswert?

vielen dank für euren sehr geistreichen kommentare. was hätte ich 
anderes erwarten sollen?

aber naja für die, die sich hier konstruktiv geäußert haben:
ich hab den farbverlauf einfach "irgendwie" programmiert halt so wie ich 
es für schön empfunden habe.

ja die kamera mit der das aufgenommen wurde ist lausig(vga eben).

kennlinie des mennschlichen auges? ;) was ist das^^

so hier noch mal nen anderes video:
http://de.youtube.com/watch?v=nJFG2ezx3sY

foto von der platine:
http://img135.imageshack.us/img135/7329/dsc00376cy9.jpg

ich freu mich auf brauchbare antworten :)
Gast #849651
Lesenswert?

z.B. Hier:

DDRB muss gesetzt werden ob Eingang oder Ausgang. Dabei von links nach 
rechts PB0 bis PB6. 1= Ausgang; 0=Eingang.
PORTB definiert ob der Eingang an den interne Pullup geschalten wird 
oder nicht.
!(PINB & (1<<PB4)) = Abfragen von Taster High or Low
Pin zu High: PORTB |= (1<<PB4);
Pin zu LowL: PORTB &= ~(1<<PB4);

So mit dem kann man nämlich arbeiten.

Jetzt wie sieht das für den ADC aus? Eventuell könnte mir jemand ein 
kleines Beispielprogramm senden? Ein Analoger Eingang schaltet ein 
Ausgang ab einem gewissen Bitwert. Ist das so viel verlangt?



1
int main (void) {           
2
 
3
     DDRB = 0b11101111;             // Pin 3 = Eingang
4
     PORTB = 0b00010000;             // Pin 4 = LOW
5

6

7
while(1) {               
8

9

10
  if ( !(PINB & (1<<PB4)) ){
11

12
    PORTB |= ( (1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3) );
13
  
14
    }
15

16
  else {
17
    PORTB &= ~( (1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3) );        //Pin 4 Einschalten
18
    }
19

20
}
21
                          
22
    return 0;               
23
}
Gast #849801
Lesenswert?

>Ey BATBAT

>Was funktioniert denn da nicht? Also ich sehe da ein laufendes programm. >Nur 
weil du 50 Projekte hast die nicht funktionieren brauchst du keine >andern Dumm 
anmachen weil die es geschaft haben ;).

Also beim 2. Video sieht man den Farbwechsel schon besser.

Hab nur mal so eine frage, bringt es das denn eine PWM mit 10 oder 14 
bits zu machen? Also ich habe ja schon bei 8bit pro farbe insgesammt 
eine Farbauswahl von 16,7 Mil farben.
#849808
Lesenswert?

Zippi wrote:

> Hab nur mal so eine frage, bringt es das denn eine PWM mit 10 oder 14
> bits zu machen? Also ich habe ja schon bei 8bit pro farbe insgesammt
> eine Farbauswahl von 16,7 Mil farben.

Also hier nochmal der Link: LED-Fading

Das Auge nimmt Helligkeiten logarithmisch wahr, d.H. du musst eine 
exponentielle Kennlinie fahren um den Anschein einer Linearen 
Leuchtkraftzunahme zu erzeugen.

Um diese Kennlinie sauber auf die PWM zu kriegen braucht man ne hohe 
Auflösung.

Vielleicht so einfacher zu verstehen:

zwischen 1% und 2% PWM Einschaltdauer der LED kann man einen STARKEN 
Unterschied sehen. Zwischen 99% und 100% sieht man KEINEN Unterschied.

Du hast dann zwar theoretisch 16.7mio Farben, aber nur vielleicht 1000 
davon sind für nen Menschen unterscheidbar.
Gast #849829
Lesenswert?

OK THX Ernst,

aber dafür brauch ich keine 10 bit. Das geht auch mit 8bit wunderbar. OK 
mit 8 bit kann ich knapp 0,4 % verändern und mit 10bit 0,1% der 
helligkeit. Doch weniger als 0,1% nimmt man warscheinlich nur sehr sehr 
schlecht war. also 14bit wären ja 0,006 % änderung. Ich denke, dass das 
schon etwas übertrieben ist.
Gast #849849
Lesenswert?

Hallo,

Zippi schrieb:
> also 14bit wären ja 0,006 % änderung. Ich denke, dass das
> schon etwas übertrieben ist.

das dachte ich auch ;)
ich hab auch mit 8 Bit angefangen, war ja ganz nett, aber: bei höchstem 
Strom und bei maximaler PWM-Helligkeit brennt es einem die Netzhaut 
runter.
Das andere Extrem (16 Bit) war bei 16 MHz-CPU-Takt zu langsam, man sah 
es durchweg flackern.

Nachdem das Ding bei mir später im Alltagseinsatz (Wohnzimmer, tagsüber 
hell, abends dunkel) ist, soll natürlich ein hoher Dynamikumfang da sein 
;)
Deswegen hab ich mich mal pauschal auf 12-14 Bit eingeschossen.

Mein letzter (vergeblicher) Versuch waren entweder 12 oder 14 Bit, das 
sollte für eine Kennlinie und für den erweiterten Helligkeitsraum dicke 
reichen.

Die LED(s) bei mir ist/sind übrigens die hier: 
http://www.dianaelectronic.de/faq/F50381.pdf

Kann ich nur empfehlen! Sind zwar ziemlich teuer aber machen ziemlich 
Druck ;)

Viele Grüße

hownottobeseen

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