MCP3424, wie liest man Kanäle parallel?

Über diese Frage

Ich habe keinen Hintergrund in Elektrotechnik, und dies ist eine meiner ersten Herausforderungen bei der Kommunikation über I2C und beim Schreiben in ein Register, also gehen Sie bitte nicht von zu viel Wissen von meiner Seite aus. Ich programmiere einen Arduino.

Wenn ich nach einem bestimmten elektronischen Bauteil/Chip frage, gehe ich davon aus, dass die Leute nicht experimentieren/testen können, um mir eine richtige Antwort zu geben. Ich gehe auch davon aus, dass die Leute diese Komponente nicht einmal kennen werden. Daher werde ich versuchen, dieser Frage viele Informationen hinzuzufügen.

Bitte lassen Sie es mich wissen, wenn Sie weitere Informationen benötigen.

Die Komponente hat vier ADCs

Ich verwende die 4-Kanal-Komponente MCP3424 ( Datenblatt ). Es kommt in zwei Paketen. Ich verwende die 4-Kanal-SOIC-Version MCP3424 E/SL, nicht die 2-Kanal-Version MCP3422 oder MCP3423.

Ich glaube, es hat vier ADCs. Auf RS-Online scheint es, als hätte die E/SL-Version 4 ADCs ( direkter Link ), während die E/ST nur einen hat ( direkter Link ).Geben Sie hier die Bildbeschreibung ein

Ich nehme an, das muss bedeuten, dass es auf mehreren Kanälen gleichzeitig abtasten kann. Ich sehe keinen anderen Grund, mehr als einen ADC auf die Komponente zu setzen.

Habe ich recht?

Kommunikation über I2C

Die Kommunikation erfolgt durch Senden eines Konfigurationsbytes, Warten auf das Ende einer Abtastung und Lesen des Ergebnisses.

Format des Konfigurationsbytes

Geben Sie hier die Bildbeschreibung ein

Die interessanten sind:

  • Bit drei von links, von 1 gezählt: Kontinuierliches Sampling
  • Bit eins und zwei von links, gezählt ab 1: Adresse

Mehr zum Config-Byte finden Sie auf Seite 18 des Datenblatts, ebenfalls hier abgebildet .

Format des Leseergebnisses

Meine Beispiele werden nur mit einer 18-Bit-Auflösung sein (Bit 5 und 6 auf 1 gesetzt). Das zurückgelesene Ergebnis besteht aus vier Bytes: Die ersten drei enthalten den Wert und das vierte enthält das Konfigurationsbyte.

Das Bit ganz links, !RDY, sagt jedoch aus, ob der Wert "neu" ist, dh ob es sich um eine neue Ablesung seit der letzten Ablesung handelt. Beim ersten Lesen eines Ergebnisses ist der Wert 0 und bei den folgenden 1, bis der ADC mit einem neuen Abtastwert bereit ist.

So verwenden Sie es ohne paralleles Sampling

Ich weiß ganz genau, wie das geht. Und alle Beispiele, die ich online gefunden habe, auch einfach du this. Schreiben Sie einfach ein Konfigurationsbyte in die Komponente und lesen Sie dann einen Wert zurück.

So stellen Sie jeden Kanal so ein, dass er automatisch kontinuierlich abtastet, und lesen Sie die Kanäle parallel

Der Pseudocode könnte so ähnlich sein

setup():
    start sampling channel 1, 18bit, 0gain, continuously
    start sampling channel 2, 18bit, 0gain, continuously
    start sampling channel 3, 18bit, 4gain, continuously
    start sampling channel 1, 18bit, 2gain, continuously

readADCs():
    // Run every 500ms
    // 18 bit samples take 375ms, so must happen in parallel 
    // to get a new sample for all every 500ms
    read channel 1
    read channel 2
    read channel 3
    read channel 4

Mein bester Versuch

Ich hoffe also, dass das Folgende jeden ADC so einstellt, dass er kontinuierlich abtastet. Das ist Arduino-Code.

void setup() {

    Wire.write(0b00011100);
    Wire.write(0b01011100);
    Wire.write(0b10011110);
    Wire.write(0b11011101);
}

Wie lese ich dann einen bestimmten Kanal? Wenn ich die Komponente einfach nach dem Ergebnis frage, gibt sie das Ergebnis des Kanals im Register zurück. Mit dem obigen Setup würde ich den Messwert für Kanal 4 erhalten. Aber sagen wir, ich möchte den Messwert von Kanal 2. Irgendwie muss ich ihm nur sagen, dass ich das Ergebnis von Kanal 2 möchte. Ich möchte nicht Bitten Sie es, irgendetwas zu sampeln, es sollte einfach ein kontinuierliches Sampling durchführen, und ich möchte nur das am meisten verärgerte Sample, das es beim automatischen Sampling erstellt hat.

Unten ist meine beste Vermutung

void readADCs() {

    // Channel 1
    // ...

    // Channel 2
    Wire.beginTransmission(104);
    Wire.write(0b01011100); // I hope not to affect, just to select
    Wire.endTransmission();
    Wire.requestFrom(104);
    Wire.read(); // val byte 1
    Wire.read(); // val byte 2
    Wire.read(); // val byte 3
    Wire.read(); // config byte
}

Also meine beste Vermutung ist. Wenn ich Kanal 2 lesen möchte, schreibe ich ein Konfigurationsbyte, das genau das gleiche ist, das ich zum Starten des Abtastkanals 2 verwendet habe.

Dies funktioniert jedoch nicht. Es ist kein Sample fertig, auch wenn es mehr als die notwendigen 375ms hatte.

Wie erreiche ich das?

Ich habe versucht, mein Bestes zu tun, um das gewünschte Ergebnis und das, was ich versucht habe, zu beschreiben, aber ich weiß, dass es nicht leicht zu lesen ist.

Können Sie mir einen Rat geben, wie ich alle ADCs parallel abtasten und dann von ihnen lesen kann, ohne zu stören?

Guter Start. Das einzige, was fehlt, ist ein Link zum Datenblatt für den MCP3424, den ich hinzugefügt habe.
MCP3424 wird in zwei Paketen geliefert, nicht in Versionen, und beide sind 4 Kanäle. ST ist TSSOP, SL ist Soic. Es gibt den MCP3422 2-Kanal, feste Adresse, den MCP3423, 2-Kanal, einstellbare Adresse und den MCP3424 4-Kanal.
+1 Sehr gründliche, gut geschriebene Frage. Leider ist dieser Chip ein einzelner ADC. Das ist in seinem Datenblatt im "Functional Block Diagram" dargestellt. Sie haben Eingangskanäle als ADCs gelesen. Mit vielen Eingangskanälen kann ein ADC verwendet werden, um viele verschiedene Signale (sequenziell) abzutasten. Der ADC ist viel teurer in der Herstellung als ein analoger Multiplexer (der den Kanal auswählt), und das Abtasten mehrerer Signale ist eine übliche Anforderung. Daher arbeiten die ADC-Chips oft auf diese Weise. Andy aka hat Ihre Frage beantwortet, aber warten Sie vielleicht, bevor Sie sie akzeptieren, da Sie möglicherweise weitere Informationen erhalten.
Ich glaubte, dass es 4 ADCs hatte, weil RS-Online sagte, dass E/SL 4 und E/ST 1 hatte. Ich habe die Beschreibung ergänzt
@MadsSkjern ignoriert RS, Microchip und ihr Datenblatt ist König. Das ist ein Fehler bei RS. Fehler auf Händlerseiten sind ziemlich häufig.

Antworten (2)

Letzteres habe ich mit vier ADCs. Ich nehme an, das muss bedeuten, dass es auf mehreren Kanälen gleichzeitig abtasten kann.

Leider nicht. Es gibt nur einen ADC, und um mehr als einen Kanal umzuwandeln, muss dies sequentiell erfolgen, indem der interne Multiplexer adressiert wird und somit ein anderer Kanal "gelesen" wird. Leider keine gleichzeitige Probenahme: -

Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass der Eingangsmultiplexer NUR einen von vier Kanälen gleichzeitig auswählt. Dies ist eine ziemlich übliche Methode, die zum Lesen mehrerer Kanäle verwendet wird, aber es gibt ADCs mit gleichzeitiger Abtastung. Sehen Sie sich die Portfolios von Linear tech, TI oder ADI an.

+1, du hast mich geschlagen :-) Es könnte sich lohnen, darauf hinzuweisen, dass es durchaus üblich ist, dass ein ADC mehrere Kanäle abtastet, da er verschiedene analoge Signale abtasten kann, was ein häufiger Fall ist.
Auch wenn niedrige Abtastraten gefordert sind, reicht Multiplexing/Interleaving oft aus
Tolle Verbesserungen, Sir.
@gbulmer Sie sind zu nett, mein Herr!!

Der MCP3424 ist ein einzelner ADC mit einem Multiplexer am Frontend.

Dieses Diagramm aus dem Datenblatt zeigt dies recht deutlich

MCP3424-Architektur

Das Datenblatt unterstützt dies mit der Einleitung:

4.1 Allgemeiner Überblick

Die MCP3422/3/4-Bausteine ​​sind differentielle Mehrkanal-Low-Power-18-Bit-Delta-Sigma-A/D-Wandler mit einer seriellen I2C-Schnittstelle. Die Bausteine ​​enthalten einen Eingangskanalauswahl-Multiplexer (Mux), einen Verstärker mit programmierbarer Verstärkung (PGA), eine integrierte Spannungsreferenz (2,048 V) und einen internen Oszillator.

Daher können Sie verschiedene Kanäle nicht wirklich gleichzeitig konvertieren, aber Sie könnten die Kanäle sequentiell mit relativ kurzer Verzögerung zwischen ihnen abtasten.

Wenn Sie das Gerät verwenden, müssen Sie sicherstellen, dass die I2C-Adressbits stabil sind; Nochmal aus dem Datenblatt:

MCP3423 und MCP3424 haben zwei externe Geräteadressen-Pins (Adr1, Adr0). Diese Pins können auf ein logisches High (oder an VDD gebunden), Low (oder an VSS gebunden) oder Floating (nicht an irgendetwas angeschlossen oder an VDD/2 gebunden) gesetzt werden. Diese Kombinationen von Logikpegeln verwenden die beiden Pins acht mögliche Adressen zulassen. Tabelle 5-3 zeigt die Geräteadresse in Abhängigkeit vom logischen Zustand der Adressauswahlpins. Das Gerät tastet den logischen Status der Adr0- und Adr1-Pins bei den folgenden Ereignissen ab:

a. Einschalten des Geräts.

b. Allgemeine Rufrücksetzung

(Siehe Abschnitt 5.4 „Allgemeiner Aufruf“).

c. Allgemeine Rufsperre

(Siehe Abschnitt 5.4 „Allgemeiner Aufruf“).

Das Gerät tastet den logischen Status (Adress-Pins) während der oben genannten Ereignisse ab und speichert die Werte, bis ein neues Latch-Ereignis auftritt. Während des normalen Betriebs (nachdem die Adresspins verriegelt sind) sind die Adresspins intern vom Rest der internen Schaltung deaktiviert.

Es wird empfohlen, einmal nach dem Einschalten des Geräts einen General Call Reset- oder General Call Latch-Befehl auszugeben. Dadurch wird sichergestellt, dass das Gerät die Adresspins in einem stabilen Zustand liest, und ein Zwischenspeichern der Adressbits wird vermieden, während die Stromversorgung hochgefahren wird. Dies kann zu einer ungenauen Adress-Pin-Erkennung führen.

Ich würde vorschlagen, dass Sie dieser Empfehlung folgen, um sicherzustellen, dass Sie wirklich mit dem Gerät kommunizieren.

Um einen bestimmten Kanal zu lesen, müssen Sie den Kanal im Konfigurationsregister auswählen und eine Konvertierung starten. Das RDY-Bit wird niedrig, wenn das Ergebnis dieser Umwandlung im Ausgangsregister verfügbar ist.