Forum: Mikrocontroller und Digitale Elektronik RGB-LED mit PWM


von Ralf (Gast)


Lesenswert?

Hallo,

ich versuch hier grad ein Konzept zur Ansteuerung von RGB-Leds zu 
erstellen. Ich will(muss) mit Software-PWM arbeiten. Ich dachte, ich 
nehm einen Timer des Controllers, stelle ihn auf die PWM-Frequenz ein, 
lasse eine Variable mitlaufen, die ich dekrementiere, und wenn sie 0 
ist, dann setz ich den PWM-Ausgang auf Null, ansonsten auf Eins. Soweit 
so gut. Das ist aber ja nur ein Kanal, ich brauch ja drei. Also drei 
Variablen nehmen, auch kein Problem. Aber Problem: Erreiche ich jede 
Farbkombination, wenn die Eins-Phasen zum gleichen Zeitpunkt starten, 
oder müsste ich die drei Kanäle um 120° verschieben, damit das klappt?

Und das zweite Problem wäre, wenn ich z.B. eine 8x8-RGB-Matrix bauen 
will, wie berechne ich dann, wie schnell ich jede LED ansteuern muss? 
Wenn ich z.B. 100Hz Ansteuerfrequenz (also flackerfrei) erreichen will, 
muss ich ja dann mit mindestens 6,4Khz arbeiten, richtig? Oder 
Rechenfehler? Ich hab hier in der Suche schon einige Formeln gefunden, 
aber die sind mir noch nicht ganz klar.

Und dann wäre die Frage, ob sich das alles in einem Timer lösen lässt, 
oder lieber aufteilen auf zwei Timer, einer für PWM, der andere für 
LED-Matrix durchschalten.

Ralf

von Falk (Gast)


Lesenswert?

@ Ralf (Gast)

>ich versuch hier grad ein Konzept zur Ansteuerung von RGB-Leds zu
>erstellen. Ich will(muss) mit Software-PWM arbeiten. Ich dachte, ich

Da bsit du nciht der Erste.
Led-Matrix
PWM

>oder müsste ich die drei Kanäle um 120° verschieben, damit das klappt?

???

>Und das zweite Problem wäre, wenn ich z.B. eine 8x8-RGB-Matrix bauen
>will, wie berechne ich dann, wie schnell ich jede LED ansteuern muss?
>Wenn ich z.B. 100Hz Ansteuerfrequenz (also flackerfrei) erreichen will,
>muss ich ja dann mit mindestens 6,4Khz arbeiten, richtig? Oder

Wie kommst du auf 6,4 kHz?

Deine 8x8 Matrix steuerst du mit 800 Hz an, macht 100 Hz 
"Bildwiderholfrequenz". Die 800 Hz sind deine PWM-Frequenz, nur dass du 
jedes mal beim Umchalten auf eine neue Zeile die PWM-Werte dieser Zeile 
generieren musst. Ausserdem, was willst du mit PWM steuern? Die 
Gesamthelligkeit ALLER LEDs oder jede LED einzeln?

>oder lieber aufteilen auf zwei Timer, einer für PWM, der andere für
>LED-Matrix durchschalten.

Kommt drauf an. Ein Timer könnte bei richtiger Programmierung reichen.

MFG
Falk

von Fly (Gast)


Lesenswert?

Beitrag "HSV RGB Led Dimmer, C Code & Video & Doku"

So als Einstieg. Steuert aber nur eine RGB Led. Dafür alle möglichen 
Farbtöne  UND die Helligkeit :)

von Ralf (Gast)


Lesenswert?

@Falk:

Danke für die Links.

>>oder müsste ich die drei Kanäle um 120° verschieben, damit das klappt?
>???

Der Gedanke wg. Verschiebung war, dass bei drei "synchron" laufenden 
PWM-Kanälen ja eigentlich immer die Mischfarbe aus allen drei Farben an 
ist. Bei einer Verschiebung würde ich z.B. kurz rot (1.PWM), dann rot 
und blau(2.PWM), dann blau leuchten lassen. Ich glaube, dass ich damit 
eine bessere Darstellung bekomme. Aber ich muss es erstmal probieren.

>Wie kommst du auf 6,4 kHz?
64 LEDs x 100Hz, da ich jede LED einzeln ansteuern können möchte. Da 
drei PWMs mit 6,4Khz laufen.

> Deine 8x8 Matrix steuerst du mit 800 Hz an, macht 100 Hz
> "Bildwiderholfrequenz". Die 800 Hz sind deine PWM-Frequenz, nur dass du
> jedes mal beim Umchalten auf eine neue Zeile die PWM-Werte dieser Zeile
> generieren musst. Ausserdem, was willst du mit PWM steuern? Die
> Gesamthelligkeit ALLER LEDs oder jede LED einzeln?

Wie gesagt, eigentlich jede LED separat. Daher die 6,4Khz. Wie soll ich 
mit einem Timer eine PWM für acht Kanäle aufbauen? Der Multiplex für 
acht Zeilen ist mir klar, aber ich bräuchte bei 8 RGB-Kanälen ja 24 
Variablen und 24 Portpins. Ich dachte an einen Zeilen- und 
Spalten-Multiplex. Daher die 6,4Khz, 3 Variablen, 3 Pins für jeweils 
eine LED.

@Fly:

Danke, werd ich mal durchlesen.

Ralf

von Falk (Gast)


Lesenswert?

@ Ralf (Gast)

>Der Gedanke wg. Verschiebung war, dass bei drei "synchron" laufenden
>PWM-Kanälen ja eigentlich immer die Mischfarbe aus allen drei Farben an
>ist. Bei einer Verschiebung würde ich z.B. kurz rot (1.PWM), dann rot

Macht der Rest der Welt auch nciht so. Ist also unnötig.

>>Wie kommst du auf 6,4 kHz?
>64 LEDs x 100Hz, da ich jede LED einzeln ansteuern können möchte. Da
>drei PWMs mit 6,4Khz laufen.

Das ist falsch. Du willst zwar jede einzeln LED unabhängig steuern, d.h. 
aber nicht, dass du sie alle einzeln nacheinander steuerst. Das wäre ein 
64:1 MUX, das ist vollkommen unsinning und praktisch auch nicht machbar 
(Pulsströme). Bei einer 8x8 Matrix werden jeweils 8 LEDs parallel 
angesteuert, jede mit seiner individullen PWM-Einstellung. Dazu brauchst 
du 24 PWM-Kanäle, sind je 8x8 RGB-LEDs! Sinnvollerweise sollte man das 
dann etwas anders aufteilen, die 8x8x3 = 192 könnte man als 12x16 Matrix 
ansteuern, mit 16:1 MUX Verhältnis. Dann braucht man nur noch 12 
PWM-Kanäle. Ist aber auch schon happig das alles rein in Software zu 
machen. Ich würde nen CPLD als PWM-Generator benutzen.

>acht Zeilen ist mir klar, aber ich bräuchte bei 8 RGB-Kanälen ja 24
>Variablen und 24 Portpins. Ich dachte an einen Zeilen- und

Genau.

>Spalten-Multiplex. Daher die 6,4Khz, 3 Variablen, 3 Pins für jeweils
>eine LED.

Die 6,4 kHz sind Quark. Vergiss das wieder.

MFG
Falk

von maddin (Gast)


Lesenswert?

...das größte problem ist die farbtiefe:

du hast eine led matrix als bsp:

8 zeilen

24 spalten (Rot:8leds,Blau8leds,Grün8leds)

du willst sie mit 100hz wiederholfrequenz ansteuern, und jede farbe auf 
jeder led mit einer auflösung von 8bit getrennt einstellbar machen. also 
pro pixel 24bit farbtiefe, pro einzelner led 8bit.

wenn jetzt eine led gerade auf 1/256 helligkeit steht, und die nächste 
auf 256/256 sollen trotzdem beide mit 100 herz belegt werden.

dann sieht deine rechnung so aus:

für eine zeile:

100hz*256=25,6khz

für 8 zeilen:

25,6khz *8= 204,8khz

du benötigst 64*3*8bytes an speicher und wenn du das ganze mit ping pong 
realierst, dann also noch mal 2= 384Kbyte


das geht immer so weiter, es gibt hier schon so viele dieser 
beispielrechnungen....bei solchen eckdaten wird das ganze recht 
anspruchsvoll...hinzu kommen pulsströme datenverteilung im hintergrund, 
wobei viele eine serielle lösung anstreben, wenn man anfäng hier 
datendruchsätze zu errechnen wird einem die problematik erst richtig 
klar..

m.

von Falk (Gast)


Lesenswert?

@ maddin (Gast)

>du benötigst 64*3*8bytes an speicher und wenn du das ganze mit ping pong
>realierst, dann also noch mal 2= 384Kbyte

??? Wozu 8 Byte/LED?

>datendruchsätze zu errechnen wird einem die problematik erst richtig
>klar..

Deshalb ein PWM-IC in Form eines CPLD. Dann hat der AVR fast nix zu tun 
als mit 800 Hz jeweils ein paar Bytes nachzuladen, z.B. per SPI.

MFG
Falk

von ReiRaWB (Gast)


Lesenswert?

@maddin
>du benötigst 64*3*8bytes an speicher und wenn du das ganze mit ping pong
>realierst, dann also noch mal 2= 384Kbyte

Ich würde sagen, du brauchst 64*3*8Bit, also 192Byte, mit ping pong 
384Byte, nicht KByte.
Die Frequenzberechnungen sind IMHO korrekt für ein 8-fach Multiplexing. 
Daraus ergibt dann aber 24 PWM-Kanäle und das in Software ist schon 
etwas heftig.

Vielleicht sollte man bei dem Umfang überlegen, die PWM-Auflösung von 8 
Bit auf 6 Bit zu reduzieren, dann kommt man mit einem Viertel der 
Taktfrequenz aus.

Gruß Reinhard

von Εrnst B. (ernst)


Lesenswert?

Zu der CPLD-Lösung:

kriegt man denn 24 PWM-Kanäle in nem CPLD unter?
Grob überschlagen:
  1*  8bit Counter Wert
+ 24* 8bit PWM Wert
macht schon 200 FFs zum speichern der aktuellen Konfig.
Dann noch 24 Komparatoren, ein Zähler, das SPI-Interface...

von maddin (Gast)


Lesenswert?

@ReiRaWB

stimmt natürlich.... mit der Speicherangabe....

ich wollte nur darauf hinweisen, das eine 192kanal pwm mit jeweils einer 
auslösung von 8bit nicht ohne ist, wenn mann denn so will...

konzepte gibts genügend:

mann könnte für jede zeile 3 8bit register hintereinander schalten, das 
ganze 8 mal...

mann könnte das ganze muxen und direkt treiben, dann erspart man sich 
die zeit fürs schieben, benötigt aber wiederum 24+8 portpins.

man könnte einen parallax->propeller nehmen und jeden cog für eine zeile 
abstellen...

man könnte auch 3 avrs nehmen, sie über die zeilen synchronissieren, 
jeden für eine farbe, über spi verbinden, und die bitrate auf vielleicht 
4 bit pwm tiefe schrumpfen....

...


@falk,

wenn man die möglickeit hat einen cpld o.ä. zu verwenden, der nicht in 
einem bga steckt, únd sich mit 3 widerständen an einem pc mit 
kostenloser software programmieren lässt, eine verständliche prog 
sprache hat, und an jeder ecke zu bekommen ist -ist das eine geile 
lösung - ich habe mich noch nicht mit solchen dingern beschäftigt - 
gibts da was?

8byte pro led, also 8byte farbtiefe pro led (RGB)....


m.

von maddin (Gast)


Lesenswert?


von Εrnst B. (ernst)


Lesenswert?

maddin wrote:

> wenn man die möglickeit hat einen cpld o.ä. zu verwenden, der nicht in
> einem bga steckt, únd sich mit 3 widerständen an einem pc mit
> kostenloser software programmieren lässt, eine verständliche prog
> sprache hat, und an jeder ecke zu bekommen ist -ist das eine geile
> lösung - ich habe mich noch nicht mit solchen dingern beschäftigt -
> gibts da was?

Xilinx XC9500-Serie... in PC44/84 Gehäuse, mit 50ct Sockel auch auf 
Lochraster zu verwenden. Läuft mit 5V oder 3.3V. Programmierung über 
Parallelport-Adaptor. (Drei Widerstände könnten reichen, sonst kommt 
noch ein TTL-Treiber dazu...)
Programierbar mit dem Xilinx-Webpack. Das ist zwar Kostenlos, aber ein 
ganz schöner Brocken zum Runterladen.
Programmierbar mit VHDL / Verilog, oder durch zusammenklicken von 
Logik-Symbolen.

von maddin (Gast)


Lesenswert?

Oha,
das hört sich doch mal interessant an.

ob brocken oder nicht, ist zweitrangig...

hier mal ein bild von modulen die es schon gibt, das prinzip ist ähnlich 
- passiv. es befinden sich 2 256bit register auf dem rücken dieser 
displays.

http://www.trektech.de/ledpanel/ledpanel.htm

sie besitzen die anschlüsse red/green/cklock enable(select)/reset - 
keinen prozessor. sind dann dreifarbig, wenn mann sie allerdings ständig 
neu beschreibt, also quasi eine pwm erzeugt, bekommt man auch 
wunderschöne mischfarben helles gelb/ orange / usw... alles was man halt 
aus ROT/GRÜN so machen kann das sieht dann so aus:

http://www.marwedels.de/malte/index.html (klick auf LED Matrix) dann das 
animierte gif links - farbübergänge...

m.

von Falk (Gast)


Lesenswert?

@ maddin (Gast)

>ich wollte nur darauf hinweisen, das eine 192kanal pwm mit jeweils einer
>auslösung von 8bit nicht ohne ist, wenn mann denn so will...

Na mal langsam, es sind "nur" 24 Kanäle, ggf. sogar nur 12. Und 12 
PWM-Kanäle + SPI Hab ich schon mal in einen 72 Makrozellen CPLD gepresst 
(9572XL, 2,90 bei Reichelt).

>man könnte einen parallax->propeller nehmen und jeden cog für eine zeile
>abstellen...

Warum nicht gleich nen P4?

>wenn man die möglickeit hat einen cpld o.ä. zu verwenden, der nicht in
>einem bga steckt, únd sich mit 3 widerständen an einem pc mit
...

>Xilinx XC9500-Serie... in PC44/84 Gehäuse, mit 50ct Sockel auch auf
>Lochraster zu verwenden. Läuft mit 5V oder 3.3V. Programmierung über

Genau! Wobei die NICHT mit variabler Spannung arbeiten wie die AVRs. Die 
"alten" sind reine 5V Typen, die neuen (mit XL am Ende) sind reine 3.3V 
Typen (die vertragen aber 5V an den IOs).

>Programierbar mit dem Xilinx-Webpack. Das ist zwar Kostenlos, aber ein
>ganz schöner Brocken zum Runterladen.

Für 99% aller Hobbysachen braucht man NICHT die MONSTER-MEGA-HEFEKUCHEN 
Version 9.irgendwas. 6.3 ist relativ klein (~220MB + 260MB Service Pack, 
verstehe wer will) und stabil und programmiert bis Spartan3 400 alles.

MfG
Falk

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.