i have problem rotary encoder, skips number. @ first looked bounce me, thing is: happens after fresh restart of board (but not after fresh start) also, doesn't happen original code example have used, when change code use lcd backpack instead of serial monitor, goes wrong.
i have included sketch , orginal one. has idea? interrupt routine long?
i have included sketch , orginal one. has idea? interrupt routine long?
don't know it's helpful you, use a different encoder reading program accurate (irq polling speed: 4khz):
code: [select]
/************************************************************
*
* demo-programm zur auswertung eines händisch betriebenen
* drehencoders (quadraturencoder) mit dem arduino im
* timer-interrupt mit einer abfragefrequenz von rd. 4 khz
*
* kann von jederman frei verwendet werden, aber bitte den
* hinweis: "entnommen aus http://www.meinduino.de" einfügen
*
************************************************************/
// die pins 2 und 3 ist der encoder angeschlossen
#define encodera 2
#define encoderb 3
// globale variablen zur auswertung in der
// interrupt-service-routine (isr)
volatile int8_t altab = 0;
volatile int32_t encoderwert = 0;
// die beiden schritt-tabellen für volle oder 1/4-auflösung
// 1/1 auflösung
//int8_t schritttab[16] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};
// 1/2 auflösung ergibt bei lego-motoren 1 tick pro grad (standard wie bei lego)
int8_t schritttab[16] = {0, 0,0,0,1,0,0,-1, 0,0,0,1,0,0,-1,0};
// 1/4 auflösung
//int8_t schritttab[16] = {0,0,0,0,0,0,0,-1,0,0,0,0,0,1,0,0};
/*************************************************************
*
* interrupt service routine
*
* wird aufgerufen, wenn der entsprechende interrupt
* ausgelöst wird
*
*************************************************************/
isr(timer1_compa_vect) {
altab <<= 2;
altab &= b00001100;
altab |= (digitalread(encodera) << 1) | digitalread(encoderb);
encoderwert += schritttab[altab];
}
/*************************************************************
*
* void setup()
*
* wird einmal beim programmstart ausgeführt
*
*************************************************************/
void setup() {
pinmode(encodera, input);
pinmode(encoderb, input);
nointerrupts(); // jetzt keine interrupts
timsk1 |= (1<<ocie1a); // timer 1 output compare match interrupt enable
tccr1a = 0; // "normaler" modus
// wgm12: ctc-modus einschalten (clear timer on compare match)
// stimmen ocr1a und timer überein, wird der interrupt
// ausgelöst
// bit cs12 und cs10 setzen = vorteiler: 1024
tccr1b = (1<<wgm12) | (1<<cs12) | (1<<cs10);
// frequenz = 16000000 / 1024 / 15 = rd. 1khz abtastfrequenz;
// Überlauf bei 14, weil die zählung bei 0 beginnt
ocr1a = 14;
interrupts(); // interrupts wieder erlauben
serial.begin(115200);
}
/*************************************************************
*
* void loop()
*
* wird immer wieder durchlaufen
*
*************************************************************/
void loop() {
while(true) {
serial.println(encoderwert);
delay(100);
}
}
Arduino Forum > Using Arduino > Programming Questions > rotary encoder, and I don't think it's bouncing
arduino
Comments
Post a Comment