PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 16Bit Software PWM XMEGA



Thalhammer
07.02.2013, 15:50
Hallo,
Ich plane aktuell einen RGB LED Kontroller auf Basis eines Xmegas.
Konkret geht es um einen Xmega32A4.
Dieser besitzt zwar 16 Hardware PWM, Da ich jedoch 14 Leds ansteuern will (Also 42 Kanäle) bräuchte ich dann 3 Xmegas.
Da ich an jedem der Xmegas noch 12 Pins (PORTa und B) freihab dachte ich an eine Software PWM.
In dem Fall hätte ich pro Kontroller 28 Kanäle und bräuchte somit nurnoch 2, bei denen ich auch noch jede Menge frei hab.
Jetzt stellen sich allerdings einige Probleme:
Zum einen möchte ich die Komplette 24bit Farbpalette möglichst Fehlerfrei darstellen können, weshalb ich aufgrund der Gammakorrektur mind. 16 bit brauch, zum anderen möchte ich schnelle Farbänderungen möglich machen, weshalb die Frequenz mind. 50Hz betragen sollte.
Ist das mit den 32MHz des Xmegas machbar oder fordere ich zuviel ?
Der xmega hat ja 5 16bit Timer. Könnte man nicht die 28 Kanäle aufteilen, sodass jeder Timer einen Port behandelt ?
Ich habe nochnicht damit gearbeitet, aber währe es nicht irgendwie möglich den DMA für sowas zu verwenden ?

MFG Thalhammer

robin
07.02.2013, 17:43
Wird nicht funktionieren, denn du hast nur 10 Takte Zeit Pro PWM Wert. Im worstcase (Werte gleich an verschiedenen Ports und nächster Wert +1) wird es nichts.

Selbst mit Assembler wird es nichts, gerade wegen dem worst case. (kam auf ca. 10 Takte pro Port) für die ISR des Timers du hast aber wie gesagt nur 10 Takte Zeit, dann ist der Wert falsch.

DMA sollte auch nicht gehen, da nicht zuverlässig genug (CPU ist vorrangig auf dem BUS)

Abhilfe könnte ein externer I2C 16bit LED Controller schaffen.
- leider nur 12bit http://www.ti.com/lit/ds/symlink/tlc5946.pdf sollte es aber auch mit 16bit geben

Thalhammer
07.02.2013, 18:31
Was externes mit 16bit hab ich nicht gefunden, und schon garnichts was erschwinglich ist.
Grundsätzlich muss man aber nicht 16 bit erzeugen, sondern nur 8 bit mit 16 bit abstufung.
Was ich damit meine ist folgendes:
Wenn man im Speicher ein Array mit 256 Elementen anlegt, das den Status der Ports enthält, und dann den DMA per Timerauslösen lässt (falls das geht),der die vorbereiteten Daten dann in den IO Bereich kopiert sollte das doch gehen oder ?

//EDIT:
Anscheinend giebts sowas ähnliches (für standard avr) schon:
http://www.mikrocontroller.net/topic/149701
Habs zwar noch nicht getestet, aber die Idee klingt gut.

//EDIT2:
Grundsätzlich sollten auch 25hz reichen (das auge "kann" ja ohnehin nur um die 15)
In dem Fall sollte aber dann Scrambled PWM drin sein, damit kein Flackern entsteht.
Dann hätte man 20 Takte in der ISR.

robin
07.02.2013, 20:22
was meinst du mit 8 Bit mit 16 Bit Abstufung?

Thalhammer
07.02.2013, 22:17
Nun ja ich brauche eine 16bit pwm, einstellbar müssen aber nur die 256 gammakorrigierten werte sein.
Wodurch man die Bitmuster für die Ports im Speicher halten kann.
Am Anfang setzt man einen Pointer auf Null und erstellt ein Array mit 256Elementen im RAM. In der ISR muss man dann nur den Wert an der Zeigerposition ausgeben und den Zeiger erhöhen. Ich blick durch diesen ganzen DMA Zeug noch nicht durch, aber der DMA erzeugt ja einen Interrupt sobald er fertig kopiert hat.
In dieser ISR lädt man dann den neuen Wert als Source und wartet darauf, das der DMA wieder durch den Timerinterrupt gestartet wird.
Das ganze sollte doch in 10-15 Takten machbar sein oder ?