rotary encoder, and I don't think it's bouncing


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?

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