Page 1 of 1

arduino lettura valori encoder

PostPosted: 03 Sep 2012, 19:06
by max
salve sono max e sono nuovo del forum

vi chiedevo un aiuto sulla lettura di un encoder http://www.micromotorssrl.com/electrica ... _1_pg.html il problema è che invece di avere 3 impulsi a giro ne trovo molti di più e non riesco a calcolare il valore della velocita del motorino collegato.

grazie per l'attenzione

Re: arduino lettura valori encoder

PostPosted: 03 Sep 2012, 19:56
by deluca
max benvenuto al forum,
potresti delucidarmi su quello che devi fare? così non riesco a decifrare .. :)

ho visto che vuoi leggere gli impulsi generati da un encoder ad effetto hall collegato meccanicamente ad un motorino ok?
l'encoder produce 3 impulsi per ogni giro dell'asse del motore.
Non si tratta di un encoder incrementale.... ok?
cosa devi leggere e per cosa ti serve.....

Re: arduino lettura valori encoder

PostPosted: 03 Sep 2012, 20:05
by cyclone
ciao max, ben ritrovato
io so di cosa stai parlando, ma secondo me dovresti riassuntare un pò quello che hai descritto altrove, spiegando quello che devi fare ...
così mettiamo al corrente deluca e gli altri iscritti del forum che secondo me, spero per te, riusciranno ad aiutarti.

ciao

Re: arduino lettura valori encoder

PostPosted: 03 Sep 2012, 20:13
by cyclone
capisco che è il tuo primo controllo, non so,

cmq, in base al codice che avevi incollato altrove, secondo me sei completamente fuori strada e siccome l'argomento mi piace, ti dò qualche dritta.

i segnali dell'encoder devono essere gestiti velocemente e soprattutto via interrupt....
per misurare la velocità devi creare un sample-timer per mezzo di un timer, per eseguire un campionamento ad intervalli regolari del numero di impulsi generati dall'encoder..

etc.... posta il codice e se puoi anche lo schema di collegamento dell'encoder.

Re: arduino lettura valori encoder

PostPosted: 03 Sep 2012, 20:47
by max
per calcolare la velocita del rotore devo contare il num di impulsi generati dal encoder ilnproblema e che sul pin digitale ricevo una serie di 1e 0 che non riesco a gestire. ad esempio in un giro me ne dovrebbe dare 3 invece ricevo una combinazione casuale di 1 e 0. mi piacerebbe approfondire l'aargomento degli interrupt che mi è stato suggerito da molti compreso cyclone. il pin è collegato con una resistenza di pull up. domani vi posto.ps grazie per la risposta .

Re: arduino lettura valori encoder

PostPosted: 03 Sep 2012, 21:05
by deluca
adesso mi è più chiaro,
domanda..... devi leggere la velocità o la devi anche controllare in closed-loop?
stai parlando di un solo pin digitale d'ingresso.... sul link che hai postato vedo che l'encoder ha solo un canale d'uscita, quindi presumo che non vuoi il controllo della posizione, ma solo della velocità, esatto?
o vuoi gestire il tutto in una modalità pseudo-closed ?

Re: arduino lettura valori encoder

PostPosted: 04 Sep 2012, 12:58
by max
non vi sto chiedendo come calcolare velocita etc etc(preciso per non passare per uno che vuole la pappa pronta). vorrei sapere come faccio a leggere l'impulso o lo zero. presumo che sia un problema di campionamento del pin

Re: arduino lettura valori encoder

PostPosted: 04 Sep 2012, 13:55
by max
ecco il codice

#include <SoftwareSerial.h>

#define encoder 5
#define motore 3


int val;
int flag;
int cont;
int app;
int pwm;
int pwmfb;
float giro;
float durata;
float app2;
float app3;
float vel;
float pausa;
int posizione;
int pot=5;


void setup()
{
pinMode(encoder,INPUT);
pinMode(motore,INPUT);
Serial.begin(9600);
app2=0;
}

void loop()
{
// acquisizione del valore del pwm

posizione=analogRead(pot);
pwm=map(posizione,0,1023,100,255);
//pwm=pwm-pwmfb;

// fine acquisizione valore del pwm
analogWrite(motore,pwm);
// comincio la procedura per acquisire il dato dall'encoder

durata=millis();
//durata=durata-app2;

val= digitalRead(encoder); // acquisisco il valore (alto o basso del encoder)
// incremento il valore cont ognivolta che trovo una variazione di valore
if (val!=flag)
{ if (val==HIGH)
{flag=1;}
else
{flag=0;}
cont=flag+cont;
}
cont=cont;
//dividendo per 3 calcolo quanti giri ha fatto il rotore
giro=cont/3;
//Serial.print("impulsi ");
//Serial.println(cont);
//Serial.print("il motore ha fatto ");
//Serial.println(giro);
giro=giro*100; // trasformo in giri al secondo
vel=giro/durata;
pausa=map(pwm,100,255,350,20); // calcolo la pausa da calcolare per campionare l'impulso
//pwmfb=map(vel,0,0.75,0,255);
//Serial.print("la velocita ");
Serial.println(vel);
//Serial.print("il tempo ");
//Serial.println(durata);
Serial.flush(); // pulisco il buffer seriale
delay(pausa); // pausa per il campionamento

// fine acquisizione velocità

Re: arduino lettura valori encoder

PostPosted: 04 Sep 2012, 14:05
by flz47655
Sicuro che non hai un qualche disturbo che ti falsa le lettura con digitalRead? flag non è inizializzato a nessun valore, questo ti potrebbe dare una prima falsa lettura...
Hai collegato un oscilloscopio mentre fai girare il codice per controllare se hai degli spike?

Ciao

Re: arduino lettura valori encoder

PostPosted: 04 Sep 2012, 14:13
by max
ok modifico flag cmq con matlab e labview mi da lo stesso errore

Re: arduino lettura valori encoder

PostPosted: 04 Sep 2012, 14:14
by max
cmq cos'è uno spike?

Re: arduino lettura valori encoder

PostPosted: 04 Sep 2012, 14:18
by flz47655
Un picco di tensione indesiderato causato ad esempio da un disturbo elettromagnetico generato dal motore, io avevo problemi di questo tipo con un encoder autocostruito, ho aggiunto dei condensatori direttamente sul motore, ho attorcigliato (cerca twisted wire) i cavi , ho aggiunto un passa basso e ho risolto :)

Ciao

Re: arduino lettura valori encoder

PostPosted: 04 Sep 2012, 14:19
by deluca
ecco un regalino,

ho scritto il codice in bascom che legge e campiona il segnale proveniente dal sensore hall
Scritto e simulato ..... e anche provato su atmega32.... chiaramente il risultato non cambia se caricato su atmega328p

visto quanto è semplice? io inizierei a vedere Bascom-avr
ho aggiunto un pin Test per controllare all'oscilloscopio che nessun conteggio venisse perso.
testato con freq enc pari a 10Khz ma si possono raggiungere freq maggiori.
Code: Select all
'*******************************************************************************
'
'  Esempio Bascom x lettura encoder 1 canale effetto hall
'  04-09-2012
'  versione bascom-avr 2.0.7.5
'
'*******************************************************************************
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 57600
$hwstack = 64
$swstack = 64
$framesize = 64

Config Timer0 = Timer , Prescale = 1024

Ddrd.2 = 0 : Portd.2 = 1
Ddrd.3 = 1
Test Alias Portd.3

Dim Contatore As Word
Dim Old_contatore As Word

Config Int0 = Change                                        'falling o rising

Enable Interrupts
Enable Int0
On Int0 Int_0

Enable Timer0
On Timer0 Timer_0

Print "Test encoder ad effetto hall"
Waitms 1000
Contatore = 0
'---------------------------------[ main ]--------------------------------------
Do
  nop
Loop
'-------------------------------------------------------------------------------
End
'-----------------------------[ gestione int0 ]---------------------------------
Int_0:
    Test = 0
           Contatore = Contatore + 1
    Test = 1
    Waitus 5
Return
'-------------------------------------------------------------------------------
Timer_0:
        Print Contatore
Return