Was ist der Unterschied zwischen INPUT und INPUT_PULLUP?

Auf neueren Arduinos kann man pinMode auf einen von drei Zuständen setzen: OUTPUT, INPUT, und INPUT_PULLUP.

Diese Seite sagt:

Der Atmega-Chip auf dem Arduino verfügt über interne Pull-up-Widerstände (Widerstände, die intern mit Strom verbunden sind), auf die Sie zugreifen können. Wenn Sie diese anstelle von externen Pulldown-Widerständen bevorzugen, können Sie das INPUT_PULLUP-Argument in pinMode() verwenden. Dies kehrt das Verhalten effektiv um, wobei HIGH bedeutet, dass der Sensor ausgeschaltet ist, und LOW bedeutet, dass der Sensor eingeschaltet ist.

Ich bin mir ziemlich sicher, dass das Umkehren des Verhaltens nicht das einzige ist, was es tut.

Was macht INPUT_PULLUP? Was unterscheidet es von INPUT, und wie entscheidet man, welches man verwendet?

INPUT_PULLUP wurde mit IDE 1.0.1 hinzugefügt. Es ist unerheblich, welches Arduino-Board Sie verwenden, sie alle unterstützen PULLUPs.

Antworten (2)

Die Standardeinstellung ist INPUT, dass der Pin als INPUT. Wenn der Pin vollständig getrennt ist, wird er zufällig gelesen HIGHund LOW. Wenn Sie es an +5 V oder 0 V binden, wird es offensichtlich HIGHoder lesen LOW.

Intern im Arduino verfügt der Atmega-Chip über interne Pullup-Widerstände mit einem Wert von etwa 20 kOhm. (Siehe die DigitalPins- Dokumentation für weitere Details) Diese Widerstände können optional intern mit verbunden werden INPUT_PULLUP. Dies entspricht funktional (und elektrisch) dem Anschluss eines Widerstands von ~20 kOhm zwischen dem Pin und +5 V. Der einzige Unterschied besteht darin, dass keine externen Komponenten erforderlich sind und Sie ihn während der Ausführung Ihres Programms in der Software ein- und ausschalten können.

Warum also Klimmzüge und keine Pulldowns? Es gibt wahrscheinlich mehrere Gründe dafür, aber wenn Sie Knöpfe oder Schalter oder irgendetwas "normalerweise offen" verdrahten, müssen Sie sie nur an Masse binden, Sie müssen keine +5 V an sie anlegen. Da die meisten Platinen aus Abschirmgründen sowieso mit großen Massegüssen ausgelegt werden, ist die Erdung praktisch.

Einige besser ausgestattete ICs wie ARM-Chips haben sowohl Pull-Ups als auch Pull-Downs, aber die 8-Bit-AVR-Reihe kommt nur mit Pull-Ups. Sie müssen sich nur daran erinnern, dass HIGH"offen" und LOW"geschlossen" ist.

Stimme zu. Zu Ihrer Information, laut Dokumentation sind die internen Klimmzüge 20K, nicht dass es einen großen Unterschied zu 50K macht. arduino.cc/en/Tutorial/DigitalPins

Beachten Sie, dass Sie vor 1.0.1 Klimmzüge mit aktivieren konnten digitalWrite(). Und du kannst es immer noch.

Der Code:

pinMode(13, INPUT);
digitalWrite(13, HIGH); // Turns internal pull-up on
digitalWrite(13, LOW);  // Turns internal pull-up off

Dies ist eine wichtige Unterscheidung, da INPUT_PULLUPoffensichtlich der Pull-up-Widerstand eingeschaltet wird. Weniger offensichtlich ist jedoch, dass ab 1.0.1 das einfache Aufrufen INPUTdas Ausschalten des Pull-Ups erzwingt. (Zuvor blieb der Zustand des Klimmzugs gleich).

Um zu sehen, wie ein Pin mit und ohne Klimmzüge funktioniert, sehen Sie sich die folgenden Videos an.

Floating Pin auf einem Oszilloskop: http://www.youtube.com/watch?v=dBIBFLYCjMM

Mit aktiviertem Pull-Up: http://www.youtube.com/watch?v=SAIw7LLVl-U

Vollständiges Tutorial-Video zu Pull-Ups (beachten Sie, dass ich dies erstellt habe, bevor INPUT_PULLUP zur Arduino-Bibliothek hinzugefügt wurde): http://www.youtube.com/watch?&v=jJnD6LdGmUo

Sehr schlau. Vielen Dank, dass Sie dies geschrieben haben. Stimme zu.