Pullup- und Pulldown Widerstand
Kategorien: Arduino, Elektronik, Raspberry Pi
Heute mal ein kurzer Beitrag zum Thema Pullup- und Pulldown-Widerstände in Verbindung mit Buttons, sprich Tastern.
Aber auch beim Einsatz von Transistoren kommen recht häufig auch Pulldown-Widerstände vor. Das ist nicht sehr verwunderlich, sind Transistoren ja auch eine Art Schalter, die schalten, sobald an der Basis genug Strom anliegt und der Transistor dann Collector und Emitter durchschaltet.
Wofür brauchen wir aber diese Pullup-/Pulldown-Widerstände?
In knappen Worten: Um einen unbestimmten Zustand bestimmt zu machen. Mit den Worten eines Programmierers: Wir initialisieren die Variable “Taste” mit dem Wert “HIGH” oder “LOW”.
Stellen wir uns folgendes vor:
Wir haben einen Taster der angeschlossen ist am Pin 6 und mit GND (Ground/Masse) verbunden ist.
Wenn der Taster noch nicht gedrückt wurde, besteht auch keine Verbindung zwischen Eingangspin 6 und GND.
Fehlt jetzt an dieser Stelle noch die Verbindung zu VCC über den Widerstand (rechts daneben) – wir haben ihn im Gegensatz zum Bild noch nicht auf dem Breadboard eingebaut – dann liegt so lange der Taster nicht gedrückt wurde am Pin 6 weder GND, noch VCC an.
Man sagt auch, der Zustand ist schwebend.
Der Pin kann diesen Zustand nicht interpretieren, da er nur HIGH (VCC) und LOW (GND) kennt. Kleinste Veränderungen, beispielsweise ausgelöst durch die Berührung mit dem Finger lassen eine dazwischengeschaltete LED mal leuchten, mal nicht leuchten. Denn unsere Haut ist auch Widerstand, die in diesem Fall die Signalhöhe verändert von LOW nach HIGH und umgekehrt.
Daher müssen wir dafür sorgen, dass der Pin einen Startwert bekommt, der eindeutig ist. Das machen wir mit dem Widerstand fest, in dem wir ihn entweder zwischen Taster und GND (Pulldown-Widerstand), oder zwischen Taster und VCC (Pullup-Widerstand) setzen und das Signal so entsprechend LOW oder HIGH defnieren.
Internal Pullup
Bei einem ATMega-Prozessor könnte man beispielsweise auf einen Pullup-Widerstand verzichten, da diese auf allen Pins – außer auf Pin 13, (Arduino Unos haben da ja auf dem Board eine LED verbaut) – von Werk aus einen Pullup-Widerstand integriert haben.
Der Vollständigkeit halber hier eine kurze Erklärung, denn ich für meinen Teil verwende in eigenen Aufbauten immer Pullup-Schaltungen mit einem externen Widerstand. Diese 2 Cent für den Widerstand können einem unter Umständen viel Zeit ersparen, denn nicht jeder Controller verfügt über interne Pullup-Widerstände und will man seine Schaltung mal mit einem anderen Controller verwenden und denkt nicht mehr an die fehlenden Pullup-Widerstände, wird man lange nach zufällig auftretenden Fehlern suchen.
In der Zeile 11 definieren wir vor Programmstart mittels “INPUT_PULLUP” die Verwendung des internen Pullup-Widerstands.
Man findet nur selten einen Hinweis darauf – außer im meterdicken Manual des ATMega-Controllers – dass es intern keinen Pulldown-Widerstand gibt. Den sucht Ihr vergebens.
Der Rest des Programms sollte klar sein. Wir definieren Ein- und Ausgabepins, initialisieren den Status des Tasters und warten in der loop() auf den Druck des Tasters und wenn dies geschieht, soll die LED aufleuchten und beim loslassen wieder ausgehen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
const int pinButton = 6; // Pushbutton-Pin const int pinLED = 13; // LED-Pin (eingebaute LED auf dem UNO) int buttonState = 0; // Status der Taste (LOW ODER HIGH zwischenspeichern) void setup() { // Initialisieren des Ausgangs, womit wir visuell den Tastendruck anzeigen moechten und ... pinMode(pinLED, OUTPUT); // dem pinButton als Eingang - wir erwarten ja einen Tastendruck oder auch nicht. Mit "INPUT_PULLUP" aktivieren wir den internen Pullup-Widerstand und ziehen das Signal auf HIGH. // das bedeutet, in ungedruecktem Zustand ist das Signal "HIGH". Druecken wir den Taster, stellen wir eine Verbindung mit GND her und ziehen somit das Signal auf LOW. pinMode(pinButton, INPUT_PULLUP); } void loop(){ // Einlesen des Buttons (HIGH oder LOW) buttonState = digitalRead(pinButton); // Wenn der Button gedrueckt wird, ziehen wir das Signal auf LOW und wollen, dass das Signal der LED auf HIGH gezogen wird, was sie dazu bewegt zu leuchten: if (buttonState == LOW) { // LED an: digitalWrite(pinLED, HIGH); } // Lassen wir den Button wieder los, geht das Signal von LOW wieder auf HIGH und dann soll unsere IF-Abfrage das Signal der LED wieder auf LOW ziehen, was ein verloeschen der LED bewirkt. else { // LED aus: digitalWrite(pinLED, LOW); } } |
Gar nicht so schwer, oder?
Und genau so verhält es sich auch bei den vorhin schon angesprochenen Transistoren. Um einen nicht schwebenden Zustand zu erreichen sollte man einen entsprechenden Widerstand (R1) von der Basis nach GND legen, um das Signal initial nach unten zu ziehen. Wir wenden damit einen Pulldown-Widerstand an, um die Ausgangssituation auf einen bestimmten Wert zu setzen, den wir dann durch weiteren Ausbau unserer Schaltung eindeutig ändern können, ohne störende Einflüsse.
6 Comments
Ein Dash Button mit Telegram und einem ESP8266
31. August 2023 at 8:36 pm[…] Button ist per Pull-Down-Widerstand am ESP8266 angeschlossen, damit er stabil eine 0 an deinen Microcontroller sendet, solange du ihn […]
Autorennbahn – Bau einer elektronischen Ampelanlagen-Steuerung –
16. Februar 2022 at 9:02 pm[…] Der Schaltplan ist recht simpel. Wir brauchen lediglich einen Basisbegrenzungswiderstand um den Transistor vor Beschädigung zu schützen, den Transistor selbst (ein NPN-Feld-Wald-Wiesen-Transistor wie beispielsweise der BC547 reicht hier vollkommen aus) und einen 10k-Widerstand von der Basis zum Emitter, damit das Signal nicht schwebt. (Stichwort: Pull-Down-Widerstand) […]
Jesse
5. Januar 2018 at 11:06 pmHabt ihr das bereits den Fehler bereits korrigiert oder noch nicht? Sieht für mich nach meinem Laienhaften Verständnis gerade richtig aus aber möchte gerne nochmal sichergehen. Ansonsten schon mal vielen Dank für die Hilfe beim Verstehen.
Ronin
6. Januar 2018 at 10:19 amHallo Jesse,
jau, ist korrigiert worden.
Viele Grüße,
Michael
Christian d’Heureuse
8. Dezember 2017 at 1:27 amDie Pulldown-Schaltung ist falsch. Der Datenpin muss immer auf der Seite des Widerstands sein.
Ronin
12. Dezember 2017 at 9:20 amHi Christian,
Vielen Dank, Du hast natürlich Recht.
Viele Grüße,
Michael