arduino lettura valori encoder

Sezione dedicata alla robotica mobile

arduino lettura valori encoder

Postby max » 03 Sep 2012, 19:06

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
max
 
Posts: 6
Joined: 03 Sep 2012, 18:01

Re: arduino lettura valori encoder

Postby deluca » 03 Sep 2012, 19:56

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.....
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: arduino lettura valori encoder

Postby cyclone » 03 Sep 2012, 20:05

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
User avatar
cyclone
 
Posts: 38
Joined: 27 Jan 2012, 11:49

Re: arduino lettura valori encoder

Postby cyclone » 03 Sep 2012, 20:13

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.
User avatar
cyclone
 
Posts: 38
Joined: 27 Jan 2012, 11:49

Re: arduino lettura valori encoder

Postby max » 03 Sep 2012, 20:47

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 .
max
 
Posts: 6
Joined: 03 Sep 2012, 18:01

Re: arduino lettura valori encoder

Postby deluca » 03 Sep 2012, 21:05

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 ?
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: arduino lettura valori encoder

Postby max » 04 Sep 2012, 12:58

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
max
 
Posts: 6
Joined: 03 Sep 2012, 18:01

Re: arduino lettura valori encoder

Postby max » 04 Sep 2012, 13:55

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à
max
 
Posts: 6
Joined: 03 Sep 2012, 18:01

Re: arduino lettura valori encoder

Postby flz47655 » 04 Sep 2012, 14:05

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
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

Re: arduino lettura valori encoder

Postby max » 04 Sep 2012, 14:13

ok modifico flag cmq con matlab e labview mi da lo stesso errore
max
 
Posts: 6
Joined: 03 Sep 2012, 18:01

Re: arduino lettura valori encoder

Postby max » 04 Sep 2012, 14:14

cmq cos'è uno spike?
max
 
Posts: 6
Joined: 03 Sep 2012, 18:01

Re: arduino lettura valori encoder

Postby flz47655 » 04 Sep 2012, 14:18

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
Last edited by flz47655 on 04 Sep 2012, 14:19, edited 1 time in total.
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

Re: arduino lettura valori encoder

Postby deluca » 04 Sep 2012, 14:19

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
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)


Return to Robotica

Who is online

Users browsing this forum: No registered users and 3 guests

cron