MCP3424, wie man Kanäle parallel liest?


9

Über diese Frage

Ich habe keinen elektrotechnischen Hintergrund und dies ist eine meiner ersten Herausforderungen bei der Kommunikation über I2C und beim Schreiben in ein Register. Nehmen Sie daher bitte nicht zu viel Wissen von meiner Seite an. Ich programmiere ein Arduino.

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

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

Die Komponente verfügt über 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. Bei RS-Online scheint die E / SL-Version 4 ADCs ( direkte Verbindung ) zu haben, während die E / ST nur eine ( direkte Verbindung ) hat. Geben Sie hier die Bildbeschreibung ein

Ich gehe davon aus, dass dies bedeuten muss, dass Sampling auf mehreren Kanälen gleichzeitig durchgeführt werden 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, ab 1 gezählt: Kontinuierliche Abtastung
  • Bit eins und zwei von links, ab 1: Adresse

Weitere Informationen zum Konfigurationsbyte finden Sie im Datenblatt auf Seite 18, das ebenfalls hier dargestellt ist .

Format des Leseergebnisses

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

Das Bit ganz links ,! RDY, gibt jedoch an, ob der Wert "neu" ist, dh ob es sich um einen neuen Messwert seit dem letzten Messwert handelt. Wenn Sie zum ersten Mal ein Ergebnis lesen, ist der Wert 0 und für die folgenden 1, bis der ADC mit einem neuen Abtastwert bereit ist.

Wie man es ohne parallele Probenahme benutzt

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

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

Der Pseudocode könnte etwas wie 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

Daher hoffe ich, dass im Folgenden jeder ADC so eingestellt wird, dass er kontinuierlich abtastet. Dies 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 nur nach dem Ergebnis frage, wird das Ergebnis des Kanals im Register zurückgegeben. Mit dem obigen Setup würde ich den Messwert für Kanal 4 erhalten. Angenommen, ich möchte den Messwert von Kanal 2 erhalten. In gewisser Weise muss ich nur sagen, dass ich das Ergebnis von Kanal 2 haben möchte. Ich möchte nicht Bitten Sie es, irgendetwas abzutasten, es sollte einfach eine kontinuierliche Abtastung durchführen, und ich möchte nur die am häufigsten gesendete Probe, die es während der automatischen Abtastung 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
}

Meine beste Vermutung ist also. Wenn ich Kanal 2 lesen möchte, schreibe ich ein Konfigurationsbyte, das genau dem entspricht, das ich zum Starten des Abtastkanals 2 verwendet habe.

Dies funktioniert jedoch nicht. Es ist keine Probe fertig, auch wenn sie mehr als die erforderlichen 375 ms hatte.

Wie erreiche ich das?

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

Können Sie mir einen Rat geben, wie alle ADCs parallel abgetastet und dann gelesen werden können, ohne sich einzumischen?


Guter Start. Das einzige, was fehlt, ist ein Link zum Datenblatt für den MCP3424, das ich hinzugefügt habe.
JRE

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, die feste Adresse, den MCP3423, den 2-Kanal, die einstellbare Adresse und den MCP3424 4-Kanal.
Passant

+1 Sehr gründliche, gut geschriebene Frage. Leider ist dieser Chip ein einzelner ADC. Dies ist in seinem Datenblatt im "Funktionsblockdiagramm" dargestellt. Sie haben Eingangskanäle als ADCs gelesen. Mit vielen Eingangskanälen kann ein ADC verwendet werden, um viele verschiedene Signale (nacheinander) abzutasten. Die Herstellung des ADC ist viel teurer als die eines analogen Multiplexers (der den Kanal auswählt), und das Abtasten mehrerer Signale ist eine häufige Anforderung. Daher funktionieren die ADC-Chips häufig auf diese Weise. Andy aka hat Ihre Frage beantwortet, aber warten Sie vielleicht, bevor Sie sie akzeptieren, da Sie möglicherweise weitere Informationen erhalten.
Gbulmer

Ich glaubte, dass es 4 ADCs hatte, weil RS-Online sagte, dass E / SL 4 hatte und E / ST 1. Ich habe der Beschreibung hinzugefügt
Mads Skjern

2
@ MadsSkjern ignorieren RS, Microchip und ihr Datenblatt ist König. Das ist ein Fehler bei RS. Fehler auf Distributorseiten sind ziemlich häufig.
Passant

Antworten:


11

Ich habe letzteres mit vier ADCs. Ich gehe davon aus, dass dies bedeuten muss, dass Sampling auf mehreren Kanälen gleichzeitig durchgeführt werden kann.

Leider nicht. Es gibt nur einen ADC, und um mehr als einen Kanal umzuwandeln, muss dies nacheinander erfolgen, indem der interne Multiplexer adressiert wird, wodurch 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 weit verbreitete Methode zum Lesen mehrerer Kanäle, es gibt jedoch ADCs mit gleichzeitiger Abtastung. Schauen Sie sich die Portfolios von Linear Tech, TI oder ADI an.


+1, du hast mich geschlagen :-) Es könnte sich lohnen, die Tatsache zu erwähnen, dass es durchaus üblich ist, dass ein ADC mehrere Kanäle abtastet, da es verschiedene analoge Signale abtasten kann, was ein häufiger Fall ist.
Gbulmer

Wenn niedrige Abtastraten erforderlich sind, ist Multiplexing / Interleaving oft gut genug
Scott Seidman,

Verbesserungen beim Spiffing, Sir.
Gbulmer

@gbulmer Sie sind zu nett, Sir!
Andy aka

5

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

Dieses Diagramm aus dem Datenblatt zeigt dies ganz deutlich

MCP3424 Architektur

Das Datenblatt belegt dies mit der Einführung:

4.1 Allgemeiner Überblick

Die MCP3422 / 3/4 Geräte sind differentielle Mehrkanal-18-Bit-Delta-Sigma-A / D-Wandler mit geringem Stromverbrauch und serieller I2C-Schnittstelle. Die Geräte enthalten einen Eingangskanal-Auswahlmultiplexer (Mux), einen programmierbaren Verstärkungsverstärker (PGA), eine integrierte Spannungsreferenz (2,048 V) und einen internen Oszillator.

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

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

Der MCP3423 und der MCP3424 verfügen über zwei externe Geräteadressstifte (Adr1, Adr0). Diese Pins können mit den beiden Pins auf einen logisch hohen (oder an VDD gebundenen), niedrigen (oder an VSS gebundenen) oder einen schwebenden (an nichts angeschlossenen oder an VDD / 2 gebundenen) Wert gesetzt werden Erlaube acht mögliche Adressen. Tabelle 5-3 zeigt die Geräteadresse in Abhängigkeit vom logischen Status der Adressauswahlstifte. Das Gerät tastet den logischen Status der Adr0- und Adr1-Pins bei folgenden Ereignissen ab:

ein. Gerät einschalten.

b. Allgemeines Zurücksetzen des Anrufs

(Siehe Abschnitt 5.4 „Allgemeiner Anruf“).

c. General Call Latch

(Siehe Abschnitt 5.4 „Allgemeiner Anruf“).

Das Gerät tastet den Logikstatus (Adresspins) während der obigen Ereignisse ab und speichert die Werte, bis ein neues Latch-Ereignis auftritt. Während des normalen Betriebs (nachdem die Adresspins zwischengespeichert wurden) sind die Adresspins intern vom Rest des internen Schaltkreises deaktiviert.

Es wird empfohlen, nach dem Einschalten des Geräts einmal einen Befehl zum Zurücksetzen des allgemeinen Anrufs oder zum Sperren des allgemeinen Anrufs auszugeben. Dadurch wird sichergestellt, dass das Gerät die Adresspins in einem stabilen Zustand liest, und es wird vermieden, die Adressbits zu verriegeln, während die Stromversorgung hochfährt. 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 Konvertierung im Ausgangsregister verfügbar ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.