Jaka jest różnica między INPUT a INPUT_PULLUP?

24

W nowszych Arduinos można ustawić pinMode do jednego z trzech stanów: OUTPUT, INPUT, i INPUT_PULLUP.

Ta strona mówi:

Układ Atmega w Arduino ma wewnętrzne rezystory podciągające (rezystory łączące się wewnętrznie z zasilaniem), do których można uzyskać dostęp. Jeśli wolisz używać ich zamiast zewnętrznych rezystorów rozwijanych, możesz użyć argumentu INPUT_PULLUP w pinMode (). To skutecznie odwraca zachowanie, gdzie WYSOKA oznacza, że ​​czujnik jest wyłączony, a NISKA oznacza, że ​​czujnik jest włączony.

Jestem raczej pewien, że odwrócenie zachowania nie jest jedyną rzeczą, którą robi.

Co ma INPUT_PULLUPzrobić? Czym się różni INPUTi jak decyduje się, którego użyć?

Manishearth
źródło
Dodano INPUT_PULLUP z IDE 1.0.1. Nie ma znaczenia, z której płyty Arduino korzystasz, wszystkie obsługują PULLUPY.
baldengineer

Odpowiedzi:

23

Domyślnie INPUTustawiony jest pin jako INPUT. Jeśli pin jest całkowicie odłączony, losowo odczyta HIGHi LOW. Jeśli przywiążesz go do + 5 V lub 0 V, to oczywiście będzie czytać HIGHlub LOW.

Wewnątrz Arduino znajdują się rezystory podciągające o wartości około 50 kΩ. Rezystory te można opcjonalnie podłączyć wewnętrznie za pomocą INPUT_PULLUP. Jest to funkcjonalnie (i elektrycznie) równoważne podłączeniu rezystora 50 kΩ między pinem a + 5 V, jedyną różnicą jest to, że nie wymaga żadnych zewnętrznych elementów i można go włączać i wyłączać w oprogramowaniu podczas wykonywania programu.

Dlaczego więc podciągania, a nie podciągania? Prawdopodobnie ma to kilka przyczyn, ale kiedy okablowanie przycisków lub przełączników lub coś „normalnie otwartego”, musisz tylko przywiązać do ziemi, nie musisz biegać do nich + 5 V. Ponieważ większość desek zostanie zaprojektowana z dużymi zalewami z powodów ekranowania, wiązanie z podłożem jest praktycznie uzasadnione.

Niektóre bardziej funkcjonalne układy scalone, takie jak układy ARM, mają zarówno podciągania, jak i opuszczania, ale 8-bitowa linia AVR ma tylko podciągnięcia. Musisz tylko pamiętać, że HIGHjest „otwarty” i LOW„zamknięty”.


źródło
Głosuj. Do twojej wiadomości, zgodnie z dokumentacją, wewnętrzne podciągnięcia są 20K, ale to nie robi dużej różnicy od 50K. arduino.cc/en/Tutorial/DigitalPins
SDsolar
9

Pamiętaj, że przed wersją 1.0.1 można było włączyć podciągania za pomocą digitalWrite(). I nadal możesz.

Kod:

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

Jest to ważne rozróżnienie, ponieważ INPUT_PULLUPoczywiście włącza rezystor podciągający. Jednak mniej oczywiste jest to, że począwszy od wersji 1.0.1, zwykłe wywołanie INPUTwymusza wyłączenie podciągania. (Wcześniej stan podciągania pozostawał taki sam).

Aby zobaczyć, jak pin działa z podciągnięciami i bez nich, obejrzyj następujące filmy.

Pływająca szpilka na oscyloskopie: http://www.youtube.com/watch?v=dBIBFLYCjMM

Po włączeniu pull-up: http://www.youtube.com/watch?v=SAIw7LLVl-U

Pełny film instruktażowy na temat podciągnięć (zwróć uwagę, że zrobiłem to przed dodaniem INPUT_PULLUP do biblioteki Arduino): http://www.youtube.com/watch?&v=jJnD6LdGmUo

Baldengineer
źródło
Bardzo mądry. Dziękuję za napisanie tego. Głosuj.
SDsolar