Ü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.
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
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?