Forum: Mikrocontroller und Digitale Elektronik SPI -> ADUM140x -> A/D-Wandler


von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich muss mit einem Microcontroller (Arduino Uno) mehrere Spannungen 
Potentialfrei messen.

Dazu habe ich hier einen Tipp bekommen das sich das relativ einfach mit 
dem ADUM140x und dem A/D Wandler MCP3002 realisieren lässt.

Jetzt habe ich mir zwei Platinen aufgebaut (Schaltbilder siehe Anlagen). 
Jede für sich funktioniert wunderbar am Arduino.
Aber wenn ich beide gemeinsam am gleichen SPI-Bus verwenden will bekomme 
ich nur Datenmüll.

Jede der Platinen hat Ihren eigenen SS/CS-Pin am Microcontroller. Dieser 
wird auch immer nach jedem Vorgang wieder auf "High" gesetzt.

Trotzdem funktioniert es nicht. Sobald ich auf einer Platine einen der 
ADUM's raus nehme (Sockel) funktioniert die andere Platine perfekt.

Mit dem selben Arduino Sketch nur ohne die ADUM's funktionieren beide 
A/D Wandler am gleichen Bus.

Wo liegt mein Fehler?
Brauche ich noch Pull-Ups oder Pull-Downs? Da bin ich bei meinen Suchen 
nicht ganz schlau geworden? (Einen PullDown habe ich schon eingebaut R3 
- ohne diesen hatte ich öfter Messfehler).

Wenn ja - wo? Auf der Seite des Microcontrollers oder auf der Seite des 
A/D-Wandlers?

oder seht ihr noch ganz andere Probleme bzw. Verbesserungen.

Vielen Dank für eure Hilfe....

Ach ja.. seid bitte nachsichtig mit meinen Schaltplänen - das sind die 
ersten Versuche mit Eagle.

von Achim S. (Gast)


Lesenswert?

Dein MISO-Signal wird von beiden ADUM gleichzeitig getrieben -> gar 
nicht gut.

Die Ausgänge der MCP3002 mögen zwar hochohmig werden, wenn CS inaktiv 
ist, aber den ADUM interessiert das nicht: der treibt munter weiter.

von Achim S. (Gast)


Lesenswert?

noch ein möglicher Lösungsvorschlag: du könntest VE2 (Pin 10) ansteuern, 
um die MISO Treiber des jeweils nicht benutzten ADUM zu disablen. 
Dummerweise ist dieser Pin High-aktiv, der CS des ADC aber low-aktiv.

Aber sonst kann auch einiges nicht stimmen: wieso lässt du Pin 14 des 
ADUM1401 den SCK treiben, wenn gleichzeitig der µC den SCK zum ADUM1402 
treiben soll?

Liegen die beiden MCP3002 auf dem selben Potential, oder müssen die auch 
untereinander getrennt sein? Wie soll deiner Planung nach der 
Signalfluss aussehen (wer treibt welches Signal)?

von Stefan L. (stefan1981)


Lesenswert?

Hallo Achim,

danke für deine Iddeen...

hier ist mal der Link wo ich die Tipps mit dem ADUM bekommen habe:
Beitrag "Anfänger: Spannungen potentialfrei an Arduino messen"

Die MCP's sind ganau die die ich vom Potential trennen muss - ich will 
Spannungen vor und hintern einem Ladereger messen der die Masseleitung 
steuert. Der Arduino würde durch die gemeinsame Masse den Ladereger 
brücken.

Mein Plan war so:

Arduino SPI(Master) |-> ADUM1401 -> MCP3002(Slave) -> Messspannung
                    |-> ADUM1402 -> MCP3101(Slave) -> Messspannung
                   (|-> EthernetShield - optional)

Der Arduino Steuert mit dem SS-Pin jeweils den MCP an der gerade 
abgefragt werden soll.
Ich habe das so verstanden das ich die anderen Pins (Clock, MISO, MOSI) 
an allen Slaves angeschlossen lassen kann und nur mit dem SS das 
jeweilige Device auswählen. Stimmt das? oder habe ich da einen 
Denkfehler?

Die Idee mit dem Pin10 (VE2) geällt mir eigenlich sehr gut. Welche 
einfache möglichkleit gäbe es denn das Singal zu invertieren?


Ich hoffe ich konnte es halbwegs verständlich erklären.
Danke :-)

von Achim S. (Gast)


Lesenswert?

Stefan L. schrieb:
> Die MCP's sind ganau die die ich vom Potential trennen muss - ich will
> Spannungen vor und hintern einem Ladereger messen der die Masseleitung
> steuert.

Ich habe verstanden, dass die MCPs vom Arudino getrennt sein müssen. 
Aber müssen sie auch untereinander getrennt sein? Ansonsten könntest du 
die beiden MISO-Signale vor dem ADUM zusammenschließen.

Stefan L. schrieb:
> Mein Plan war so:
>
> Arduino SPI(Master) |-> ADUM1401 -> MCP3002(Slave) -> Messspannung
>                     |-> ADUM1402 -> MCP3101(Slave) -> Messspannung
>                    (|-> EthernetShield - optional)
>
> Der Arduino Steuert mit dem SS-Pin jeweils den MCP an der gerade
> abgefragt werden soll.
> Ich habe das so verstanden das ich die anderen Pins (Clock, MISO, MOSI)
> an allen Slaves angeschlossen lassen kann und nur mit dem SS das
> jeweilige Device auswählen. Stimmt das? oder habe ich da einen
> Denkfehler?

Das hast du im Prinzip richtig verstanden, aber falsch umgesetzt. Wenn 
der Controller SCLK treibt, dann darfst du nicht SCLK auf Pin 14 eines 
ADUM1401 legen. Pin 14 ist ein Ausgang, der ADUM1401 und der µC arbeiten 
gegeneinander. Bei der zweiten Schaltung hast du es richtig gemacht: 
SCLK wird vom µC getrieben und geht auf Pin 12 eines ADUM1402 (also 
einen Eingang) und von dort zum ADC.

Stefan L. schrieb:
> Die Idee mit dem Pin10 (VE2) geällt mir eigenlich sehr gut. Welche
> einfache möglichkleit gäbe es denn das Singal zu invertieren?

Einen Inverter draufbasteln? Oder einen freien IO-Pin des Arduino zum 
Aktivieren der Ausgänge nutzen?

Aber auch wenn der Teil klappt kann ich mir nicht vorstellen, dass die 
erste Schaltung funktioniert (z.B. wegen der Kollision bei SCLK).

von Stefan L. (stefan1981)


Lesenswert?

ja ich sehe es auch... das hab ich falsch gezeichnet.. aber richtig 
gelötet.

ADUM1401
MCP                 Arduino
         -----
   G -09 |   | 8- G
   V -10 |   | 7- V
MISO -11 |   | 6- MISO
CLK  -12 |   | 5- CLK
SS   -13 |   | 4- SS
MOSI -14 |   | 3- MOSI
   G -15 |   | 2- G
   V -16 |   | 1- V
         -----

Einen freien IO habe ich leider nicht mehr.
Daher würde mit der Inverter gefallen.

Welcher Transistor schafft denn die Geschwindigkeit?
Ich habe gerade gesucht und bin auf den BC547B gestoßen.
Würde der funktionieren? gibt es einen passenderen?

Danke!

von Frank K. (fchk)


Lesenswert?

Stefan L. schrieb:

> Die Idee mit dem Pin10 (VE2) geällt mir eigenlich sehr gut. Welche
> einfache möglichkleit gäbe es denn das Singal zu invertieren?

74LVC1G04. Ist extra für diesen Zweck gemacht.

fchk

von Stefan L. (stefan1981)


Lesenswert?

Frank K. schrieb:
> 74LVC1G04. Ist extra für diesen Zweck gemacht.

Den Typ finde ich (als Privatperson) leider nicht zum kaufen.
Gibt es einen Vergleichstypen den man auch einkaufen kann (ab besten bei 
Conrad - da wäre ich morgen).

von Frank K. (fchk)


Lesenswert?

Du kannst auch einen ganzen 74HC04 oder HC00 nehmen und nur ein Gatter 
benutzen. Die 74AHC1G* und 74LVC1G* enthalten immer genau ein Gatter der 
jeweiligen Sorte und sind damit kleiner und einfacher unterzubringen.

fchk

von Stefan L. (stefan1981)


Lesenswert?

Vielen Dank für die nützlichen Infos...

Ich besorge mit die nötigen Teile und dann versuche ich es weiter.


Nur noch eine kurze Verständnis Frage... Wieso treiben die ADUM's 
weiter?

- Wenn der A/D-Wandler hochohmig wird müsste doch die "rest Spannung" an 
dem Widerstand abfallen oder?
- Dann dürfte doch der ADUM nur einen Logische 0 an seinem Ausgang 
ausgeben.
- Das sollte doch die anderen Geräte am SPI-Bus nicht beeinträchtigen 
oder?

So habe ich es als Laie verstanden... Ich würde es nur gerne Verstehen.. 
das ich in Zukunft nicht wieder so doof fragen muss.

DANKE!

von Achim S. (Gast)


Lesenswert?

Stefan L. schrieb:
> - Dann dürfte doch der ADUM nur einen Logische 0 an seinem Ausgang
> ausgeben.

richtig

> - Das sollte doch die anderen Geräte am SPI-Bus nicht beeinträchtigen
> oder?

falsch, wie kommst du darauf? Wenn ein ADUM auf MISO eine 0 treibt und 
der andere versucht gleichzeitig eine 1 zu treiben, dann
- stresst das die beiden Treiber
- ergibt es einen undefinierten Pegel auf MISO, so dass der Arduino 
Unsinn einliest.

Es gibt einige Busse, bei denen ein Pegel dominant ist (d.h. entweder 
die 0 oder die 1 "gewinnt" einen Buskonflikt). Bei deinem SPI-bus ist 
das nicht so: der ADUM hat weitgehend symmetrische Treiber, die 1 und 
die 0 werden annähernd gleich stark getrieben.

von Stefan L. (stefan1981)


Lesenswert?

Alles klar.

Meine Vermutung war das wenn eine Logische 0 anliegt einfach "kein 
Strom" da ist. Aber habe ich verstanden das der Pin dann richtig auf 
Masse gezogen wird (PullDown?). Das dass den kompletten Bus 
beeinträchtigt ist dann auch mir klar ;-).

Jetzt habe ich verstanden.

Vielen Dank nochmal.

Stefan

von Achim S. (Gast)


Lesenswert?

Stefan L. schrieb:
> Aber habe ich verstanden das der Pin dann richtig auf
> Masse gezogen wird (PullDown?)

ja, aber nicht über einen passiven Pulldown-Widerstand, sonder über 
einen aktiv angesteuerten FET, der über die Drain-Source-Strecke den 
Ausgang mit Vss verbindet.

von Stefan L. (stefan1981)


Lesenswert?

so...

hab jetzt alles zusammengebaut und es funktioniert. :-)

Vielen Dank nochmal.

Habe wieder etliches dazu gelernt.

Ihr seid Spitze!

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.