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
@ 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-MatrixPWM>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
@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
@ 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
...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.
@ 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
@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
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...
@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.
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.
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.
@ 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