gestione encoder (azzerare la variabile di passi)
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;
}
