Encoder a Quadratura: gestione con Interrupt

Quando si utilizza l’encoder, in abbinamento a un motore che sposta un dispositivo, avanti e indietro, lungo un asse, senza perdere il riferimento iniziale, è importante conoscere se l’encoder ha perso il passo.

L’utilizzo della gestione dell’encoder con Quadencoder::CheckforChange, segnala l’errore della perdita di passo, restituendo il valore  “255”.

Gli oggetti e le variabili utilizzate per il programma sono simili a quelli utilizzati nel programma di test, con l’eccezione della variabile “Cambiastato” che diventa di tipo Byte e l’aggiunta della variabile “SegnalaErrore”, di tipo Bool.

oggetti da inserire nel 3D System panel

encoder IOC 1
  • Dal menu Outputs seleziono il display LCDI2C, mantenendo le “properties” predefinite.
  • Dal menu Inputs, seleziono il QuadEncoder e lo collego ai pin 0 e 1 della porta B..
  • Dal menu Input, seleziono il pulsante Sw_push e lo collego al pin 7 della porta B.

$PORT.B7

Variabili da utilizzare nel programma

encoder IOC 2
  • Variabile CambiaStato: di tipo Byte, contiene il valore dello stato logico dell’uscita A dell’encoder.
  • Variabile SegnalaErrore”: di tipo Bool.
  • Variabile Count: di tipo Int con valori da -32768 a +32767. Contiene il valore del corrispondente al numero di volte che l’encoder ha cambiato stato logico.
  • Variabile Delay: di tipo UINT, valore compreso tra 0 e 65535; contiene il numero di volte che può essere ripetuto il ciclo , sostituisce la funzione Delay.
  • Variabile SwA: di tipo Bool, contiene il valore del pulsante: premuto = 1, non premuto =0.

Count

Delay

SegnalaErrori

SwA

Changed

Interrupt IOC:

Collego l’uscita A e B  dell’encoder, a due pins di una porta, disponibile, del microcontrollore.

In questo esempio ho selezionato i pins 0 e 1 della porta B.

encoder IOC 3

porte IOC disponibili

in verde sono visibili i pins utilizzabili, sulla porta B

creazione della macro richiamata dall’Interrupts

macro Check_encoder

encoder IOC macro IRQ

Quando i segnali presenti ai pins 0 e 1 della porta B, cambiano stato logico, il Component macro

Changed=QuadEncoder::CheckForChange()

Dipendente dalla variabile Changed, aumenta il valore della variabile Count.

La funzione Decisione controllo se è stato generato il valore 255.

If Changed = 255?

dovuto alla perdita di passi dell’encoder, con la funzione Calcolo, imposta la variabile SegnalaErrori a 1.

    CheckForChange: controlla se il segnale in uscita dall’encoder ha cambiato stato logico.

    Restituisce 1, se è cambiato o non è cambiato, 255 se c’è un errore

    Parametri: non ci sono parametri.

    Valore di ritorno: Byte.

Diagramma di flusso

encoder IOC 4
  • inizializzo il display LCD, con il Component Macro e la funzione “Start”.
  • Abilito l’encoder con il component Macro e la funzione “Enable
  • Inserisco la Funzione Interrupt.
encoder IOC 5

Ciclo principale:

  • Inserisco la Funzione

Loop: While = 1

  • inserisco la funzione Input:

B7 -> SwA.

Che controlla lo stato logico presente sul pin 7 della porta B, cui è collegato il pulsante Sw_push.

  • Inserisco la funzione decisione:

if SegnalaErrore >= 1

per controllare se è avvenuto un codice di errore 255 da CheckForChanged.

In caso di errore

  • inserisco la funzione:

 

Cursor 10,0

  • inserisco la funzione:

LCDI2C::PrintString(“Perdita di passi”)

visualizzazione della scritta ”perdita di passi” alla posizione 10 della riga 0 del display.

encoder IOC 6

Se non ci sono errori,

  • inserisco la funzione Decisione:

If Count = 360

Se il contatore raggiunge il numero 360 (giro completo del potenziometro presente sul simbolo dell’encoder).

  • inserisco il Component Macro

QuadEncoder::ResetCounter

  • inserisco la funzione Calcolo:

 Count = 0

Queste operazioni resettano a zero il Counter e la variabile Count.

l’istruzione Rotational Increment, agisce sul movimento dell’encoder.

serve per controllare il movimento lungo un asse meccanico, dopo aver fissato il punto di riferimento con un microswitch.

encoder simul ref

1.000000

In Panel Properties dell’encoder nella impostazione Simulation, imposto il Rotation Increment = 1.000000 per far corrispondere il numero 360 con un giro completo dell’encoder.

CICLO DI RITARDO

eseguo 1000 volte l’istruzione prima di iniziare un nuovo ciclo .

  • inserisco la funzione Decisione:

If Delay > 1000

fintanto che il valore 1000 non è superato

  • la funzione calcolo:

Delay = Delay + 1

incrementa il valore della variabile Delay di 1 , ad ogni ciclo

raggiunto il valore Delay > 1000

  • la funzione Calcolo:

Delay = 0

azzera la variabile Delay.

 

encoder ioc delay

C Code

rick 3Riccardo Monti