Forum: Analoge Elektronik und Schaltungstechnik TLC5940 und dessen Anschluss


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Roland B. (rolandb)


Lesenswert?

Ich möchte gerne ein Lauflicht mit Atemga8 und dem LTC5940 aufbauen. Die 
LED sollen an einer Kette nacheinander hochlaufen und dabei 
unterschiedlich "warm" flackern, wie kleine Kerzen. Nun finde ich diesen 
TLC recht praktisch dafür, denn er scheint alles genau zu können. Nur 
hätte ich noch einige fragen zum Anschluss und Betriebsmodi:

Betriebsmodi:

Es gibt zwei? Den GS (Grayscale  PWM Mode @12 Bit) und den DC (Dot 
Correction @6Bit) mode. Der Mode wird über DCPRG und VPRG eingestellt 
(0/1).

Ich denke mal der PWM Mode sollte für mich der richtige sein? Also muss 
ich über SW SPI 192 Bit schubsen. Nur muss ich jedes mal neue 192 Bit 
senden, wenn die nächste LED angehen soll?

Weiterhin verstehe ich das folgende nicht:
http://www.farnell.com/datasheets/85896.pdf
(Auszug aus DB)

"When the counter reaches a count of FFFh, the counter
stops counting and all outputs turn off. Pulling BLANK high before the 
counter reaches FFFh immediately resets the counter to zero."


Ich kann doch die PWM je Kanal einstellen? Heisst das, dass eine ausgeht 
und eine andere noch leuchten kann?

Hm, kurz zusammengefasst:

LED0 an ,192Bit senden, nur die Bits für LED0 füllen, die restlichen 0
LED1 an ,192Bit senden, nur die Bits für LED0&1 füllen, die restlichen 0
LED2 an ,192Bit senden, nur die Bits für LED0&1&2 füllen, die restlichen 
0

Dabei sollten alle unterschiedlich flackern. Also muss doch jede mit 
einem andern PWM Wert geladen werden?

mfg

von Benedikt K. (benedikt)


Lesenswert?

Roland Bumm wrote:

> Ich denke mal der PWM Mode sollte für mich der richtige sein?

Du brauchst beide: Mit Dot Correction stellst du den Strom ein, und mit 
PWM dimmst du die LEDs danach.

> Nur muss ich jedes mal neue 192 Bit
> senden, wenn die nächste LED angehen soll?

Nein, einmal reicht (außer man möchte die Helligkeit ändern).

> "When the counter reaches a count of FFFh, the counter
> stops counting and all outputs turn off. Pulling BLANK high before the
> counter reaches FFFh immediately resets the counter to zero."

So wie ich das verstanden (und umgesetzt habe), scheint es keine echte 
PWM zu sein, sondern eine Art programmierbares Monoflop:
Nach jedem Blank scheint die LED für die durch den PWM Wert bestimmte 
Dauer zu leuchten. Danach geht sie aus. Zumindest konnte ich bei mir 
solch ein Verhalten feststellen und das deckt sich auch mit obigem Satz.
Konkret heißt das also, dass man alle 4096 Takte Blank kurz aktivieren 
muss.

von Falk B. (falk)


Lesenswert?

@ Roland Bumm (rolandb)

>Es gibt zwei? Den GS (Grayscale  PWM Mode @12 Bit) und den DC (Dot
>Correction @6Bit) mode. Der Mode wird über DCPRG und VPRG eingestellt
>(0/1).

>Ich denke mal der PWM Mode sollte für mich der richtige sein?

Ja, er bietet mehr Auflösung für dein LED-Fading, ist aber ein wenig 
kompizierter.

>ich über SW SPI 192 Bit schubsen. Nur muss ich jedes mal neue 192 Bit
>senden, wenn die nächste LED angehen soll?

Nein, du musst sogar die 192 neu senden, wenn deine einzelene LED einen 
neuen Helligkeitswert annehmen soll.

>"When the counter reaches a count of FFFh, the counter
>stops counting and all outputs turn off. Pulling BLANK high before the
>counter reaches FFFh immediately resets the counter to zero."

Das Ding ist ein One Shot Counter, sprich ein Zähler der einmal 
durchläuft und dann stehen bleibt. Danach musst du ihn rückstetzten und 
kannst danach einen neuen PWM-Zyklus starten.

>Ich kann doch die PWM je Kanal einstellen?

Ja, über die 192 Bits.

> Heisst das, dass eine ausgeht und eine andere noch leuchten kann?

???

>LED0 an ,192Bit senden, nur die Bits für LED0 füllen, die restlichen 0
>LED1 an ,192Bit senden, nur die Bits für LED0&1 füllen, die restlichen 0
>LED2 an ,192Bit senden, nur die Bits für LED0&1&2 füllen, die restlichen
0

Ja, das geht so.

>Dabei sollten alle unterschiedlich flackern. Also muss doch jede mit
>einem andern PWM Wert geladen werden?

Ja. Für den Anfangs solltest du es erstmal mit dem Dot Correction Mode 
probieren, der ist einfacher.

MfG
Falk

von Falk B. (falk)


Lesenswert?

@ Benedikt K. (benedikt)

>> Ich denke mal der PWM Mode sollte für mich der richtige sein?

>Du brauchst beide: Mit Dot Correction stellst du den Strom ein, und mit
>PWM dimmst du die LEDs danach.

Nein, der IC kann nur den einen ODER den anderen, nicht beide 
gleichzeitig!
Der Maximalstrom wird über einen Widerstand eingestellt.

>Nein, einmal reicht (außer man möchte die Helligkeit ändern).

Was der OP ja wohl ausdrücklich will . . .

>So wie ich das verstanden (und umgesetzt habe), scheint es keine echte
>PWM zu sein, sondern eine Art programmierbares Monoflop:

Ist es auch.

MFG
Falk

von Roland B. (rolandb)


Lesenswert?

Ok danke euch beiden.

Also, ich brauche beide Modis.

@Benedikt

Ich möchte ja die Helligkeit steuern.
Die LED's sollen ja flackern wie Kerzen, und dabei die Kette mit ca. 
1,5sec/LED hochlaufen. Die vorhergehende LED soll anbleiben und zu jeder 
LED soll eine andere Flackerfrequenz herschen.

Also kann ich folgendes tun:

1. 16*6=96Bit senden
LED0 über DC einstellen (das lass ich immer konstant für LED0..15)
2. 16*12=192Bit senden
LED0 über GS den PWM0 Counter laden

dann 1.5 Sekunden warten:

1. 16*6=96Bit senden
LED0&1 über DC einstellen (das lass ich immer konstant für LED0..15)
2. 16*12=192Bit senden
LED0&1 über GS den PWM0 Counter laden

kann man so überhaupt erreichen das die unterschiedlich flackern?

mfg

von Benedikt K. (benedikt)


Lesenswert?

Falk Brunner wrote:
> Nein, der IC kann nur den einen ODER den anderen, nicht beide
> gleichzeitig!
> Der Maximalstrom wird über einen Widerstand eingestellt.

Dann sag das mal meiner 16x16xRGB Matrix, bei der ich das genau so 
mache...
Da geht das nämlich wunderbar. Wäre ja auch dumm für TI wenn es nicht 
gehen würde, denn genau so wird das IC angepriesen: Die Dot Correction 
(daher ja auch der Name) dient dazu um die LED Toleranzen auszugleichen, 
deshalb auch das EEPROM. Wenn alle LEDs aus die gleiche Helligkeit 
getrimmt sind, dann kann man diese per PWM dimmen.

Roland Bumm wrote:

> Also kann ich folgendes tun:
>
> 1. 16*6=96Bit senden
> LED0 über DC einstellen (das lass ich immer konstant für LED0..15)
> 2. 16*12=192Bit senden
> LED0 über GS den PWM0 Counter laden
>
> dann 1.5 Sekunden warten:
>
> 1. 16*6=96Bit senden
> LED0&1 über DC einstellen (das lass ich immer konstant für LED0..15)
> 2. 16*12=192Bit senden
> LED0&1 über GS den PWM0 Counter laden

Wieso 1,5s warten? Sagen wir mal du willst 200Hz PWM Frequenz, dann 
benötigt das IC rund 820kHz an GSCLK. Alle 5ms (=200Hz) muss Blank kurz 
aktiviert werden und falls notwendig neue Daten an das IC gesendet 
werden.

Der DC Wert muss nur einmal gesendet werden, danach wird die Helligkeit 
über die PWM Werte verstellt (man kann es natürlich auch umgekehrt 
machen, aber so hat der Hersteller das ursprünglich geplant).

von Maik F. (sabuty) Benutzerseite


Lesenswert?

Um mal ein bisschen Licht ins Dunkel zu bringen:

Die Dot Correction (DC) ist ursprünglich dazu gedacht, die 
herstellungsbedingten Helligkeitsunterschiede von LEDs permanent 
auszugleichen. Wenn man also nur eine LED pro Port des TLC5940 hätte, 
würde man bei der Inbetriebnahme die LED-Helligkeiten über die Dot 
Correction angleichen und diese Werte dann im EEPROM des TLC5940 
speichern. Für farbtreue Videodisplays etc. macht das auch Sinn.

Jetzt erst kommt die PWM ins Spiel: die individuelle 
Helligkeitssteuerung der LEDs funktioniert im Sinne von TI damit. Die 
LED wird über den via Dot Correction eingestellten Strom getrieben, 
solange der PWM-Wert das erlaubt. Das mit dem One Shot wurde ja schon 
vorher erläutert.

Man kann sich das allerdings auch zunutze machen, dass man für die PWM 
ja nie die vollen 12 Bit ausnutzen muss, man kann die Zähler ja schon 
via BLANK nach beliebigen Intervallen zurücksetzen. Wenn man also nur 
an/aus braucht, kann man auch eine 1-Bit-PWM bauen ;)

EDIT: juhu, Benedikt hat seinen Beitrag um die Informationen ergänzt, 
die ich hier gebe, während ich meinen geschrieben habe...

von Falk B. (falk)


Lesenswert?

@ Roland Bumm (rolandb)

>Die LED's sollen ja flackern wie Kerzen, und dabei die Kette mit ca.
>1,5sec/LED hochlaufen.

Dann musst du aber in den 1,5s mehrere Dutzend bis Hundert mal neue 
Daten in den IC laden.

>1. 16*6=96Bit senden
>LED0 über DC einstellen (das lass ich immer konstant für LED0..15)
>2. 16*12=192Bit senden
>LED0 über GS den PWM0 Counter laden

>dann 1.5 Sekunden warten:

Und wie soll die LED dann langsam gedimmt werden?

>kann man so überhaupt erreichen das die unterschiedlich flackern?

Nö ;-)

@  Benedikt K. (benedikt)

> Nein, der IC kann nur den einen ODER den anderen, nicht beide
> gleichzeitig!

>Dann sag das mal meiner 16x16xRGB Matrix, bei der ich das genau so
>mache...

OK, stimmt. ist nicht auf die Schnelle herauszulesen, muss man ein wenig 
genauer lesen und das Blockschaltbild anschauen :-0

MFG
Falk

von Roland B. (rolandb)


Lesenswert?

Aha, also da ist mein Denkfehler. Der LTC5940 kann von sich aus nur 
dimmen. Mit einem bestimmten Startwert, hinunter zu "0" Licht.
Den DC habe ich jetzt auch gerafft.

Also, wie bekomme man das flackern mit dem gleichzeitigen hochlaufen der 
LED? Also doch, mittels mehrfachen senden der GS Bytes?

mfg

@Benedikt

kannst du mir bitte mal den Stromlaufplan vom LTC Part senden? Oder hier 
posten. Laut dem Datenblatt müssen da FET's hinein. Hast du die drin?

von Falk B. (falk)


Lesenswert?

@ Roland Bumm (rolandb)

>Aha, also da ist mein Denkfehler. Der LTC5940 kann von sich aus nur
>dimmen. Mit einem bestimmten Startwert, hinunter zu "0" Licht.

NEIN! Er kann nun allein STATISCH den LEDs ein bestimmte Helligkeit 
geben. Wenn die sich zeitlich ändern soll, muss der uC das neu laden.

>Den DC habe ich jetzt auch gerafft.

Hab da meine zweifel.

>Also, wie bekomme man das flackern mit dem gleichzeitigen hochlaufen der
>LED? Also doch, mittels mehrfachen senden der GS Bytes?

JA!

>kannst du mir bitte mal den Stromlaufplan vom LTC Part senden?

Ist der so kompliziert? Gibts doch im Datenblatt.

> Oder hier posten. Laut dem Datenblatt müssen da FET's hinein.

Nur wenn man den EEPROM programmieren will. Wenn nicht einfach mit einem 
normalen IO-Pin schalten. DC Register kann man auch im uC im EEPROM 
speichern und nach dem Reset einfach in den TLC schreiben.

MFG
Falk

von Benedikt K. (benedikt)


Lesenswert?

Roland Bumm wrote:
> Also, wie bekomme man das flackern mit dem gleichzeitigen hochlaufen der
> LED? Also doch, mittels mehrfachen senden der GS Bytes?

Das Flacken usw. musst du alles selbst erstellen. Du sagst dem IC z.B. 
LED1 soll zu 1234/4096 leuchten. Das macht das IC. Alles andere musst du 
selbst machen. Den Flackereffekt musst du also irgendwie in Software 
berechnen, z.B. mit einem Zufallszahlengenerator.

> kannst du mir bitte mal den Stromlaufplan vom LTC Part senden? Oder hier
> posten. Laut dem Datenblatt müssen da FET's hinein. Hast du die drin?

Welche FETs? Meinst du die in Figure 22. Cascading Devices? Die sind nur 
zum Programmieren notwendig, das brauchst du nicht. Der VPRG Pin dient 
dann nur zum Auswählen zwischen DC und GS.

von Roland B. (rolandb)


Angehängte Dateien:

Lesenswert?

Cool, danke. Ansonsten ist ja da nicht viel drann. Alle Pins gehen an 
PortD des Atmega8.Ich werde den LTC auf ca. 35mA einstellen und mittels 
Poti feintunen. Kann man da nicht ein Poti für beide LTCs nutzen?
Beide bekommen nen 800er Widerstand gehen, dann aber über ein Poti?

Und das flackern via Software implementieren.


mfg

von Falk B. (falk)


Lesenswert?

@ Roland Bumm (rolandb)

>Dateianhang: v1_ltc5940.jpg (45,8 KB, 1 Downloads)

Bildformate!!!

>PortD des Atmega8.Ich werde den LTC auf ca. 35mA einstellen und mittels
>Poti feintunen.

Und wozu? das Ding kann MEHRFACH digital eingestellt werden, und du 
willst noch nen Poti dranbauen?

> Kann man da nicht ein Poti für beide LTCs nutzen?

Nicht unbedingt.

>Beide bekommen nen 800er Widerstand gehen, dann aber über ein Poti?

Wozu? Mach nen Festwiderstand dran und gut.

von Roland B. (rolandb)


Angehängte Dateien:

Lesenswert?

Naja, ich will das Teil einmal programmieren, einstellen und den Apparat 
verschliessen. Dann falls mir was nicht gefällt, etwas mit Poti 
nachstellen.
Das mit den durchschieben habe ich auch noch net gerafft. Aber ich 
denke, das ist dann eine SW Frage und keine HW technische.

@sorry fürs Bild. Werde PNG nächstes mal nehmen. Danke für den Hinweis 
falk.

Ach nochwas, ich finde den exakten Footprint nicht. Ist das ein schmales 
DIP28 Gehäuse oder ein breites? (300/600?)


danke und mfg
RolandB.

von Falk B. (falk)


Lesenswert?

@  Roland Bumm (rolandb)

>Dateianhang: ver1.png (7,8 KB, 0 Downloads)

PNG ist richtig, die Auflösung nicht. Das kann man nur schlecht lesen.

>Das mit den durchschieben habe ich auch noch net gerafft. Aber ich
>denke, das ist dann eine SW Frage und keine HW technische.

AVR-Tutorial: Schieberegister

>Ach nochwas, ich finde den exakten Footprint nicht. Ist das ein schmales
>DIP28 Gehäuse oder ein breites? (300/600?)

Keine Ahnung. Im Datenblatt stehts nicht :-(

MfG
Falk

von Roland B. (rolandb)


Lesenswert?

Danke für den Link, aber hier wird doch ein internes Schieberegister 
genommen, vom LTC und kein externes. Ich Meinte wie die Codefolge dafür 
aussehen muss, welche Pins also gesetzt werden müssen.

Mit dem Bild. Ist von KiCAD die Option "Plot to Clipboard" und dann in 
Irfanview reinkopiert. Dann einfach als PNG gespeichert. Werde mal 
schauen wo man bei Irfanview die Auflösung einstellen kann.


mfg

von Falk B. (falk)


Lesenswert?

@  Roland Bumm (rolandb)

>Danke für den Link, aber hier wird doch ein internes Schieberegister
>genommen, vom LTC und kein externes. Ich Meinte wie die Codefolge dafür
>aussehen muss, welche Pins also gesetzt werden müssen.

GENAU SO! Stell dich mal nicht so mädchenhaft an.

>Mit dem Bild. Ist von KiCAD die Option "Plot to Clipboard" und dann in

KiCAD = KinderCAD?

von Roland B. (rolandb)


Lesenswert?

Falk Brunner wrote:
> @  Roland Bumm (rolandb)
>
>>Danke für den Link, aber hier wird doch ein internes Schieberegister
>>genommen, vom LTC und kein externes. Ich Meinte wie die Codefolge dafür
>>aussehen muss, welche Pins also gesetzt werden müssen.
>
> GENAU SO! Stell dich mal nicht so mädchenhaft an.
>
>>Mit dem Bild. Ist von KiCAD die Option "Plot to Clipboard" und dann in
>
> KiCAD = KinderCAD?

:-) vergraul mal hier nicht die Mädels ;-)

KinderCAD ist gar nicht mal so übel, bisjetzt noch nichts negatives 
festgestellt.Naja, das ist aber auch ne andere Diskussion.


mfg

von Roland B. (rolandb)


Angehängte Dateien:

Lesenswert?

Habe den Schaltplan fertig. Denke er sollte so in Ordnung sein? 
Anregungen bzw Verbesserungen sind gerne erwünscht!


mfg
RolandB.

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.