Convertire un encoder da incrementale uscita A-B ad assoluto interfaccia SSI ?

Jan 21, 2024 Last reply: 2 anni fa 41 Replies

RobertoA snipped-for-privacy@tiscalinet.it ha scritto:

a volte alcuni dettagli sfuggono. RoV ha supposto che usavi un encoder con uscita line driver, i piu' usati in automazione, mentre in effetti tu hai indicato che il tuo encoder esce con segnali a 24V, solo A e B.

l'uscita line driver ha sia A e B che A/ e B/ (i negati) quindi c'e' sempre almeno un segnale a livello logico 1, e sono a 5V, se li unisci tutti e 4 in una OR a diodi (scotcky) ci puoi alimentare la tua elettronica, forse.

Dispongo di un encoder incrementale, che chiamero' A, che esce con il classico segnale doppia onda quadra sfasata 90gradi, e' un 500 impulsi/giro,segnali A-B a 0-24V



Poi ho l'apparecchiatura utente, chiamero' B, che deve 'leggere' l'encoder e dispone di interfaccia Ssi ed inoltre deve leggere oltre che la posizione sul giro anche il numero di giri che ha fatto l'encoder



L'encoder A puo' girare anche quando l'apparecchiatura utente B e' spenta, e quindi dovendo mantenere il numero di giro al quale e' arrivato l'encoder, dovro' piazzare un po' di elettronica permanentemente alimentata o comunque alimentata almeno quando l'encoder gira, che sia ingrado di memorizzare il numero di giri e la posizione encoder nel giro In sostanza devo inserire tra A e B un'apparecchiatura che chiamero' C per ottenere un encoder assoluto e cambiargli intefaccia uscita



Sapete se cia sia gia' qualche scheda che faccia questo di mestiere o mi tocca accendere il saldatore e mettermi a programmare? (sappiate che nel secondo caso vi rompero' le scatole mica poco)



Temo che dovrai armarti di saldatore e compilatore:) Non ho esperienza con quella roba, ma se hai in encoder relativo e, differenze di interfacciamento a parte, devi farlo parlare con qualcosa che se ne aspetta uno assoluto, dovrai implementare qualcosa che elimini gli inevitabili errori che si accumulano leggendo la posizione ogni tot gradi e corregendo dove serve, altrimenti alla fine ti ritroveresti pure con il numero di giri sbagliato. E' anche un problema meccanico.

Il 21/01/24 10:48, RobertoA ha scritto:

Cit. Temo che dovrai armarti di saldatore e compilatore:) Io ho esperienza con quella roba e il livello di difficoltà della soluzione proponibile dipende dalla frequenza massima dell'onda quadra generata dall'encoder (da quattro cmos in croce, ad un piccolo micro, ad un fpga).

Essendo l'encoder un 500imp/giro, a quale velocità massima ruoterà?

Il 21/01/2024 10:48, RobertoA ha scritto:

Se non ho capito male, vuoi trasformare un encoder incrementale in un encoder assoluto, cosa che non è possibile in modo completo.

Per esempio, come faresti a conoscere la posizione assoluta dell'encoder all'accensione?

Il 22/01/2024 11:58, pozz ha scritto:

non dimenticandola, è quello che vuole insieme a tutti i giri se non ho capito male :)

Bisogna creare un circuito, non credo ci sia qualcosa di già pronto.

Il 22/01/2024 11:58, pozz ha scritto:

Una volta attivata la scheda di conversione (intendo l'elettronica in mezzo tra encoder A ed apparecchiatura utente B), si dovra' fare un azzeramento inziale

Il 22/01/2024 10:06, infar ha scritto:

Abbastanza lenta, credo che al massimo si arrivera' a qualche centinaio di impulsi/sec, supponiamo 200 impulsi/sec tanto per dare una misura

Il 22/01/2024 12:43, Franco Af ha scritto:

Speravo ci fosse qualcosa del tipo "l'encoder in kit" Ma si vede che sono troppo ottimista

Il 21/01/2024 10:48, RobertoA ha scritto:

Arduino Nano con 2 interrupt.

A Gennaio si parlò di qualcosa di simile:

formatting link
Foto del profilo di LAB LAB

14 gen 2023, 14:04:06 a Con un encoder a scatti scrive il valore di contatore sulla seriale:

volatile int16_t contatore=0; // Fino a oltre +/-32000. Ho previsto anche i valori negativi. volatile uint8_t s=0; // Valore decimale dei bit. volatile uint8_t sp=0; // Stato precedente di s. volatile uint8_t x=0; int16_t contatorep=0; // Valore precedente.

void setup() { pinMode(8, INPUT_PULLUP); pinMode(9, INPUT_PULLUP); Serial.begin(9600); Serial.println("Start"); // Pin Change Interrupt Control Register (PCICR): PORTD=PCIE2; PORTC=PCIE1; PORTB=PCIE0; PCICR |= 0b00000001; // PORT B. // PORT B: PMSK0; D9 e D8 sono i bit 1 e 0: PCMSK0 |= 0b00000011; }

void loop() { if(contatore != contatorep) { Serial.println (contatore); contatorep = contatore; } }

ISR (PCINT0_vect) { // bit AB s=((PINB^0xFF) & 0b00000011); // Inverto i bit, perché l'encoder chiude a massa, e considero solo D9 e D8. S è composto dai bit A e B. s^=s>>1; // Faccio AB XOR A, ottenendo un valore decimale fra 0 e 3. if (s!=sp && s==0) x=0; if (x==0) { if (sp==1 && s==2) { contatore+=1; x=1; } else if (sp==3 && s==2) { contatore-=1; x=1; } else if (!s) x=0; sp=s; } }

Il 23/01/2024 09:44, LAB ha scritto:

Si certo, per la lettura non c'e' alcun problema e' il classico due onde quadre sfasate di 90 gradi, da leggere

La vedo un po' piu' fastidiosa la necessita' di tenere alimentata l'elettronica anche quando l'utente B e' spento, perche' in realta' la mia elettronica sara' fisicamente dentro l'armadietto 'utente B'

Stavo cercando un po' in giro per capire se qualche cpu quelli tipo low-power sono in grado di 'svegliarsi' abbastanza rapidamente da poterli addormentare tra un impulso encoder e l'altro

Dopotutto se metto a 200 impulsi/secondo il limite massimo di velocita' che devo leggere, stiamo parlando di un segnale che varia ogni 5 millisecondi, in effetti un fronte ogni 2,5 mSec Ma non avendo mai fatto roba a basso consumo non so bene se rientriamo nei parametri del "la cpu si risveglia in tempo" oppure no, perche' mi pare di aver visto che la fase di risveglio non sia poi tanto rapida

Il 23/01/24 09:44, LAB ha scritto:

Sono d'accordo, data la modesta frequenza dell'onda quadra un Atmega328 basta e avanza. Ci sarà un leggero ritardo di fase ma ipotizzo non sia un problema per l'OP. Buon divertimento :)

Un bel giorno RobertoA digitò:

E' un'informazione che puoi trovare abbastanza facilmente per la tua CPU di riferimento. Abbastanza a caso, ho trovato questo:

formatting link
Ci sono esempi con alcune MCU, i tempi variano da qualche us a qualche decina di us.

Il 22/01/2024 18:27, RobertoA ha scritto:

Ah ok.

Il 21/01/2024 10:48, RobertoA ha scritto:

Quindi, ammettendo che accendi l'encoder incrementale A + l'interfaccia in questione e fai un azzeramento della posizione assoluta, in linea teorica non è difficile fare quello che cerchi. E' sufficiente qualsiasi micro che legge in modo abbastanza veloce i due segnali in quadratura.

La cosa che non mi convince è la gestione degli errori. Se ci fosse un errore (e non puoi pensare che non ci siano), tipo giri una volta ma tu ne leggi due, questo si aggiungerebbe alla tua posizione errata in modo definitivo.

Sta a te capire se l'applicazione può vivere tranquillamente con questi errori. Se l'encoder A può girare h24 7/7 sempre alimentato, sinceramente sarebbe un bel problema. Magari dopo 3 mesi ti ritrovi una posizione assoluta completamente diversa dalla reale. Diverso è se l'encoder A si spegne spesso.

Un'altra possibilità che mi viene in mente è modificare meccanicamente l'accrocchio in modo che, almeno una volta per giro, ci sia un segnale che dica alla interfaccia che l'encoder è passato da un preciso punto, riallineando la posizione.

Il 23/01/24 12:46, pozz ha scritto:

Gli encoder incrementali usano tipicamente un am26ls31 e in ricezione si usa un am26ls32. Optoisolatori, filtro a campionamento, a maggioranza. I disturbi di modo comune sono eliminati dalla logica stessa. Ci sono applicazioni superveloci in cui perdere impulsi non è ammissibile e, se dovesse capitare, l'evento 'catastrofico' va segnalato. Ipotizzo non sia questo l'obbiettivo dell'OP, gli basta verificare la congruenza tra il conteggio e il passaggio attraverso l'impulso Z (hai il canale Z, vero?), in questo caso il conteggio dovrà essere un multiplo di 500.

Il 23/01/24 13:30, infar ha scritto:

Correggo: un multiplo di 2000.

Tieni conto che devi tenere acceso anche l'encoder. Se è ottico consumera' ben di piu' del micro, temo.

Ciao,

Il 23/01/2024 13:30, infar ha scritto:

Segnale Z o segnale indice... non lo conoscevo ed è esattamente quello che suggerivo di fare.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required