Bidirektionaler Pegelwandler

Wer mit Mikrocontrollern bastelt, möchte früher oder später auch einmal seine Konstruktion mit anderen Controllern, Modulen, oder Mikrorechnern (z.B. RasPi) kommunizieren lassen. Dabei ergibt sich dann oftmals das Problem, daß die verschiedenen Systeme mit verschiedenen Betriebsspannungen arbeiten (z.B. 5V und 3.3V). Für (unidirektionale) Signale, bei denen klar ist, welche Station "Sender" ist, und welches Modul den "Empfänger" darstellt, gibt es Unmengen von Chips und (meist recht einfachen) Schaltungen, die die Spannungen auf den Kommunikationsleitungen entsprechend anpassen. Etwas komplizierter wird es jedoch, wenn auf einer Leitung Signale in beide Richtungen (bidirektional) übertragen werden, und "Sender" und "Empfänger" irgendwann ihre Rollen wechseln. Das ist z.B. bei dem recht beliebten I2C-Bus der Fall.

Lösungsmöglichkeiten

Natürlich betrifft diese Problematik nicht nur die Hobbybastler, sondern tritt auch im industriellen Umfeld auf. Daher existieren auch einige Lösungsansätze:
Spezielle Chips (z.B. MAX1740, ST2378)
Funktional sind diese Chips bestimmt eine sehr gute Lösung, leider sind sie aufgrund der Beschaffbarkeit (fast nur bei großen/teuren Distributoren verfügbar) und der Bauformen (SMD mit <1mm Pinabstand, BGA) nur wenig "bastlerkompatibel".
"Empfohlene" MOSFET-Schaltungen (wie z.B. hier beschrieben)
Diese Schaltungen nutzen "Pullup"-Widerstände an den Betriebsspannungen beider Module, und verbinden die Ein- und Ausgänge mit Hilfe eines MOSFETs, falls eine Seite den Pegel auf "Low" zieht. Das funktioniert recht gut wenn sichergestellt ist, daß beide Module auch immer mit Betriebsspannung versorgt werden. Besteht jedoch die Möglichkeit, daß auch mal eine Seite nicht mit Spannung versorgt wird, sind zusätzliche Schaltungteile (wie z.B. in AN97055 erwähnt wird) zum Schutz der Ein- und Ausgänge notwendig. Außerdem entsprechen die Anforderungen an die verwendeten MOSFETs (geringe Gatespannung) nicht gerade den Bauteilen, die gut und preisgünstig verfügbar sind.
Pegelwandler als "Maker"-Boards
Diese kleinen Boards (in Briefmarkengröße) basieren auf den schon vorgestellten Chips und/oder Schaltungen, und sind relativ gut verfügbar. Damit sind eine passable Möglichkeit, um entsprechende Schaltungen aufzubauen. Wer jedoch seine Leiterplatten lieber selber entwirft, wird diese Boards wohl maximal als Quelle für schwer beschaffbare Bauteile sehen.

Eine Schaltung mit bipolaren Transistoren

Schaltplan 1
Die nebenstehende Schaltung zeigt einen bidirektionalen Pegelwandler für 5V- und 3.3V-Signale, der mit (gut erhältlichen) Bipolartransistoren aufgebaut ist, und auch bei abgeschalteter 3.3V-Betriebsspannung keine unzulässigen Spannungen auf dem 3.3V-Ein/Ausgang erzeugt. Im Prinzip werden die Ausgangsspannungen durch Pullup-Widerstände zu den entsprechenden Betriebsspannungen erzeugt, und bei einem Stromfluß auf der Eingangsseite (Eingang wird auf "Low" gezogen) den Ausgang mit Hilfe eines Transistors ebenfalls auf "Low" zieht. Diese Schaltung ist ausgelegt für CMOS-Ein/Ausgänge, die als Eingang geschaltet hochohmig sind, und als Ausgang geschaltet einen Strom von min. 2mA nach "Low" ziehen können.
3.3V→5V, Uout, Iin vs Uin
3.3V → 5V, Ausgangsspannung und Eingangsstrom gegenüber Eingangsspannung
5V→3.3V, Uout, Iin vs Uin, 3.3V on
5V → 3.3V, Ausgangsspannung und Eingangsstrom gegenüber Eingangsspannung, 3.3V aktiv
5V→3.3V, Uout, Iin vs Uin, 3.3v off
5V → 3.3V, Ausgangsspannung und Eingangsstrom gegenüber Eingangsspannung, 3.3V abgeschaltet

GPIO ist nicht gleich GPIO

Nachdem ich diese Schaltung bei mehreren Projekten mit Arduinos und RasPis erfolgreich eingesetzt hatte, wollte ich sie für den I2C-Bus eines RasPis einsetzten, und musste feststellen, daß sie dort nicht funktioniert. Ein paar Messungen und viele Recherchen ergaben, daß die beiden GPIOs, die ein RasPi für die Signale SCL und SDA bereitstellt (im Gegensatz zu allen anderen GPIO-Pins) mit internen 1.8kΩ-Pullups versehen sind. Unter diesen Umständen konnte die Schaltung keinen brauchbaren "Low"-Pegel mehr liefern. Also blieb mir nur übrig, eine Schaltungsvariante "für I2C-Signale am RasPi" zu entwickeln.
5V→3.3V, Uout, Iin vs Uin, 3.3v pullup
5V → 3.3V, Ausgangsspannung und Eingangsstrom gegenüber Eingangsspannung, 3.3V-Seite mit 1.8kΩ-Pullup

Die modifizierte Schaltung

Schaltplan 2
Diese Schaltung liefert an einem GPIO mit 1.8kΩ-Pullup brauchbare Logikpegel, die eine I2C-Kommunikation ermöglichen. Leider war es bei der Modifikation aufgrund der Pegel notwendig, die Diode in der Koppelleitung zu entfernen. Dadurch geht jedoch die "Schutzfunktion" verloren, die verhinderte, daß am 3.3V-Ein/Ausgang eine Spannung anliegt, während die 3.3V-Stromversorgung abgeschaltet ist. Der Strom, der bei abgesschalteten 3.3V aus den Ein/Ausgang fließen kann, ist zwar gering genug, daß die Schutzdioden des GPIO-Ports diesen ableiten können sollten, trotzdem sollte die Firmware des steuernden Controllers (auf der 5V-Seite) den Port auf "Low" legen, wenn die Stromversorgung der 3.3V-Seite abgeschaltet wird.
3.3V→5V, Uout, Iin vs Uin
3.3V → 5V, Ausgangsspannung und Eingangsstrom gegenüber Eingangsspannung
5V→3.3V, Uout, Iin vs Uin
5V → 3.3V, Ausgangsspannung und Eingangsstrom gegenüber Eingangsspannung


Für die Richtigkeit und Allgemeingültigkeit dieser Informationen kann ich keinerlei Verantwortung übernehmen. Diese Seite hat ausschließlich den Sinn, eine kleine, und ggf. nützliche Schaltung vorzustellen, die bei manchen Problemstellungen brauchbar sein kann. Ich verkaufe weder fertige aufgebaute Schaltungen, noch kann ich bei der Bauteilauswahl für einen bestimmten Zweck hilfreich sein → Ich arbeite ausschließlich "für den Eigenbedarf".


Startseite  Hardware  Rechtliches  Kontakt

HTML und Design: DK1RM erstellt: 17.9.2023 - letzte Änderung: 17.9.2023