Interfacciare un contatto
|
Contatti meccanici.
La maggior parte dei sistemi per comunicare un evento al
microcontroller si basa sull' uso di contatti meccanici.
Di questa categoria fanno parte interruttori, pulsanti, tasti, encoder
meccanici, termostati, ecc.
Il funzionamento è semplice: il contatto è costituito da due
parti metalliche che possono essere allontanate (contatto aperto - nessuna
circolazione di corrente) o accostate con una certa pressione (contatto chiuso
- circolazione di corrente).
Questa struttura si presta bene a numerose applicazioni, in
quanto è relativamente semplice da realizzare, quindi poco costosa e non
richiede una alimentazione speciale per il suo funzionamento, adeguandosi al
circuito in cui il contatto è inserito. Inoltre può separare l' operatore o
il circuito azionante dal circuito del microcontroller, effettuando un
isolamento galvanico (ovvero dove le masse dei due circuiti sono isolate tra
di loro).
Dal punto di vista pratico i contatti sono molto pratici per essere azionati
manualmente (pulsanti, tasti, commutatori, encoder) e possono essere attivati
anche da sensori di fenomeni vari, come termostati, fine corsa, microswitch su
porte o parti in movimento; contatti di relè sono l' uscita comune di PLC,
sensori di livello di liquidi, rilevatori di luminosità, ecc.
Si prestano benissimo all' interfacciamento con gli ingressi
digitali del microcontroller, dato che ne seguono la logica
"digitale" binaria, avendo solo due possibili posizioni, aperto o
chiuso, che è semplice associare ai livelli logici 0 e 1.
|
SI potrebbe pensare di collegare l' interruttore S1 ad un port del
microcontroller, configurato come ingresso digitale, nel modo
rappresentato a lato.
Quando l' interruttore è chiuso, il livello di tensione al pin va
a 0V, quindi a livello basso.
Però...
Però quando l' interruttore è aperto, quale è il livello di
tensione sul port ?
Il livello al port è indeterminato, dato che non è legato ad una precisa tensione.
In queste condizioni, l' ingresso diventa una possibile fonte di
problemi: si tratta tipicamente di un circuito ad alta impedenza e
quindi ben predisposto alla possibilità di catturare disturbi
elettromagnetici. |
|
Proprio per utilizzare contatti come elementi di ingresso, i
costruttori dei microcontroller embedded offrono su alcuni port la
possibilità di attivare dei pull-up
integrati.
Si tratta di resistenze che possono essere inserite tra il pin e la
Vdd, agendo su un apposito registro. Nei PIC di Microchip prendono il
nome di weak pull-up e sono disponibili su uno o più pin a seconda
del modello di microcontroller.
Se attiviamo questa opzione, il pin, anche se non vie è collegato
nulla all' esterno, viene portato a livello alto attraverso la RPU. In
questo modo il pin si trova ad una tensione determinata e viene
ridotta drasticamente la possibilità di disturbi.
Ora, se l' interruttore è aperto, il pin è a livello alto
(attraverso RPU), mentre quando l' interruttore è chiuso va a
livello basso. Attraverso i contatti dell' interruttore passerà una
debole corrente limitata dalla RPU. |
La logica di comando è la seguente:
S1 |
livello di
tensione al port |
aperto |
H |
chiuso |
L |
Nel caso in cui al pin non sia possibile associare una
resistenza interna, si dovrà ricorrere all' aggiunta di un pull-up esterno; questo
va fatto anche quando si interfaccia un contatto che richiede una determinata
circolazione di corrente o quando, usando una resistenza esterna di valore
abbastanza basso, si intende aumentare l' immunità ai disturbi con il
contatto aperto.
|
Il valore della R1 non è particolarmente critico.
Il suo valore determina la corrente che attraversa i contatti di S1
quando sono chiusi.
Tipicamente si utilizzano resistenze tra 4k7 e 100k, tenendo
presente che un valore minore assicurerà una maggiore la reiezione
dei disturbi, ma farà passare una maggiore corrente nei contatti
chiusi e viceversa.
Un valore tra 10K e 22K è solitamente il più utilizzato. Non
occorrono resistori particolari, ma sono adatti piccoli componenti da
1/4 di watt o meno.
Va osservato che la
tensione di alimentazione di R1 deve essere la stessa che alimenta il
microcontroller; e non potrebbe essere diversamente, dato
che il livello alto determinato dalla R1 deve rientrare nei limiti
previsti dal foglio dati del controller. |
Può essere necessario utilizzare un contatto che fa capo alla
Vdd invece che alla massa.
|
La logica di comando è l' opposto della precedente:
S1 |
livello
di tensione al port |
aperto |
L |
chiuso |
H |
In questo caso è obbligatoria l' inserzione di R1 verso massa,
quindi un pull-down che mantiene il port a livello basso con il
contatto aperto.
Quando il contatto è chiuso, il pin viene portato a livello della Vdd.
La resistenza R2 non è strettamente necessaria. Il suo compito è quello di proteggere il
port del microcontroller da correnti eccessive. Senza R2, chiudendo i
contatti di S1 il pin viene collegato direttamente alla Vdd:
trattandosi di un ingresso digitale, la corrente assorbita è minima,
ma se si verificasse un eccesso di tensione, questo potrebbe mettere a
rischio il circuito di ingresso del port. |
Con S1 aperto, si potrebbe verificare una presenza di tensione
statica o di disturbo elettromagnetico indotto nelle connessioni tra contatti
e microcontroller, sopratutto se queste hanno una certa lunghezza. In tal caso
R2 protegge il pin da questi eventi.
Per quanto riguarda i valori, R1 pull-down di un ingresso TTL dovrà avere un
valore tale da mantenere il pin a livello basso, per cui potrà assumere
valori tra 1K e 10K. Negli ingressi CMOS dei
microcontroller la differenza di valore tra pull-up e pull-down non è
decisiva, anche se solitamente è in uso mantenere i pull-down di valore
minore dei pull-up. Anche in questo caso, minore è la resistenza, maggiore
sarà la corrente che attraversa il contatto chiuso e maggiore sarà la
reiezione dei disturbi e viceversa.
La R2 potrà assumere valori anche elevati: maggiore è il suo valore,
maggiore è la protezione dell' ingresso. Valori tra 100 ohm e 100k dipendono dall'
applicazione. Se si tratta di protezione anti statica i valori più elevati
sono quelli più adatti.
Ovviamente, se il collegamento tra il contatto e il port è brevissimo, a
livello di circuito stampato, non si presumono problemi di alimentazione o di
elettricità statica, R2 può essere tranquillamente omessa.
Tenendo sempre ben presente, però, che una apparecchiatura che funziona sul
banco del laboratorio, potrà trovarsi in condizioni ben diverse nell'
ambiente di uso previsto.
Una nota indispensabile che riguarda i contatti meccanici utilizzati
all' ingresso del microcontroller.
Abbiamo detto che se la resistenza di pull-up o
pull-down diventa troppo grande, allora diventa più facile per il rumore
indotto portare casualmente a livello alto o basso il pin di ingresso.
Per contro, una elevata resistenza riduce la corrente assorbita dall'
alimentazione a contatto chiuso, cosa indispensabile per
apparecchiature a basso consumo o alimentate a batteria.
Ma va considerato anche un altro punto solitamente trascurato.
Molti switch sono inaffidabili quando la corrente attraverso
i contatti è troppo piccola, in quanto diventa necessaria
una minima corrente per " pulire" i contatti alla chiusura.
Quindi è necessario verificare dalle caratteristiche del componente
se esista un minimo di corrente di commutazione per quei dati contatti
e far si che alla chiusura essi siano attraversati da una corrente
sufficiente, adeguando il valore della resistenza in serie.
Questo fenomeno è particolarmente sensibile per i contatti che
vengono utilizzati per commutare elevate correnti o tensioni, come
pulsanti, interruttori e relè per impianti elettrici, termostati per
uso domestico e industriale, fine corsa e microswitches industriali
previsti per commutare direttamente carichi a tensione di rete. Tutti
questi non sono particolarmente idonei ad essere collegati ad un
ingresso digitale e, se proprio è necessario usarli, potrà
essere necessario ridurre il valore delle resistenze di pull-up o
pull-down in modo da far passare nei contatti qualche milliampere o
decina di milliampere, per assicurare un contatto chiuso
effettivamente operativo.
Del tutto negativa è, spesso, l' esperienza di utilizzare contatti
usurati ("sfiammati") in cui la corrosione dei metalli crea
situazioni di conduzione instabili e casuali, con corrispondenti
instabilità e casualità nell' esecuzione del programma, spesso
difficili da diagnosticare correttamente.
|
Non ci si deve preoccupare, invece, nel caso di impiego di
tastiere, pulsanti, interruttori e relè previsti per l' uso con circuiti
elettronici, dato che i contatti sono proprio pensati per interrompere
correnti molto basse come quelle presenti nei circuiti logici.
Debouncing
Associato all' impiego di contatti meccanici come ingressi digitali
va tenuta ben presente la necessità di inserire una qualche forma di
debounce hardware o software per eliminare i problemi derivanti dai
rimbalzi delle parti meccaniche che costituiscono il contatto.
In mancanza di questo, ci si potrà trovare con problemi di debug
difficili da diagnosticare e risolvere. |
Il problema è trattato in altra sezione, ma una semplice via per
"ammortizzare" una buona parte dei rimbalzi è quella di aggiungere
un condensatore.
|
La soluzione più semplice è quella di utilizzare un condensatore
ceramico da 10-100nF in parallelo al pin, dopo la R2. Si realizza così un filtro
passa basso in cui la carica del condensatore richiede un certo tempo
dipendente dalla capacità e da R2 e quindi "assorbe" una parte
delle variazioni più rapide.
Il miglior funzionamento si avrà con un ingresso Schmitt trigger;
quindi questa soluzione è applicabile ai pin di ingresso in cui è
presente questa funzione, mentre con quelli dotati solo di buffer TTL
è possibile che la lenta rampa di salita della carica del
condensatore non permetta una commutazione ben definita, creando
problemi.
|
Il funzionamento è semplice:
- Con il contatto aperto, il condensatore si carica attraverso R1, raggiungendo
dopo un certo tempo la tensione di scatto del trigger (tipicamente
0.85 Vdd).
- Chiudendo il contatto, il condensatore si scarica attraverso R2, che ha
lo scopo di evitare che un corto circuito del condensatore, limitandone la
corrente di scarica. Dato che R2 ha un valore basso, il livello elettrico
del pin va rapidamente a 0. Anche se ci sono rimbalzi, questo sono
neutralizzati dalla necessità di caricare C attraverso la Rp.
Inoltre, senza la R2, solitamente si generano delle oscillazioni alla
chiusura del contatto, dovute alla componenti induttive sempre presenti. R2,
limitando il picco di corrente, minimizza queste oscillazioni.
Peraltro, la R2 crea anche una protezione per l' ingresso, effettuando una
limitazione della corrente nei diodi di protezione integrati nel pin quando
sia applicato un disturbo ESD.
Che valori per i pull-up?
Solitamente, negli schemi si vedo impiegati pull-up da 10k. Questa non è
una regola, ma semplicemente una usanza dipendente dal fatto che questo valore
è di uso molto comune e facilmente se ne hanno nel cassetto dei componenti.
In effetti, il valore della resistenza di pull-up può essere di valore
molto superiore, il che riduce la corrente che circola quando il contatto è
chiuso; o anche di valore minore, quando si vuole avere una elevata reiezione
ai disturbi (ma con un corrispondente aumento della corrente a contatto
chiuso, il che può essere necessario per contatti che hanno chiusura sicura
con una certa corrente).
Se consultiamo il foglio dati del microcontroller, troviamo che un ingresso
digitale ha tipicamente una corrente di leakage di circa 5uA (param. D061).
Questa è la corrente che il pin assorbe quando è configurato come ingresso
digitale, per cui varierà al variare della resistenza di pull-up e della
Vdd. Possiamo stilare una tabella che rapporti il valore del
pull-up e la caduta di tensione su di esso prodotta dalla corrente di leakage.
Nel calcolo consideriamo anche la resistenza serie di protezione:
Rpu+Rs |
dV |
1k + 1k |
0.01 |
4k7+1k |
0.0285 |
10k+1k |
0.055 |
47k+1k |
0.285 |
100k+1k |
0.55 |
La tensione che deve avere il pin per essere considerato a livello 1
dipende dal fatto che sia Schmitt trigger o TTL e dalla tensione di
alimentazione secondo questa tabella:
Vdd |
Trigger |
Param. |
|
TTL |
Param. |
< 4.5V |
.85Vdd |
D041 |
0.25 Vdd
+ 0.8 |
D040a |
>4.5V |
2V |
D040 |
Quindi, se mettiamo questi dati in relazione:
Vdd |
VHi |
dV
Vdd-VHi |
Trigger
.85Vdd |
TTL |
2V |
0.25 Vdd
+ 0.8 |
2 |
1.7 |
- |
1.3 |
0,3 -0,4 |
3 |
2.55 |
- |
1.55 |
0.45 - 1.45 |
3.3 |
2.80 |
- |
1.62 |
0.5 - 1,68 |
4.5 |
3.82 |
2 |
- |
0.68 - 2,5 |
5 |
4.25 |
2 |
- |
0.75 - 3 |
E' evidente che le condizioni sono più stringenti nel caso di ingressi con
Schmitt trigger.
Riferendoci alla tabella con il calcolo delle cdt, possiamo dire che,
approssimativamente, si potranno utilizzare i seguenti valori di pull-up::
Vdd |
VHi
Trigger
|
dV |
pull-up
max |
|
VHi
TTL |
dV |
pull-up
max |
2 |
1.7 |
0,3 |
60k |
1.3 |
0,4 |
80k |
3 |
2.55 |
0.45 |
90k |
1.55 |
1.45 |
100k |
3.3 |
2.80 |
0.5 |
100k |
1.62 |
1,68 |
100k |
4.5 |
3.82 |
0.68 |
100k |
2 |
2,5 |
100k |
5 |
4.25 |
0.75 |
100k |
2 |
3 |
100k |
Per valori di Vdd alti è teoricamente possibile salire con il valore del
pull-up, anche a 220k o più (potrebbe parere strano per ingressi
"TTL", ma, ricordiamo, che si tratta di logiche in tecnologia CMOS,
ovvero a bassissimo consumo, in cui TTL indica la compatibilità dei livelli
di tensione). Però questo non è sempre consigliabile dato che, cos' facendo,
si riduce la reiezione dei disturbi. Mentre non ci sono problemi all'uso di
valori minori, anche se non è consigliabile scendere al di sotto di 4k7-1k,
dato che si esporrebbe il pin a problemi che possono nascere da disturbi sulla
tensione di alimentazione.
In generale, posiamo dire che un compromesso tra la possibilità di operare
con sicurezza in tutta la gamma di Vdd possibili e indipendentemente dalla
struttura dell' ingresso, un pull-up da 47k-56k è adeguato per contenere il
consumo.
Di conseguenza, il classico 10k è un valore di ampio margine di sicurezza e
quindi ne è giustificato l' impiego.
In ogni caso, la linea guida è la seguente:
- nei limiti calcolati qui sopra, la scelta di un valore più elevato dei
pull-up sarà d'obbligo quando si desidera minimizzare l'assorbimento di
corrente (apparati low power e alimentati a batteria, solare, ecc.).
- un valore più basso sarà applicato dove sia necessaria una maggiore
reiezione dei disturbi, tipicamente se il contatto non è sullo stesso
stampato del chip o se, comunque, ci si aspetta la possibilità di
disturbi ESD o elettromagnetici indotti.
Attenzione: un basso valore di pull-up NON è una automatica
salvaguardia dalla captazione di disturbi elettromagnetici o cariche
elettrostatiche. La protezione da questi eventi va effettuata con cablaggi
corti e ordinati, cavi schermati, isolamenti ottici, separazione tra logica e
potenza e, in generale, con una costruzione ragionata.
E per il debounce RC?
Il tempo di debounce, stabilito dalla formula:
VHi = Vdd (1 - e -t/RC)
da cui:
t = RC ln (1 - (Vhi/Vdd))
il che dà, per una Vdd = 5V e una Vhi = 4.25V
un tempo pari a circa 0.189RC.
Se utilizziamo Rp+Rs = 10 +1 = 11k e C = 100nF
abbiamo un tempo di 0.189ms. Se usiamo un Rp da 47k, abbiamo
0,82ms. Portando C a 1uF arriviamo a 8.2ms.
Aumentando il valore del condensatore è possibile aumentare il tempo, ma
si può avere un problema sul fronte del segnale, che diventa lento in
proporzione diretta al valore di C e che lo Schmitt trigger potrebbe a vere
difficoltà a trattare correttamente.
Va notato che un debounce hardware è soggetto al vantaggio di escludere
una azione anti rimbalzi attraverso il software, alleggerendolo.
Per contro ha alcuni svantaggi:
- è un tempo fisso dipendente dai componenti. Questo tempo è quello che
viene richiesto per individuare il pulsante premuto o aperto. Se il
contatto ha una durata di rimbalzo minore, viene sprecato tempo.
- per contro, il tempo deve essere adeguato alle caratteristiche del
contatto:ci sono problemi se si utilizza un diverso contatto con tempi di
rimbalzo superiori a quelli prestabiliti.
Inoltre, è normale che un contatto che ha lavorato a lungo aumenti il suo
tempo di rimbalzi. Di questo va tenuto conto nel dimensionamento.
|