Guten Morgen,
ich fange zur Zeit mit einem neuen Projekt an und stehe noch am Anfang
der Planung, bei der Basisfrage welche Hardware.
Nun erstmal zu meinem Projekt...
Ich widme mich dem schon oft behandelten Thema LEDs via PWM via DMX
dimmen.
Das ganze geht in Richtung von RGB-Panels bzw RGB-Matrixen.
Meine Grundidee sind kompakte Module mit 4x4 RGB-Leds.
Jetzt stehe ich ich vor der ersten Entscheidung:
- Die Leds direkt über einen Treiber ansteuern
- Die Leds per Multiplexing ansteuern
- Die Leds mit Treibern ansteuern die zB am I²C Bus hängen
Soo, alle Varianten haben ihre Vor- und Nachteile. Die erste Vari.
brauch sehr viele Ports, die zweite brauch weniger Ports aber mehr
Hardware und ist langsamer(???) und die Dritte fand ich am Scnhönsten,
wobei ich dann doch einen Schock bekam als ich bei Maxim den Preis für
diese Treiber gesehen habe. Dort war es ein 24 Kanal Treiber der seriell
angesteruert wird, diese kostesn bis 24 Stück aber rund 29 Dollar pro
Stück.
Also fällt die Dritte schon mal raus, leider.
Ich bin mir nicht mehr genau sicher ob ich das mal richtig verstanden
habe, aber wäre das Multiplexing hier noch ratsam oder ist es wirklich
zu langsam?
Weiter will ich ein relative hohe PWM-Auflösung erreichen, sprich nicht
die oft gesehenen 8Bit sonder eher 10-16bit, umso mehr umso besser.
Mit PWM habe ich noch keine Erfahrung, deswegen kann ich den mehr
Aufwand nicht einschätzen, darum frag ich nun auch hier ;-)
Was ich nun hier erwarte?
Erwarten erstmal nichts, ich hoffe das mir ein paar der µC- und
Elektronik-Gurus hier mir ein paar Starthilfen geben können. Mich etwas
beraten können was die Hardware angeht und Denkanstöße für die Software.
Hochachtungsvoll
Philipp
PS.: Die Schaltungen von Henne ( hölscher ) kenne ich bereichts und
benutze ich selber schon ;-)
Guten Morgen,
ich habe ganz vergessen genau zu sagen wie viele Kanäle es dann sind.
Also 4x4 RGB also 48 Leds müssen unabhängig von einander gedimmt werden
@Sebastian
Hardwareseitig sind es dort auch "nur" 4 bzw. 6 PWM-Kanäle und insgesamt
muss ich auf 48 hoch.
Sprich da müsste ich dann auch wieder via Software PWMen, also habe ich
doch keinen Vorteil darauß oder sehe ich das falsch?
Software-PWM ist nur eine Frage der Rechenleistung bzw.
Ausführungsgeschwindigkeit. In einer Timer-Interruptroutine müssen eben
die hier dann softwaremäßigen "Compare-Register" mit dem Zählerstand
verglichen werden und die Ausgänge ggf. geschaltet.
Bei 48 Kanälen kann aber, wie an anderer Stelle igrendwann mal erwähnt,
ein CPLD sinnvoll sein, um die PWM-Logik aus dem Mikrocontroller
auszulagern. Erhöht den Aufwand aber wesentlich.
Wenn es kein Atmel sein muß... ein MSP430F147 (oder F149, wenn man mehr
Speicher braucht) kann immerhin 10 Kanäle bei 16 Bit, durch zwei Counter
mit zusammen 10 Compare-Registern.
Hey,
also ich würde sehr gerne im Atmel-Lager bleiben, da ich dort schon ein
wenig Erfahrung habe.
Es gibt auch große Atmegas mit 6 und mehr PWM Kanälen.
Aber die Hardware PWMs haben doch nur den Vorteil das ich diese nicht
mehr per Software machen muss, oder?
Sprich bei 8 Hardware-PWMs muss ich nur noch 42 via Software machen
oder?
was spricht gegen Multiplexing?
Da brauchst du nur 12 Ports.
48 LEDS direct an nen µC zu hängen ist der toatale Overkill.
ich würde 4 spalten and den µC hängen (je nach Strom natürlich einen
Treiber dazwischen) und die 4 Zeilen (auf jedenm Fall über Treiber)
über ein shift register ansprechen, wo du eine 1 durchwandern lässt.
macht dann 14 Ports.
Bei nur 4 Zeilen könntest du aber auch direkt an den µC hängen, da
brauchst du 16 Ports
Bei insgesammt nur 16 LEDs könntest du aber auch immer nur eine mit 3
Ports ansprechen und die selection mit 2 gekoppelten Shiftregistern
machen.
da reichen sogar 5 Ports.
musst halt je nach Variante die Vorwiderstände anpassen, aber auch auf
den spezifizierten maximalen Pulse-Strom der LED achten.
Als treiber würde ich dir den uln2003A (hat leider nur 7 chanäle, aber
die 8er variante ist unverhältnismäßig teurer, oder kaum zu bekommen)
und für die andere Seiten den udn2981 (oder TD62783AP, ist baugleich
aber billigeR) empfehlen.
Schieberegister 74X164 (am besten HCT, LS tuts aber auch)
http://www.reichelt.de/?ARTICLE=22008http://www.reichelt.de/?ARTICLE=22069http://www.reichelt.de/?ARTICLE=3332
Alles sehr günstig, aber eine Bestellung nur deswegen lohnt sich halt
nicht.
Zusatz, was hast du davon, wenn du leds mit einer größeren PWM als 8bit
ansprichst? dein Computer zeigt die normalerweise auch nur 256
Helligkeitswerte pro Farbe. die zusätzlichen zwischenstufen bei einer
10,12 oder 16nit PWM siehst du bei LEDs sowiso nicht.
Noch was zum Thema SoftwarePWM:
Langsamer schon, aber das is relativ, (keine ahnung was du noch machen
willst.
wenn du 150Hz erreichen willst mit 4 Multiplexkanälemusst muss deine
Timer ISR etwa 600Hz haben (mehr schaded nie;)
bei 8Mhz Taktfrequenz:
8000000Hz/256 = 31250Hz (bei 256 läuft der Timer über und die IST wird
aufgerufen)
Das heißt du kannst einen Timer Prescaler von 32 nehmen (falls es den
gibt)
dann würde die ISR 8000000Hz/32/256 = 976 mal pro sek aufgerufen
also alle 8192 Takte, die IST braucht schätzungsweise höchstens
300Takte, das heißt die bleiben 8000 Takte zwischen 2 ISR aufrufen.
Das macht eine auslastung von 300*976/80000000 = 0,036 = < 3%
Die Pwm ist ganz simple:
nc = anzahl Multiplexkanäle
ledpmc = anzahl LEDs pro Multiplexkanal
du setzt einen Timer auf, der mindestens 150Hz*nc hat
außerdem brauchst du einen globalen uint8 Zähler (nenen wir in
uint8 pwmStep = 0; ) für die PWM
dann einen globalen Zähler für den aktuellen multiplex-kanal
uint8 plex = 0;
sowie für jede LED einen PWM Vergleichswert
uint8 ledDutycycle[AnzahlLEDs]; der mit dem PWM-Wert beschrieben werden
muss
die ISR sollte dann so aussehen:
(Beispiel 8bit PWM)
plex inkrementieren
wenn plex>=nc dann
plex = 0;
1 in shiftregister schieben:
shift-reg data pin auf 1
pwmStep incrementieren (überlauf nicht abfangen)
sonst
shift-reg datapin auf 0
shift-reg clock pin auf 1 und wieder zurück
für alle LEDs pro multiplex-kanal schaeun, ob der wert größer oder
kleiner dem PWM wert ist udn ab oder anschalten.
for(i=0;i<ledpmc ;++i)
switchOnSpalte(i, ledDutycycle[ledpmc * plex + i]<pwmStep);
@ Philipp (Gast)
>Ich widme mich dem schon oft behandelten Thema LEDs via PWM via DMX>dimmen.
Hab ich mal gemacht, 20 Kanäle per Soft-PWM über DMX gesteuert. Ein
ATmega16war das Arbeitstier.
>Ich bin mir nicht mehr genau sicher ob ich das mal richtig verstanden>habe, aber wäre das Multiplexing hier noch ratsam
Ja, aber nicht zwingend.
> oder ist es wirklich>zu langsam?
Nein.
>Weiter will ich ein relative hohe PWM-Auflösung erreichen, sprich nicht>die oft gesehenen 8Bit sonder eher 10-16bit, umso mehr umso besser.
Jaja, dise Jugend . . . ;-)
>beraten können was die Hardware angeht und Denkanstöße für die Software.
Ein guter Kompromiss sind die TLC5921 & Co. Die kosten um die drei Euro,
sind relativ gut beschaffbar und können 16 LEDs per 12 Bit PWM steuern.
Was will man mehr. Dann reicht ein kleiner ATtiny2313 als DMX Empfänger,
der dann die TLC per SPI füttert.
MFG
Falk
Moin,
mhm ok an sowas dachte ich am Anfang ja auch, war lediglich von dem
Preis bei Maxim etwas geschockt.
Das nächste Problem wäre dann nun, das ich mit SPI noch weniger gemacht
habe, was heißt garnichts ;-)
Kannst du mir grob sagen wie eine Ansteuerung der Treiber grob aussehen
würde?
@ Philipp Weber (jppweber)
>Kannst du mir grob sagen wie eine Ansteuerung der Treiber grob aussehen>würde?
Sehr einfach, die Daten werden seriell in den IC getaktet.
Etwa so.
AVR-Tutorial: Schieberegister
Das Datenbaltt sagt es dir genau.
MFg
Falk
Hey Leute,
hat jemand sich schon mal weiter damit beschäftigt? Also sprich mit dem
MBI5030 in Verbindung mit dem Atmega und DMX. Gibts da was neues? Wie
ist der aktuelle Stand?
Mfg
Chris