Pagina 1 di 2

gestione encoder (azzerare la variabile di passi)

MessaggioInviato: 1 giu 2018, 17:29
da luchinho
ciao a tutti, questo è il codice per la lettura dei passi di un encoder incrementativo ma ho un problema nell'azzerare la variabile ogni secondoqualche consiglio? Grazie questo è il codice

Codice: Seleziona tutto
//VARIABILI DI TEMPO
unsigned long istante_ultimo_cambiamento_stato = 0;
int tempo_per_istante = 1000 ; // Periodo per ogni lettura degli impulsi in questo caso  1 secondo


//GESTIONE PWM DI POTENZA
#define PWM 5 // pin per il PWM del motore
int valorepwm = 0; // valore del duty cycle tra 0 e 255

// GESTIONE ENCODER
#define encoderCLK 2 // CLK (canale A) connesso al pin D2
#define encoderDT 3  // DT (Canale B) connesso al pin D4
#define interrupt0 0 // Associato al pin 2 di Arduino
#define interrupt1 1
volatile int lastEncoded = 0;
volatile long encoderO = 0;
volatile long encoderA = 0;
long encoderOeff = 0;
long encoderAeff = 0;
volatile long encoderF = 0;
int lastMSB = 0;
int lastLSB = 0;

bool i,j = 0;


void setup() {
 
  // I pin sono impostati come ingresso
  pinMode(encoderCLK, INPUT);    // interrupt 0
  pinMode(encoderDT, INPUT);   
  pinMode(PWM,OUTPUT);

 
  attachInterrupt(1, Encoder, CHANGE);
  attachInterrupt(0, Encoder, CHANGE);

  Serial.begin(9600);

  analogWrite(PWM, 0);
}

void loop() {
if (millis() -  istante_ultimo_cambiamento_stato >= tempo_per_istante)
  {
     istante_ultimo_cambiamento_stato = millis();
    if(encoderO%4 == 0 && i == 1){
  encoderOeff = encoderO/4;
  i = 0;
}
if(encoderA%4 == 0 && j == 1){
  encoderAeff = encoderA/4;
  j = 0;
}

encoderF = encoderOeff - encoderAeff ;
     Serial.print("    ");
     Serial.print(encoderF);
     Serial.print("    ");
     Serial.print(encoderOeff);
     Serial.print("    ");
     Serial.println(encoderAeff);

      encoderO = 0; // resetto le variabili
      encoderA = 0; // resetto le variabili
}
}

void Encoder(){
  int MSB = digitalRead(encoderCLK);
  int LSB = digitalRead(encoderDT);

  int encoded = (MSB << 1) |LSB;
  int sum  = (lastEncoded << 2) | encoded;

  if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderO ++; i = 1;
  if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderA ++; j = 1;

  lastEncoded = encoded;
}

Re: gestione encoder (azzerare la variabile di passi)

MessaggioInviato: 3 giu 2018, 9:44
da lelerelele
non sono esperto di arduino, ed anche poco di altro....mi pare che siano usati interrupt per la lettura degli ingressi, (se se ne accorge Foto Utentevenexian sono guai) :mrgreen:

dal mio punto di vista gia l'uso di due interrupt mi pare eccessivo, sono più dannosi che altro, forse è questo che ti obbliga a generare una variabile da azzerare ogni secondo?

nel mio caso usai un solo interrupt su un canale, ed in quel momento analizzai la posizione dell'altro per identificare la rotazione in un senso o nell'altro.

saluti.

Re: gestione encoder (azzerare la variabile di passi)

MessaggioInviato: 3 giu 2018, 9:51
da dadduni
ma ho un problema nell'azzerare la variabile ogni secondo

Se l'obbiettivo è quello di azzerare la variabile ogni secondo basta far partire un timer che genera un interrupt ogni secondo e dentro la routine di interrupt azzeri la variabile. Se il timer non ce la fa a sostenere timing così lunghi (non conosco il micro) allora setti il timer ad esempio ad un centesimo di secondo, all'interno della routine di interrupt incrementi una variabile e quando questa arriva a 100 azzeri il counter dell'encoder.
Davide

Re: gestione encoder (azzerare la variabile di passi)

MessaggioInviato: 3 giu 2018, 12:28
da luchinho
dadduni nel linguaggio di arduino all'interno della routine di interrupt non si possono uare timer, perciò io gli ho attivati all'interno del loop dove gli ho "azzerati" ma non funziona nel modo corretto, forse bisogn azzerare in un altro modo ?

Re: gestione encoder (azzerare la variabile di passi)

MessaggioInviato: 5 giu 2018, 20:46
da dadduni
a te serve che ogni secondo si resetti l'encoder?
l'ATmega328 ha diversi timer che generano interrupt quando passa un certo periodo di tempo, basta che ne setti uno a farti generare una interrupt ogni secondo e dentro questa interrupt resetti il contatore.

Re: gestione encoder (azzerare la variabile di passi)

MessaggioInviato: 5 giu 2018, 23:07
da MassimoB
luchinho ha scritto:dadduni nel linguaggio di arduino all'interno della routine di interrupt non si possono uare timer, perciò io gli ho attivati all'interno del loop dove gli ho "azzerati" ma non funziona nel modo corretto, forse bisogn azzerare in un altro modo ?

#-o

Re: gestione encoder (azzerare la variabile di passi)

MessaggioInviato: 7 giu 2018, 16:05
da WALTERmwp
luchinho ha scritto:ciao a tutti, questo è il codice per la lettura dei passi di un encoder incrementativo ma ho un problema nell'azzerare la variabile ogni secondoqualche consiglio? (...)
ci sarebbe da portare qualche osservazione(come in parte già fatto da chi ha preceduto) ma, per quella che tu ritieni essere un'anomalia, in pratica, in quale condizione operativa si manifesterebbe ?

Saluti

Re: gestione encoder (azzerare la variabile di passi)

MessaggioInviato: 8 giu 2018, 19:18
da luchinho
Certo WALTERmwp l'anomalia la ritrovo utilizzando la seriale che riporta i passi, mentre sto girando l'encoder segna valori errati (pensa che è un encoder da 1080 passi), so che la serile rallenta di molto ma senza di essa come posso verificare la quantità di passi ? con un lcd direttamente ?

Re: gestione encoder (azzerare la variabile di passi)

MessaggioInviato: 8 giu 2018, 19:19
da luchinho
Ho sbagliato qualcosa? MassimoB

Re: gestione encoder (azzerare la variabile di passi)

MessaggioInviato: 8 giu 2018, 19:20
da luchinho
Potresti farmi un esempio ? dadduni