Wie Drehgeber entprellen?

Gast #2721418
Lesenswert?

Hallo,
ich habe so einen Drehgeber (siehe Bild) an einen ATXmega16A4 
angeschlossen.
1
unsigned char n=0;
2

3
ISR(PORTC_INT0_vect)
4
{
5
  if(PORTC_IN & (1<<PIN1)) n++; else n--;
6
  Show_turnwheel(n);
7
}
8

9
int main (void) 
10
{
11
  Set_osc_32();
12

13
  PORTA_DIRSET = 0xFF;
14
  PORTB_DIRSET = 0x0F;
15
  
16
  PORTC.DIRCLR = (1<<PIN0)|(1<<PIN1)|(1<<PIN3); // PC0, PC1, PC3 sind Input
17
  PORTC.INT0MASK = (1<<PIN0);  // PC0 löst den Interrupt aus
18
  PORTC.INTCTRL = PORT_INT0LVL_LO_gc;
19
  PORTC.PIN0CTRL = PORT_ISC_FALLING_gc;
20
  PMIC.CTRL |= PMIC_LOLVLEN_bm;  // Enable low interrupt level in PMIC
21
  sei();              // Enable global interrupts
22

23
  Show_turnwheel(n);
24
  while(1){}                      
25
}
Leider funktioniert der Drehgeber nur so zu 80%, manchmal reagiert er 
überhaupt nicht, oder die Anzeige springt um 2 oder 4 oder eine 
beliebige Anzahl von Positionen.
Ich müsste den Drehgeber vielleicht entprellen.
Wie kann ich das machen?
Oder ist da ein schlimmer Fehler in meinem Code?
Angehängte Dateien:
Gast #2721563
Lesenswert?

Versuche es mal mit einfachen R/C Gliedern.

Also z.B. 10nF parallel zu den Mikrocontroller Eingängeng und 1k 
Widerstände in Reihe zu den beiden Schaltkontakten.

Unter der Annahme, daß der interne Pull-Up des Mikrocontrollers etwa 50k 
Ohm hat, kommst Du so ganz grob gerechnet auf eine Entsprell-Zeit von:

t= 2*50k*10n = 1ms

Die Kontakte dürfen also maximal 1ms prellen, und Du kannst maximal 100 
Impulse pro Sekunde drehen. Falls das nicht reicht, versuche es mit 
4,7nF.

Eigentlich müsste man zwischen Mikrocontroller und R/C Filter einen 
Schmitt-Trigger schalten, aber in der Praxis hatte sowas bei mir bisher 
immer auch ohne Schmitt-Trigger zufriedenstellend funktioniert.
Gast #2721569
Lesenswert?

> Versuche es mal mit einfachen R/C Gliedern.

Du meinst, du selbst hast es zwar nie "versucht"
und weisst nicht ob es funktioniert,
aber warum nicht fremde Leute sinnlose Arbeit machen lassen,
da kann man sich doch schön auf die Schenkel klopfen ?

Und dann noch ohne Schmitt-Trigger, damit garantiert jede
Schwankung der Versorgungsspannung sauber mitgezählt wird...
Gast #2721653
Lesenswert?

Hallo

hier das Beispiel hab ich damals benutzt um einen Drehgeber 
abzutasten... Hat bei mir auf anhieb funktioniert.
Findet man in der Codesammlung unter Drehgeber.
1
SIGNAL (SIG_OVERFLOW0)
2
{
3
  static char enc_last = 0x01;
4
  char i = 0;
5

6
  if( PHASE_A )
7
    i = 1;
8

9
  if( PHASE_B )
10
    i ^= 3;        // convert gray to binary
11

12
  i -= enc_last;      // difference new - last
13

14
  if( i & 1 ){        // bit 0 = value (1)
15
    enc_last += i;      // store new as next last
16

17
    enc_delta += (i & 2) - 1;    // bit 1 = direction (+/-)
18
  }
19
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren