August 23, 2013

Interfacciamento encoder

Per il calcolo della rotazione angolare, si è utilizzato una importante periferica presente sul microcontrollore dsPIC della Motion Control, il modulo QEI (Quadrature Encoder Interface).

Quadrature Encoder Interface QEI

Quadrature Encoder Interface QEI

Questa importante periferica permette di eseguire diverse operazioni fondamentali senza occupare tempo di elaborazione del microntrollore:

  • Filtraggio programmabile del segnale in ingresso
  • Contatore di impulsi e della direzione
  • Possibilità di settare la risoluzione a X1, X2 o X4
  • Registro di 16Bit per il salvataggio del conteggio

Filtraggio programmabile del segnale in ingresso

La periferica predispone di un filtro digitale che permette di filtrare il possibile segnale disturbato proveniente dai due encoder. I disturbi più comuni di un encoder sono principalmente dovuti a montaggi non perfetti dei dischi ottici sull’albero motore al corpo ottico non completamente oscurato ad improvvisi cali di tensione sull’encoder.

Filtro digitale

Filtro digitale

Il filtro può essere programmato per filtrare tutti i canali entranti e la precisione per clock su divisione può partire da 1:1 fino ad 1:256.

Contatore di impulsi e della direzione

Per effettuare misure tramite encoder, è necessario un componente elettronico elementare chiamato contatore. Grazie ai suoi diversi input, un contatore elementare rilascia un valore che rappresenta il numero di fronti (transizioni da alto a basso nella forma d’onda) contati. La maggior parte dei contatori è dotato di tre input rilevanti: gate, source, e up/down. Il contatore, rilevando gli eventi registrati nell’input source e in base allo stato della line a up/down, è in grado di aumentare o diminuire il conteggio. Ad esempio, se la linea up/down è alta, il contatore aumenta il conteggio; se è bassa il conteggio decresce.

Counter Encoder

Counter Encoder

L’encoder dispone di quattro cavi da connettere allo strumento (giallo, blu, rosso, nero). E’ possibile utilizzare questi cavi per alimentare l’encoder (rosso, nero) e per leggere i segnali A e B.

Possibilità di settare la risoluzione di lettura dell’encoder a X1, X2 o X4

Una volta contati i fronti del segnale, il passo successivo prevede la conversione dei questi valori in posizioni. Il processo che si occupa di convertire i fronti del segnale in numero di posizioni dipende dal tipo di codifica utilizzata. Esistono tre tipologie elementari di codifica, X1, X2, e X4.

  • Codifica X1. Quando il canale A anticipa il canale B, l’aumento avviene sul fronte di salita del canale A. Nel caso inverso quando, B anticipa A, la riduzione si presenta sul fronte di discesa del canale A.
  • Codifica X2. La codifica X2 avviene nello stesso modo, ad esclusione del fatto che il contatore cresce o decresce su ciascun fronte del canale A, in base al tipo di canale che anticipa l’altro. Su ciascun ciclo sono presenti due incrementi o decrementi, come mostrato nell’immagine seguente.

    Codifica X2 Encoder

    Codifica X2 Encoder

  • Codifica X4. Nella codifica X4, l’encoder cresce o decresce allo stesso modo su ciascun fronte dei canali A e B. Aumento o diminuzione del valore del counter dipender’a da quale canale anticipa l’altro. Su ciascun ciclo sono presenti quattro incrementi o decrementi, come mostrato nell’immagine seguente.

    Codifica x4 Encoder

    Codifica x4 Encoder

I Registri

I Registri utilizzati per poter configurare e leggere le informazioni provenienti da questa periferica sono:

  • QEIxCON
  • DFLTxCON
  • POSxCNT
  • MAXxCNT

I primi due registri permettono di configurare la periferica e di configurare un filtro digitale che migliora il segnale ricevuto dai ricevitori degli encoder.

All’interno del registro QEIxCON è presente il bit UPDN che restituisce il verso di rotazione letto dagli encoder.

Registro di 16Bit per il salvataggio del conteggio

Un contatore a 16Bit permette di acquisire fino a 65536 impulsi e quindi un quantitativo più che sufficiente prima che il registro vada in overflow.

Interpretazione del verso di rotazione

Interpretazione del verso di rotazione

Il registro POSxCNT restituisce il conteggio di tutti gli impulsi ricevuti dal modulo di quadratura, ed infine il registro MAXxCNT permette di diminuire l’overflow del contatore della periferica.

Il Modulo Input-Capture

Dopo aver trattato il caso analitico del calcolo della velocità, si passa alla sua realizzazione effettiva sul programma di controllo del robot.

Oltre al modulo QEI si è utilizzato il modulo input-capture presente sempre nel dsPIC.

Questo dispositivo, collegato con un timer di riferimento, conta ogni fronte di salita e/o di discesa e ne memorizza il valore su di un registro o su di un piccolo buffer FIFO. Il valore è costituito dal valore presente conteggiato sul timer durante il passaggio del di salita e/o di discesa. Alla saturazione del buffer viene generato un interrupt di priorità che deve essere gestito dal microcontrollore.

Modulo Input-Capture

Modulo Input-Capture

Registri e configurazione

Rispetto al precedente il modulo è costituito solamente da un registro, ma ha bisogno di essere configurato assieme ad un timer per poter restituire correttamente i valori richiesti per l’elaborazione della velocità.

Il registro ICxCON configura principalmente la modalità di generazione dell’interrupt (se su fronte di salita e/o discesa) e la modalità di acquisizione dei dati sul buffer.

La modalità scelta per il robot è la “Edge Detection Mode”, che genera un interrupt registrando il valore del timer in quell’istante. Questo comporta che la velocità minima e massima misurabile sono in funzione dell’overflow del timer e del conteggio tra un istante ed un altro del contatore.

Il timer (timer 2) è configurato in FreeRunning e non sono presenti pre-scaler quindi il conteggio ‘e effettuato alla massima frequenza di clock cioè, ad un conteggio massimo di: N_{max} = 2^{16} = 65536 ad una velocità di clock di f_c = 80Mhz.

Si ottiene quindi che il tempo massimo è dato da:

T_2 = N_{max} \cdot \left( f_{cy} \right)^{-1} = 65536 \cdot 2.58064 \cdot 10^{-8} s
T_2 \approx 0.00169 s

Il salvataggio dei campioni viene eseguito attraverso il buffer FIFO presente nella periferica, esso genera un singolo interrupt una volta che il buffer è stato riempito, in modo tale da ridurre drasticamente il numero di interruzioni.

input capture fifo

input capture fifo

Gestione dell’interrupt

Affinché sia possibile acquisire correttamente i dati, è importante poter rispondere nel più breve tempo possibile alla chiamata, generata dalla periferica ed acquisire il tempo percorso tra i due fronti.

Un possibile codice che permette di rispondere alla chiamata può essere scritto nel seguente modo:

// Initialize Capture Module
IC1CONbits.ICM= 0b00;    // Disable Input Capture 1 module
IC1CONbits.ICTMR= 1;     // Select Timer2 as the IC1 Time base
IC1CONbits.ICI= 0b00;    // Interrupt on every second capture event
IC1CONbits.ICM= 0b001;   // Generate capture event on every Rising edge
// Enable Capture Interrupt And Timer2
IPC0bits.IC1IP = 1;      // Setup IC1 interrupt priority level
IFS0bits.IC1IF = 0;      // Clear IC1 Interrupt Status Flag
IEC0bits.IC1IE = 1;      // Enable IC1 interrupt
// Capture Interrupt Service Routine
unsigned int timePeriod = 0;
void __attribute__((__interrupt__)) _IC1Interrupt(void) {
    unsigned int t1,t2;
    t2=IC1BUF;
    t1=IC1BUF;
    IFS0bits.IC1IF=0;
    if(t2>t1)
       timePeriod = t2-t1;
    else
       timePeriod = (PR2 - t1) + t2
}

Copyright © 2013. All Rights Reserved.

Leave a Reply