Forum: Mikrocontroller und Digitale Elektronik Drehgeber auswertung


von fabian-82 (Gast)


Lesenswert?

ich möchte die Drehgeschwindigkeit in grad/s über einen Drehgeber 
ermitteln.der Drehgeber gibt 3600 impulse/s aus und der Motor wird denn 
auf maximal 30 U/min gedreht.
verfügbares Hardware :STK500 und atmega168.
Peter Dannegger hat hier ein code zur verfügung gestellt was natürlich 
für einen Anfänger ziemlich schwer zu verstehen was da alles gemacht 
wird :)
also für 30 U/min (0,5 U/s) sind  1800 Impulse/s .
maximal in jeder 0,5 ms muss ein Interrupt auftretten?

ich möchte nur die Impulse die über Spur A des Sensors zählen da die 
Drehrichtung ist nicht wichtig(motor dreht in einer Richtung), vondaher 
wurde die Spur B am Mikrocontroller nicht angeschlossen.

hab den Timer1  so konfiguriert:

TCCR1B = (1<<WGM12) | (1<<CS11) | (1<<CS10);
OCR1A  = (uint16_t)(XTAL / 64.0 * 1e-3 - 0.5);
TIMSK1 |= 1<<OCIE1A;
es heisst doch dass jede 1ms ein Interrupt auftritt und ISR wird denn 
bearbeitet?

was soll ich in diesem Fall in ISR schreiben wenn man nur Die Spur A 
auswerten will?

vielen Dank im voraus.

von MaWin (Gast)


Lesenswert?

> was soll ich in diesem Fall in ISR schreiben wenn man nur Die Spur A
> auswerten will?

static BOOL olda=0;
long pos=0;

 BOOL a;

 a=port.inpouta.
 if(a!=olda) pos++;
 olda=a;

von Timmo H. (masterfx)


Lesenswert?

In deinem Fall würde es doch einfach ausreichen eine Phase des 
Drehgebers (sofern er denn überhaupt zwei hat) einen Interrupt Pin 
anzuschließen. Dann zählst du zwischen einer paar Dutzend pulsen einfach 
die Zeit die vergangen ist.

von fabian-82 (Gast)


Angehängte Dateien:

Lesenswert?

ich haben Peter Dannegger`code so umgeschrieben,kann mir jemand sagen 
welche fehlern vorhanden sind.

von Karl H. (kbuchegg)


Lesenswert?

Ich versteh nicht, warum du so auf einem Drehgeber bestehst, wenn du ihn 
sowieso nicht als Drehgeber benutzen willst.

Was du vorhast, ist nichts anderes als eine Lichtschranke abfragen, die 
regelmässig durch die Motordrehung unterbrochen wird.

Oder ein Taster

oder ....

Auf jeden Fall, da dich die Richtung nicht interessiert, musst du auch 
nicht mit Drehgeber Methoden da rann, sondern einfach nur Pulse in einer 
vorgegebenen Zeit zählen.

Also: Warum kompliziert, wenss auch einfach geht?

von Karl H. (kbuchegg)


Lesenswert?

Ähm
1
ISR( TIMER1_COMPA_vect )             // 1ms for manual movement
2
{
3
  int8_t neu;
4
 
5
  neu = 0;
6
  if( PHASE_A ){
7
    neu = 1;                   
8
    enc_delta+=neu;
9
  }
10
}

was soll denn das sein?
Das war ja mal nichts.

Du willst Flanken feststellen! Veränderungen!
Dazu musst du dir den jetzigen Zustand des Pins merken um dann im 
nächsten ISR Aufruf damit vergleichen zu können, ob er sich verändert 
hat.

Damit kann man diese Frage
> kann mir jemand sagen welche fehlern vorhanden sind.
dann auch beantworten:

Der Hauptfehler ist, dass du Können mit Wollen verwechselst.
Lern Programmieren und zwar von der Pieke auf, vorher hat das alles 
keinen Sinn. In 1 bis 2 Monaten bist du soweit, dass du über diese 
Aufgabenstellung nur noch lachst.

von MaWin (Gast)


Lesenswert?

> kann mir jemand sagen welche fehlern vorhanden sind.

static int8_t last;

void encode_init( void )
{
  last = 0;
  if( PHASE_A )
    last = 1;
  enc_delta = 0;
  TCCR1B = (1<<WGM12) | (1<<CS11) | (1<<CS10);     // CTC, XTAL / 64
  OCR1A  = (uint16_t)(XTAL / 64.0 * 0.5e-3 - 0.5);   // 0,5ms 
Vergleichswert
  TIMSK1 |= 1<<OCIE1A;//Interrupts aktivieren und damit Timer starten

}

ISR( TIMER1_COMPA_vect )             // 1ms for manual movement
{
  int8_t neu;

  neu = PHASE_A;
  if( neu!=last ){
    last=neu;
    enc_delta++;
  }
}

sonst dreht er und dreht er und dreht er....

von fabian-82 (Gast)


Lesenswert?

danke MaWin für deine Hilfe aber das scheint nicht zu funktionieren.
ich gebe die variable val über UARt an einem Terminalprog aus(ohne den 
Senor an der Platine anzuschliessen).die wird nur bis 32767 
inkrementiert.
wie kannst du mir das erklären?

von MaWin (Gast)


Lesenswert?

> die wird nur bis 32767 inkrementiert.

Weil sie nur 2 byte gross ist ?

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


Lesenswert?

fabian-82 schrieb:
> der Drehgeber gibt 3600 impulse/s aus
Muß das Impulse/U heißen?
Denn sonst geht die folgende Formel nicht auf, weil dann die Einheit
Impulse*U/s² herauskäme...

> also für 30 U/min (0,5 U/s) sind  1800 Impulse/s .
> maximal in jeder 0,5 ms muss ein Interrupt auftretten?
Das ist ein theoretischer Mindestwert. In der Praxis solltest du für 
eine saubere Flankenerkennung 3-4 mal schneller abtasten als die höchste 
Impulsfrequenz (wenn du ein Tastverhältnis von 50% zugrunde legen 
kannst).
Wenn schon mit dem Timer, dann sollten hier 0,2ms bis 0,1ms stehen...

Aber ich würde den Geber einfach an einen Zähler anschliessen...

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.