BoxIdee

INTERFACCIA PER ENCODER INCREMENTALE

Descrizione

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.



Teoria di funzionamento

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.


Decodifica

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:

  1. Rilevare il cambiamento di stato di un interruttore (es. A)
  2. In corrispondenza, leggere lo stato di B
  3. In base al verso di cambiamento di A e allo stato attuale di B, determinare il verso di rotazione orario o anti-orario del perno

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.



Caratteristiche

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à:



Firmware e uso

PINICSPI/O
1MCLRComando
solo ingresso - opzionale
2VccVcc
3GndGND
4PGDDIR
uscita - direzione di rotazione
5PGCCNG
uscita - cambiamento di stato
6non utilizzatoBTN
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).



Download

File compresso contenente schema elettrico e circuito stampato (versione EagleCad 5.x> + file sorgente in Basic 'PicSimulatorIde' + eseguibile: » scarica


Click su qualsiasi immagine per ingrandire


Schema elettrico


Circuito stampato


Prototipo montato