↕️ Circuiti e progettazione · Guida 10

Resistenze pull-up e pull-down

Un ingresso digitale non dovrebbe mai essere lasciato senza un livello logico definito. Le resistenze pull-up e pull-down servono proprio a questo: mantengono un nodo a HIGH oppure a LOW quando nessun altro dispositivo lo pilota. Sono fondamentali nei pulsanti, nei segnali di reset, negli ingressi dei microcontrollori e nei bus open-drain come I²C.

Livello: base → intermedio Tempo di lettura: 22–26 min HIGH / LOW definiti Arduino + ESP32 + I²C

Che cos’è un ingresso flottante?

Un ingresso digitale è flottante quando non è collegato in modo definito né a un livello logico alto né a uno basso. Poiché gli ingressi dei moderni microcontrollori hanno impedenza molto elevata, bastano piccolissime correnti parassite, campi elettromagnetici o capacità dei collegamenti per far cambiare casualmente il livello letto.

Un pin flottante può sembrare “funzionare” sul banco e diventare instabile nel circuito reale Avvicinare una mano, toccare un filo o accendere un motore nelle vicinanze può essere sufficiente per modificare la lettura.
La pull-up o pull-down non “forza” violentemente il nodo Gli assegna semplicemente un livello di default attraverso una resistenza, lasciando che un pulsante o un altro circuito possa portarlo facilmente allo stato opposto.

Come funziona una resistenza pull-up

Una resistenza pull-up collega il nodo di ingresso a VCC. Quando nessun altro elemento pilota il nodo, la resistenza lo mantiene a livello logico HIGH.

Schema resistenza pull-up con ingresso digitale e pulsante verso massa
Schema di una resistenza pull-up: con il pulsante aperto l’ingresso rimane HIGH; premendo il pulsante viene portato a LOW.
Pulsante aperto → HIGH Pulsante premuto → LOW

Come funziona una resistenza pull-down

La pull-down è il contrario: collega il nodo a GND e lo mantiene a livello LOW quando nessun altro circuito lo pilota. Il pulsante viene normalmente collegato tra ingresso e VCC.

Schema resistenza pull-down con ingresso digitale e pulsante verso VCC
Schema di una resistenza pull-down: con il pulsante aperto l’ingresso rimane LOW; premendo il pulsante viene portato a HIGH.
Pulsante aperto → LOW Pulsante premuto → HIGH

Pull-up e pull-down a confronto

ConfigurazioneStato di defaultCon pulsante
Pull-up + pulsante verso GNDHIGHLOW
Pull-down + pulsante verso VCCLOWHIGH
Dal punto di vista logico entrambe funzionano La scelta dipende dal circuito, dalle resistenze interne disponibili, dalla sicurezza richiesta e dal tipo di uscita collegata.

Perché il pull-up è così comune con i pulsanti?

Molti microcontrollori includono pull-up interne, quindi basta collegare il pulsante tra il pin e GND. Questo riduce il numero di componenti esterni.

Il risultato è una logica invertita Pulsante non premuto = HIGH.
Pulsante premuto = LOW.
Questa configurazione è anche molto pratica nel cablaggio Per un pulsante remoto puoi portare al contatto semplicemente il segnale e la massa, senza distribuire necessariamente VCC.

Logica attiva bassa

Quando una funzione viene attivata portando il segnale a LOW si parla spesso di active-low. Nei nomi dei segnali puoi incontrare convenzioni come:

  • /RESET;
  • RESET_N;
  • CS#;
  • EN̅.
Pull-up + segnale active-low è una combinazione molto comune Finché nessuno interviene, il segnale rimane inattivo a HIGH. Un dispositivo lo porta a LOW quando deve attivare la funzione.

Come scegliere il valore della resistenza

Per semplici ingressi digitali si incontrano spesso valori da 1 kΩ a 100 kΩ, con 4,7 kΩ e 10 kΩ molto comuni.

ValoreCaratteristica
1 kΩPull forte, buona immunità al rumore ma maggiore corrente.
4,7 kΩCompromesso molto comune.
10 kΩTipico per pulsanti e ingressi digitali lenti.
47–100 kΩBasso consumo, ma nodo più sensibile a disturbi e capacità.
Non esiste un “10 kΩ sempre giusto” Il valore dipende da tensione, leakage, capacità, velocità del segnale, rumore e corrente disponibile dal dispositivo che porta la linea allo stato opposto.

Quanta corrente scorre nella pull-up?

Quando il nodo viene portato allo stato opposto, la resistenza si trova tra VCC e GND. La corrente è determinata dalla legge di Ohm:

I = V / R
Pull-up da 10 kΩ su 5 V I = 5 / 10.000 = 0,5 mA.
Pull-up da 10 kΩ su 3,3 V I = 3,3 / 10.000 = 0,33 mA.

Consumo quando il pulsante è premuto

Con una pull-up e pulsante verso GND, quando il pulsante è aperto idealmente la corrente è quasi nulla. Quando viene premuto scorre invece corrente attraverso la resistenza.

P = V² / R
5 V e 10 kΩ P = 25 / 10.000 = 2,5 mW.
Nei dispositivi a batteria il valore può diventare importante Se un segnale rimane nello stato “attivo” per molto tempo, una pull-up troppo bassa può aumentare inutilmente il consumo.

Cosa succede se la resistenza è troppo bassa?

  • aumenta la corrente quando la linea viene portata allo stato opposto;
  • aumenta il consumo;
  • l’uscita open-drain deve assorbire più corrente;
  • può superare i limiti del dispositivo che forza il LOW.
Una pull-up da 100 Ω a 5 V richiederebbe 50 mA quando la linea è LOW Per un normale GPIO sarebbe un valore decisamente inappropriato.

Cosa succede se la resistenza è troppo alta?

  • il nodo diventa più sensibile alle correnti di leakage;
  • aumenta la sensibilità ai disturbi;
  • insieme alla capacità della linea aumenta il tempo di salita;
  • la tensione HIGH reale può diminuire in presenza di leakage significativo.
La resistenza deve essere abbastanza bassa da dominare leakage e rumore, ma abbastanza alta da non sprecare corrente È questo il vero criterio progettuale.

Resistenze pull-up e pull-down interne

Molti microcontrollori integrano resistenze configurabili internamente. Sono comode perché eliminano componenti esterni, ma il loro valore può essere poco preciso e variare tra dispositivi.

Non usarle automaticamente in circuiti che richiedono un valore ben definito Per bus veloci, temporizzazioni RC o segnali esposti a forte rumore può essere preferibile una resistenza esterna.

Arduino e INPUT_PULLUP

Con Arduino è possibile attivare la pull-up interna usando:

pinMode(pin, INPUT_PULLUP); Il pulsante viene normalmente collegato tra pin e GND.
Ricorda l’inversione logica digitalRead() restituisce HIGH con pulsante rilasciato e LOW quando viene premuto.

Pull-up e pull-down su ESP32

ESP32 offre pull-up e pull-down interne su molti GPIO, ma non necessariamente su tutti i pin e in tutte le modalità.

Controlla sempre il pin specifico Alcuni GPIO hanno funzioni di boot, strap o periferiche speciali. Una resistenza esterna può influenzare l’avvio della scheda.

Pull-up su RESET, ENABLE e linee critiche

Le linee di reset o enable devono avere uno stato noto anche mentre il microcontrollore sta iniziando ad alimentarsi e i GPIO non sono ancora configurati.

Per questo spesso si usa una resistenza esterna Una pull-up mantiene RESET inattivo finché un pulsante, un supervisore o un altro circuito non forza la linea a LOW.

Uscite open-drain e open-collector

Un’uscita open-drain non genera attivamente il livello HIGH. Può soltanto:

  • portare la linea a LOW;
  • oppure rilasciarla in alta impedenza.

Serve quindi una pull-up esterna per ottenere il livello HIGH.

Più dispositivi possono condividere la stessa linea Qualunque dispositivo può portarla a LOW senza che due uscite push-pull entrino in conflitto.

Perché I²C usa resistenze pull-up?

Le linee SDA e SCL di I²C sono tipicamente open-drain. I dispositivi possono soltanto portarle a LOW; le resistenze pull-up le riportano a HIGH.

tr ≈ 0,8473 · RP · CBUS Relazione approssimata comune tra pull-up, capacità del bus e tempo di salita 30–70%.
Una pull-up troppo alta può rendere il fronte di salita troppo lento Alle velocità I²C più elevate la capacità del bus diventa un parametro fondamentale.

Pull-up, capacità e costante di tempo

Una linea reale possiede capacità verso massa. La pull-up e questa capacità formano un circuito RC.

τ = Rpull-up · Clinea
Esempio R = 10 kΩ
Clinea = 100 pF

τ = 10.000 × 100×10−12 = 1 µs.
Per un semplice pulsante è irrilevante, per un bus veloce no Questo spiega perché i valori delle pull-up su I²C non possono essere scelti senza considerare lunghezza e capacità del bus.

Pull-up, pull-down e immunità al rumore

Una resistenza più bassa rende il nodo “più rigido”: una piccola corrente parassita produce una variazione di tensione inferiore.

ΔV = Idisturbo · R
Corrente parassita di 10 µA Con 100 kΩ → ΔV = 1 V.
Con 10 kΩ → ΔV = 0,1 V.
Questo è uno dei motivi per cui 10 kΩ è un valore così diffuso negli ingressi lenti Offre un buon compromesso tra consumo e robustezza.

Errori comuni con pull-up e pull-down

  • lasciare un ingresso digitale flottante;
  • confondere pull-up e pull-down;
  • dimenticare che un pulsante con pull-up produce logica invertita;
  • usare una resistenza troppo bassa e sovraccaricare l’uscita che forza il LOW;
  • usare una resistenza troppo alta in ambienti rumorosi;
  • considerare le pull interne come valori precisi;
  • aggiungere pull-up duplicate su un bus I²C senza considerare la resistenza equivalente;
  • ignorare la capacità del bus;
  • collegare una pull-up a una tensione non compatibile con il dispositivo;
  • modificare involontariamente i livelli di boot/strap di un microcontrollore.