Ich habe einen Sensor, den ich über I2C zu lesen versuche, aber ich habe einige Probleme mit den Pull-up-Widerständen und der Spannung, auf die sie eingestellt sind.
Mein Host-Computer ist der Arduino Nano, während mein Sensor das Magnetometer HMC5883L ist .
Unten ist ein Blockdiagramm, das mein Verdrahtungsschema zeigt.
Ich habe einige Nachforschungen über den Prozessor des Nano Every angestellt . Die I2C-Pins sind mit dem ATMEGA4809 verbunden und werden mit +5 V versorgt. Somit werden die I2C-Leitungen auf eine Spannung von 5 Volt bezogen. Das HMC5883L-Modul hat bereits Pull-up-Widerstände für 5 V und 3,3 V, aber wenn ich meine eigenen externen Pull-up-Widerstände hinzufügen wollte, müsste ich sie auf 5 V referenzieren, wie in meinem Blockdiagramm gezeigt, richtig? Wenn ich mich entscheide, es auf 3,3 Volt zu referenzieren (und 3,3 Volt vom Nano mit dem entsprechenden Pin am Sensor verbinde), da der Mikrocontroller mit 5 Volt läuft, an welche Spannung sollte ich die Pull-up-Widerstände anschließen?
Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan
Somit werden die I2C-Leitungen auf eine Spannung von 5 Volt bezogen
Nö. Sie sind auf GND bezogen.
Anschließen von 3,3 Volt vom Nano an den entsprechenden Pin des Sensors
Tun Sie dies nicht! Die 3,3 V am Sensor sind ein Ausgang .
Das HMC5883L-Modul hat bereits Pull-up-Widerstände für 5 V und 3,3 V
Obwohl es sich tatsächlich um Pull-up-Widerstände handelt, sind sie auch Teil des eingebauten Pegelumsetzers, der es dem 3,3-V-Sensor ermöglicht, mit einem 5-V-I2C-Bus zu arbeiten.
Wenn ich meine eigenen externen Pull-up-Widerstände hinzufügen wollte, müsste ich sie wie in meinem Blockdiagramm gezeigt auf 5 V referenzieren, richtig?
Es gibt keinerlei Grund, irgendetwas extern hinzuzufügen. Wenn Sie dies jedoch tun möchten, können Sie Pull-up-Widerstände zu 5 V hinzufügen, aber dann müssen Sie entweder R3, R4 von der Sensorplatine entfernen oder sicherstellen, dass Ihre zusätzlichen Widerstände parallel zu ihnen nicht unter ein Minimum fallen zulässigen Widerstand (dh Ihr kombinierter Klimmzug ist nicht zu stark). Beispielsweise führen zusätzliche 10k-Widerstände zu einem 5k-Pull-up, was für einen 400-kHz-Bus in Ordnung sein sollte.
Wenn ich mich entscheide, es auf 3,3 Volt zu beziehen
Auch hierfür gibt es keinen Grund, da die Sensorseite des Pegelumsetzers bereits auf 3,3 V hochgezogen ist. Die MCU-Seite der Schalthebel wird auf 5 V hochgezogen. Wenn Sie eine 3,3-V-MCU verwendet haben, hätten Sie alle 4 Widerstände (R1-R4) und zwei MOSFETs entfernen, die SDA- und SCL-Leitungen für den Durchgang kurzschließen und schließlich externe Pull-up-Widerstände auf 3,3 V hinzufügen können. Da Sie jedoch Nano verwenden, ist seine MCU nicht mit dem 3,3-V-I2C-Bus kompatibel.
AKTUALISIEREN:
Was Sie an VIN anschließen, hängt vom I2C-Logikpegel der MCU ab?
JA für Adafruit-Boards, NEIN im Allgemeinen. Die Adafruit-Boards sind so konzipiert, dass sie mit 5 V (VIN) betrieben werden, wobei der interne Regler verwendet wird, um auf 3,3 V herunterzuregeln, wie Sie selbst erwähnt haben. Die Platine wird also mit 5 V betrieben, der Sensorchip darauf jedoch mit 3,3 V.
Jetzt beträgt die VIN_min für den HMC5883L-Chip 2,16 V, für LSM9DS1 1,9 V. Theoretisch können Sie die Platinen mit diesen Spannungen + Spannungsabfall am LDO versorgen. Bedeutet nicht, dass Sie es tun müssen. Wenn Sie ein stabiles vorhersehbares Verhalten wünschen, würde ich empfehlen, die Platinen nach Möglichkeit mit 5 V zu versorgen. Aber lies weiter...
Also 5V von Nano zu VIN und meine Klimmzüge.
Ihr Fehler ist zu glauben, dass VIN irgendetwas mit Klimmzügen zu tun hat. Die I2C-Busspannung (wo Pull-Ups angeschlossen werden sollten) wird in den Schaltplänen oft als VDDIO bezeichnet. Viele Chips haben separate Eingangspins für VDDIO (zB Pin 13 von HMC5883L, Pins 1 und 3 von LSM9DS1). Es ist einfach so, dass Adafruit diese Pins mit VDD von LDO auf ihren Boards verbunden hat.
Da sie VDDIO mit dem internen 3,3-V-Regler verbunden haben, konnten sie nicht zulassen, dass Sie eine höhere Spannung an die I2C-Pins des Sensors anlegen. Also fügten sie ihren Platinen Level-Shifter hinzu, mit Pull-Ups auf 3,3 V auf der Sensorseite und Pull-Ups auf VIN auf der Steckerseite. Dies wiederum fixiert die externe I2C-Busspannung auf VIN. In diesem Fall definiert die VIN also die Busspannung , aber nur, weil die Adafruit-Ingenieure die Platinen auf diese Weise verdrahtet haben.
Zusammenfassen:
Die Leute von Adafruit haben sich das für Sie ausgedacht. Wenn Sie auf die Adafruit-Site gehen, auf die Sie für den HMC5883L verlinkt sind, erfahren Sie Folgendes über die SDA- und SCL-Leitungen für I2C:
Meine Interpretation davon ist also, dass Sie externe Pullup-Widerstände auf 5 V verwenden können.
Der Atmega hingegen hat ein digitales Hoch, das im Datenblatt als solches definiert ist:
Bei einer 5-V-Quelle sind 0,7 * VDD 3,5 V. Ihre 3,3 V werden also nicht als Hochspannung registriert, wodurch der I2C nicht funktioniert. Sie müssen also 5 V für den I2C-Pullup verwenden.
Der Controller hat eine IO-Spannung von 5V. Es könnte mit einem 3V3-I2C-Bus laufen, aber Sie sollten besser bei 5 V bleiben. Verwenden Sie einfach die internen 5-V-I2C-Pullups des Sensorboards.
BesteQualitätVakuum
Ahorn
BesteQualitätVakuum