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.
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.
cioè?
ps non so se ho scritto che ho inserito un moror shield
ciao ho cambiato motorino ed encoder ma il problema persiste non riesco ad acquisire il valore dell'encoder
http://www.micromotorssrl.com/electricaldata_1/e_data_1_pg.html
questo è ciò che sto utilizzando cosa ne pensate come mai non va