Forum: Mikrocontroller und Digitale Elektronik Drehgeber überspringt mehrere Werte


von Michael F. (michael_f268)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe ein Problem bei der Anwendung des bewährten Codes aus dem 
bewährten Codes von P. Dannegger:
Solide Lösung: Beispielcode in C
https://www.mikrocontroller.net/articles/Drehgeber.

Ich musste den Code etwas umschreiben, da ich als Compiler Codevision 
benutze und einen Atmega328 anstatt des Atmega8 und bin mir nicht 
sicher, ob ich es richtig angepasst habe. Wahrscheinlich nicht, weil ich 
das Problem habe, dass der Zähler meistens gleich 2 oder 4 Werte hoch 
und runterzählt, selten eben nur einen Wert, wie es sein sollte.

Der Drehgeber ist der Klassiker von ALPs (Stec11B09). Ich benutze den 
internen 8Mhz Takt des µC. Ich habe im Layout leider die externen 
Pullups vergessen, aber laut anderer Erfahrungsberichten benötigt man 
diese ja auch nicht unbedingt.

Hatte hier jmd. schon mal ein ähnliches Problem und kann mir eine Tipp 
geben, das Problem zu lösen?

Vielen Dank schon mal,
Michael

von Falk B. (falk)


Lesenswert?

Michael F. schrieb:

> Ich musste den Code etwas umschreiben, da ich als Compiler Codevision
> benutze

Ja und? das ist normales C, da muss man nix ändern, bestenfalls die 
cli() und sei() Funktionen.

>und einen Atmega328 anstatt des Atmega8 und bin mir nicht
> sicher, ob ich es richtig angepasst habe. Wahrscheinlich nicht, weil ich
> das Problem habe, dass der Zähler meistens gleich 2 oder 4 Werte hoch
> und runterzählt, selten eben nur einen Wert, wie es sein sollte.

Möglicherweise ist dein Drehgeber falsch angeschlossen. Wenn man einen 
der Kanäle mit GND vertauscht, ergibt das diesen Effekt.

> Der Drehgeber ist der Klassiker von ALPs (Stec11B09). Ich benutze den
> internen 8Mhz Takt des µC. Ich habe im Layout leider die externen
> Pullups vergessen, aber laut anderer Erfahrungsberichten benötigt man
> diese ja auch nicht unbedingt.

Man muss dann aber die internen einschalten. Außerdem kann man auch 
externe nachrüsten, auch wenn die im Layout fehlen!

von Michael F. (michael_f268)


Lesenswert?

Falk B. schrieb:
> Möglicherweise ist dein Drehgeber falsch angeschlossen. Wenn man einen
> der Kanäle mit GND vertauscht, ergibt das diesen Effekt.

Die Anschlüsse habe ich eben überprüft. Müsste schon so passen. Ich habe 
den mittleren Pin mit GND verbunden und die beider anderen sind am Port 
PD2 und PD3.

Falk B. schrieb:
> Man muss dann aber die internen einschalten. Außerdem kann man auch
> externe nachrüsten, auch wenn die im Layout fehlen!

Habe ich das nicht hiermir gemacht?

DDRD.3=1;
PORTD.3=1;
DDRD.2=1;
PORTD.2=1;

von Thomas F. (igel)


Lesenswert?

Michael F. schrieb:
> Habe ich das nicht hiermir gemacht?
>
> DDRD.3=1;
> PORTD.3=1;
> DDRD.2=1;
> PORTD.2=1;

Nö. Du hast die Pins D2 und D3 als Ausgänge definiert und auf High 
gesetzt.
Dein Drehgeber schliesst jetzt die Ausgänge gegen Masse kurz.

Beitrag #5668021 wurde von einem Moderator gelöscht.
von Falk B. (falk)


Lesenswert?

Michael F. schrieb:
> Falk B. schrieb:
>> Möglicherweise ist dein Drehgeber falsch angeschlossen. Wenn man einen
>> der Kanäle mit GND vertauscht, ergibt das diesen Effekt.
>
> Die Anschlüsse habe ich eben überprüft. Müsste schon so passen.

Wirklich? Wie sieht dein Datenblatt aus?

https://www.alps.com/prod/info/E/HTML/Encoder/Incremental/EC11/EC11B15202AN.html

> den mittleren Pin mit GND verbunden und die beider anderen sind am Port
> PD2 und PD3.
>
> Falk B. schrieb:
>> Man muss dann aber die internen einschalten. Außerdem kann man auch
>> externe nachrüsten, auch wenn die im Layout fehlen!
>
> Habe ich das nicht hiermir gemacht?
>
> DDRD.3=1;
> PORTD.3=1;
> DDRD.2=1;
> PORTD.2=1;

Man muss die Bits im DDR-Register aus 0 setzen, damit der IO-Pin zum 
Eingang wird! Den Pull-Up schaltet man dann mit dem Port-Bit = 1 ein, 
das ist OK. Also eher so.

DDRD.3=0;
PORTD.3=1;
DDRD.2=0;
PORTD.2=1;

von Michael F. (michael_f268)


Lesenswert?

Was mir bei den Code auch nicht klar ist, welchen Art des Encoders ich 
eigentlich nun verwende. Es gibt ja anscheinend 
single/two...step-encoders.
Was ist denn damit gemeint?

von Falk B. (falk)


Lesenswert?

Michael F. schrieb:
> Was mir bei den Code auch nicht klar ist, welchen Art des Encoders ich
> eigentlich nun verwende. Es gibt ja anscheinend
> single/two...step-encoders.
> Was ist denn damit gemeint?

Damit ist gemeint, wieviele elektrische Schritte der Encoder pro 
mechanischem Schritt (Rastung) macht.

von Michael F. (michael_f268)


Angehängte Dateien:

Lesenswert?

Falk B. schrieb:
> Damit ist gemeint, wieviele elektrische Schritte der Encoder pro
> mechanischem Schritt (Rastung) macht.

OK, dann habe ich einen "single step"-encoder, da er so beschrieben ist:
20 Impulse / 20 Rastungen

Falk B. schrieb:
> Man muss die Bits im DDR-Register aus 0 setzen, damit der IO-Pin zum
> Eingang wird! Den Pull-Up schaltet man dann mit dem Port-Bit = 1 ein,
> das ist OK. Also eher so.
>
> DDRD.3=0;
> PORTD.3=1;
> DDRD.2=0;
> PORTD.2=1;

OK, das habe ich umgesetzt, leider bleibt das Verhalten identisch.

Falk B. schrieb:
> Wirklich? Wie sieht dein Datenblatt aus?

Ich denke schon, anbei habe ich den Schaltplanteil angefügt.

von Michael W. (Gast)


Lesenswert?

Dann passt da entweder was mit den Interrupts und der Ausführungszeit 
nicht oder die Decoderausgänge werden durch eine Dämpfung zu stark 
gefiltert, um alle Flanken mitzubekommen.

von Michael F. (michael_f268)


Lesenswert?

M. W. schrieb:
> Dann passt da entweder was mit den Interrupts und der Ausführungszeit
> nicht oder die Decoderausgänge werden durch eine Dämpfung zu stark
> gefiltert, um alle Flanken mitzubekommen.

Du meinst hier bei der hier bei der Initialisierung des Timers?
Wegen der Taktfrequenz bin ich mir nicht sicher, ob der Timer hier von 
8Mhz ausgeht.
    //*********************************************************************
    // Timer/Counter 0 initialization BY THE WIZARD
    // Clock source: System Clock
    // Clock value: 250.000 kHz
    // Mode: CTC top=OCR0A
    // OC0A output: Disconnected
    // OC0B output: Disconnected
    // Timer Period: 1 ms @ 8MHz?
    TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | 
(1<<WGM01) | (0<<WGM00);
    //TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | 
(1<<WGM01) | (0<<WGM00);
    TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00);
    TCNT0=0x00;
    OCR0A=0xF9;
    OCR0B=0x00;
    // Timer/Counter 0 Interrupt(s) initialization
    TIMSK0=(0<<OCIE0B) | (1<<OCIE0A) | (0<<TOIE0);

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


Lesenswert?

Michael F. schrieb:
> kann mir eine Tipp geben, das Problem zu lösen?
Hast du mal mit einem 2-Kanal Oszi die Pegel und die zeitlichen 
Spannungsverläufe an den beiden Pins angesehen?
Oder mangels Oszilloskop mal wenigstens die Pegel mit dem Multimeter 
nachgemessen?

von Michael F. (michael_f268)


Lesenswert?

Lothar M. schrieb:
> Oder mangels Oszilloskop mal wenigstens die Pegel mit dem Multimeter
> nachgemessen?

Die Pegel passen, habs mit dem Mulitmeter nachgemessen.

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


Lesenswert?

Michael F. schrieb:
> Die Pegel passen
Dann ist noch der zeitliche Ablauf interessant. Denn nur, wenn du weißt, 
was du auswerten willst, kannst du dir Gedanken machen,  wie du das 
auswerten kannst. Aber da wäre ein Oszi tatsächlich hilfreich. Bald ist 
Weihnachten... ?

von Michael F. (michael_f268)


Lesenswert?

Lothar M. schrieb:
> Dann ist noch der zeitliche Ablauf interessant. Denn nur, wenn du weißt,
> was du auswerten willst, kannst du dir Gedanken machen,  wie du das
> auswerten kannst. Aber da wäre ein Oszi tatsächlich hilfreich. Bald ist
> Weihnachten... ?

Ich kann leider morgen erst an mein Oszi, bin nur leider akutell 
räumlich getrennt zur Zeit.

von Flohzirkus (Gast)


Lesenswert?

Lothar schulmeisterte:
> Denn nur, wenn du weißt,
> was du auswerten willst, kannst du dir Gedanken machen,  wie du das
> auswerten kannst.


https://www.youtube.com/watch?v=DetDKNSyQTI

von samstag (Gast)


Lesenswert?

Probiers doch erstmal mit dem nOOb-Algorithmus nach dem Schema
"wenn A steigt und B high, dann hochzählen, sonst runter blabla.."

Manche kennen ja nix anderes. ;-)

von Michael B. (laberkopp)


Lesenswert?

samstag schrieb:
> Probiers doch erstmal mit dem nOOb-Algorithmus nach dem Schema
> "wenn A steigt und B high, dann hochzählen, sonst runter blabla.."

Warum sollte er vorsätzlich fehlerträchtig auswerten, nur damit er sich 
über hin- und herspringende Werte nicht wundert ?

von batman (Gast)


Lesenswert?

Na um seine Konfiguration zu testen. An Pedas Algorithmus liegts 
jedenfalls nicht, das kann ich schonmal verraten.

von Gerhard (Gast)


Angehängte Dateien:

Lesenswert?

Ich denke es ist ein "Four Step Encoder"! Zwei Flanken bei PIN A und 
zwei bei Pin B zwischen den gestrichelten Linien, den Rastpunkten.

Gerhard

von Michael F. (michael_f268)


Lesenswert?

Gerhard schrieb:
> Ich denke es ist ein "Four Step Encoder"! Zwei Flanken bei PIN A und
> zwei bei Pin B zwischen den gestrichelten Linien, den Rastpunkten.

Es funktioniert! Ist ja fast wie vorgezogene Weihnachten!

Ich dachte das wäre ein single-step endocer, weil in der Beschreibung 
das hier steht: 20 Impulse / 20 Rastungen

von Dumpf Backe (Gast)


Lesenswert?

Michael F. schrieb:
> Ich dachte das wäre ein single-step endocer, weil in der Beschreibung
> das hier steht: 20 Impulse / 20 Rastungen

Wobei es ja wirklich keinen Aufwand bedeuten würde einmal
alle Möglichkeiten durchzuprobieren. So viele sind es ja
dann doch nicht.

Wäre jedenfalls schneller als hier im Forum zu fragen und
stunden-/tagelang auf eine Lösung zu warten.

von Falk B. (falk)


Lesenswert?

Und wo lag der Fehler?

von Michael (Gast)


Lesenswert?

Falk B. schrieb:
> Und wo lag der Fehler?

Am User

von Michael F. (michael_f268)


Lesenswert?

Sorry, war meine Schuld. Aber meistens liegen solche Problemen nun mal 
im Trivialen. Ich habe nur die one und two step Variante ausprobiert.

von Joachim B. (jar)


Lesenswert?

Michael F. schrieb:
> Sorry, war meine Schuld. Aber meistens liegen solche Problemen nun mal
> im Trivialen. Ich habe nur die one und two step Variante ausprobiert.

so gings mir zu Anfang auch, aber ich probierte alle Versionen bis es 
beim

Gerhard schrieb:
> "Four Step Encoder"

funktionierte :)

Dumpf Backe schrieb:
> Wobei es ja wirklich keinen Aufwand bedeuten würde einmal
> alle Möglichkeiten durchzuprobieren. So viele sind es ja
> dann doch nicht.

hihi, stimmt, ich probierte auch lieber als auf Antwort zu warten.

von Christian R. (supachris)


Lesenswert?

Michael F. schrieb:
> Gerhard schrieb:
>> Ich denke es ist ein "Four Step Encoder"! Zwei Flanken bei PIN A und
>> zwei bei Pin B zwischen den gestrichelten Linien, den Rastpunkten.
>
> Es funktioniert! Ist ja fast wie vorgezogene Weihnachten!
>
> Ich dachte das wäre ein single-step endocer, weil in der Beschreibung
> das hier steht: 20 Impulse / 20 Rastungen

Auch bei richtigen Drehgebern wird die Auflösung immer für Single 
Abtastung angegeben. Bei Quad Abtastung, also jede Zustandsänderung 
zählen ist dann immer das 4 fache.

von batman (Gast)


Lesenswert?

Christian R. schrieb:
> Auch bei richtigen Drehgebern wird die Auflösung immer für Single
> Abtastung angegeben. Bei Quad Abtastung, also jede Zustandsänderung
> zählen ist dann immer das 4 fache.

Äh wie Quad-Abtastung, das hab ich jetzt nicht verstanden. Kannst du das 
bitte mal erklären?

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.