<style>[reveal]{opacity:1 !important;transform:none !important}</style>

Bidirektionaler Pegelwandler mit MOSFET

Ein BSS138 und zwei Pull-ups verbinden einen 3,3-V-Controller mit einem 5-V-I²C-Sensor in beide Richtungen: Funktion, Auslegung der Widerstände und Grenzen.

7 Min. LesezeitPegelwandler bidirektionalLevel ShifterBSS138 PegelwandlerI2C 3,3 V 5 V

Dein ESP32 arbeitet mit 3,3 V, das LCD mit I²C-Adapter oder der ältere Sensor aber mit 5 V. Eine Richtung ist leicht: 3,3 V reichen vielen 5-V-Eingängen gerade noch als High. Der Rückweg ist gefährlich, denn 5 V an einem 3,3-V-Pin überlasten dessen Schutzdioden. Beim I²C-Bus kommt hinzu, dass dieselbe Leitung mal vom Controller und mal vom Sensor auf Low gezogen wird. Ein Spannungsteiler als Pegelwandler funktioniert nur in einer Richtung.

Die Lösung kommt mit einem kleinen MOSFET und zwei Widerständen pro Leitung aus und arbeitet in beide Richtungen, ohne dass jemand die Richtung umschalten muss. Sie steckt auf den billigen vierkanaligen „Logic Level Converter“-Modulen und eignet sich für alle Open-Drain-Leitungen: I²C (SDA, SCL), SMBus, 1-Wire und Interrupt-Leitungen mit Pull-up.

Schaltplan

Pegelwandler: SDA des ESP32 an der Source eines BSS138, R1 3,3 kΩ von dort an +3,3 V, Gate fest an +3,3 V, Drain an SDA des Sensors mit R2 3,3 kΩ an +5 V; die Body-Diode zeigt von Source nach Drain
Ein Kanal des Pegelwandlers. Für SCL baust du dasselbe ein zweites Mal auf.
  • Q1, BSS138: N-Kanal-MOSFET im SOT-23-Gehäuse (Pin 1 Gate, 2 Source, 3 Drain). Die Source liegt auf der Seite mit der niedrigeren Spannung, der Drain auf der 5-V-Seite.
  • Gate an +3,3 V: Das Gate hängt fest an der niedrigeren Versorgung. Ob der FET leitet, entscheidet allein die Spannung an der Source.
  • R1, 3,3 kΩ: Pull-up der 3,3-V-Seite. Er zieht die Leitung bei Ruhe auf 3,3 V.
  • R2, 3,3 kΩ: Pull-up der 5-V-Seite. Er zieht die Leitung bei Ruhe auf 5 V.
  • Body-Diode: Sie steckt in jedem MOSFET, Anode an der Source, Kathode am Drain. Hier wird sie gebraucht.

Wie Open-Drain-Ausgänge mit Pull-up arbeiten, zeigt der Open-Collector-Ausgang.

So funktioniert die Schaltung

Es gibt drei Zustände.

1. Niemand zieht. R1 hält die Source auf 3,3 V. Gate und Source liegen gleich hoch, UGS = 0 V, und der FET sperrt. R2 zieht die 5-V-Seite auf 5 V. Jede Seite sieht ihren eigenen High-Pegel. Die Body-Diode sperrt, weil der Drain höher liegt als die Source.

2. Der ESP32 zieht seine Seite auf Low. Die Source fällt auf etwa 0,1 V. Nun liegt zwischen Gate und Source fast die volle Spannung von 3,3 V, weit über der Schwellenspannung von höchstens 1,5 V. Der FET leitet und verbindet beide Seiten niederohmig. Die 5-V-Seite folgt nach unten.

3. Der Sensor zieht seine Seite auf Low. Jetzt fällt zuerst der Drain. Die Source liegt noch auf 3,3 V, also ist die Body-Diode in Durchlassrichtung gepolt und zieht die Source auf etwa 0,7 V. Damit hat der FET wieder genug Gate-Source-Spannung, schaltet ein und zieht die 3,3-V-Seite ganz auf Low.

Lässt die ziehende Seite los, steigen beide Leitungen über ihre Pull-ups gemeinsam an, bis die Source etwa 3,3 V − UGS(th) erreicht. Dann sperrt der FET, die 3,3-V-Seite bleibt bei 3,3 V stehen und die 5-V-Seite läuft allein weiter bis 5 V.

Zeitverlauf beider Seiten: Zieht der ESP32 auf Low, fallen beide Seiten gleichzeitig auf 0,15 V; beim Loslassen steigen sie gemeinsam bis etwa 2 V, dann trennen sich die Kurven, die 3,3-V-Seite endet bei 3,3 V, die 5-V-Seite bei 5 V; dasselbe, wenn der Sensor zieht
Simulation mit 3,3 kΩ und je 100 pF Leitungskapazität: Egal, wer zieht, beide Seiten gehen gemeinsam auf Low.

Die Pegelwandlung funktioniert nur, weil I²C nie aktiv auf High treibt. Jeder Teilnehmer zieht entweder nach Masse oder lässt los. Wie die Pegel einer Logikfamilie definiert sind, steht unter Logikfamilien.

Dimensionierung

1. Schwellenspannung des FET. Die niedrigere Versorgung muss deutlich über der größten Schwellenspannung liegen, sonst schaltet der FET bei Low auf der Niederspannungsseite nicht sicher durch. Der BSS138 hat UGS(th) zwischen 0,5 V und 1,5 V. An 3,3 V stehen bei Low gut 3 V zur Verfügung, das ist doppelt so viel. Ein 2N7002 mit bis zu 2,5 V wäre an 3,3 V schon knapp. Was „Logic Level“ bei MOSFETs bedeutet, erklärt Logic-Level-MOSFET.

2. Größter Pull-up aus der Anstiegszeit. Im Fast Mode (400 kHz) erlaubt I²C höchstens 300 ns von 30 % auf 70 % der Versorgung. Für eine RC-Ladekurve dauert dieser Abschnitt 0,847 · R · C. Mit einer großzügig angesetzten Leitungskapazität von 100 pF pro Seite:

Rmax = 300 ns0,847 · 100 pF = 3,54 kΩ

3. Kleinster Pull-up aus dem Sinkstrom. Ein I²C-Ausgang muss nur 3 mA bei 0,4 V aufnehmen können. Zieht eine Seite auf Low, fließen die Ströme beider Pull-ups durch denselben Ausgang:

I = 3,3 V − 0,4 VR1 + 5 V − 0,4 VR2 ≤ 3 mA

Mit R1 = R2 = 3,3 kΩ aus der E12-Reihe sind das 0,88 mA + 1,39 mA = 2,27 mA. Das passt. Den Pull-up für einen ganzen Bus mit mehreren Teilnehmern rechnest du am besten mit dem Rechner:

Rechner

I²C-Pull-up-Widerstände

Rmin
967 Ω
Rmax
3,54 kΩ
Vorschlag (E12)
2,2 kΩ
Anstiegszeit damit
186 ns
Strom bei Low
1,32 mA
3,3 V70 %30 %00tr ≤ 300 ns300 nsZeit ab 30 % von VDD967 Ω2,2 kΩ3,54 kΩ

Nach NXP UM10204 (Rev. 7, Abschnitt 7.1): Rmin = (VDD − VOL,max) / IOL mit VOL,max = 0,4 V bei IOL = 3 mA, Rmax = tr / (0,8473 · Cb); 0,8473 = ln(0,7/0,3) ist die Zeit von 30 % auf 70 % in Zeitkonstanten. Der Vorschlag ist der größte E12-Wert bis 75 % von Rmax – Reserve für Toleranzen und eine zu knapp geschätzte Buskapazität. Cb schätzt du aus Pin-Kapazitäten (je Gerät etwa 5–10 pF) plus Leitung (grob 50–100 pF je Meter). Die steilste Flanke gehört zu Rmin, die flachste zu Rmax. Grenzen im Fast-mode: tr ≤ 300 ns, Cb ≤ 400 pF.

Bauteilliste

BezeichnerWert/TypHinweis
Q1, Q2BSS138N-Kanal, SOT-23, UGS(th) ≤ 1,5 V; je Leitung einer
R1, R33,3 kΩPull-ups 3,3-V-Seite (SDA, SCL)
R2, R43,3 kΩPull-ups 5-V-Seite (SDA, SCL)

Haben Controller-Board oder Sensormodul schon eigene Pull-ups, zählen die parallel. Zwei 4,7-kΩ-Widerstände parallel ergeben 2,35 kΩ und damit mehr Sinkstrom.

Varianten

Fertige Module. Die verbreiteten vierkanaligen Module mit BSS138 haben meist 10-kΩ-Pull-ups auf beiden Seiten. Mit 100 pF steigt die Leitung damit in 0,847 · 10 kΩ · 100 pF ≈ 850 ns, das reicht für 100 kHz (erlaubt 1000 ns), aber nicht für 400 kHz.

Integrierte Pegelwandler. Der PCA9306 enthält zwei solche Kanäle mit passender Schwelle und arbeitet schon ab 1,0 V auf der Niederspannungsseite. Für 1,8-V-Logik ist das die bessere Wahl, denn ein BSS138 hätte dort zu wenig Gate-Spannung.

Gegentaktsignale. SPI, UART oder WS2812-Daten werden aktiv getrieben und sind oft schnell. Hier steigt die Flanke beim MOSFET-Wandler nur über den Pull-up und wird zu langsam. Für eine feste Richtung nimmst du einen Pegelumsetzer wie den 74LVC1T45 oder einen 74AHCT125 an 5 V, dessen Eingänge 3,3 V als High erkennen. Siehe UART-Schnittstelle und WS2812-LED-Streifen.

Mehr Teilnehmer. Am Bus selbst ändert sich nichts. Die Pull-ups pro Seite gibt es nur einmal, nicht pro Teilnehmer. Wie du einen ganzen I²C-Bus beschaltest, zeigt I²C-Bus beschalten.

Typische Fehler

  • Source und Drain vertauscht: Dann zeigt die Body-Diode in die falsche Richtung und verbindet die 5-V-Seite dauerhaft mit der 3,3-V-Seite. Die 3,3-V-Leitung liegt dann bei knapp 4 V, also über der erlaubten Spannung des ESP32. Miss im Ruhezustand: 3,3 V auf der einen Seite, 5 V auf der anderen.
  • Versorgungen vertauscht: Gate und R1 gehören an die niedrigere Spannung. Hängt das Gate an 5 V, leitet der FET auch bei High, und wieder sieht der ESP32 mehr als 3,3 V.
  • Kein Pull-up auf einer Seite: Ohne R1 wird die 3,3-V-Seite nach einem Low nicht mehr High. Der Bus hängt, der I²C-Scanner findet nichts.
  • Zu große Pull-ups bei hoher Taktrate: Am Oszilloskop siehst du statt Rechtecken Haifischflossen. Takt senken oder Pull-ups verkleinern.
  • Falscher FET: Ein BS170 oder 2N7000 hat bis zu 3 V Schwellenspannung und schaltet an 3,3 V nicht zuverlässig. Bei kleinen Exemplaren klappt es, beim nächsten nicht.

Selbsttest

Warum liegt das Gate fest an 3,3 V und nicht an 5 V?

Dann sperrt der FET, sobald die Source 3,3 V erreicht. Am Gate auf 5 V würde er auch im Ruhezustand leiten und 5 V auf die 3,3-V-Seite durchreichen.

Wie gelangt ein Low von der 5-V-Seite auf die 3,3-V-Seite, obwohl der FET anfangs sperrt?

Über die Body-Diode: Sie zieht die Source auf etwa 0,7 V, dadurch bekommt der FET genug Gate-Source-Spannung, schaltet ein und zieht die Source ganz herunter.

Welcher Strom fließt durch den Ausgang des ESP32, wenn er SDA auf Low zieht (R1 = R2 = 3,3 kΩ)?

Etwa 2,9 V / 3,3 kΩ + 4,6 V / 3,3 kΩ ≈ 2,3 mA – beide Pull-ups zusammen.

Warum eignet sich die Schaltung nicht für schnelles SPI mit 10 MHz?

Die steigende Flanke entsteht nur über den Pull-up und die Leitungskapazität. Mit einigen Kiloohm und 50 pF dauert sie über 100 ns, bei 10 MHz bleiben aber nur 50 ns pro Halbperiode.

Funktioniert die Schaltung mit einem BSS138 für 1,8 V auf der Niederspannungsseite?

Nicht sicher: Die Schwellenspannung kann 1,5 V erreichen, dann bleibt kaum Gate-Spannung übrig. Hier ist ein PCA9306 die richtige Wahl.