- 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;
}
gestione encoder (azzerare la variabile di passi)
15 messaggi
• Pagina 1 di 2 • 1, 2
0
voti
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
0
voti
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
venexian sono guai)
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.
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
lelerelele il 3 giu 2018, 9:54, modificato 1 volta in totale.
-

lelerelele
4.899 3 7 9 - Master

- Messaggi: 5505
- Iscritto il: 8 giu 2011, 8:57
- Località: Reggio Emilia
0
voti
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
0
voti
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 ?
0
voti
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.
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.
0
voti
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 ?

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
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
0
voti
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 ?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? (...)
Saluti
W - U.H.F.
-

WALTERmwp
30,2k 4 8 13 - G.Master EY

- Messaggi: 8982
- Iscritto il: 17 lug 2010, 18:42
- Località: le 4 del mattino
0
voti
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 ?
0
voti
Potresti farmi un esempio ? dadduni
15 messaggi
• Pagina 1 di 2 • 1, 2
Chi c’è in linea
Visitano il forum: Nessuno e 10 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)


