Pages: [1]   Go Down
Author Topic: Lettura di un encoder incrementale  (Read 2105 times)
0 Members and 1 Guest are viewing this topic.
grugliasco
Offline Offline
Jr. Member
**
Karma: 0
Posts: 95
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve a tutti ragazzi, sono di nuovo qui con un nuovo problema nei miei vari esperimenti sto cercando di utilizare un encoer ricavato da un vecchio videoregistratore. Quindi ho scritto un skech per leggere i due canali (A e B). Quando mi fermo su un punto continua  a in crementare i conteggio ansichè fermarsi.Questo è l skech che ho scritto

Code:
#define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )
#define CAN_A 6 // ingresso encoder canale A
#define CAN_B 7 // ingresso encoder canale B
int  impulsi = 0; // impulsi encoder
void setup(){
 
  Serial.begin(9600);       // apre la porta seriale x il pc}
 }
 void loop(){
    boolean canold_a;
    boolean canold_b;
    boolean can_a;
    boolean can_b;
    can_a=digitalRead(CAN_A);//leggo in canale a dell'encoder
    can_b=digitalRead(CAN_B);//leggo in canale b dell'encoder
    if ((can_a==HIGH) && (canold_a==LOW) && (can_b==LOW)) {
     canold_a=HIGH;
     impulsi=impulsi + 1;
     Serial.println(impulsi);
    }
    if ((can_b==HIGH) && (canold_b==LOW) && (can_a==LOW)) {
     canold_b=HIGH;
     impulsi=impulsi - 1;
     Serial.println(impulsi);
    }
   
  if (can_a==LOW && can_b==LOW ) {
  canold_a=LOW;
  canold_b=LOW;
  }
 }
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22635
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La funzione loop() viene ripetuta all'infinito.
Ogni volta che viene ripetuta le variabili canold_a/b vengono reinizializzate quindi saltano tutti i controlli negli if.

Mettile all'inizio dello sketch, in modo che siano globali, impostane i valori iniziali nella funzione setup() e dovrebbe andare.
Logged


grugliasco
Offline Offline
Jr. Member
**
Karma: 0
Posts: 95
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho fatto le modifiche come sugerito però adesso la lettura varia tra 0 e -1 oppure tra 0 e 1 la mia idea era che appena un canale andava a uno bloccava l'altro e canold serviva per legere il fronte di salita, non sono sicuro che
Code:
if ((can_a==HIGH) && (canold_a==LOW) && (can_b==LOW)) {
sia corretto
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22635
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Questo devi vederlo tu. Non so come funziona il tuo progetto HW  smiley-lol
Logged


grugliasco
Offline Offline
Jr. Member
**
Karma: 0
Posts: 95
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

gli encoder incrementali quando vengono ruotati generano due treni di impulsi che sono sfalsati di mezza durata dell'impuso.invertendo la rotazione si inverte ordine di arrivo degl'impulsi.

http://forum.lithium.it/portal/images/stories/Image/Controlli%20Automatici/EncoderIncr.png

Ti ringrazio per l'aiuto ciao.
Logged

0
Offline Offline
Faraday Member
**
Karma: 31
Posts: 2908
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao tecno, nel playground italiano c'è uno sketch, puoi prendere esempio da li, solo che la lettura degli encoder in pooling è inaffidabile.
Per la lettura degli encoder è meglio ricorrere alle routine di interrupt, vedi nel reference la funzione attachInterrupt().
Quelle funzioni lavorano solo sui pin 2 e 3 di arduino 2009 o UNO, sul mega ci sono mi pare in totale 4 pin interrupt.


Il pooling è la tecnica che controllo ripetutamente lo stato di un qualcosa in questo caso lo stato di un pin.

Ciao.
Logged

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10463
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

usando i registri dell'atmega puoi settare interrupt su qualsiasi pin  smiley

ma per ora credo che quelli messi a disposizione da attachInterrupt() possano bastare. Se poi per ogni treno di impulsi la durata del segnale basso è uguale a quello del segnale alto anziché usare l'interrupt sul change puoi usarlo solo su rising o falling, dimezzando il carico di lavoro dell'arduino
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

0
Offline Offline
Faraday Member
**
Karma: 31
Posts: 2908
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
usando i registri dell'atmega puoi settare interrupt su qualsiasi pin  smiley
Esatto, però non su gli altri pin hai un vettore per porta, cioè in totale sul 328 ci sono 3 vettori di interrupt appunto uno per ogni porta, anche per questo non è possibile trigerarli come si fa con i pin 2 e 3, cioè sono solo changed.

Però non credo che tecno sia a questo livello, meglio attachInterrupt che le ISR nude è crude.

Ciao.
Logged

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

grugliasco
Offline Offline
Jr. Member
**
Karma: 0
Posts: 95
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

vi ringrazio tutti per i consigli.
Per MauroTec nel fratempo ho visto lo skech e penso di studiarmelo.
Per tutti gli altri penso che per adesso non intrapendo la via degli
interrup perche come dice un mio amico io sono programmatore della domenica.
Ciao a tutti
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10463
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
usando i registri dell'atmega puoi settare interrupt su qualsiasi pin  smiley
Esatto, però non su gli altri pin hai un vettore per porta, cioè in totale sul 328 ci sono 3 vettori di interrupt appunto uno per ogni porta, anche per questo non è possibile trigerarli come si fa con i pin 2 e 3, cioè sono solo changed.
Con un poco di logica booleana riesci a gestire anche le change su pin specifici, e credo che sia la stessa algebra che usa l'attachInterrupt(), ma non ho mai controllato.
Io uso gli interrupt su 4 pin per leggere 4 segnali PPM e mai avuto problemi

Però non credo che tecno sia a questo livello, meglio attachInterrupt che le ISR nude è crude.

Ciao.
non posso che darti ragione, ma in caso gli servisse almeno sà che esistono :_)
« Last Edit: February 20, 2011, 03:33:27 pm by lesto » Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

grugliasco
Offline Offline
Jr. Member
**
Karma: 0
Posts: 95
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Questo pomeriggio ho trovato dove era il problema ,bisognava aggiungere queste due istruzioni
Code:
canold_b = HIGH;// bit oneshot per il canale b
 canold_a = HIGH;// bit oneshot per il canale a

adesso riesco a leggere bene l'encoder
Per adesso non ho intenzione di provare con gli interrup per non devo controllare un asse di una cnc quindi se perdo degli inuplsi non è problema.
Logged

Pages: [1]   Go Up
Jump to: