Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

gestione encoder (azzerare la variabile di passi)

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[1] gestione encoder (azzerare la variabile di passi)

Messaggioda Foto Utenteluchinho » 1 giu 2018, 17:29

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;
}
Avatar utente
Foto Utenteluchinho
0 3
 
Messaggi: 23
Iscritto il: 15 giu 2017, 22:24

0
voti

[2] Re: gestione encoder (azzerare la variabile di passi)

Messaggioda Foto Utentelelerelele » 3 giu 2018, 9:44

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.
Ultima modifica di Foto Utentelelerelele il 3 giu 2018, 9:54, modificato 1 volta in totale.
Avatar utente
Foto Utentelelerelele
4.899 3 7 9
Master
Master
 
Messaggi: 5505
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

0
voti

[3] Re: gestione encoder (azzerare la variabile di passi)

Messaggioda Foto Utentedadduni » 3 giu 2018, 9:51

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
Avatar utente
Foto Utentedadduni
2.073 2 7 12
Expert EY
Expert EY
 
Messaggi: 1370
Iscritto il: 23 mag 2014, 16:26

0
voti

[4] Re: gestione encoder (azzerare la variabile di passi)

Messaggioda Foto Utenteluchinho » 3 giu 2018, 12:28

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 ?
Avatar utente
Foto Utenteluchinho
0 3
 
Messaggi: 23
Iscritto il: 15 giu 2017, 22:24

0
voti

[5] Re: gestione encoder (azzerare la variabile di passi)

Messaggioda Foto Utentedadduni » 5 giu 2018, 20:46

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.
Avatar utente
Foto Utentedadduni
2.073 2 7 12
Expert EY
Expert EY
 
Messaggi: 1370
Iscritto il: 23 mag 2014, 16:26

0
voti

[6] Re: gestione encoder (azzerare la variabile di passi)

Messaggioda Foto UtenteMassimoB » 5 giu 2018, 23:07

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
MCSA Windows Server 2012 R2
Cisco CCNA R&S - Cisco CCNA Security - Cisco CCNA Cyber Ops
CompTia A+ - CompTia Linux+ - CompTIA Systems Support Specialist CSSS
CompTia Pentest+ LPIC-1 - VCP VMware - Cisco CCNP Enterprise
Avatar utente
Foto UtenteMassimoB
14,2k 6 12 13
Expert free
 
Messaggi: 3163
Iscritto il: 28 ott 2012, 9:56
Località: Milano

0
voti

[7] Re: gestione encoder (azzerare la variabile di passi)

Messaggioda Foto UtenteWALTERmwp » 7 giu 2018, 16:05

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
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[8] Re: gestione encoder (azzerare la variabile di passi)

Messaggioda Foto Utenteluchinho » 8 giu 2018, 19:18

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 ?
Avatar utente
Foto Utenteluchinho
0 3
 
Messaggi: 23
Iscritto il: 15 giu 2017, 22:24

0
voti

[9] Re: gestione encoder (azzerare la variabile di passi)

Messaggioda Foto Utenteluchinho » 8 giu 2018, 19:19

Ho sbagliato qualcosa? MassimoB
Avatar utente
Foto Utenteluchinho
0 3
 
Messaggi: 23
Iscritto il: 15 giu 2017, 22:24

0
voti

[10] Re: gestione encoder (azzerare la variabile di passi)

Messaggioda Foto Utenteluchinho » 8 giu 2018, 19:20

Potresti farmi un esempio ? dadduni
Avatar utente
Foto Utenteluchinho
0 3
 
Messaggi: 23
Iscritto il: 15 giu 2017, 22:24

Prossimo

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 10 ospiti