Go Down

Topic: Calcolare il tempo tra due eventi  (Read 1 time) previous topic - next topic

luchinho

Standardoil ho eliminato il Serial.print nella ISR e ho lasciato quello nel loop e mi conta in modo "corretto" il passi cioè che se giro più o meno veloce lencoder nello stesso spazio il numero di passi è sempre costante, corretto non proprio perchè legge il passo ogni volta doppio e non capisco il perchè. Eppure non mi sembra sbagliato il codice, mi piacerebbe che Claudio_FF mi spiegasse il suo.

Claudio_FF

#31
Apr 19, 2018, 05:55 pm Last Edit: Apr 19, 2018, 05:56 pm by Claudio_FF
Se non sbaglio nei primi codici l'interrupt era impostato sul solo fronte di salita, negli ultimi sulla variazione, con il secondo metodo si conta esattamente il doppio a parità di movimento.

Il mio codice (primo sketch) è solo una versione compatta della logica che hai postato.
Se si sente la variazione non serve la variabile lettura precedente. Quando c'è una variazione si controlla se il secondo ingresso è uguale al primo. Il risultato booleano del confronto lo metto nella variabile clwise (senso orario), che vale 1 per senso orario altrimenti 0. Il resto è solo un barbatrucco per sommare o sottrarre 1 dalla variabile conteggio, che ha la stessa funzione dalla tua espressione ternaria.

Nello sketch successivo uso la variabile first per quanto detto alla fine di uno dei post precedenti. Per calcolare il tempo servono almeno due impulsi, e se si stava girando al contrario il primo va solo salvato per il calcolo con quello successivo.
* * * *    if non è un ciclo   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *

Silente

Standardoil ho eliminato il Serial.print nella ISR e ho lasciato quello nel loop e mi conta in modo "corretto" il passi cioè che se giro più o meno veloce lencoder nello stesso spazio il numero di passi è sempre costante, corretto non proprio perchè legge il passo ogni volta doppio e non capisco il perchè. Eppure non mi sembra sbagliato il codice, mi piacerebbe che Claudio_FF mi spiegasse il suo.
... Non basterebbe dimezzare il valore della variabile?

luchinho

a
... Non basterebbe dimezzare il valore della variabile?
ok ma quando si incrementa di uno quella nuova variabile 0.5 non ho senso 

Silente

Allora forse ho capito male, tu hai detto che conta il passo doppio, e io ho capito che ogni giro anziché salire di uno sale di due, per questo ho pensato che soluzione era dimezzarla. In che senso conta il passo doppio?

luchinho

ah ho capito, grazie Claudio_FF

Silente allora questo codice ogni passo dell' encoder lo lo incrementa di due sia il fronte di salita che quello di discesa, perciò è sbagliato come concetto perchè deve incrementare solo durante il fronte di salita

Claudio_FF

Quote
questo è quello che ho scritto

Code: [Select]

#define encoderCLK 2
int encoderCountOr = 0;
int encoderCountAnt = 0;
int encoderCount = 0;
volatile boolean i = 0;
volatile boolean val_B;
unsigned long inizio_A = 0;
unsigned long fine_A = 0;
unsigned long diff_A = 0;
unsigned long temp_tot = 0;
void setup() {
   Serial.begin(38400);
   attachInterrupt(digitalPinToInterrupt (2), frontecanaleA, RISING);
   pinMode(4,INPUT);
  // attachInterrupt(digitalPinToInterrupt (4), frontecanaleB, RISING);
}

void loop() {
  if(i == 1 &&  val_B== HIGH){
 // encoderCountOr++;
  encoderCount++;
 
  inizio_A = micros();
  diff_A = inizio_A - fine_A;
  fine_A = inizio_A;

 
  i = 0;

  }
  if(i == 1 && val_B== LOW){
 // encoderCountAnt++;
 encoderCount--;
  i = 0;

    }
 temp_tot= diff_A + temp_tot;
// encoderCount = encoderCountOr - encoderCountAnt;

    Serial.print(encoderCount);
    Serial.print("     ");
    Serial.println(diff_A);
}
void frontecanaleA()
{
   i=1;
   val_B = digitalRead(4);
}
 


in questo primo uso un interrupt solo, ma non riconosce i passi nel modo corretto

Code: [Select]

#define encoderCLK 2
int encoderCountOr = 0;
int encoderCountAnt = 0;
int encoderCount = 0;
volatile boolean i = false;
volatile boolean j = false;
unsigned long inizio_A = 0;
unsigned long fine_A = 0;
unsigned long diff_A = 0;
unsigned long temp_tot = 0;

void setup() {
   Serial.begin(38400);
   attachInterrupt(digitalPinToInterrupt (2), frontecanaleA, RISING);
   attachInterrupt(digitalPinToInterrupt (4), frontecanaleB, RISING);

}

void loop() {
 if(i == true && j == true){
  encoderCountOr++;
 
  fine_A = inizio_A;
  inizio_A = micros();
  diff_A = inizio_A - fine_A;

  temp_tot= diff_A + temp_tot;
 
  i = false;
  j = false;
  }
  if(i == true && j == false){
  encoderCountAnt++;
 // fine_A = inizio_A;
 // diff_A = 0;
  i = false;
  j = false;
    }

    encoderCount = encoderCountOr - encoderCountAnt;
    Serial.print(encoderCount);
    Serial.print("     ");
    Serial.println(diff_A);
}
void frontecanaleA()
{
 i=true;
}
void frontecanaleB()
{
 j=true;
}


questo l'ho fatto con due interrupt e non funziona nemmeno questo
Per quanto ne so solo i pin 2 e 3 possono essere usati come sorgente di interrupt individuale.
* * * *    if non è un ciclo   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *

Go Up