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-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
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 :)
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.