Encoder rotativo ottico con motore da 9V

Ciao, premettendo che e´la prima volta che uso arduino, volevo chiedere se mi potreste aiutare per il mio problema. Ho un motore “maxon DC motor 118742” da 9V collegato ad un encoder “Avago HEDS 5540” mediante il quale mi servirebbe sapere il numero di giri che il motore effettua. Utilizzo un Arduino Uno e girando tra i forum ho capito come effettuare i collegamenti, ma non sono riuscito a capire bene che programma scrivere. Potreste aiutarmi nella stesura del codice su arduino grazie?

AV02-1046EN_DS_HEDM-55xx_2014-11-20.pdf (462 KB)

15-135-EN.pdf (444 KB)

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni e a leggere il regolamento se non lo hai già fatto: Regolamento Qui una serie di link utili, non inerenti al tuo problema: - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - qui le pinout delle varie schede by xxxPighi: Pinout - qui una serie di link [u]generali[/u] utili: Link Utili

nid69ita: Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni e a leggere il regolamento se non lo hai già fatto: Regolamento Qui una serie di link utili, non inerenti al tuo problema: - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - qui le pinout delle varie schede by xxxPighi: Pinout - qui una serie di link [u]generali[/u] utili: Link Utili

Grazie mille nid69ita, mi sono presentato dove tu mi hai indicato e sto iniziando a leggere le guide!! Sei stato gentilissimo grazie.

Prego. Per la domanda specifica, pazienta, qualcuno esperto dell'argomento risponderà. Ciao e benvenuto

adanilo90: Utilizzo un Arduino Uno e girando tra i forum ho capito come effettuare i collegamenti,

Premesso che motore ed encoder sono materiali di fascia alta, non si tratta delle solite cineserie da due soldi, c'è il "piccolo" problema che l'encoder può avere una risoluzione di 800-1000-1024 cpr, tocca vedere la lettera dopo la sigla per sapere il valore esatto, in tutti i casi è fuori portata per Arduino gestire un encoder come questo. Anche ipotizzando di non usare la quadratura, che quadruplica il numero degli impulsi ottenibili, e che l'encoder è il modello con minore risoluzione devi comunque gestire i due canali che forniscono ciascuno un minimo di 800 impulsi per ogni rotazione del motore, alla velocità massima di rotazione, ~5000 rpm, arrivano ben 5000/60*800 = 66666 impulsi per ogni canale che si traducono in 133332 interrupt al secondo, ovvero meno di 7.5 us per gestirli, decisamente troppo poco per una mcu a 8 bit con il clock a 16 MHz che al massimo lavora a 10 Mips reali, solo l'entrata e l'uscita dall'interrupt richiede un paio di microsecondi. Anche se lavorando in assembly forse si riesce a gestire quegli encoder, ma solo per ottenere la velocità, distanza e verso di marcia, scordati qualunque tipo di controllo, usando wiring diventa impossibile non solo gestire gli encoder quando il motore gira veloce, ma pure quando va lento. Per gli encoder come questi o si usano ic specifici, p.e. HCTL-20xx come suggerito dal data sheet, oppure si usano micro dotati di hardware specifico per gli encoder, non mi risulta che esistono micro utilizzabili per Arduino 8 bit con tale caratteristica. Puoi risolvere la cosa utilizzando la Teensy 3.2, basata su un micro a 32 bit e ufficialmente supportata dal progetto Arduino, che dispone di hardware specifico per gestire gli encoder e si programma da IDE di Arduino con la stessa semplicità.

astrobeed: Premesso che motore ed encoder sono materiali di fascia alta, non si tratta delle solite cineserie da due soldi, c'è il "piccolo" problema che l'encoder può avere una risoluzione di 800-1000-1024 cpr, tocca vedere la lettera dopo la sigla per sapere il valore esatto, in tutti i casi è fuori portata per Arduino gestire un encoder come questo. Anche ipotizzando di non usare la quadratura, che quadruplica il numero degli impulsi ottenibili, e che l'encoder è il modello con minore risoluzione devi comunque gestire i due canali che forniscono ciascuno un minimo di 800 impulsi per ogni rotazione del motore, alla velocità massima di rotazione, ~5000 rpm, arrivano ben 5000/60*800 = 66666 impulsi per ogni canale che si traducono in 133332 interrupt al secondo, ovvero meno di 7.5 us per gestirli, decisamente troppo poco per una mcu a 8 bit con il clock a 16 MHz che al massimo lavora a 10 Mips reali, solo l'entrata e l'uscita dall'interrupt richiede un paio di microsecondi. Anche se lavorando in assembly forse si riesce a gestire quegli encoder, ma solo per ottenere la velocità, distanza e verso di marcia, scordati qualunque tipo di controllo, usando wiring diventa impossibile non solo gestire gli encoder quando il motore gira veloce, ma pure quando va lento. Per gli encoder come questi o si usano ic specifici, p.e. HCTL-20xx come suggerito dal data sheet, oppure si usano micro dotati di hardware specifico per gli encoder, non mi risulta che esistono micro utilizzabili per Arduino 8 bit con tale caratteristica. Puoi risolvere la cosa utilizzando la Teensy 3.2, basata su un micro a 32 bit e ufficialmente supportata dal progetto Arduino, che dispone di hardware specifico per gestire gli encoder e si programma da IDE di Arduino con la stessa semplicità.

ciao astrobeed, innanzitutto ti ringrazio per la risposta cosi´esaustiva che mi chiarito molti aspetti. Per quanto riguarda motore ed encoder so che sono di fascia alta, ma li sto riutilizzando da un vecchio progetto. Riguardo alla frase: "Anche se lavorando in assembly forse si riesce a gestire quegli encoder, ma solo per ottenere la velocità, distanza e verso di marcia, scordati qualunque tipo di controllo, usando wiring diventa impossibile non solo gestire gli encoder quando il motore gira veloce, ma pure quando va lento." per il mio progetto mi basta sapere solo quelle informazioni, e cioe´velocita´e verso di marcia, potresti aiutarmi a scrivere un codice che lo possa fare (sempre continuando ad utilizzare arduino)?

adanilo90:
(sempre continuando ad utilizzare arduino)?

Come ti ho già detto scordati di farlo con Arduino, sopratutto con wiring, devi prendere una Teensy 3.2 per poter risolvere il problema.

Ciao astrobeed ho visto il datasheed del mio encoder, che e´ HEDS 5540 #A02 della Avago, che ha una risoluzione di 500 cpr, con una tale risoluzione seguendo i tuoi calcoli con Arduino dovrei farcela a sapere la velocita´del motore o sbaglio?

astrobeed: Anche ipotizzando di non usare la quadratura, che quadruplica il numero degli impulsi ottenibili, e che l'encoder è il modello con minore risoluzione devi comunque gestire i due canali che forniscono ciascuno un minimo di 800 impulsi per ogni rotazione del motore, alla velocità massima di rotazione, ~5000 rpm, arrivano ben 5000/60*800 = 66666 impulsi per ogni canale che si traducono in 133332 interrupt al secondo, ovvero meno di 7.5 us per gestirli, decisamente troppo poco per una mcu a 8 bit con il clock a 16 MHz che al massimo lavora a 10 Mips reali, solo l'entrata e l'uscita dall'interrupt richiede un paio di microsecondi.

In quanto seguendo i tuoi calcoli io avrei: 5000/60*500 = 41666 impulsi per ogni canale che si traducono in 83333 interrupt al secondo, ovvero 12 us per gestirli.

Con 500 cpr potresti anche farcela se ti basta solo la velocità, verso e distanza, però devi scrivere il codice in C puro, si può fare anche con l'IDE di Arduino però è meglio se usi Atmel Studio e consideri Arduino solo una delle tante board di sviluppo per mcu. In tutti i casi alla massima velocità di rotazione del motore 12us non bastano per calcolare la velocità in tempo reale dato che anche se eviti l'uso dei float, fai tutto con i long int, il calcolo è dato dal reciproco del periodo tra due click dell'encoder ed è una divisione che richiede più di 12 us su un 8 bit come gli AVR. Se non ti serve la velocità in tempo reale, praticamente inutile anche devi fare il controllo del motore tramite PID, o altro algoritmo, puoi calcolare la velocità all'esterno degli interrupt un centinaio di volte al secondo, dovrebbe bastare per qualunque tipo di applicazione, se devi solo visualizzarla su un display o tramite telemetria bastano 10-20 volte al secondo. All'interno degli interrupt ti limiti a contare gli impulsi, per la misura della distanza, rilevare il senso di marcia, tramite una XOR tra i due canali, e il periodo tra due cpr per il conteggio della velocità, preferibilmente tramite una media mobile di almeno 16 valori in modo da azzerare gli errori dovuti all'immancabile jitter e l'errore dovuto alla risoluzione dei timer.

astrobeed: Con 500 cpr potresti anche farcela se ti basta solo la velocità, verso e distanza, però devi scrivere il codice in C puro, si può fare anche con l'IDE di Arduino però è meglio se usi Atmel Studio e consideri Arduino solo una delle tante board di sviluppo per mcu. In tutti i casi alla massima velocità di rotazione del motore 12us non bastano per calcolare la velocità in tempo reale dato che anche se eviti l'uso dei float, fai tutto con i long int, il calcolo è dato dal reciproco del periodo tra due click dell'encoder ed è una divisione che richiede più di 12 us su un 8 bit come gli AVR. Se non ti serve la velocità in tempo reale, praticamente inutile anche devi fare il controllo del motore tramite PID, o altro algoritmo, puoi calcolare la velocità all'esterno degli interrupt un centinaio di volte al secondo, dovrebbe bastare per qualunque tipo di applicazione, se devi solo visualizzarla su un display o tramite telemetria bastano 10-20 volte al secondo. All'interno degli interrupt ti limiti a contare gli impulsi, per la misura della distanza, rilevare il senso di marcia, tramite una XOR tra i due canali, e il periodo tra due cpr per il conteggio della velocità, preferibilmente tramite una media mobile di almeno 16 valori in modo da azzerare gli errori dovuti all'immancabile jitter e l'errore dovuto alla risoluzione dei timer.

Allora ancora grazie mille per la disponibilita´ ed i consigli, a me non serve il calcolo della velocita´ in tempo reale, mi basta saperla anche 10-20 volte al secondo se non ancora meno. Ora premettendo che il linguaggio C non lo tocco da 4 anni almeno, potresti aiutarmi nella stesura del programma? P.s. Atmel Studio lo ho gia´installato sul pc che uso.

Ciao, scusate ma non sono riuscito a trovare ancora una soluzione, qualcun altro riesce a darmi degli utili consigli come ha fatto fino ad ora astrobeed?