Pullup- und Pulldown-Widerstände

Ein Pullup- bzw. Pulldown-Widerstand wird dazu benutzt, um am Eingangspin für ein eindeutig definiertes Signal (LOW oder HIGH) zu sorgen. Ohne einen Pullup- oder Pulldown-Widerstand kann es durch Störungen an einem offenen Eingangspin zu Verfälschungen kommen, sodass falsche Signale vom Mikrocontroller erkannt werden.
Am Beispiel einer Schaltung zum Einlesen des Zustands eines Mikrotasters werden hier die verschiedenen Möglichkeiten für Pullup-Widerstände am Arduino gezeigt.

Verwendete Bauteile

Pullup- bzw. Pulldown-Widerstände am analogen Eingang

Würde man den 10kΩ-Widerstand entfernen, so gäbe es einen Kurzschluss zwischen VCC und GND. Außerdem könnten durch Störungen das Signal nicht mehr korrekt ermittelt werden. Der Pulldown-Widerstand sorgt dafür, dass das Signal (und damit auch etw. Störungen) auf GND "herunter gezogen" wird.

Schaltbild mit Pulldown-Widerstand
Abb.: Schaltbild mit Pulldown-Widerstand
Aufbau mit Pulldown-Widerstand
Abb.: Aufbau mit Pulldown-Widerstand

Will man einen Pullup verwenden, muss man die Verbindung am Mikro-Taster zum GND- und VCC-Pin tauschen. Dann muss aber natürlich die Prüf-Logik in der Programmierung des Mikrocontrollers vertauscht werden, d.h. also einen geschlossenen Schalter auf LOW prüfen und einen offenen auf HIGH.

Schaltbild mit Pullup-Widerstand
Abb.: Schaltbild mit Pullup-Widerstand
Aufbau mit Pullup-Widerstand
Abb.: Aufbau mit Pullup-Widerstand

Der folgende, simple Sketch liest den Wert eines Mikro-Tasters über einen analogen Eingang aus:

#define BUTTON_PIN A0

int buttonValue = 0;

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    buttonValue = analogRead(BUTTON_PIN);
    Serial.println(buttonValue);

    delay(250);
}

Interne Pullup-Widerstände am digitalen Eingang

Ist ein digitaler Port als Eingang geschaltet, so kann man elegant interne Pullups setzen, denn der ATMega-Chip im Arduino besitzt intern verbaute Widerstände, die man per Software aktivieren kann. Auf den meisten AVR-basierten Boards sind Pullups zwischen 20kΩ und 50kΩ verbaut, doch sieht man sich am besten die Datenblätter an, um den korrekten Wert zu ermitteln.

Schaltbild mit internem Pullup-Widerstand
Abb.: Schaltbild mit internem Pullup-Widerstand
Aufbau mit internem Pullup-Widerstand
Abb.: Aufbau mit internem Pullup-Widerstand

Der folgende Sketch zeigt, wie man den internen Pullup aktiviert. Hinweis: Hier wird das Verhalten des Pins invertiert, d.h. bei HIGH ist der Taster "aus" und bei LOW "an", d.h. gedrückt:

#define BUTTON_PIN 2

void setup()
{
    pinMode(BUTTON_PIN, INPUT_PULLUP);
}

Hinweis: Pin 13 ist gegenüber den anderen Pins schwieriger als INPUT zu benutzen, denn an diesem Pin ist ja noch zusätzlich eine LED und ein Widerstand auf dem Board verlötet. Wenn man also nun den internen Pullup für Pin 13 aktiviert, so werden nur etwas 1,7V anstatt der 5V anliegen, d.h. es gilt sozusagen immer als LOW. Falls man also wirklich Pin 13 als digitalen Input benutzen will, sollte man einen externen Pulldown-Widerstand verwenden.

Für den Arduino vor der Version 1.0.1 kann man den internen Pullup nur in folgender Weise aktivieren:

pinMode(pin, INPUT);      // set pin to input
digitalWrite(pin, HIGH);  // turn on pullup resistors
zurück