Tips & Tricks - PIC

 


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. 

 



 

Copyright © afg . Tutti i diritti riservati.
Aggiornato il 03/11/14 .