Multiplexer Kommunikation Geschwindigkeit

Hallo,
ich möchte 4x 16-Kanalmultiplexer verwenden um analogRead auszulesen für ein Tasteninstrument mit Anschlagsdynamik (also wie stark eine Taste der Klaviatur gedrückt wurde). Ich möchte das mit Piezo-Sensoren probieren.

Da es bei Musik auch immer um das Timing geht, frage ich mich, ob durch die Fülle von analogRead - Abfragen (auch digitalRead) und digitalWrite - Befehlen auf der Ausgabeseite nicht hörbare Verzögerung entsteht. Eine Gesamtverzögerungen (von Tastendruck bis Tonausgabe) unter 10ms würde kein Problem darstellen. Tolerabel wären Gesamtverzögerungen vielleicht bis 20ms).

Es soll ein Arduino Nano zum Einsatz kommen.

Meine Frage in die Expertenrunde: wo büße ich zusätzliche Zeit ein durch die Kommunikation zwischen Multiplexer und Arduino? Bzw. mit welchem Verfahren ist ein etwaiger Zeitverlust geringer? :

Bei der Verwendung von I2C wie zB. mit 4x PCA9548A I2C IIC Multiplexer

oder
bei der Verwendung von 4x CD74HC4067 16-Kanal Analog Digital Multiplexer?

Vielen Dank schon mal im Voraus und beste Grüße in die Runde,
bq.

PS.:
Im Forum wurde ja schon mehrfach besprochen, dass die analog/digitalRead/Write - Befehle viel mehr Zeit fressen als bei direkter Programmierung und entsperchende Lösungen vorgeschlagen.
Ich habe schon gesehen, dass man die "Auflösung" in einem "Prescaler" verändern kann und diverse Register im Chip zumindest bei digitalRead direkt ansprechen kann. Da ich nicht so tief in der Materie stecke, hoffe ich aber solche Programmierung nicht vornemen zu müssen.

analogRead() dauert etwa 112 µS. Das sollte also ausreichen

Es gibt auch Optionen das schneller zu machen. z.B. in dem man die ADC-Frequenz erhöht. Oder nicht-blockierend mit einem Interrupt ausliest. Aber bevor man optimiert sollte man immer versuchen ob es auch so geht.

1 Like

Witzig - ich bastele gerade etwas ähnliches.:grinning:

Ich würde vermuten, dass der Nano da überfordert sein könnte. 4x16x112 Mikrosekunden sind zwar nur etwas über 7 Millisekunden, aber du brauchst auch noch Zeit für die Signalverarbeitung und das Weiterleiten (als MIDI?).

Piezoelemente sind tricky, weil sie hohe positive Spannungen (und negative bei Entlastung) produzieren, die man in den Griff kriegen muss. Ich verwende Velostatfolie, die allerdings auch so ihre Problematiken hat.

Du willst I2C verwenden - dann schau in die Datenblätter, welche Zeiten da auf Dich zukommen.
PCA9548A CD74HCT4067
Schneller gehts mit SPI.
Ein 16Kanal Analog wäre für 5V u.a. der LTC2496, mit einer Auflösung von 16 Bit. Datasheet

Suche schon mal vorbereitet:
https://www.mouser.de/c/semiconductors/data-converter-ics/analog-to-digital-converters-adc/?interface%20type=SPI&number%20of%20channels=16%20Channel

Der 4067 ist nicht I²C-gesteuert, sondern direkt über 4 Adresspins (und einen ENable-Pin).

Stimmt. Hab mich vom PCA blenden lassen. ;(

oder eben nicht I2C.
Der von mir verlinkte CD74HCT4067 braucht 4 Pins für binäre "Adressierung/Ansteuerung" und einen weitern Pin für die Daten (digital oder analog, das wäre dann wohl die Messung der aktuellen Spannung, falls ich das nicht durcheinanderbringe).

Die 4 Pins werden dann einfach an die anderen Multiplexer weitergeleitet, welche je einen weiteren Datenpin zur Abrage benötigen.
Welcher Multiplexer abgefragt wird, ergibt sich aus der Abfrage über den jeweiligen Datenpin (der ja zu einem konkreten Gerät führt), die Multiplexer Pins werden über die 4 "Adresspins" definiert.
Den Enable Pin kann man wohl auf GND legen, also weglassen.

So wäre mein Plan, wenn ich nicht die I2C - Varianten nehme. DIe Frage war, ob das dann langsamer ginge oder vielleicht auch schnell (oder in etwa gleich schnell) wie eben I2C.

Ich habe mich für die 4067-Variante entschieden. Ich benutze einen zusätzlichen 4067, um die SIG-Pins der anderen durchzuschalten. Damit sind bis zu 256 Tasten abfragbar. Die 8 Adressbits setze ich über einen 74HCT595, so dass ich wenige Pins dafür brauche.
Beide TTL-Chips haben ~70ns Schaltzeit, so dass je Taste im Mittel knapp 150ns anfallen.
Das ist deutlich weniger, als bei I²C anfallen, und die Zeit, die der ADC zum Samplen braucht, ist viel länger.

Danke, das ist ein deutlicher Hinweis. Das wollte ich wissen.

In meinem Projekt werden Töne (Elektromagnete lösen Schlegel aus) direkt erzeugt, ich brauche nicht unbedingt Midi.
Aber wenn du dich da auskennst: die Erzeugung der 3 Midi Bytes für einen Note On - Befehl (mit Note, Channel und Velocity) bewältigt der Nano oder Uno in vernachlässigbaren Zeitfenstern?

Die MIDI-Message selber ist nicht das Problem - das geht über Serial mit 31250 Baud eher gemächlich :grin:
Du musst da natürlich einen 5-Pin-DIN-Adapter anschließen. Siehe z.B. hier - Optokoppler ist sehr empfehlenswert!

Ich habe für mich das Ermitteln von Notenanfang und -ende sowie die Errechnung der korrekten Velocity als Hauptproblem ausgemacht. Ich vermute mal, sobald Du soweit bist, wirst Du auf ähnliche Schwierigkeiten stoßen:

  • der Signalverlauf ist alles andere als linear und rauschfrei
  • die einzelnen Sensoren haben leicht unterschiedliche Charakteristiken

Na dann bin ich ja schon mal vorgewarnt. :blush: Zur Not kann ich aber auf die Velocity verzichten. Dann erfolgt Dynamik über ein Fusspedal oä (wie bei einer Orgel).

Das beinhaltet nicht die Zeit die die Arduino Software braucht um die Pins zu schalten. Diese ist im Vergleich zur A/D-Wandlung selbst aber auch fast vernachlässigbar

Nein.
74HCT595,
CD74HCT4067
sind die C-MOS Varianten der SN74xx TTL Logikbausteine, also keine TTL Bausteine.

Welche Sensoren sind das? Welches Signal produzieren sie?

Grüße Uwe

Korrekt. Die Schaltzeiten stimmen trotzdem.

Die hab ich ja auch nicht beanstandet.

Grüße Uwe

mit solchen hier:

oder wenn das das nicht geht solchen:

Der Piezo verändert bei druck den Widerstand und damit die Spannung. Ich denke das kann man an einem Analogeingang des Nano auslesen wie bei einem Poti... ???

Genauer: Der Piezo erzeugt bei Druck eine Spannung, die beim Loslassen auch negativ werden kann.

Gruß Tommy

Danke für den Hinweis. :+1:
Ich muss mich da noch reinarbeiten (testen, ggf. messen). Ich bin hier noch bei grundsätzlicher Planung.

Sind diese Spannungen nicht nur kurze Spannungsspitzen, die während der Applikation der Kraft (Taster) entstehen. Da kann man nicht über eine Multiplex alle 1/2 von 1/128 stel Zeit den Piezo abtasten. 1/2 weil ca 1/2 der ADC-Meßzeit der S&H Kondensator geladen wird. 1/128 weil wenn 128 Tasten gemessen werden sollen Durchschnittlich nur 128 der Zeit gemessen wird.

Grüße Uwe

Das wird man austesten müssen. Ich wollte nur auf den Fehler der Widerstandsänderung hinweisen.

Gruß Tommy