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.
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 ).
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?
Die Kommunikation erfolgt durch Senden eines Konfigurationsbytes, Warten auf das Ende einer Abtastung und Lesen des Ergebnisses.
Die interessanten sind:
Mehr zum Config-Byte finden Sie auf Seite 18 des Datenblatts, ebenfalls hier abgebildet .
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.
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.
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
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.
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?
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: -
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.
Der MCP3424 ist ein einzelner ADC mit einem Multiplexer am Frontend.
Dieses Diagramm aus dem Datenblatt zeigt dies recht deutlich
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.
JRE
Passant
gbulmer
Mads Skjern
Passant