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!
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.
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.
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.
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
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.
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...
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.
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.
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...
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
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