Forum: Mikrocontroller und Digitale Elektronik ATMega328, TLC5940 und SPI Kabellänge, Ringing Problem


von A. L. (vantage)



Lesenswert?

Ich baue gerade eine (räumlich) etwas grössere LED Installation 
basierend auf dem ATMega328, 4 Boards mit je 3 TLC5940NT und insgesamt 
50 RGB Leds auf. Ein einzelnes TLC Board mit 3x TLC5940 steuert jeweils 
15 RGB Leds an. Bedingt durch den Aufbau haben die TLC Boards einen 
recht grossen Abstand von 110 cm zueinander, d.h. ich habe insgesamt 380 
cm Kabellänge vom Arduino zum letzten Board (3x110cm+50 cm).

Da ich mir keine wirklichen Gedanken über den SPI Bus und die Länge 
gemacht habe, bekomme ich nun die Rechnung in Form von deutlichem 
Ringing im Signal. Angehängt sind zwei Beispiele der GSCLK mit 4 MHz, 
einmal vom Arduino zum Ende eines 20 cm Flachbandkabels , einmal mit 110 
cm.

Bei der Suche im Forum habe ich einen hilfreichen Beitrag unter 
Beitrag "SPI Reichweite" gefunden.
D.h. ich würde als nächstes hinter dem ATMega Ausgängen Widerstände für 
die Impedanzanpassung einbauen (und den Wert empirisch über ein Poti und 
Scope rausfinden).

Frage, die Werte für den RC Snubber sind mir nicht klar, wie kann man 
die ermitteln?

Zweite Frage, habe ich mit der Buslänge überhaupt eine Chance, das 
passiv in den Griff zu bekommen? Oder alternativ Leitungstreiber bei 
jedem Board verwenden? (74...?)

Für Falk:
[X] Ja, ich bin mir mittlerweile darüber bewusst, das SPI nicht für 
solche Kabellängen gedacht ist :)

von A. L. (vantage)


Lesenswert?

So, mit 72 Ohm bekomme ich schon 160 cm hin (TLC Board mit 3 TLC5940) 
nach 110 cm, dann noch ein 60 cm FB). Der RC Snubber mit 480 Ohm und 
0,1uF auf Masse legt mir allerdings das Signal auf Null, den habe ich, 
bis ich die Berechnung herausgefunden habe, erstmal rausgenommen.

Die Peaks vom Ringing sind weg, allerdings nähert sich das 4 Mhz GSCLK 
Rechteck jetzt einem Sinus, lässt sich das vermeiden?

von holger (Gast)


Lesenswert?

>Die Peaks vom Ringing sind weg, allerdings nähert sich das 4 Mhz GSCLK
>Rechteck jetzt einem Sinus, lässt sich das vermeiden?

Geh von 4MHz auf 100kHz runter.

von A. L. (vantage)


Lesenswert?

Müsste ich mal ausprobieren, ich befürchte daß ich dann die Datenrate 
für die Updates der 150 Leds nicht mehr hinbekomme.

von holger (Gast)


Lesenswert?

>Müsste ich mal ausprobieren, ich befürchte daß ich dann die Datenrate
>für die Updates der 150 Leds nicht mehr hinbekomme.

Dann mach doch das Kabel kürzer.
Oder überdenke dein Konzept.
Das SPI für lange Leitungen nicht taugt hast du ja schon erkannt.

von Falk B. (falk)


Lesenswert?

Ich werfe mal das Stichwort Wellenwiderstand in die Runde

uuuups, ist schon spät

von Marcus O. (marcus6100)


Lesenswert?

Flachbandkabel ist irgendwie nicht so richtig geeigenet. Probier doch 
mal Antennenkabel o.ä. mit richtiger Anpassung.

von Falk B. (falk)


Lesenswert?

@  Marcus Overhagen (marcus6100)

>Flachbandkabel ist irgendwie nicht so richtig geeigenet.

Falsch, das geht wunderbar bis mehrere Meter. Man muss "nur" wissen was 
man tut.

> Probier doch mal Antennenkabel o.ä. mit richtiger Anpassung.

Klar, am besten noch RG213!!!

von Anja (Gast)


Lesenswert?

Hallo A. L.

eine Serienterminierung am Sender geht nur wenn du genau einen Empfänger 
am Leitungsende hast.
Ansonsten ergeben sich bei den Empfängern die in Kabelmitte angeordnet 
sind leider unschöne Treppenspannungen die normalerweise genau an der 
Schaltschwelle liegen.
-> Du brauchst dann mindestens Schmitt Trigger-Eingänge für die 
Empfänger in der Mitte.


Ich würde wie folgt vorgehen.
Keine Serienterminierung am Sender.
RC-Terminierung (Snubber) am Leitungsende.

Dimensionierung wie folgt:
R ca 10-20% oberhalb vom Wellenwiderstand der Leitung.
Ziel ist eine Steile Flanke zu erhalten. Es ergeben sich geringe 
Überschwinger die halt unterhalb der Schwellspannungen der 
Eingangsschutzdioden liegen müssen.
also R rund 120-150 Ohm je nach Wellenwiderstand des Flachbandkabels
(Ich gehe davon aus daß Signal-und Masseleitung auf benachbarten 
Leitungen im Flachbandkabel geführt sind ansonsten wird es nichts mit 
dem Wellenwiderstand).

R*C = ca 2*Leitungslaufzeit.
bei 3,3m schätze ich mal so 16,5ns als einfache Leitungslaufzeit.

also C mit ca 33ns/150 Ohm = ca 220pF

100nF sind bei weitem zu viel und bügelt das Signal unnötig weg.

von Anja (Gast)


Lesenswert?

mal ne andere Frage:

hängen die TLCs ohne Buffer an der Leitung
oder gibt es Schmitt-Trigger-Buffer bei den Empfängern.

(Große Kapazitive Lasten am Kabel stören die Übertragung ebenfalls).

von A. L. (vantage)


Lesenswert?

Anja, danke für Deine ausführliche Antwort zum RC Snubber. Ich hab das 
Posting leider erst jetzt gelesen, und vorher die uC Platine schon mit 
Serienterminierung ausgestattet, das probiere ich jetzt erstmal aus und 
schau mir das mit dem Scope an. RC Snubber kommt als nächstes dran.

Die TLCs haben keinen Buffer, die Eingänge hängen direkt über das FB 
(momentan über Serienterminierung) am AVR uC. Als nächstes lese ich mir 
Falks Links zum Wellenwiderstand durch, spannend.

Danke nochmal an alle, dank der Inputs komme ich sehr gut voran :)

von A. L. (vantage)


Angehängte Dateien:

Lesenswert?

p.s. Holger, Kabel kürzen wird ein Problem, siehe Anhang, 4 Meter x 2 
Meter sind Vorgabe :)

von Anja (Gast)


Angehängte Dateien:

Lesenswert?

Hallo A. L.

habe das ganze mal mit LT-Spice (näherungsweise) simuliert.

Beim Arduino gehe ich mal davon aus daß es ein Mega328 ist und du Ihn 
mit 3,3V betreibst (siehe Dein Oszibild).

Laut Datenblatt ergibt sich dann ein "Treiberinnenwiderstand" von ca 30 
Ohm.
Die 3 Empfänger/Leiterplatte habe ich (mit Verdrahtung) als 15pF 
angenommen. (sitzen sicher nicht alle direkt am Stecker). Die 
Flachbandleitung habe ich mit 120 Ohm und Verkürzungsfaktor 0.7 
angenommen.

Das Ergebnis ist in tline_15p.PNG.
In Treibernähe werden im ersten Schritt nur im Mittel 2,3V (/3V) 
erreicht.
(mit Über- und Unterschwingern bis 2V herunter). Ursache ist der hohe 
Treiberinnenwiderstand des ATMEGA im Verhältnis zum Wellenwiderstand.
(Die Empfängerkapazitäten drücken den effektiven Wellenwiderstand. )
Die TLCs brauchen zum sicheren schalten 20 bzw. 80% der Versorgung. Dies 
wird eigentlich nur am Leitungsende erreicht.

Bei Verwendung eines Empfänger-Buffers mit 3pF direkt am Stecker 
(tline_3p.PNG) ergibt sich ein etwas besseres Bild. Wenn der Buffer dann 
noch Schaltschwellen von 30 bzw. 70% der Versorgung hat, könnte es 
gerade so funktionieren.

Alternativen wären:
a) Verwendung eines niederohmigeren Treibers am Arduino-Board.
b) Aufsplitten der Leitungen in Leitungsstücke die jeweils eigene 
Treiber haben (also Signalauffrischung auf den TLC-Boards).
In diesem Fall könnte man mit einfacher Serienterminierung arbeiten.

von Anja (Gast)


Lesenswert?

noch eine Alternative
c) mittels RC-Tiefpaß am Sender die Flankensteilheit auf mehr als 40ns 
vergrößern. (Eventuell geht auch die Verwendung eines CD4050 Treibers).
Allerdings sollte dann am Empfänger auf jeden Fall ein Schmitt Trigger 
sitzen.
Die Datenleitung muß bei 4MHz = 125ns Setup-Time natürlich über dieselbe 
Zeit verzögert werden.

von Falk B. (falk)


Lesenswert?

@  Anja (Gast)

>c) mittels RC-Tiefpaß am Sender die Flankensteilheit auf mehr als 40ns
>vergrößern.

Würde ich lassen. Wenn man sich an die grundlegenden Hinweise im Artikel 
Wellenwiderstand hält, kriegt man das auch so hin.

>Die Datenleitung muß bei 4MHz = 125ns Setup-Time natürlich über dieselbe
>Zeit verzögert werden.

Spätestens hier beginnt der Baselmurks.

MFG
Falk

von Anja (Gast)


Lesenswert?

Hallo Falk,

>Würde ich lassen. Wenn man sich an die grundlegenden Hinweise im Artikel
>Wellenwiderstand hält, kriegt man das auch so hin.

Dort wird immer nur der "Spezialfall" Leitungsende behandelt, nicht aber 
eine Multi-Drop-Leitung. Mit dem vorhandenen "Treiber" (ATMega328) 
kriegt man eine Multi-Drop-Leitung eben nicht "so einfach hin".

von Eddy C. (chrisi)


Lesenswert?

Ich würde mal - probeweise - den Leitungsabschluss komplett weglassen 
und stattdessen Schottky-Klemmdioden gegen VCC und GND testen.

von Anja (Gast)


Angehängte Dateien:

Lesenswert?

Gibt leider für die Treibernahen Empfänger keinen Vorteil ....

von A. L. (vantage)


Lesenswert?

Anja, vielen Dank für die Simulation mit Spice. Den Spannungsabfall 
konnte ich gestern an der Installation mit zwei TLC Boards bestätigen. 
Ich tendiere zu Deinem Vorschlag b), SOUT wird eh von jedem der TLC5940 
neu generiert, dann muss ich nur SCLK, GSCLK, XLAT und BLANK mit einem 
Treiber pro TLC Board Ausgang versehen. D.h. alle 120 cm gibt es eine 
Signalauffrischung mit Serienterminierung.

Frage, was nimmt man da als Treiber? Eine schnelle Suche in der 74er 
Familie zeigt mir den SN74HCT244 (Octal Buffer and Line Driver), ist das 
der richtige Ansatz?

Danke,
Adrian

von Anja (Gast)


Lesenswert?

>Frage, was nimmt man da als Treiber? Eine schnelle Suche in der 74er
>Familie zeigt mir den SN74HCT244 (Octal Buffer and Line Driver), ist das
>der richtige Ansatz?

Ja, ist als Treiber bei Serienterminierung verwendbar. Als Empfänger 
würde ich den allerdings wegen der unsymmetrischen Empfangs-Pegel nicht 
verwenden. (dann lieber einen 74HC244 statt einem HCT).

Die Treibereigenschaften findest Du z.B. hier:
Ein Bustreiber 74HC240 (gilt auch für den HC244) hat etwa 22 Ohm 
Treiberinnenwiderstand. Siehe Diagramm Seite 19.

http://focus.ti.com/lit/an/sdya010/sdya010.pdf

von A. L. (vantage)


Lesenswert?

Danke, guter Hinweis, bis zum Eingangspegel hatte ich das Datenblatt 
nicht gelesen. Ich hab hier auch noch ein paar SN74LV125A, die ich noch 
nicht verbaut habe, laut Datenblatt sehen die aber recht universell aus 
(und schön schnell). Melde mich nach den ersten Tests.

von A. L. (vantage)


Lesenswert?

Kleiner Update, ich hab letzte Woche zwei TLC Boards mit je einem 
74HC244 (Anja, danke für den Hinweis mit dem HC statt HCT) als 
Eingangsstufe versehen, das Signal sah aber noch nicht so optimal aus. 
Die Spitzen sind dank Serienterminierung raus, aber das Rechteck ist 
noch recht weichgekocht. Der Durchlauf war allerdings nicht ganz fair, 
da ich noch das verlegte FB ohne zusätzliche Masse zwischen jedem 
Signalleiter verwende, und auf eine Ausgangsstufe verzichtet habe.

Auf die Empfehlung eines Freundes hab ich dann als Versuch neue 
Eingangsstufen mit dem 74LS541 (Schmitt Trigger) aufgebaut, damit schaut 
das Signal sehr brauchbar aus, dafür bekomme ich die Peaks jetzt nicht 
mehr mit der Serienterminierung weg. Ich schaue mir die Impedanz und 
Terminierung noch mal in Ruhe an und berichte nach dem nächsten 
Durchlauf.

von Roland O. (robelix)


Lesenswert?

Hallo,

wäre interessiert was letztendlich geholfen hat.

Habe einen sehr ähnlichen Aufbau - und wohl das gleiche Problem:

Arduino -> Board mit 3x TLC5940 -> 60cm Kabel -> 3x TLC -> 60cm Kabel 
...

Ein Board läuft prächtig ( http://robelix.com/blinken/ )
Bei 2 Boards - einzelne Pixelfehler, ab dem Dritten kommt wenig bis gar 
nichts mehr an.

von A. L. (vantage)


Lesenswert?

Hallo Roland,

aus dem Gedächtnis, der letzte Stand sieht so aus

[3xTLC5940]->FB Kabel mit Masse auf jeder zweiten Leitung -> 
[74HC541][3xTLC59409]...

Dazu habe ich vor dem 74HC541 Octal Buffer/Schmitt Trigger Eingang eine 
Terminierung mit Kondensator->Widerstand von Masse an der jeweiligen 
Signalleitung (Daten/Clock), Werte muss ich mal nachsehen. Damit läuft 
es wie gewünscht.

Viel Erfolg,
Adrian

von Anja (Gast)


Lesenswert?

Hallo,

die Dimensionierung ist Abhängig vom verwendeten Kabel 
(Wellenwiderstand) und von der Leitungslänge.
Siehe auch meine Antwort vom 23.01.2010 12:27

Gruß Anja

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.