www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Lese ich richtig die Werte von optischen Encoders?


Autor: Luca Bertoncello (lucabert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, Leute!

Gestern abend habe ich mein Code nochmal angeschaut, und habe ich 
entdeckt, daß ich bestimmt die Signale von Encoder nicht richtig lese, 
sondern daß ich ein Signal einer Funktion schicke, wenn der Pegel hoch 
ist und wenn der Pegel unter ist, also falsch.

Das habe ich korrigiert, und dieser ist jetzt mein Code (nur für ein 
Rad, aber für das andere ist gleich):
#define HIGH  1
#define LOW   0

  if((lastLeftStatus == HIGH) && bit_is_clear(ENCODER_PIN, ENCODERL_PIN))
  {
    lastLeftStatus = LOW;
  }
  if((lastLeftStatus == LOW) && bit_is_set(ENCODER_PIN, ENCODERL_PIN))
  {
    nStepLeft++;
    lastLeftStatus = HIGH;
    intervalL = getUptime() - lastL;
    lastL = getUptime();
  }

Dieser Code wird alle Millisekunde in der Interruptfunktion des Timers 
aufgerufen.
Ich denke, es sollte jetzt richtig sein, oder?

Nun folgendes Problem: wenn ich messe wie viele Schritte eine Umdrehung 
des Rads ist, kriege ich 100 anstatt die erwarterte 200.
Es mag auch sein, daß ich den Datenblatt des Encoders völlig falsch 
verstanden habe. Kann jemand anderen es noch angucken, und mir sagen, ob 
mein Code falsch ist, oder ob ich dringend Englischnachhilfe brauche?

Da ich nicht sicher bin, ob ich hier eine PDF-Datei hochladen darf, habe 
ich den Datenblatt auf meinem Server hochgeladen:

    http://www.lucabert.de/~lucabert/COPAL_RE10-100-200.pdf

Danke
Luca Bertoncello

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PDF-Link haste noch was verbockt:

Forbidden

You don't have permission to access /~lucabert/COPAL_RE10-100-200.pdf on 
this server.
Apache/2.2.3 (Debian) PHP/5.2.0-8+etch16 mod_ssl/2.2.3 OpenSSL/0.9.8c 
mod_watch/4.3 mod_perl/2.0.2 Perl/v5.8.8 Server at www.lucabert.de Port 
80

Autor: Luca Bertoncello (lucabert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lehrmann Michael schrieb:
> PDF-Link haste noch was verbockt:
>
> Forbidden
>
> You don't have permission to access /~lucabert/COPAL_RE10-100-200.pdf on
> this server.
> Apache/2.2.3 (Debian) PHP/5.2.0-8+etch16 mod_ssl/2.2.3 OpenSSL/0.9.8c
> mod_watch/4.3 mod_perl/2.0.2 Perl/v5.8.8 Server at www.lucabert.de Port
> 80

Weil ich blöd bin...
Ich habe jetzt die Rechte richtig gesetzt. Die Datei kann ab sofort 
gelesen werden!

Danke
Luca Bertoncello

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

Bewertung
0 lesenswert
nicht lesenswert
100 P/R

würde ich als 100 Pulses per Rotation lesen.


Ausserdem solltest du den Pinzustand nur 1 mal in der Funktion lesen. 
Theoretisch könnte sich der Pinzustand ausgerechnet genau zwischen den 
beiden Abfragen verändern. Sicher ist sicher.

Auch ist es so, dass entweder das eine if, oder das andere 
möglicherweise true ergeben können, aber nicht beide gleichzeitig. d.h. 
das 2.te if sollte eigentlich ein else if sein, denn lastLeftStatus kann 
bei einem Funktionsaufruf nur entweder High oder Low sein, aber nicht 
beides gleichzeitig. Dazu kommt, dass du genau diesen Zustand im ersten 
if umstellst und damit in die potentielle Gefahr läufst, damit die 
Triggerbedinung für den 2.ten if zu erhalten
  uint8_t newLeftStatus = ENOCDER_PIN & ( 1 << ENCODERL_PIN );

  if( lastLeftStatus == HIGH ) {
    if( newLeftStatus == 0 )
      lastLeftStatus = LOW;
  }

  else {
    if( newLeftStatus != 0 ) {
      nStepLeft++;
      lastLeftStatus = HIGH;
      intervalL = getUptime() - lastL;
      lastL = getUptime();
    }
  }

Autor: Luca Bertoncello (lucabert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> 100 P/R
>
> würde ich als 100 Pulses per Rotation lesen.

Aha, also ich lese JETZT die Signale richtig, und vorher habe ich immer 
alles FALSCH gelesen.

Wenn ich jetzt per Programm die Motoren nach 200 Schritte (was ich 
dachte, eine Umdrehung sind) anhalte, werden genau ZWEI Umdrehungen 
gemacht.
Das würde dann genau passen, wenn 100 Impulse pro Umdrehung sind.

Also, 1 Schritt des Encoders sind genau 3.6°.

Gut, ich danke dir!
Luca Bertoncello

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.