Forum: Mikrocontroller und Digitale Elektronik Drehgeber: Funktion


von Jochen (Gast)


Lesenswert?

Hallo,


hab eine Frage zu dem Drehgeber-Code von Peter Danegger:
1
void ISR(void)
2
{
3
  enc_input1 = GPIOE->IDR &  0x00002000;     //PE13
4
  enc_input2 = GPIOE->IDR &  0x00004000;       //PE14
5
  
6
  if((enc_input1 & PHASE_A) == PHASE_A)
7
      enc_new = 3;              
8
9
  if((enc_input2 & PHASE_B) == PHASE_B)  
10
      enc_new ^= 1;
11
12
   enc_new -= enc_last; 
13
14
  if (enc_new & 1)
15
  {
16
      enc_last += enc_new;
17
      enc_delta += (enc_new & 2)-1;
18
  }
19
20
}
21
22
/*
23
  drehgeber init function 
24
*/
25
void init(void)
26
{
27
  enc_input1 = GPIOE->IDR &  0x00002000;
28
  enc_input2 = GPIOE->IDR &  0x00004000;
29
30
  if( (enc_input1 & PHASE_A) == PHASE_A )
31
    new = 3;
32
  if( (enc_input2 & PHASE_B) == PHASE_B )
33
    new ^= 1;                   
34
  
35
  enc_last = new;                  
36
  enc_delta = 0;
37
38
}

Wenn ich das Prinzip richtig verstanden habe, sollte in enc_delta 
entweder 0x00 (wenn der Drehgeber nicht betätigt worden  ist), oder 0x01 
/ 0xFF enthalten sein (je nachdem in welche Richtung der Drehgeber 
gedreht worden ist).

Momentan verwende ich einen Drehgeber von Alps aus der EC11 Serie mit 
(Anschläge 30 und Auflösung 15ppr). Wenn ich von einem Anschlag auf den 
nächsten den Encoder bewege, wird die if() Bedingung in der ISR immer 2x 
ausgeführt.
1
if (enc_new & 1)
2
  {
3
      enc_last += enc_new;
4
      enc_delta += (enc_new & 2)-1;
5
  }

Liegt diese Tatsache auch wirklich am Aufbau des Drehgebers, oder hat 
das einen anderen Hintergrund? Wird mit Anschläge die Rasterung vom 
Encoder - Rasterpunkte - bezeichnet? Was bedeutet in diesem Zusammenhang 
dann die Auflösung?
Wäre schön, wenn mir das jmd kurz erklären kann bzw. in Zusammenhang 
setzen könnte.

Des Weiteren bin ich mir nicht sicher, was genau ein 2 oder 4 step 
encoder ist?
http://www.mikrocontroller.net/articles/Drehgeber

Dachte, dass so ein Encoder stets zwei Pins von einem µC benötigt und 
beide beim Drehen des Encoders sich zwischen 0 und 1 bewegen können; so 
wie die Abbildung das in dem Link ganz oben zeigt; ist das dann ein 2 
step encoder?

Gruß
Jochen

von Falk B. (falk)


Lesenswert?

@Jochen (Gast)

>Momentan verwende ich einen Drehgeber von Alps aus der EC11 Serie mit
>(Anschläge 30 und Auflösung 15ppr). Wenn ich von einem Anschlag auf den
>nächsten den Encoder bewege, wird die if() Bedingung in der ISR immer 2x
>ausgeführt.

Eben weil die meisten Encoder 2 Schritte pro Rastung machen.

>Liegt diese Tatsache auch wirklich am Aufbau des Drehgebers,

Ja.

>das einen anderen Hintergrund? Wird mit Anschläge die Rasterung vom
>Encoder - Rasterpunkte - bezeichnet?

Ja.

>Was bedeutet in diesem Zusammenhang dann die Auflösung?

Die Schritte pro Umdrehung.

>Des Weiteren bin ich mir nicht sicher, was genau ein 2 oder 4 step
>encoder ist?

Einer der 2 oder 4 Schritte pro Rastung macht.

>Dachte, dass so ein Encoder stets zwei Pins von einem µC benötigt

Das ist auch so.

> und
>beide beim Drehen des Encoders sich zwischen 0 und 1 bewegen können;

Das tun sie auch.

>so wie die Abbildung das in dem Link ganz oben zeigt; ist das dann ein 2
>step encoder?

Das "Problem" ist halt, dass die meisten halt mehr Schritte als 
Rastungen haben, daher die Irritation. Siehe Artikel.

MfG
Falk

von Jochen (Gast)


Lesenswert?

>Das "Problem" ist halt, dass die meisten halt mehr Schritte als
>Rastungen haben, daher die Irritation. Siehe Artikel

Vielen Dank für deine Antworten, Falk. Du meinst sicherlich den letzten 
Part in diesem Artikel.... werd ich versuchen, ob`s mit der halben 
Auflösung besser passt
1
int8_t table[16] PROGMEM = {0,0,-1,0,0,0,0,1,1,0,0,0,0,-1,0,0};

und den unteren Code verwenden.

Gruß
Jochen

von Peter D. (peda)


Lesenswert?

Die Schrittzahl zwischen den Rastungen wird erst in der Auslesefunktion 
berücksichtigt, deshalb stehen da ja 3 Auslesefunktionen.

Der Interrupt muß aber jeden Schritt zählen, sonst funktioniert die 
Entprellung nicht.


Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.