Forum: Mikrocontroller und Digitale Elektronik primitiver ADC mux


von Richard S. (rscheff)



Lesenswert?

Hallo,

Spricht etwas dagegen, mittels PMOS (Wühlbox) einen primitiven A/D 
Signal Multiplexer zu bauen, da der MCU (attiny861) zwar noch 
ausreichend gpio, aber keine freien ADC Eingänge mehr hat?

Zwischen den Eingangspins und Gnd soll praktisch nur zwischen 6 
verschiedenen Widerstandswerten grob unterschieden werden können (open, 
close, 1500, 680, 220, 100 Ohm) - der 1k ist da als Bias für den PMOS, 
damit ein pull-low auf dem GPIO diesen niederohmig schalten kann - auch 
wenn das die Spannungslevel näher zueinander rückt (8bit ADC - kann also 
gut auf 4-5 LSB verzichten, nur um die Größenordnung richtig zu haben).

Oder hat jemand eine andere idee, wie man auf "überzählichen" GPIO einen 
eizelnen verbleibenden ADC port aufmuliplexen kann?

Danke,
  Richard

(Und nein, ich mag keinen größeren MCU mit mehr ADC ports kaufen für das 
Projekt, soll aus der bastelkiste aufgebaut werden)

von Unterste Kiste (Gast)


Lesenswert?

Relais?

von Christian (Gast)


Lesenswert?

Sind warscheinlich grade nicht vorhanden.

von Stefan F. (Gast)


Lesenswert?

Anstelle der MOSFET würde ich ein IC benutzen. Schau dir dieses 
Datenblatt an: https://www.ti.com/lit/ds/symlink/cd4053b.pdf

von Anja (Gast)


Lesenswert?

Richard S. schrieb:
> Spricht etwas dagegen,

Überlege mal was passiert.
Dein "aktiver" Kanal hat 5V d.h. der Ausgang hat auch 5V.
Alle "inaktiven" Kanäle haben 0V.
-> über die Body-Diode der inaktiven Kanäle wird das Signal am Ausgang 
heruntergeteilt.

Richard S. schrieb:
> Oder hat jemand eine andere idee, wie man auf "überzählichen" GPIO einen
> eizelnen verbleibenden ADC port aufmuliplexen kann?

Früher hätte man einen CD4051B genommen.

Gruß Anja

von Unterste Kiste (Gast)


Lesenswert?

Christian schrieb:
> Sind warscheinlich grade nicht vorhanden.

Kein problem mit Draht, Nackel, Spiralfeder, Unterlage: 
https://www.kreativekiste.de/magnet-realis-kupferlackdraht-bauanleitung

von Uwe Bonnes (Gast)


Lesenswert?

Warum kein 4066?

von Peter D. (peda)


Lesenswert?

Richard S. schrieb:
> da der MCU (attiny861) zwar noch
> ausreichend gpio, aber keine freien ADC Eingänge mehr hat?

Der ATtiny861 hat doch 10 ADC-Eingänge, dann bleiben nur noch 5 IOs 
übrig.

Die 15V Schutzdioden kannst Du weglassen, bei 15V ist eh alles kaputt.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter D. schrieb:
> Die 15V Schutzdioden kannst Du weglassen, bei 15V ist eh alles kaputt.
Zuallererst die Dioden, wenn nicht davor noch etwas Strombegrenzendes 
ist.

von Patrick C. (pcrom)


Angehängte Dateien:

Lesenswert?

Wenn die Widerstaende nicht unbedingt am GND haengen muessen kann man so 
eine schaltung benutzen. ADC input am mitte.
Um Rref1vsR1 zu messen setzt mann GP0 auf PULLDOWN und die andere auf 
High-Impedance. Gleich fuer die andere GPx.
Als letzte messt man Rref1vsRref2

Dann kann man R1/2/3/... berechnen. zB Rref1=1k; Rref2=1k.

Davon aus gehende das die PullDown impedanz fuer alle GPx gleich ist 
kann man so eine gute messung machen.
Nur weisz ich nicht ob dein prozessor die GPx auf Pulldown und 
High-Impedance schalten kann

Ich benutze die schaltung ein bisschen anders (differential) wenn ich 
mich nicht irre musz dies so auch funktionieren

Grusze aus die Niederlaende
Patrick

von Richard S. (rscheff)


Lesenswert?

Peter D. schrieb:
> Richard S. schrieb:
>> da der MCU (attiny861) zwar noch
>> ausreichend gpio, aber keine freien ADC Eingänge mehr hat?
>
> Der ATtiny861 hat doch 10 ADC-Eingänge, dann bleiben nur noch 5 IOs
> übrig.
>
> Die 15V Schutzdioden kannst Du weglassen, bei 15V ist eh alles kaputt.

Er hat sogar 11 ADC Eingänge (ADC0 .. ADC10); einer ist aber wegen OC1D 
(hardware PWM mit Software OCR reload) nicht nutzbar; die anderen 9 A/D 
Kanäle müssen relativ Zeitkritisch (~10 usec) in Abstimmung mit dem 
jeweiligen PWM Ausgängen gemessen werden.

Für AUX Messungen bleibt daher leider nur 1 AD Eingang übrig...

Die 15V Schutzdioden sollten doch mit den Vorwiderständen zumindest den 
Strom in den MCU soweit begrenzen, dass dort nicht sofort alles kaputt 
ist... Sind eher elektrostatische Ladungen (hohe Spannung, geringe 
Kapazität, hohe Impedanz) die da abgebaut werden müssen, nicht harte 15V 
aus einem Netzteil o.dgl...

von Richard S. (rscheff)


Lesenswert?

Anja schrieb:
> Richard S. schrieb:
>> Spricht etwas dagegen,
>
> Überlege mal was passiert.
> Dein "aktiver" Kanal hat 5V d.h. der Ausgang hat auch 5V.
> Alle "inaktiven" Kanäle haben 0V.
> -> über die Body-Diode der inaktiven Kanäle wird das Signal am Ausgang
> heruntergeteilt.

Danke! Ich wusste, irgendwas habe ich sicher übersehen...

> Früher hätte man einen CD4051B genommen.

Leider nicht in der Wühlkiste ;)

Aber vielleicht doch besser ein RC nur mit den GPIOs aufbauen (interner 
Pull-Up, vs. active Ground) und die Zeit messen, bis der Digitalpin auf 
high geht...

Fürchte nur, dass das mit den PWM Interrupts kollidieren könnte...

Danke jedenfalls.

Vielleicht die Widerstände so bemessen dass man sich nur in einem 
Interval von 0,5V bewegt und die Body Dioden keinen nennenswerten Strom 
leiten?

von Flip B. (frickelfreak)


Lesenswert?

4066

von Richard S. (rscheff)



Lesenswert?

Patrick C. schrieb:
> Wenn die Widerstaende nicht unbedingt am GND haengen muessen kann man so
> eine schaltung benutzen. ADC input am mitte.
> Um Rref1vsR1 zu messen setzt mann GP0 auf PULLDOWN und die andere auf
> High-Impedance. Gleich fuer die andere GPx.


Gute Idee... Leider ist der zu messende Widerstand immer zw. Gnd und dem 
gezeigten Eingang, also nicht floating...

ich denke, mit Bias-Widerständen (damit Vth groß genug werden kann) und 
NMOS sieht sowas besser aus:

von Stefan F. (Gast)


Lesenswert?

Richard S. schrieb:
> Die 15V Schutzdioden sollten doch mit den Vorwiderständen zumindest den
> Strom in den MCU soweit begrenzen, dass dort nicht sofort alles kaputt
> ist

Das sind 10mA bei 5V Versorgung. Ich hoffe du hast da auch genug 
Verbraucher dran hängen die diese 10mA aufnehmen, sonst werden aus den 
VCC=5V ganz schnell wesentlich mehr.

Suche mal im Datenblatt die Angabe, wie viel Strom die internen ESD 
Dioden des Mikrocontrollers vertragen. Wenn da nichts stehts, dann 
sollte man sie besser gar nicht belasten oder die Konsequenzen tragen 
können.

von A. S. (Gast)


Lesenswert?

Was genau möchtest Du denn eigentlich messen? Die Widerstände R23,24,26 
oder R25,27,28? Und wofür sind die da, also was ist der eigentliche 
Zweck, wenn es nicht die Erkennung ist?
Also was misst Du mit GND enabled und was ohne? Und welche Spannung kann 
"nicht Vcc" während einer Messung maximal haben?

Vermutlich kannst Du mit einem Widerstandsnetzwerk und ein wenig 
Rechnerei das ganze mit einem ADC hinbekommen, dafür fehlt aber die 
konkrete Aufgabenstellung.

von Gerd E. (robberknight)


Lesenswert?

Anja schrieb:
> Überlege mal was passiert.
> Dein "aktiver" Kanal hat 5V d.h. der Ausgang hat auch 5V.
> Alle "inaktiven" Kanäle haben 0V.
> -> über die Body-Diode der inaktiven Kanäle wird das Signal am Ausgang
> heruntergeteilt.

Dagegen könnte man statt dem einen PMOS dann 2 PMOS antiseriell 
verbauen.

Der 4066er wäre natürlich die bessere Lösung. Gibt es auch als 1G im 
Little Logic Katalog, z.B. 74LVC1G66.

von Richard S. (rscheff)


Lesenswert?

A. S. schrieb:
> Was genau möchtest Du denn eigentlich messen? Die Widerstände R23,24,26
> oder R25,27,28? Und wofür sind die da, also was ist der eigentliche
> Zweck, wenn es nicht die Erkennung ist?
> Also was misst Du mit GND enabled und was ohne? Und welche Spannung kann
> "nicht Vcc" während einer Messung maximal haben?
>
> Vermutlich kannst Du mit einem Widerstandsnetzwerk und ein wenig
> Rechnerei das ganze mit einem ADC hinbekommen, dafür fehlt aber die
> konkrete Aufgabenstellung.


+5V (links oben) wird erst nach der Initialisierung des MCU aktiviert; 
Bevor diese Versorgung anliegt, wäre es wünschenswert, zwischen open, 
short oder einem Widerstand zw. 100..1500 Ohm unterscheiden zu können, 
der zwischen Gnd und PPdnX angelegt wird.

(Siehe 2. Anhang von mir aus der Simulation).

GND - Rx ist somit immer gegeben, Rx (zw. PPdnX und Gnd) kann somit nur 
einseitig irgendwie verbunden werden...

von Hannes (Gast)


Lesenswert?

Richard S. schrieb:
> Bevor diese Versorgung anliegt, wäre es wünschenswert, zwischen open,
> short oder einem Widerstand zw. 100..1500 Ohm unterscheiden zu können,
> der zwischen Gnd und PPdnX angelegt wird.

Mal ganz dumm gefragt: Es handelt sich also nur um EINEN Widerstand, 
dessen Wert grob bestimmt werden soll?

von A. S. (Gast)


Lesenswert?

Richard S. schrieb:
> 5V (links oben) wird erst nach der Initialisierung des MCU aktiviert;
> Bevor diese Versorgung anliegt, wäre es wünschenswert, zwischen open,
> short oder einem Widerstand zw. 100..1500 Ohm unterscheiden zu können,
> der zwischen Gnd und PPdnX angelegt wird.
>
> (Siehe 2. Anhang von mir aus der Simulation).
>
> GND - Rx ist somit immer gegeben, Rx (zw. PPdnX und Gnd) kann somit nur
> einseitig irgendwie verbunden werden...

Also ist der zu messende Widerstand gar nicht eingezeichnet und parallel 
zur 15V-Diode. OK. das war mir nicht klar.

Darf dieser Widerstand z.B. mit 15k belastet werden? Dann führe die 
Verbindungen Rx/PPdnX mit je 10k oder so zusammen auf den ADC (alle 
Mosfets etc. weg).

Um den ersten zu messen, stellst Du die anderen beiden auf 1. Dann hast 
Du einen Spannungsteiler von 5k und Rx1, den Du messen kannst.

Falls das nicht geht: 4.ter GPIO der einen Pullup am ADC steuert und 3 
Dioden in Richtung Verbindung Rx/PPdnX. Wenn der GPIO high ist und 2 der 
3 PPdnX high sind, misst Du den übrig gebliebenen. Die Diodenstrecke 
kannst Du einfach abziehen, so genau braucht es ja nicht zu sein.

von Richard S. (rscheff)


Lesenswert?

Nun, jeweils 1 Widerstand pro PPdnX Eingang. Der Eingang kann offen 
sein, oder einen Widerstand von ~1500, 680, 220, 100, 50 Ohm annehmen, 
oder kurz geschlossen sein (Fehlerzustand).

A. S. schrieb:
> Darf dieser Widerstand z.B. mit 15k belastet werden?

Jeder der Rx kann mit mindestens 1/4W belastet werden (nominell 1/2W).
Bei 5V sollte das also kein Thema sein.

> Dann führe die Verbindungen Rx/PPdnX mit je 10k oder so zusammen
> auf den ADC (alle Mosfets etc. weg).

> Um den ersten zu messen, stellst Du die anderen beiden auf 1. Dann hast
> Du einen Spannungsteiler von 5k und Rx1, den Du messen kannst.
>
> Falls das nicht geht: 4.ter GPIO der einen Pullup am ADC steuert und 3
> Dioden in Richtung Verbindung Rx/PPdnX. Wenn der GPIO high ist und 2 der
> 3 PPdnX high sind, misst Du den übrig gebliebenen. Die Diodenstrecke
> kannst Du einfach abziehen, so genau braucht es ja nicht zu sein.

Ich kann mir nicht aussuchen, ob, und welche Kombination von PPdnX offen 
oder einen Widerstand (oder eine direkte Verbindung auf Gnd) haben...

Und nur 1 ADC Eingang frei (aber noch 3 GPIOs verfügbar).

Nachdem PPdnX auch gegen Gnd Kurzgeschlossen sein kann (oder ESD 
hereinkommen kann), wäre wohl die direkte Verbindung ohne Widerstand mit 
einem GPIO keine so gute Idee...

Aber die Idee mit 1k Widerstand nach dem GPIO und PPdnX, und dann von 
allen PPdnX mit einer Diode auf ADC zu gehen ist sehr gut.

von A. S. (Gast)


Lesenswert?

Richard S. schrieb:
> Nun, jeweils 1 Widerstand pro PPdnX Eingang. Der Eingang kann offen
> sein, oder einen Widerstand von ~1500, 680, 220, 100, 50 Ohm annehmen,
> oder kurz geschlossen sein (Fehlerzustand).

Ah, jetzt wird es klar. Es wäre schön gewesen, wenn Du Rx schematisch 
eingezeichnet hättest, ich glaube, es hat hier keiner wirklich 
verstanden.

Oder wenn Du geschrieben hättest, wofür das gut ist, dann hätte man sich 
das erschließen können. Es ist mir z.B. noch immer nicht klar, wofür die 
3 Stränge jetzt gut sind, also Z-Diode, Diode, 240R und 1k. Also ob die 
vorgeben sind, also einen anderen Zweck erfüllen, oder ob Du sie für die 
Messung irgendwie brauchst. Für die wären sie überflüssig.

Jedenfalls freue ich mich, dass Du nun eine Lösung hast. Und wünsche Dir 
ein frohes Fest! Wenn noch Probleme sind, am besten einen Schaltplan von 
der neuen Lösung und dabei schreiben, was für die Messung ist und was 
gegeben.

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.