encoder in quadratura

ciao a tutti, sono nuovo ho una leggera esperienza di arduino, derivante una libreria piena di libri a tema.
sto svolgendo un progetto con arduino, controllo di velocità di un motorino elettrico, ma la difficoltà maggiore è leggere il segnale del mio encoder in quadratura per poter definire la velocità.
Ogni volta che leggo ricevo valori improbabili e penso che sia un errore di campionamento.

*encoder a quadratura un gradino ogni rivoluzione
*un motorino elettrico 6900rpm

quindi a ogni giro dobrei avere un qualcosa che mi sembri una serie di 1 e 0 ripetuti che dovrebbero indicarmi la rotazione ma questo non avviene consigli?

ovviamente grazie in anticipo

Hai un oscilloscopio che puoi utilizzare per vedere cosa esce fuori dall'encoder?

Quale encoder hai?
Ciao Uwe

innanzitutto grazie per le risposte....

allora si la forma d'onda che esce è un onda quadra tramite l'oscilloscopio.

l'encoder è heds-5500

questo è il codice per capire che segnale arriva:

#include <SoftwareSerial.h>

#define encoder 6
#define motore 3

int val = 0;
int cont=0;
float durata=0;

void setup()
{
pinMode(encoder,INPUT);
pinMode(motore,INPUT);
Serial.begin(9600);

}

void loop()
{
analogWrite(motore,0);
val=digitalRead(encoder);
Serial.println(val);
}

Con

analogWrite(motore,0);

sicuro di non fermare il motore?
Ad ogni modo a che frequenza è l'onda quadra? Magari è troppo veloce per Arduino
Ciao

allora analogWrite=0 mi è servito per girare il rotore a mano e verificare cosa stesse ricevendo il pin mentre per verificare se la frequenza è troppo alta cosa dovrei vedere?

sul datasheet del encoder
Count Frequency f 100 kHz Velocity (rpm) x N/60

dubito fortemente che riuscirai a leggere la sequenza in quadratura con il solo arduino alla max velocità.
la famiglia HEDS5xxx sono encoder con risoluzione molto elevata e in base alla sigla si può arrivare fino a 1024 CPR.

anche gestendo bene i segnali A e B utilizzando gli interrupt potrai stare dietro alla lettura solo se farai andare il motore molto ma molto lentamente.
per migliorare un pò la funzione di intercettazione e conteggio degli impulsi dovresti scrivere la routine in assembly (codice macchina).

grazie ma per cultura e per l'acquisto di un nuovo encoder/motore che frequenza legge arduino

mentre per verificare se la frequenza è troppo alta cosa dovrei vedere?

Deve essere inferiore alla frequenza massima che puoi leggere con digitalRead e il resto del codice

Ciao

sni per digitalRead, ma il tutto dipende fortemente, come dicevo prima, da come gestisci l'interrupts di intercettazione degli impulsi.

max00 hai mai usato la gestione degli external int ?

e una tesi devo usare arduino ma potrei cambiare il motore... ps nom so come gli dovrei usare gli interrupt

@legacy,
concordo, quello sarebbe l'ideale usando il QUE...
oppure aggiungere un chippetto dedicato o una piccola CPLD-ad hoc implementando un QUE e con uscita I2C o SPI in modo da far respirare l'atmega che poverino in queste applicazioni ha bisogno dell' ossigeno.

max00:
e una tesi devo usare arduino ma potrei cambiare il motore... ps nom so come gli dovrei usare gli interrupt

non vorrei scoraggiarti,
scusa ma allora come vorresti leggere un encoder in quadratura? non capisco.
devi prima studiare a cosa servono gli int e la loro gestione .... se nò te la scordi la tesi. :slight_smile:

sono inesperto dovrei leggere il segnale dell'encoder ma ho capito che la frequenza dell'onda wuadra e troppo alta quindi o cambio encoder o uso gli interrupt... ora nonho capito come dovrei usare gli interrupt

allora, tutto dipende da come vuoi leggere gli encoder ad 1X, 2X, o 4X(quadratura)
ma se non vuoi complicarti la vita.. e non sei vincolato al tipo di encoder, e devi al più presto consegnale la tesi,

utilizza qualche encoder con minore risoluzione,,,, anche un 25/50 impulsi giro potrebbe andare. (devi ridurre almeno di un fattore 10)
chiarmente se abbassi la risoluzione hai qualche difficoltà in più nel controllare la velocità..
domanda : devi usare PID, PI o solo P? o devi realizzarla in logica fuzzy?

volevo usare l'ottimo simmetrico. ora mi tocca acquistare un nuovo motore con encoder

guarda se devi dimostrare solo la funzione dell'ottimo simmetrico di tipo 2 con un polo reale e 2 poli complessi coniugati
ti consiglio di non complicarti la vita con l'hardware. Usa un encoder con più bassa risoluzione, studia come usare gli int, e
di sicuro con la PI e con filtro di smoothing farai un buon lavoro riuscendo nel tuo intento.

ok grazie

mi sono ricordato proprio adesso che con la famiglia AVR XMega (es: ATxmega128a1) avresti potuto farlo poichè possiede una parte hw dedicata chiamata Quadrature Decoder (QDEC)....
Io l'ho provato qualche mese fa e funziona alla grande anche con encoder molto risoluti.