Multiplexer Spannungsmatrix

Hallo Zusammen,

vielleicht könnt ihr mir helfen. Ich bin recht neu im Bereich Microcontroller und beschäftige mich zurzeit mit Multiplexern.
Mein Ziel ist es eine Art Spannungsmatrix mithilfe von Multiplexern zu erzeugen.

Dabei wollte ich folgendermaßen vorgehen:

Zunächst versuche ich die Spannung auf einer Zeile mit einem WRITE-Multiplexer zu halten. Iterativ lese ich mit einem READ-Multiplexer Spalte für Spalte aus.
Dann geht es zur nächsten Zeile.

Meine naive Überlegung ist jetzt, dass wenn ich einen Kanal von einem WRITE-Multiplexer mit einem Kanal von dem READ-Multiplexer verbinde, ein hohen Spannungswert in dem jeweiligen Feld in der "Spannungsmatrix" sehe.

Das ist leider nicht der Fall. Ich erhalte kein sauberes Signal, sondern überall hohe Werte.

Ich habe jetzt etwas recherchiert und folgende Ideen um das Signal zu verbessern:

  • ein Kondensator zwischen VCC und GND zu schalten
  • Vorwiderstände an die Kanäle vom Multiplexer zu schalten
  • Multiplexer mit geringerem Channel Bleeding zu verwenden
  • andere Microcontroller zu verwenden

Habt ihr Idee wie ich eine Art Spannungsmatrix erzeugen kann ? Gerne könnt ihr Links zur weiterführenden Literatur posten.

Als neuer Nutzer darf ich leider keine Anhänge hochladen. Ansonsten hätte ich gerne ein Fritzing PDF und den entsprechen Arduino Code hochgeladen.

Hardware:

  • Arduino Due
  • 2 CD4051 Multiplexer

Ein Schaltbild wäre schön, mit Angabe aller Komponenten.

Habe die Dokumente jetzt woanders hochgeladen und hier verlinkt:

Reicht das ? Sonst kann ich auch explizit die Schaltplanansicht von Fritzing nachliefern. Ich habe da gerade ein Problem, Fritzing konvertiert die Steckplatinenansicht nicht zu einer Schaltplanansicht. Ich muss das leider manuell machen.

Anbei der Arduino Code

#include <Arduino.h>
#include <Arduino_JSON.h>
#include "Mux.h"

using namespace admux;

Mux readMux(Pin(A0, INPUT, PinType::Analog), Pinset(2, 3, 4));
Mux writeMux(Pin(A1, INPUT, PinType::Digital), Pinset(5, 6, 7));

void setup(){
  Serial.begin(115200);
  analogReadResolution(8);
}

void loop(){

  JSONVar rows;
  for(int writeIdx = 0; writeIdx < 8; writeIdx++) {

    writeMux.channel(writeIdx);

    
    JSONVar columns;
    
    for(int readIdx = 0; readIdx < 8; readIdx++) {

      columns[readIdx] = readMux.read(readIdx);
    
    }
    
    rows[writeIdx] = JSON.stringify(columns);
  }
  Serial.println(JSON.stringify(rows));
  delay(100);
}

Die Multiplexer 4051 verbinden immer einen Common Pin mit einem anderen der 8 möglichen Pins. Das funktioniert in beide Richtungen also Ausgaag am Common und Eingang am Pin oder umgekehrt.

Eingänge Multiplexen um zB aus einem Analogeingang 8 zu machen geht gut. Umgekehr ist es schwieriger.
Die Pins des 4051 halten dei Spannung an den ausgängen nicht. Der ausgesuchte ist wie ein Stufenschalter mit dem common verbinden aber die anderen 7 sind nicht verbunden also haben keinen definierten Zustand.
Daurm kann man mit Multiplexern keine Ausgänge vermehren.

Aus Deiner Beschreibung erschließt sich mir nicht was Du machen willst. Kannst Du es besser erklähren damit wir Dir zu etwas raten können.
Grüße Uwe

Hallo Uwe,

was ich gerne hätte, wäre folgende "Spannungsmatrix":

Kanal 1 Kanal 2 Kanal 3
Kanal 1 0 0 0
Kanal 2 0 255 0
Kanal 3 0 0 0

Dabei entsprechen die Werte in der Matrix der Spannung (bspw. 8 Bit Auflösung).

  • die Spalten in der Matrix sind Kanäle eines READ-Multiplexers
  • die Zeilen in der Matrix sind Kanäle eines WRITE-Multiplexers

Um eine Matrix wie oben zu erzeugen, würde ich gerne, dass der WRITE-Multiplexer beim Channel 2 die Spannung hält während ich beim READ-Multiplexer
durch die Kanäle iteriere.

Grüße Johannes

Wenn Du in Zeile 2 (oder jeweils in 1 Zeile) konstant 255 haben willst, wozu soll dann der Multiplexer gut sein?

Gruß Tommy

Wie soll das gehen?
Ist jeder Lesekanal mit den 3 schreibkanälen verbunden? also die Schreibkanäle Kurzgeschlossen?

Ah sorry Fehler von mir. Habe die Matrix oben korrigiert.

Ich meinte folgende Matrix:

Kanal 1 Kanal 2 Kanal 3
Kanal 1 0 0 0
Kanal 2 0 255 0
Kanal 3 0 0 0

unter der Annahme das Kanal 2 des WRITE-Multiplexers mit Kanal 2 von dem READ-Multiplexer verbunden ist.

Matrix heißt daß alle Eingänge mit allen Ausgängen irgendwie verbunden sind. Das irgendwie können zB Taster oder LED sein.

Bei Deiner Matrix, wie sind die Ausgänge mit den Eingängen verbunden?

Grüße Uwe

Und was soll sonst passieren? Wirf mal nicht nur Brocken hier rein, sondern eine genaue Beschreibung, was insgesamt passieren soll. Für Deine Tabelle brauchst Du keinen Multiplexer, sondern nur eine Verbindung.

Gruß Tommy

Was für ein Verhalten ich eigentlich erwarten würde, wenn ich nur Kanal 2 des WRITE-Multiplexers mit Kanal 2 von dem READ-Multiplexer verbinde:

SOLL-Zustand

Kanal 1 Kanal 2 Kanal 3
Kanal 1 0 0 0
Kanal 2 0 255 0
Kanal 3 0 0 0

Was ich stattedessen erhalte, ist folgende Matrix:

IST-Zustand

Kanal 1 Kanal 2 Kanal 3
Kanal 1 243 245 241
Kanal 2 241 255 234
Kanal 3 243 239 221

Um zu meiner Ausgangsfrage zurückzukommen, wie erklärt sich dieses Verhalten ?
Warum erhalte bei allen anderen Einträgen außer (2,2) hohe Spannungswerte auch wenn sie überhaupt nicht miteinander verbunden sind ?

Ist habe unten nochmal das erwartete Verhalten dem aktuellen Verhalten gegenüber gestellt. Mir ist bewusst, dass man dafür keinen Multiplexer braucht. Ich würde trotzdem gerne das Verhalten verstehen.

Ich würde gerne Deine Schaltung verstehen. Wo kommen die 9 Anschlüsse her, an denen Du eine Spannung messen möchtest?

Wo sind die Runterzieher?

Oder anders:
Wo ist die Senke, wo rein das zu hohe Potential abfließen kann.

Bedenke, wenn man einen geladene Kondensator aus der Schaltung zieht, bleibt der erstmal geladen.

Genau weil sie "überhaupt nicht miteinander verbunden sind" erhällst Du Spannungswerte.

Zuerst mal bist Du uns immernoch die Schaltung schuldig.

  1. Du hast 9 Messungen aber nur eine hat ein definierten Spannungspegel. Die anderen hängen in der Luft (sind an nichts angeschlossen).

Der AD Wandler hat intern einen Kondensator der mit dem Meßwert geladen wird und diesen für die Dauer der Messung, die in mehreren Schritten nacheinander von statten geht, konstant hält. Wird bei einer Messung kein Spannungspotential an den analogen Eingang gelegt (in der Luft gemessen) so wird der interne Kondensator weder geladen noch entladen. Du mißt (fast) den gleichen Wert der letzten Messung erneut. Darum mißt Du Werte nahe an 255 wo gar nichts sein sollte.
Leere Eingänge sollten mittels eines Widestandes auf Masse gezogen werden. Das meint combie mit

Grüße Uwe

Hier ist der Schaltplan dazu:

Zwei Anmerkungen dazu:

  • die 3 x 3 Matrix oben war nur als Beispiel gedacht um das Verhalten zu erläutern. Im Schaltplan habe ich natürlich eine 8 x 8 Matrix.

  • Ignoriert die INH Pins. Im Code sind sie nicht zu finden. Ich würde sie entweder mit Ground verbinden oder auf LOW setzen.

Der AD Wandler hat intern einen Kondensator der mit dem Meßwert geladen wird und diesen für die Dauer der Messung, die in mehreren Schritten nacheinander von statten geht, konstant hält. Wird bei einer Messung kein Spannungspotential an den analogen Eingang gelegt (in der Luft gemessen) so wird der interne Kondensator weder geladen noch entladen. Du mißt (fast) den gleichen Wert der letzten Messung erneut. Darum mißt Du Werte nahe an 255 wo gar nichts sein sollte.
Leere Eingänge sollten mittels eines Widestandes auf Masse gezogen werden. Das meint combie mit

Ok das ergibt natürlich Sinn. Das heißt, dass ich die Kanäle vom READ-Multiplexer die nicht verbunden sind, mit einem Widerstand mit Ground verbinden müsste ?

Warum kannst Du den Plan nicht hier einstellen?
Kein Mensch weiss, was Du da hast und wenn das Bildchen irgendwann weg ist, kann niemand mehr nachvollziehen, wie Dein Aufbau ist.

Häng den Plan einfach hier mit rein.

Da ist keine Matrix zu sehen, nur 2 Multiplexer mit vielen offenen Eingängen. Willst Du uns alle verarschen?

404 Not Found

Gruß Tommy

Da hat wohl jemand den USB-Stick von seiner Fritzbox abgezogen.