Go Down

Topic: calcolo velocità con encoder ottico (Read 11049 times) previous topic - next topic

francescoprisco

Jul 29, 2013, 10:07 pm Last Edit: Jul 29, 2013, 10:15 pm by francescoprisco Reason: 1
Salve ragazzi, sono dinuovo alla presa con questo dannato calcolo della velocità...Ho deciso di usare un ecoder ottico del tipo come lo vedete in immagine


l'encoder ha sigla tk462.fa.500 quindi credo che sia da 500 scatti ogni giro (correggetemi se sbaglio).Ho pensato di calcolare la velocità usando un interrupt sul cambiamento di stato da high a low quindi un falling.
ho trovato questo codice in internet , l'ho testato e in effetti indica i giri ma non so se li indica in modo corretto nel senso che comunque dovrei tarare il codice all'encoder ma non so cosa andar a modificare.Qualcuno potrebbe aiutarmi?

Code: [Select]


volatile long time;            //timekeeping
int encoderZ = 2;              // Encoder Index
int encoderA = 3;                // Encoder A
int encoderPulse = 0;          //Encoder Pulse Counter
volatile long timePrevious = 0;               //Remembers time before
float rpm = 0;
float  vel=0;
//Setup Display
void setup(){
Serial.begin(9600);
pinMode(encoderZ, INPUT);       // Index pulse input
digitalWrite(encoderZ,HIGH);    // enables pull up to reset signal

//pinMode(encoderA, INPUT);       // A pulse input
//digitalWrite(encoderA,HIGH);    // enables pull up to reset signal

Serial.print("RPM:");

//Configure pin modes
//pinMode(encoderA, INPUT);
//digitalWrite(encoderA, HIGH);  // Turn on pullup resistor
//attachInterrupt(1, count, FALLING);   // call sub count to increment at interrupt pin.

pinMode(encoderZ,INPUT);
digitalWrite(encoderZ, HIGH);  // Turn on pullup resistor
attachInterrupt(0, timeCheck, FALLING);   // call sub count to increment at interrupt pin.
}

void loop(){
rpm = 60000/(time-timePrevious);
Serial.print("Spindle RPM: ");


Serial.println(int(rpm));
delay(1000);

}

/* -------- Function timeCheck ----------*/
void timeCheck(){
timePrevious=time;
time = millis();   //sets miLLIseconds to minutes
//  rpm = 1009;

}

/* ---------- Function count --------------- */
//void count(){
// encoderPulse++;

//}

PaoloP


francescoprisco

il datasheet è questo
http://www.tekel.it/PDF/TK45.pdf

la sigla del pezzo e' tk462.FA.500.12.S.K1.8.PS10.LD.X280
quindi è bidirezionale + index a 500 impulsi al giro  alimentato a 12 V con frequenza da 0 a 50 khz

PaoloP

Dalla sigla mi pare di capire che anche le uscite sono a 12V perché manca il /5.
Quindi attento perché non li puoi collegare direttamente all'Arduino, ti serve un traslatore di livello o più semplicemente un partitore di tensione.

francescoprisco

paolo io l'ho collegato direttamente ad arduino pare funzionava... c'è da seriale riusciva a darmi dei dati... ho bruciato l'arduino?

PaoloP

C'è una incongruenza sulla sigla: manca il /5 sull'alimentazione per indicare l'uscite a 5V ma come uscite indica LD che si applica (come dice il datasheet) solo ai modelli con uscite a 5V.
Boh!

francescoprisco

quindi sarà 5v... tralasciando questa cosa del voltaggio in uscita poi appena posso lo misuro con un tester. quel codice perchè non va correttamente? come faccio ad indicare che l'encoder per ogni giro fa sti 500 scatti?
ho preso il codice da qui non so se può essere utile http://www.alpha.triggerdog.com/blog/?p=17

PaoloP

#7
Jul 30, 2013, 10:41 am Last Edit: Jul 30, 2013, 10:45 am by PaoloP Reason: 1
Il codice lo puoi prendere qui --> http://playground.arduino.cc/Main/RotaryEncoders
Anzi, leggi tutta la pagina, ha decine di esempi per tutte le situazioni possibili.
Il tuo encoder ha 2 segnali più lo zero, mi pare di aver capito. controlla tra gli esempi, dovrebbe esserci qualcosa che fa al caso tuo.

Dallo sito del produttore ho visto che ci sono delle istruzioni --> http://www.tekel.it/PDF/Manuali/MU_EI_ITA_A3_R2.PDF
e delle spiegazioni interessanti --> http://www.tekel.it/Incr-ita.htm

Anche questo --> http://www.tekel.it/PDF/Appendice%20incrementali.pdf

francescoprisco

non ho trovato nulla a riguardo il calcolo di rpm o velocità. già ho letto quella pagina

PaoloP

Quante connessioni ha in uscita l'encoder?

Per ottenere la velocità devi calcolare il numero di impulsi nell'intervallo di tempo oppure il tempo tra due impulsi.
Ma prima occorre, in base al modello dell'encoder, ottenere l'impulso.

Millis è troppo grande come unità di tempo, devi usare micros().
Con 500 impulsi al giro, bastano 2 giri al secondo, ovvero 120 al minuti che la millis non riesce più a calcolare il tempo.

francescoprisco

allora in uscita io ho 6 fili... 2 out A  2 out B e 2 out z  due fili per l'alimentazione e poi la schermatura del cavo

PaoloP

#11
Jul 30, 2013, 11:10 am Last Edit: Jul 30, 2013, 11:12 am by PaoloP Reason: 1
Allora in base al codice di ordinazione, siccome hai un "Line Driver" devi usare un integrato che fa da interfaccia tra l'encoder e l'arduino.
L'integrato è il 26LS32 (http://www.ti.com/lit/ds/symlink/am26ls32a.pdf) che dispone di 4 ingressi, tu ne userai tre.
Inoltre ti serviranno resistenze da 4.7K, condensatori da 10nF e impedenze da 150Ohm, secondo lo schema pubblicato qui, ultimo in basso a destra --> http://www.tekel.it/PDF/Appendice%20incrementali.pdf

Forse puoi utilizzare solo una delle 2 uscite per canale senza tutto l'ambaradan qui sopra. Ma non credo.

francescoprisco

perchè ne userò tre? due di entrata a cui collegara i 6 fili e uno d'uscita?

PaoloP

Quell'integrato ha 4 coppie di ingressi, mentre il tuo encoder ha 3 coppie in uscita. Intendevo questo.
Dalle 3 coppie in ingresso al 26LS32 otterrai in uscita 3 singoli segnali ripuliti di eventuali disturbi.


francescoprisco

#14
Jul 30, 2013, 11:29 am Last Edit: Jul 30, 2013, 11:42 am by francescoprisco Reason: 1
quindi questo integrato serve solo a ripulire il segnale? serve un segnale sull'enable? l'altro schema a cosa serve in particolare? è possibile collegare direttamente l'encoder e l'arduino?

Go Up