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


von Luca B. (lucabert)


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):
1
#define HIGH  1
2
#define LOW   0
3
4
  if((lastLeftStatus == HIGH) && bit_is_clear(ENCODER_PIN, ENCODERL_PIN))
5
  {
6
    lastLeftStatus = LOW;
7
  }
8
  if((lastLeftStatus == LOW) && bit_is_set(ENCODER_PIN, ENCODERL_PIN))
9
  {
10
    nStepLeft++;
11
    lastLeftStatus = HIGH;
12
    intervalL = getUptime() - lastL;
13
    lastL = getUptime();
14
  }

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

von Lehrmann M. (ubimbo)


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

von Luca B. (lucabert)


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

von Karl H. (kbuchegg)


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
1
  uint8_t newLeftStatus = ENOCDER_PIN & ( 1 << ENCODERL_PIN );
2
3
  if( lastLeftStatus == HIGH ) {
4
    if( newLeftStatus == 0 )
5
      lastLeftStatus = LOW;
6
  }
7
8
  else {
9
    if( newLeftStatus != 0 ) {
10
      nStepLeft++;
11
      lastLeftStatus = HIGH;
12
      intervalL = getUptime() - lastL;
13
      lastL = getUptime();
14
    }
15
  }

von Luca B. (lucabert)


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

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.