Il modulo di interfaccia qui presentato è nato come parte di un progetto elettronico più complesso
(vedere la pagina DDS)
nel quale viene utilizzata come controllo dei parametri funzionali.
Le caratteristiche e la flessibilità operativa la rendono comunque utile in tante altre applicazioni; da qui l'idea di
presentarla come progetto a sè stante.
Il motivo per cui ho scelto di avere un'elettronica separata per gestire un encoder rotativo a quadratura è la capacità di
generare i segnali opportuni verso l'utilizzatore senza 'appesantirlo' con routine abbastanza critiche
nelle temporizzazioni. Inoltre, avere un firmware dedicato a questa funzione consente di modificare e personalizzare
l'interfaccia senza dover intervenire sul programma, sicuramente più complesso, dell'utilizzatore.
In sintesi, l'encoder incrementale rotativo è composto da 2 interruttori meccanici, comandati dalla rotazione
del perno, con chiusura/apertura dei contatti sfasati di 90°.
Il diagramma a lato riporta l'andamento dei segnali nei casi di rotazione in senso orario (sopra) e senso
anti-orario (sotto).
I codici binari associati allo stato degli interurruttori mostrano che un solo bit cambia di stato nel
passaggio da un codice al successivo (ovvero, è un codice Gray); questo consente di identificare univocamente
la stato corrente degli interruttori e determinare di conseguenza il verso di rotazione del perno.
Gli encoder hanno tutti 3 pin di interfaccia, dei quali uno è il terminale in comune comune dei 2
interruttori (normalmente collegato a mass), mentre gli altri due sono gli estremi liberi delgli interuttori,
normalmente collegati al positivo di alimentazione tramite due resistenze di circa 10Kohm.
Frequentemente, all'interno dell'encoder è realizzato un ulteriore interuttore comandato dalla pressione
sul perno; è un interruttore momentaneo, dotato di 2 pin separati. La pressione di questo pulsante durante
la rotazione del perno, può segnalare all'utilizzatore che deve modifica l'interpretazione dei segnali di rotazione.
Decodificare le informazioni fornite significa rilevare il cambiamento di stato delle uscite, eventualmente
misurare la velocità di rotazione, determinare il senso di rotazione.
La logica di decodifica è tipicamente:
Il punto 1 si può realizzare con un interrupt generato sul cambiamento di stato di A, oppure col metodo
polling, interrogando lo stato di A ogni periodo di tempo prefissato (es. 1 msec).
La scelta dipende dalle risorse disponibili, dal realizzare un firmware più o meno semplice, ma anche da considerazioni
pratiche.
Per capire questo punto bisogna considerare che tutti gli interruttori meccanici, a differenza di quelli elettronici, per natura hanno dei
rimbalzi dei contatti che generano un segnale 'sporco' all'atto della transizione (treno di impulsi).
Occorre quindi una soluzione di 'pulizia' del segnale (debouncing); in parte questo viene fatto aggiungendo
un condensatore in parallelo ai contatti; questa C insieme alla R di carico crea una rete di ritardo
che elimina buona parte degli impulsi veloci di rimbalzo (per una costante di tempo T = RC pari a circa 1msec).
A questo punto, la soluzione polling, visto che non reagisce a tutti i cambiamenti di stato come l'interrupt, offre una
probabibilità maggiore di intercettare il reale nuovo stato stabile dei contatti.
La logica di decodifica si farà successivamente carico di 'scartare' le rimanenti situazioni di false transizioni.
La soluzione polling è poco indicata nei casi in cui sia la CPU principale a dover svolgere il compito, perchè rallenta
tutte le altre funzioni. Nel caso si usi una CPU dedicata, come in questo progetto, il problema non si pone e il compito
è più semplice.
Per il punto 3, la soluzione più semplice (N.B. non è una mia idea, ma è stata reperita in rete), e forse elegante, è utilizzare una tabella contenente tutti i valori (16)
che possono assumere i 2 bit dello stato precedente più i 2 bit dello stato attuale; questi 4 bit identificano quale valore
di uscita prelevare dalla tabella.
Il progetto si base su una CPU PIC12F683 a 8 pin che ha, come caratteristiche salienti, 6 pin di I/O, un oscillatore interno
fino a 8MHz (non richiede quindi un quarzo esterno), 2048 words di programma, 128 bytes di RAM e 256 bytes di EPROM.
Il circuito è estremamente semplice: la CPU, 3 condensatori + 3 resistenze di filtro, 1 condensatore elettrolitico
per stabilizzare la tensione di alimentazione e 1 connettore a 6 poli.
Quest'ultimo è l'unico componente da evidenziare, visto che svolge una duplice funzione: è il connettore
ICSP durante la fase di programmazione e il connettore di I/O durante l'uso del circuito.
Le funzioni dei pin sono state pensate appositamente per questa interscambiabilità:
PIN | ICSP | I/O |
1 | MCLR | Comando solo ingresso - opzionale |
2 | Vcc | Vcc |
3 | Gnd | GND |
4 | PGD | DIR uscita - direzione di rotazione |
5 | PGC | CNG uscita - cambiamento di stato |
6 | non utilizzato | BTN uscita bottone Encoder premuto |
Il programma invia 2 segnali all'esterno: CNG [Change] quando avviene un cambio di stato valido
dall'encoder, e DIR [Direction] che segnala la direzione di orario o antioraria.
I segnali sono in logica negativa, per cui a riposo sono al valore 1 mentre sono a 0 nello stato attivo.
Per [DIR] lo stato attivo (0) corrisponde alla rotazione oraria.
Sull'interfaccia è presente anche il segnale [BTN]; per quegli encoder che hanno lo switch incorporato
(pressione del perno), il segnale di chiusura va al PIC che, con il firmware presentato, rallenta
la generazione di impulsi all'esterno a 1 ogni 96 impulsi letti, ovvero circa un cambiamento ogni
100msec. Questo è utile per il controllo 'fine' della grandezza voluta. Con una semplice modifica al firmware
(es. ponendo maxcount=1) si può disabilitare questa funzione.
Lo stesso segnale [BTN] può essere letto dal processore esterno per ulteriori funzionalità o elaborazioni.
Infine, il pin 1 dell'interfaccia può essere usato come comando (è solo in ingresso) dal processore
esterno all'encoder per eseguire altri compiti (es. disabilitazione conteggi, divisione impulsi, ecc).
File compresso contenente schema elettrico e circuito stampato (versione EagleCad 5.x> + file sorgente in Basic 'PicSimulatorIde' + eseguibile: » scarica