www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Drehgeber auswertung


Autor: fabian-82 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: fabian-82 (Gast)
Datum:
Angehängte Dateien:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ähm
ISR( TIMER1_COMPA_vect )             // 1ms for manual movement
{
  int8_t neu;
 
  neu = 0;
  if( PHASE_A ){
    neu = 1;                   
    enc_delta+=neu;
  }
}


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.

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: fabian-82 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> die wird nur bis 32767 inkrementiert.

Weil sie nur 2 byte gross ist ?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.