Resistenze di Pull-Up e Pull-Down (comportamento della corrente)

Salve a tutti ragazzi, sono nuovo del forum ma mi preparo già per la prima domanda. :smiley:
Premetto che ho già effettuato numerose ricerche in tutto il web e sul forum, ma dato che mi piace andare fino in fondo nelle cose, non ho trovato le risposte alla mia curiosità.

Come da Titolo l'argomento sono le resistenze di Pull-Up e Pull-Down: so cosa sono, come funzionano, e a cosa servono, ma ciò che non riesco a capire è come cambi il valore della lettura con digitalRead() sui pin digitali grazie a queste.

Prendiamo ad esempio una resistenza di Pull-Up, connessa ad un pin di input con il classico schema che include un pulsante che apre/chiude il collegamento con la massa: quando il pulsante non è schiacciato, il valore letto sul pin è HIGH, dato che il polo positivo è connesso al pin tramite la resistenza, seppur in modo limitato a causa di quest'ultima.
Quando invece si schiaccia il pulsante, il valore letto da Arduino diventa LOW, dato che si apre la connessione alla massa.

La spiegazione di cui mi ero accontentato inizialmente è che il segnale di Pull-Down riesce a "sopraffare" quello di Pull-Up, essendo più "forte", dato che l'altro è limitato dalla resistenza.

Avendo successivamente visto un'immagine (che allego sotto) dov'era spiegato che i pin digitali sono connessi alla massa , sono nate in me queste 2 cavillose domande:
Che tipo di connessione si stabilisce fra massa e massa per far si che Arduino legga il valore LOW? :astonished:
Ma soprattutto: una volta schiacciato il pulsante, la connessione al polo positivo, grazie alla quale leggeva il valore HIGH, rimane comunque. Dunque per quale motivo il valore letto è LOW, nonostante cio? :fearful:

Avendo troppe poche conoscenze di Elettrotecnica ed Elettronica in generale, e pensando che la soluzioni di questi misteri si trovi semplicemente nel capire il comportamento della corrente nel semplice circuito, chiedo a qualche anima pia di svelarmi l'arcano! =(

Grazie mille a tutti in anticipo. :grin:

511568b7ce395f613f000004.jpg

Ti invitiamo a presentarti qui: Re: Presentazioni nuovi iscritti, fatevi conoscere da tutti! (Part 1) - Generale - Arduino Forum
e a leggere il regolamento: [REGOLAMENTO] Come usare questa sezione del forum - Italiano - Arduino Forum

TheBoss97:
...
Come da Titolo l'argomento sono le resistenze di Pull-Up e Pull-Down: so cosa sono, come funzionano, e a cosa servono, ma ciò che non riesco a capire è come cambi il valore della lettura con digitalRead() sui pin digitali grazie a queste.
...

Mi spiace contraddirti, ma da questa tua affermazione si capisce invece che ... non hai affatto capito a cosa servono ...

I pin in ingresso di una MCU, in generale, sono pin ad alta impedenza, e come tali, sensibilissimi a qualsiasi campo elettromagnetico.

Se li lasci liberi e vai a leggere il valore del pin (digitalRead) ... avrai valori che saltellano da LOW a HIGH senza alcuna logica ... poiché seguiranno qualsiasi disturbo il pin capti.

Per evitare questo, si FORZA la condizione del pin in uno stato stabile e sicuro ... o HIGH, mettendo una resistenza verso il +Vcc (pull-up), o LOW, mettendo una resistenza verso GND (pull-down).

Tutto qui ...

E' il caso che ti studi un po' di elettronica di base ...
... puoi cominciare con il fare questa ricerca con Google "imparare l'elettronica partendo da zero pdf" ... sicuramente troverai un bel libro, in .pdf, che pubblico molto tempo fa Nuova Elettronica. Lo trovi anche su Scribd ... QUI.

Buono studio ...

Guglielmo

il pin di ingresso è qualcosa in altissima resistenza (probabilmente il gate di un mosfet) quindi quella resistenza è davvero molto molto alta (quella in ingresso)

quindi usando la formual del partitore:

Vo = Vi (Ring/(Rpul+Ring)) ring>>Rpul quindi Vo= Vi di conseguenza l'ingresso "legge" Vi (nel nostro caso 5V)

quando metti a massa... vi =0 quindi tutto va a zero.

Spero di non aver fatto errori sennò mi tirano le orecchie :slight_smile:

In aggiunta a quanto ti hanno già detto gli altri amici, ti allego l'immagine derivata dal manuale del ATmega328.

I due diodi all'ingresso impediscono (entro certi limiti!) sovratensioni positive e negative, mentre il MOSFET all'interno della parte logica serve ad attivare il resistore interno da circa 20k che evita un eventuale resistore esterno di pull up mediante l'apposita istruzione pinmode.

Digital IO.jpg

gpb01:

TheBoss97:
...
Come da Titolo l'argomento sono le resistenze di Pull-Up e Pull-Down: so cosa sono, come funzionano, e a cosa servono, ma ciò che non riesco a capire è come cambi il valore della lettura con digitalRead() sui pin digitali grazie a queste.
...

Mi spiace contraddirti, ma da questa tua affermazione si capisce invece che ... non hai affatto capito a cosa servono ...

I pin in ingresso di una MCU, in generale, sono pin ad alta impedenza, e come tali, sensibilissimi a qualsiasi campo elettromagnetico.

Se li lasci liberi e vai a leggere il valore del pin (digitalRead) ... avrai valori che saltellano da LOW a HIGH senza alcuna logica ... poiché seguiranno qualsiasi disturbo il pin capti.

Per evitare questo, si FORZA la condizione del pin in uno stato stabile e sicuro ... o HIGH, mettendo una resistenza verso il +Vcc (pull-up), o LOW, mettendo una resistenza verso GND (pull-down).

Tutto qui ...

E' il caso che ti studi un po' di elettronica di base ...
... puoi cominciare con il fare questa ricerca con Google "imparare l'elettronica partendo da zero pdf" ... sicuramente troverai un bel libro, in .pdf, che pubblico molto tempo fa Nuova Elettronica. Lo trovi anche su Scribd ... QUI.

Buono studio ...

Guglielmo

Grazie per la risosta Guglielmo.
Forse ho scritto troppo presciolosamente la domanda, non specificando tutto. Questo fatto dell'alta impedenza e del segnale "fluttuante" lo conoscevo. Sapevo anche che questi resistori servono a stabilire dei livelli logici precisi, il cui cambiamento equivale ad una "transizione di stato".

Se cambiassi la domanda semplicemente in questo, cosa potresti dirmi per farmi risolvere questo problema: "Come i pin digitali di input leggono un segnale/stato? "
E quindi: Essendo tutti e due i poli collegati al pin di input, di cui uno con un resistore di pull down/up, com'è possibile che il valore letto sia precisamente uno?

Forse in questo modo saprai chiarirmi meglio le idee.
Grazie mille per il libro, lo leggerò sicurmente! :smiley:

Se ti vai a studiare il datasheet del 328P scoprirai che a pagina 303 c'è scritto che un pin assume ...

LOW : 0.2 - 0.3 x Vcc ... a 5V hai che LOW è circa 1V - 1.5V
HIGH : 0.6 - 0.7 x Vcc ... a 5V hai che HIGH è circa 3V .. 3.5V
nel mezzo è ... indeterminato

Ora, fissato questo, capisci come funziona il tutto ... XD

Guglielmo

Scusa se sono insistente, ma voglio capre bene questa cosa. Che cosa significa quando scrivi:

gpb01:
LOW : 0.2 - 0.3 x Vcc ...
HIGH : 0.6 - 0.7 x Vcc ...

Che HIGH e LOW sono funzione di con che tensione alimenti la MCU ...

... il 328P può essere alimentato, a seconda delle frequenza del clock, da 1.8V a 5.5V e il valore di HIGH e LOW cambia secondo quelle moltiplicazioni.

Avevo messo anche l'esempio per i 5V ... non era chiaro ???

Guglielmo

Gugliemo, probabilmente è stato tratto in inganno da quello schema decisamente fuorviante che aveva.

gpb01:
Che HIGH e LOW sono funzione di con che tensione alimenti la MCU ...

... il 328P può essere alimentato, a seconda delle frequenza del clock, da 1.8V a 5.5V e il valore di HIGH e LOW cambia secondo quelle moltiplicazioni.

Avevo messo anche l'esempio per i 5V ... non era chiaro ???

Guglielmo

Ok perfetto, non avevo capito che era un'espressione matematica! Ho afferrato, comunque allora anche per il valore LOW c'è un range di valori.
Con un po' di studio cercherò di risolvere tutto quello che ho in testa.

Grazie a tutti per l'aiuto!

gpb01:
Se ti vai a studiare il datasheet del 328P scoprirai che a pagina 303 c'è scritto che un pin assume ...

LOW : 0.2 - 0.3 x Vcc ... a 5V hai che LOW è circa 1V - 1.5V
HIGH : 0.6 - 0.7 x Vcc ... a 5V hai che HIGH è circa 3V .. 3.5V
nel mezzo è ... indeterminato

Ora, fissato questo, capisci come funziona il tutto ... XD

Guglielmo

Con alimentazione 5V i limiti sono:
da -0,5V fino a 1,5V (0,35V) viene riconosciuto LOW
da 3V (0,6
5V) a 5V+0,5V viene riconosciuto HIGH.
Tra 1,5V e 3V non avviene nessun cambio di stato percui se si passa da LOW a HIGH il cambio avviena a 3V mentre se si passa da HIGH a LOW il cambio a LOW avviene a 1,5V.
Ciao Uwe

uwefed:
Con alimentazione 5V i limiti sono:
da -0,5V fino a 1,5V (0,35V) viene riconosciuto LOW
da 3V (0,6
5V) a 5V+0,5V viene riconosciuto HIGH.
Tra 1,5V e 3V non avviene nessun cambio di stato percui se si passa da LOW a HIGH il cambio avviena a 3V mentre se si passa da HIGH a LOW il cambio a LOW avviene a 1,5V.
Ciao Uwe

Infatti mi sembrava. Grazie mille per i chiarimenti :smiley: