Newsgroup: it.hobby.elettronica.digitale
Titolo: consiglio su lettura encoder

Ciao,
devo leggere un encoder assoluto a 6 bit che effettua un giro completo 
ogni 200-250 ms. In funzione dell'angolo letto devo attivare delle 
uscite, controllare un motore passo-passo e via dicendo. Praticamente ho 
una tabellina che per diversi valori angolari mi dice cosa devo fare.
Naturalmente il tutto viene implementato su uC.
Chiedevo consiglio su come conviene gestire la lettura dell'encoder, le 
variazioni dei bit avvengono circa ogni 3-4 ms. Conviene estrappolare un 
clock e generare un interrupt ogni volta per andare a leggere il valore 
corrente?
Cosa suggerite?
Grazie,
Marco / iw2nzm

 ha scritto:

Se l'encoder ha un uscita in codice binario è abbastanza semplice da gestire con
un interrupt sul bit meno significativo (LSB) attraverso la gestione del del
fronte in modo da generare un int ogni variazione.
Se invece esce in codice gray la cosa si complica e la scelta è tra la
complicazione dell'hardware con comparatori (HC688) e latch o la gestione in
polling del dato.
ciao
  Stefano

 polling del dato.
Le specifiche me le daranno a breve, ho visto di sfuggita la tabella 
delle uscite ma era compilata in modo assurdo e non si poteva capire che 
codice fosse... Ad ogni modo se si riesce a tirar fuori un clock 
conviene gestire ad interrupt, altrimenti si può provare con il polling.
Ma in questo caso come si potrebbe fare? Cioè, aspetto fino a che non 
rilevo un cambiamento sulla porta, leggo il valore e aggiorno la mia 
variabile interna. Mi rimetto in attesa del successivo cambiamento.
Però nel frattempo dovrei fare altre cose, tipo comandare uno stepper o 
eseguire controlli su altri ingressi... come si concilia questo con il 
polling?
Grazie,
Marc/ iw2nzm

polling?
Dipende dalla velocità con cui devi seguire l'encoder.
Se ad esempio alla velocità massima consentita l'encoder ha una frequenza di
cambiamento di 1 millisecondo (equivalente ad una frequenza di 500Hz su LSB)
allora puoi usare il polling tramite un timer con un tempo inferire al
millisecondo, e in background fare il resto.
Naturalmente in questo caso non hai una risposta immediata alla variazione del
dato ma hai un ritardo massimo che è il ciclo del timer, nel caso che la
variazione avvenga subito dopo una lettura.
ciao
  Stefano

 polling del dato.
Se hai un interrupt sulla porta e non su un pin soltanto (tipo i PIC), puoi
usare l'interrupt anche se l'encoder ha il codice gray, no?
Olivier.

 Olivier.
Vero, ma dovendo gestire anche altri interrupt non posso usare tutta una 
porta per l'encoder! E comunque i PIC (o meglio quelli che sto usando) 
hanno solo un nibble con interrupt.
Ciao!
Marco / iw2nzm

 hanno solo un nibble con interrupt.
Non sono sicuro al 100%, ma se l'encoder è a 8 bit gray, presi anche solo 4 bit
a caso, questi non sono mai uguali in due posizioni adiacenti.
Olivier.

 a caso, questi non sono mai uguali in due posizioni adiacenti.
Beh, questo lo posso verificare facilmente!
Grazie dei suggerimenti!
Marco / iw2nzm

 operazioni, meglio evitare di dover anche comunicare sul bus!
Sempre che sul tuo PIC non abbia l'I2C hardware...
Olivier.

 conviene gestire ad interrupt, altrimenti si può provare con il polling.
Se l'encoder esce solo con i dati senza clock e la codifica
sembra incomprensibile, allora e' sicuramente codice gray.
Essendo un encoder assoluto, non c'e' il pericolo di perdere
la posizione che avresti come con un encoder incrementale,
percio' puoi leggerlo quando ti pare e non hai bisogno di
interrupt.
Come alternativa al micro, potresti pensare anche ad una memoria,
a 6 linee di indirizzi colleghi l'encoder e attivi le uscite in
corrispondenza dei valori che ti interessano. E' molto comodo
se le posizioni sono fisse perche' puoi usare una eprom.
Se le posizioni devono essere variate frequentemente dovresti
usare una ram e il circuito si complica un po'.

 Sempre che sul tuo PIC non abbia l'I2C hardware...
Si si, c'è l'ha on-board se riesco però vorrei evitare di aggiungere 
troppa roba al programma... come per l'hardware.. meno funzioni ci sono 
meno bug vanno corretti ^__^
Marco / iw2nzm

 usare una ram e il circuito si complica un po'.
I valori di posizione sono impostabili dall'utente tramite LCD e 
tastierino numerico. Le operazioni da fare in loro corrispondeza sono 
azionamenti di stepper e controlli vari. Eventualmente se ci fossero 
problemi a gestire tutto via micro si potrebbe sempre pensare a usare la 
EEPROM per abilitare alcune uscite in funzione dei valori preimpostati. 
Queste uscite le rileva il uC e fa quel che deve. Ci si può pensare...
Thx,
Marco / iw2nzm

 meno bug vanno corretti ^__^
Non so, a me sembrano tanto carini e facili da usare, alla fine non credo che il
codice si complichi di molto. Hai bisogno di un interrupt esterno e di un
interrupt per la ricezione del byte i2C.
Olivier.