Forum: Mikrocontroller und Digitale Elektronik Logic level Anpassung I2C Arduino


von Lukas Neumann (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche gerade ein Accelerometer (MMA8452q) zum Laufen zu bekommen 
und habe da ein Verständnisproblem mit den logic levels.
Der Sensor braucht 3,3V. Der Arduino liefert aber 5V.

Im Tutorial von Sparkfun 
(https://learn.sparkfun.com/tutorials/mma8452q-accelerometer-breakout-hookup-guide/example-hookup) 
werden einfach zwei 330 Ohm Widerstände seriell in die Datenleitungen 
gehängt (siehe Bild).


Wie führen die Widerstände nun zu einer Anpassung der Spannung von 5V 
auf 3,3V?


Vielen Dank und beste Grüße!

von hinz (Gast)


Lesenswert?

Lukas Neumann schrieb:
> Wie führen die Widerstände nun zu einer Anpassung der Spannung von 5V
> auf 3,3V?

Murksig.

AN10441 von NXP sagt wie mans richtig machen kann.

von Tom (Gast)


Lesenswert?

Der Arduino / Atmega 328P nimmt einen Pin ab 0,6*Vcc, also 3,0V bei 5V 
sicher als HIGH an. Es ist kein Problem bei einem 5V Arduino I2C mit 
3,3V Bus-Spannung zu betreiben - hab ich auch praktisch schon mehrfach 
gemacht.
Auf Level-Shifting kann man hier verzichten.

Einfach die internen Pullups des Atmega 328P deaktivieren und selber 
~10k gegen 3,3V legen.

Je nach Anwendung kann man natürlich auch den Arduino mit 3,3V 
betreiben, wobei das Datenblatt sagt dass er dann theoretisch nicht mehr 
mit 16 MHz laufen darf.

von Lukas Neumann (Gast)


Lesenswert?

Das heißt bei dem 330 Ohm Widerstand fällt einfach ein bisschen Spannung 
ab, sodass der Pegel dann eher irgendwo bei 3,3V liegt.
Seh ich das richtig?

Wieviel Strom fließt denn da in den Sensor?
Würde gerne nachvollziehen können wieviel da abfällt.

von Christian M. (Gast)


Lesenswert?

Das ist eine interessante Frage. Habe mich kurz durchgegoogelt, ein 
Fragen bleiben aber offen:

- es sind nirgends I2C Pull-Up-Widerstände. Auch auf dem Arduino nicht. 
Sind evtl. im ATMega328P welche Softwaremässig aktivierbar? Im DaBla sah 
ich nichts auf die Schnelle.

- der MMA8452Q hat in den AMR "Input voltage on any control pin (SA0, 
SCL, SDA) Vin –0.3 to VDDIO + 0.3 V", also max. 3.6! SCL und SDA sind 
Open-Drain, sind da auch Body-Dioden drinn? Die würden die Spannung 
begrenzen...

Wenn es also Pull-Ups braucht, könnte man die auf der 3.3V-Seite 
reintun. Sonst wären wohl richtige Level-Shifter die sauberste Lösung!

Gruss Chregu

von Wolfgang (Gast)


Lesenswert?

Tom schrieb:
> Einfach die internen Pullups des Atmega 328P deaktivieren und selber
> ~10k gegen 3,3V legen.

10kΩ Pull-Up für einen I2C mit 3,3V ist arg wenig.
Wenn man dann einen vernünftigen Strom fließen läßt, spielen die 
20..50kΩ der internen Pull-Ups keine wirkliche Rolle, m.a.W. es ist 
eigentlich egal, ob die aktiv sind oder nicht. VDDIO+0.3V sind zulässig, 
d.h. unterhalb von 4.3kΩ für den Pull-Up nach 3,3V ist man innerhalb der 
Spezifikation.

Abgesehen davon, schadet es niemandem, wenn die 70µA vom internen 
Pull-up des ATmega328 durch die Schutzdiode des MMA8452Q fließen würden 
(ohne Pull-Up nach 3,3V), auch wenn dazu nichts im Datenblatt steht.

von Lukas Neumann (Gast)


Angehängte Dateien:

Lesenswert?

Hab mal die Schematics vom Breakout Board eingefügt.

Die Pull-Up-Widerstände für die I2C Leitungen sind da schon drauf.

von hinz (Gast)


Lesenswert?

Tom schrieb:
> Der Arduino / Atmega 328P nimmt einen Pin ab 0,6*Vcc, also 3,0V bei 5V
> sicher als HIGH an.

Doller Störabstand, und das auch noch bei o.C.

Für den Bastelwastel mags reichen...

von Christian M. (Gast)


Lesenswert?

Ja habe grad genauer gelesen: Die internen Pull-Ups im Atmega kann man 
disablen! Mach doch das!

Gruss Chregu

von Wolfgang (Gast)


Lesenswert?

hinz schrieb:
> Doller Störabstand, und das auch noch bei o.C.

Die AN10441 als vernünftige Lösung wurde genannt. Was will man dem 
hinzufügen ...

von m.n. (Gast)


Lesenswert?

Man kann sich jetzt natürlich kräftig aufpusten und auf den minimalen 
high-Pegel 0,7 x VDD bestehen. Nur bringt es im vorliegenden Fall 
nichts.
Störsicherheit und IIC passen sowieso nicht zusammen.

Sieht man genauer ins Datenblatt eines ATmega328, dann kann man 
erkennen, daß für alle Eingangssignale jeweils ein einziger 
Schmitt-Trigger zuständig ist, dessen typ. VOH bei 2,6 V liegt.
Das reicht (erwiesenermaßen) zur IIC-Kommunikation mit einem 3,3 V 
Baustein aus.

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo,

in AN10441 wird schön gezeigt, wie es geht. Nur, welche 
Kleinsignal-Mosfets wären dafür geeignet?

MfG

von Clemens L. (c_l)


Lesenswert?

Jeder MOSFET, der mit 3,3 V sicher einschaltet. Also BSS138.

von Lukas Neumann (Gast)


Lesenswert?

Christian M. schrieb:
> Ja habe grad genauer gelesen: Die internen Pull-Ups im Atmega kann
> man
> disablen! Mach doch das!

Das heißt die Spannung der I2C Leutungen liegt dann auf 3,3V und damit 
is gut?
KAnn ich mir dann die 330Ohm Widerstände sparen?

Wolfgang schrieb:
> Die AN10441 als vernünftige Lösung wurde genannt. Was will man dem
> hinzufügen ...

Die Frage war ja eigentlich was die 330 Ohm Widerstände genau bewirken 
und wie sich dadurch das Level anpasst.


Ich bin noch nicht so fix in der Elektrotechnik und würde Zusammenhänge 
gerne verstehen lernen anstatt Dinge einfach so hinzunehmen.

von Tom (Gast)


Lesenswert?

Was die 330 Ohm Widerstände hier konkret bewirken sollen ist mir auch 
schleierhaft, da sie zumindest in der vorliegenden 
Standard-Konfiguration in Serie mit den internen Pullups des Atmega 
liegen, welche ein bis zwei Größenordnungen größer sind, und somit 
vernachlässigbar sind.

Normal hat man solche Serienwiderstände, da die Eingänge eines 3,3V ICs 
typischerweise mit Schutzdioden gegen Vcc beschaltet sind. Diese leiten 
also alles ab was größer 3,3V (+Spannungsabfall der Diode) ist und somit 
würde ein riesen Strom entstehen wenn man 5V anlegt und der IC zerstört 
werden. In dem Fall begrenzt der Serienwiderstand den Strom sodass die 
Schutzdioden nicht kaputt gehen und die Eingangsspannung dann even 
Vcc+Diode beträgt.

Wenn du die internen Pullups des Atmega328P abschaltest (und ja bloß nie 
die Ausgänge auf HIGH setzt!) kannst du dir die 330 Ohm sparen.
Die sind einfach nur für den Worst Case da, falls du doch mal 5V/HIGH an 
den Bus anlegst.

Für I2C/TWI werden die IOs nur zwischen LOW und INPUT (ohne Pullup) 
umgeschalten.

Bzg. 3,3V Bus und Störabstand... Man wird die Pullups bei hohen 
Datenraten evtl. nochmal weiter reduzieren müssen damit die Flanken 
schärfer werden... Trotzdem, ich hab schon länger einen 5V Atmega382P 
(Slave) via I2C an einem 3,3V ESP8266 (Master). Ich hab damals, eben 
wegen dieser Frage, 24h lang Daten mit 2 MHz fehlerfrei übertragen. War 
mir zuverlässig genug...

von Gerhard O. (gerhard_)


Lesenswert?

Bestell Dir ein solches Bord und gut ist es:

http://www.ebay.com/bhp/level-shifter

Die Dinger funktionieren einwandfrei und sind spottbillig und sehr 
klein. Sie sind nach der von NXP vorgeschlagenen Schaltweise mit Klein 
MOSFETs konzipiert. Ist ideal für zusammengewürfelte Steckbrettprojekte. 
Auch sonst lassen sie sich nutzbringend einsetzen. Vorteil ist, dass 
keine Anpassungen am 5V Teil notwendig sind.

Gerhard

von Gerhard O. (gerhard_)


Lesenswert?

Sich auf die CMOS Chip Schutzdioden mittels Strombegrenzung zu verlassen 
kann bei gewissen ICs in die Hose gehen. Mir ist diesbezüglich mal ein 
Faux Pas passiert. Ein gewisser 24-bit ADC den ich mal verwendete, hatte 
an den Eingängen so geringe zulässige Eingangschutzdioden 
Strombegrenzungswerte, dass dem Datenblatt nach bei Überlastung trotz 
Eingangschutzwiderständen auch mit nur 1mA Überstrom durch die Device 
Schutzdioden mit möglichen Latchup gerechnet werden müsste. Das konnte 
beim diesbezüglichen absichtlichen Testen auch bestätigt werden.

Das ist Hersteller und Device abhängig. Also immer diesbezüglich das 
Datenblatt lesen und sich danach halten. Bei vielen uC hat man 
diesbezüglich viel mehr Spielraum und man verläßt sich darauf. Nicht 
alle amderen Bauteile verhalten sich ähnlich. "Don't take anything for 
granted!"

Gerhard

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.