Un encoder rotativo incrementale è un componente elettromeccanico molto interessante, che permette di realizzare molte applicazioni dove sia richiesto un accurato controllo manuale, sia nei circuiti analogici che digitali. Il costo è, in genere, molto basso ed è facilmente reperibile presso la maggior parte dei rivenditori di componenti elettronici. Sfortunatamente, gli impulsi delle uscite non possono essere letti e utilizzati immediatamente, perché essi sono segnali in opposizione di fase che risultano presenti ad ogni passo della rotazione. Il circuito presentato nell'articolo fornisce una semplice soluzione per eliminare il problema.
Introduzione
Solitamente, un microcontrollore con un firmware adatto è utilizzato per interpretare gli impulsi generati da un encoder rotativo e per determinarne il senso di rotazione. Per molte applicazioni, utilizzare un encoder rotativo come potenziometro digitale è, spesso, scomodo. Se si lavora a progetti nei quali occorrono decine di encoder, il problema può diventare serio. Per rendere il tutto più semplice si può realizzare un piccolo circuito economico, non più grande dell'encoder stesso, con uscite a Trigger di Schmitt separate per la rotazione oraria e antioraria. Inoltre gli impulsi non si accavallano quando l'encoder viene ruotato rapidamente.
Principio di funzionamento
Per soddisfare tali requisiti, è stato progettato il circuito qui descritto, che è adatto per un encoder con interruttore a pulsante incorporato ma va anche bene per uno sprovvisto d'interruttore. Il design è adatto alla maggior parte dei modelli sul mercato. Il circuito, mostrato in figura 1, è costituito da due flip-flop CMOS con fronte positivo con ingressi preimpostati, tramite il 74HC74 e il 74HC14. Tutte le uscite dall'encoder (quindi gli ingressi al circuito, compreso quello dal pulsante) sono collegate tramite due resistori da 10 kΩ in serie alla linea di alimentazione positiva. C1, C2 e C3 provvedono al disaccoppiamento. Il circuito garantisce un impulso anti rimbalzo, con un tempo di discesa di 7 ms e un tempo di salita di 14 ms. Gli inverter trigger di Schmitt convertono gli impulsi dall'encoder in segnali attivi con fronti ripidi, per attivare il D-flip-flop con un fronte di salita. Il tempo tra gli impulsi successivi è limitato a un minimo di 10.5 ms per impedire la sovrapposizione degli impulsi. L'uscita dell'inverter IC1.A è collegata all'ingresso D e all'ingresso di reset del primo flip-flop (IC2.A). L'ingresso preimpostato non viene utilizzato ed è collegato a VCC. Anche l'uscita del primo inverter è collegata all'ingresso del secondo flip-flop. L'uscita del secondo inverter (IC1.F) è collegata come la prima, con la differenza che IC2.A e IC2.B sono invertiti. Nello stato di riposo le uscite sono basse. Tuttavia, quando l'encoder ruota di un passo, vengono generati due impulsi sfasati, che dipendono dalla direzione di rotazione.
La rotazione dell'encoder
Quando l'encoder viene ruotato in senso antiorario, il circuito vede il primo impulso ("FFA") presente sul pin 1 di K1 ("FFA" in figura 2), dopo un quarto di tempo questo è seguito da un impulso sul pin 3 (" FFB"). Tale primo impulso (attivo-basso) (FFA) viene invertito da IC1.A e quindi attiva IC2.A. Poiché non c'è alcun segnale di clock (nessun impulso ancora sul pin 3 di K1), l'uscita di IC2.A non è a livello logico alto e l'uscita corrispondente (pin 2 di K2) rimane alta. Tuttavia, IC2.B riceve un impulso di clock. Quando, successivamente, si presenta un impulso sul pin 3 di K1 (attivo-basso), l'uscita di IC1.F commuta a livello alto e IC2.A scandisceil segnale sull'ingresso D. Il pin 2 di K2 diventa basso per indicare che l'encoder è ruotato in senso antiorario. Sebbene l'ingresso D di IC2.B sia ora alto, questo segnale non è "sincronizzato" all'uscita perché il segnale sull'ingresso di IC2.B era alto, quindi pin 4 di K2 rimane alto. Una volta che l'impulso sul pin 1 non è più presente, IC2.A viene resettato e il pin 2 di K2 torna alto. Nulla cambia all'uscita di IC2.B, poiché l'ingresso del clock reagisce solo a un fronte di salita. L'ingresso di clock di IC2.A ritornerà basso e non produce alcuna modifica alla sua uscita. Quando si gira l'encoder in senso orario si verifica una sequenza di eventi quasi identica, con la sola differenza che l'uscita di IC2.B cambia e l'uscita di IC2.A rimane bassa.
Conclusioni
Notiamo che la durata degli impulsi all'uscita corrispondono alla metà rispetto a quelle dell'encoder all'ingresso. L'uscita rimane bassa finché non si rilascia il pulsante. Viene anche bufferizzata utilizzando due inverter Schmitt-Trigger. Il tutto è molto semplice e intuitivo.
Gli encoder rotativi sono utilizzati moltissimo anche in campo robotico per la determinazione delle velocità delle ruote dei robot, anche se le applicazioni più generali sono in ambito industriale per calcolare le velocità degli alberi rotanti.
Questo è il genere di articoli che piace a noi cresciuti a suon di Elektor ed altre riviste di pari portata che hanno fatto la storia della divulgazione sull’elettronica e che per correttezza nei confronti della redazione di Elektor evito di citare. Perché ci piace? Perché tratta di un progetto risolto senza microcontrollore, diremmo vecchio stile ma sempre attuale. Quei progetti che per essere compresi devi seguire i collegamenti tra i vari componenti sullo schema e non delle righe di firmware. Quei progetti su cui imparare davvero l’elettronica e non un linguaggio di programmazione o un algoritmo di vario genere. Quei progetti dove le temporizzazioni si fanno con resistori, condensatori e invertitori a trigger di Schmitt invece di utilizzare una funzione di delay(). Quei progetti dove il debug lo si fa con un multimetro, sonda logica (magari autocostruita) e per chi ha la fortuna di possederlo con un oscilloscopio, senza breakpoint e monitor seriali di qualsivoglia ide di sviluppo. Insomma, un problem solving diverso nell’approccio ma pur sempre di problem solving si tratta. 😀
Al di là della mia divagazione spero condivisibile dall’utenza del blog, volendo focalizzare l’attenzione sul progetto specifico, mi preme evidenziare che gli encoder incrementali (relativi) sono sistemi di rilevazione della posizione molto utilizzati in diversi ambiti non solo squisitamente industriali, ma anche nella progettazione quotidiana dove sapere la posizione esatta di un’asse rotante e quindi l’angolo tracciato rispetto ad una posizione iniziale può influenzare l’azione del sistema, o sullo stesso asse (loop in retroazione negativa tipica dei sistemi di controllo con regolatore) o su attuatori remoti. Tipica applicazione degli encoder incrementali è la selezione di una voce da menù a schermo o la regolazione di parametri “analogici” agendo su potenziometri digitali. Tipicamente vengono gestiti in maniera molto semplice tramite il firmware di un microcontrollore, abilitando un interrupt a priorità alta sullo stato dei pin FFA e FFB; in tal modo non si rischia di perdere azioni sulla manopola o sull’albero in rotazione su cui è calettato l’encoder rispetto all’esecuzione del resto del firmware. Il circuito presentato nell’articolo invece rivela, tramite due uscite digitali, il verso di rotazione e lo stesso, associato al segnale di sincronismo generato dalla rotazione dell’encoder, rendono possibile l’interpretazione dell’azione in corso sul componente. Ottimi gli spunti progettuali che se ne possono trarre.