Drehgeber: Funktion

Gast #1789055
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
#1789433
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
Gast #1789508
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

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