Quanto preciso posso ottenere Arduino usando gli encoder rotativi?


15

I motori passo-passo sono spesso costosi per un motore di grandi dimensioni. Tuttavia, con un potente motore CC standard e un encoder rotativo, è possibile "simulare" un motore passo-passo. Quanto sono precisi gli encoder rotativi con Arduino solo con un loop di base e non molto altro codice? "Perderà un impulso" e non registrerà abbastanza rotazione spesso? Come posso gestirlo con molto più codice? C'è un modo migliore per farlo? Aiuterebbe gli interrupt? C'è una sorta di circuito che potrebbe aiutare con questo problema?

Nota: probabilmente non supererà le 4 rotazioni al secondo ... (Potrebbe essere molto, ma se stai facendo un meccanismo a vite che sarebbe di soli 24 pollici al minuto se ci sono 10 rotazioni per pollice di movimento lineare. )


Ho usato encoder rotativi che si sono rifiutati di funzionare correttamente se girati velocemente. Immagino che vari con il prezzo.
jippie

Risposte:


10

Gli interrupt sono ciò che useresti in questa situazione.

Le frequenze che hai menzionato sono abbastanza lente dove probabilmente saresti in grado di contarlo all'interno di un ciclo, tuttavia questo non è raccomandato, poiché un ciclo tipico richiederà molti cicli di clock per essere completato, e in base al numero di istanze per ciclo , potresti perdere alcuni conteggi.

Gli interrupt sono fatti per questo scopo, poiché possono essere attivati ​​in qualsiasi momento, indipendentemente dallo stato del loop.

C'è una funzione chiamata attachInterrupt()che prenderà tre argomenti.

  1. Pin di interruzione
  2. Routine di servizio di interruzione
  3. Modalità

Di seguito è riportato un esempio per il conteggio di un interrupt

volatile int myCounter = 0;

void setup(){
    attachInterrupt(0, count, RISING);
}

void count(){
    myCounter++;
}

Le modalità sono le seguenti:

BASSO, CAMBIAMENTO, SORGENTE, CADUTA

Ulteriori informazioni sull'uso degli interrupt sono disponibili qui .

A seconda del codificatore che utilizzi, dovrai personalizzare il codice in base alle tue esigenze e fare altri calcoli per determinare la tua posizione, ma questo dovrebbe essere un buon punto di partenza.

Modifica Ecco un esempio di codice da Arduino Sandbox per l'utilizzo di un codificatore rotante.


1
Un rilevatore di bordi comandato da interruzione su un Duemilanove gestisce facilmente 100 fronti al secondo (6500 giri / min su un motore).
Wayfaring Stranger

@WayfaringStranger Quindi allora non c'è nessun problema su Uno. Grazie!
Anonimo Penguin

1
@AnnonomusPerson - Quanto lavoro sei disposto a fare? Se vai nudo ( ISR_NAKED()), puoi saltare il salvataggio automatico del contesto C ed eseguire senza problemi i tassi di interruzione di 100-500 Khz, ma sostanzialmente stai scrivendo assembly in C a quel punto.
Connor Wolf

1
Se desideri un documento completamente banannas sull'ottimizzazione dell'assoluta schifezza della risposta agli interrupt, guarda qui . Posizionare il codice direttamente nella tabella degli interrupt per ridurre ulteriormente la latenza degli interrupt!
Connor Wolf

1
Inoltre, tieni presente che se stai per interruzioni a bassa latenza, la funzione arduino attachInterrupt inietta un intero overhead di chiamata di funzione aggiuntiva invece di utilizzare ISR()direttamente l'interrupt .
Connor Wolf,

3

Aggiunta di alcuni riferimenti a librerie ed esempi già scritti, per consentire il confronto tra diversi approcci ed esperienze con velocità rispetto alla suscettibilità ai passaggi mancanti.

Lettura degli encoder rotativi: http://playground.arduino.cc/Main/RotaryEncoders

Encoder in quadratura troppo veloce per Arduino (con soluzione): http://www.hessmer.org/blog/2011/01/30/quadrature-encoder-too-fast-for-arduino/

Libreria di Teensy Encoder: https://www.pjrc.com/teensy/td_libs_Encoder.html

Lettura dell'encoder rotativo su Arduino: http://www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.