Forum: Mikrocontroller und Digitale Elektronik Probleme mit Drehgeberauswertung


von Thomas (Gast)


Lesenswert?

Hallo,
ich weiß es gibt schon duzende Threads zum Thema 
Drehgeber-Auswertung,ich bekomme es aber einfach nicht zu laufen. 
Außerdem würde ich gerne aus meinen Fehlern lernen. Wäre also toll wenn 
mir jemand sagen könnte woran es scheitert.
Habe das ganze mit Hilfe des Drehgeber-Artikels verfasst und ein paar 
LEDs zur Visualisierung verwendet. Programmiert wird das ganze für einen 
Atmega328p. Das Problem ist, beim Drehen wird die LED mal alle Drei, mal 
jeden zweiten und manchmal sogar nur jeden vierten "click" getoggelt.
Wär toll wenn mir jemand einen Tipp geben könnte.

mfg Thomas
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
5
#define F_CPU 16000000UL
6
7
#include <util/delay.h>
8
9
#define PHASE_A (PIND & (1<<PD2))
10
#define PHASE_B (PIND & (1<<PD3))
11
12
volatile int8_t rot_delta=0; 
13
volatile int32_t encode_val=125;
14
volatile static int8_t last=0;
15
16
const int8_t lookup_table[] PROGMEM ={0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};
17
18
ISR(TIMER1_COMPA_vect){
19
  
20
  last=(last<<2) & 0xF;  //letztes Bitmuster um zwei Stellen nach links schieben und auf 4 Stellen begrenzen
21
  if (!PHASE_A){last|=2;} //Phase A auf Bit1 Schreiben, LOW-Active      
22
  if (!PHASE_B){last|=1;}; //Phase B auf Bit0 Schreiben
23
    
24
  rot_delta += pgm_read_byte(&lookup_table[last]); //Zustand durch Binärwert aus Tabelle lesen
25
  
26
  if(rot_delta>4 || rot_delta<-4){  //4Step-Encoder
27
    PORTB ^= (1<<PB5);        //Toggle PIN B5 bei jeder Rastposition
28
    if(rot_delta>0){encode_val++;  //Absolutwert des Encoders erhöhen
29
        PORTD ^= (1<<PD6);}    // Wenn Wert erhöht worden wird Toggle PIN D6
30
      else{encode_val--;
31
        PORTD ^= (1<<PD7);}    // Wenn Wert verringert worden ist Toggle PIN D7
32
    rot_delta=0;}          //Delta Wert zurücksetzen
33
  }
34
35
36
37
int8_t GetRotEntPos(void)
38
{
39
  int8_t  value = 0;    //Um Overflow zu verhindern wert con encode_Val auf value schreiben
40
              // Schritt nötig??
41
  cli();          
42
  value = encode_val;
43
  encode_val = 0;
44
  sei();
45
  
46
  return value;
47
}
48
49
int main(void)
50
{  
51
  DDRD |= (1<<PD6) | (1<<PD7);
52
  OCR0A=0;
53
  DDRB |= (1<<PB5);
54
  
55
  
56
  TCCR1B |= (1<<WGM12);  //CTC Mode aktivieren
57
  TIMSK1 |= (1<<OCIE1A);  //Compare Interrupt aktivieren
58
  OCR1A = 62;        // (1ms/(1/(F_CPU/Prescaler)))-1 -->1kHz
59
60
  TCCR1B |= (1<<CS12);  //Prescaler-256 16000000/256=62500Hz
61
  
62
  sei();          //Enable global Interrupts
63
    
64
  int32_t value=0;
65
  
66
    while(1)
67
    {    value += GetRotEntPos();  //Value auslesen
68
69
      }
70
    return 1;
71
    }

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Thomas schrieb:
> Das Problem ist, beim Drehen wird die LED mal alle Drei, mal jeden
> zweiten und manchmal sogar nur jeden vierten "click" getoggelt.
Welche LED? Welcher Click? Und was meint das Oszilloskop zu dieser 
Sache? Was kommt heraus, wenn du einfach mal die Encoderposition an 
einem Port ausgibst?

von m.n. (Gast)


Lesenswert?

Und welcher Drehgeber: mechanisch, optoelektronisch?
Wieviele Flanken sollen ausgewertet werden: 1, 2 oder 4?

von Thomas (Gast)


Lesenswert?

Hallo und guten Morgen.
Ausgelesen soll ein mechanischer Handdrehgeber. Dieser hat pro Spur 4 
Zustandswechsel pro Rastposition. Ich möchte nun mitzählen um wieviele 
Rastpositionen ich mich bewegt habe. Benötige also theoretisch nicht 
alle Flanken.
Da das Ausgeben nicht richtig funktioniert hat und ich lediglich ein 
Multimeter zur "Analyse" besitze, habe.ich nun eine LED für eine Drehung 
im Uhrzeigersinn und eine für eine Drehung gegen den Uhrzeigersinn, die 
ich bei jeder Rastposition, also nach 4 Signalübergängen togglen möchte. 
Leider passiert dies jedoch nicht in regelmäßigen Abständen. Also mal so 
wie es richtig wäre nach 2 Rastpositionen, dann wieder erst bei der 
dritten oder vierten Rastposition.
Hoffe nun ein bisschen mehr Klarheit in die Sache gebracht zu haben
haben.

Mfg Thomas

von porter (Gast)


Lesenswert?

Evtl prellt der Drehgeber!?

von loh (Gast)


Lesenswert?

>Evtl prellt der Drehgeber!?
Auch wenn er das tüte (Konjunktiv), sollte es bei dieser Art der 
Auswertung gehen.

Ich glaube das Problem liegt daran:

>habe.ich nun eine LED für eine Drehung
>im Uhrzeigersinn und eine für eine Drehung gegen den Uhrzeigersinn,
Genau das darfst Du nämlich nicht machen.

Angenommen Du drehst 2 Schritte weiter.
+1 +1
Dann leuchtet die LED 2x, rot_delta steht auf 2.

Angenommen Du drehst 2 Schritte weiter.
+1 -1 +1 +1
Dann leuchtet die LED 3x, rot_delta steht auf 2.

Du siehst, wichtig ist, was in rot_delta steht. Nicht, wie oft die LED 
leuchtet.
Ich vermute, es geht also. Die LEDs verwirren nur, weil diese nämlich 
die Flanken zählen. Genau das willst Du ja nicht.

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Vielen Dank Ioh, das ist natürlich richtig.

Habe das Programm jetzt so umgeschrieben, dass die LEDs die Zustände der 
Drehgebersignale anzeigen und merkwürdiges beobachtet.
Bei langsamer Drehung im Uhrzeigersinn gehen beide LEDs gleichzeitig an 
und nicht wie es eigentlich sein sollte versetzt. Aus gehen sie dann 
phasenverschoben. Dreht man den Drehgeber gegen den Uhrezigersinn, so 
schalten die LEDs zwar versetzt ein, gehen aber gleichzeitig aus.
Woran könnte denn das liegen? o.O Bin echt verwirrt.
Anbei noch der "Timing"Auszug aus dem Datenblatt.

Vielen Dank schonmal an alle hier!!!

von Falk B. (falk)


Lesenswert?

@ Thomas (Gast)

>Bei langsamer Drehung im Uhrzeigersinn gehen beide LEDs gleichzeitig an
>und nicht wie es eigentlich sein sollte versetzt. Aus gehen sie dann
>phasenverschoben. Dreht man den Drehgeber gegen den Uhrezigersinn, so
>schalten die LEDs zwar versetzt ein, gehen aber gleichzeitig aus.
>Woran könnte denn das liegen? o.O Bin echt verwirrt.

Klingt nach einem mechanischen Defekt. Oder einem falschen Anschluss. 
Ist mir auch schon mal passiert. Wenn man die gemeinsame Masse mit einem 
der Ausgänge verwechselt kommt genau das raus ;-)

von Thomas (Gast)


Lesenswert?

Falk Brunner schrieb:
> Klingt nach einem mechanischen Defekt. Oder einem falschen Anschluss.
> Ist mir auch schon mal passiert. Wenn man die gemeinsame Masse mit einem
> der Ausgänge verwechselt kommt genau das raus ;-)

Und wie recht du hast :P
Masseabgriff ist nicht in der Mitte sondern an einem seitlichen Pin. Und 
ich schreib mir da die Finger wund. Vielen vielen Danke für die rasche 
Hilfe.
Einen schönen rest Sonntag allerseits.

mfg Thomas

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.