Forum: Mikrocontroller und Digitale Elektronik BastlerProjekt - Drehgeberauswertung


von Dom R. (styrianwarrior)


Lesenswert?

Guten Tag!

Ich bitte euch mir zu helfen.

Ich habe ein kleines Bastelprojekt gestartet.
Nun sitze ich weinend in der Ecke...

Ich habe fast bis gar nicht mit Mikrocontroller gearbeitet.
Ich habe einen Arduino Nano zu Hause.
Dieser soll den Drehgeber ausmessen und Richtung, Geschwindigkeit pro 
Rampe und die Umdrehungen seit Richtungsänderung an meinen Rasp-Pi über 
UART übertragen.

Da ich bis jetzt nur die Sprache C mächtig. Drum wäre es ziemlich nett 
wenn ihr mir in dieser Sprache helfen könntet.

Könnte mir da bitte jemand helfen einen Code zu zeigen, der gleichzeitig 
mit Kommentaren erklärt wird, da ich mich ein wenig in diese Richtung 
arbeiten möchte.

Habe folgenden Drehgeber zu Hause:
https://cdn.usdigital.com/assets/datasheets/E4P_datasheet.pdf?k=636486202630853960

Mit dieser Auswertung sollte ich hoffentlich die Grundlagen für die 
Programmieren kennen.

Ich bedanke mich jetzt schon für eure Zeit!
Bei Fragen stehe ich gerne zur Verfügung.

Liebe Grüße,
styrianwarrior

: Verschoben durch User
von Teo D. (teoderix)


Lesenswert?


von W.S. (Gast)


Lesenswert?

Dom R. schrieb:
> Ich habe ein kleines Bastelprojekt gestartet.
> Nun sitze ich weinend in der Ecke...

Und warum?

Immerhin hast du einen optischen Encoder, der ganz offensichtlich 
sämtliche Entprellungen bereits integriert hat und der dir deshalb 
saubere Signale liefert. Jetzt brauchst du diese nur noch auszuwerten. 
Laut Dokumentation liefert der dir je nach Untertyp 100..360 Stellungen 
pro Umdrehung, wenn du nur eine Flanke eines Signales auswertest und 
400..1440 Stellungen pro Umdrehung, wenn du beide Flanken beider Signale 
auswertest.

Mein Vorschlag wäre, beide Flanken eines Signales auszuwerten und das 
andere Signal nur für die Richtungserkennung zu verwenden. Das kannst du 
getrost in einer kurzen Interrupt-Routine tun. Der Interrupt sollte so 
eingestellt sein, daß er auf beiden Flanken des Signales (z.B. "A" auf 
Seite 4) erfolgt. Dann bildest du in deiner Interrupt-Service-Routine 
das XOR aus beiden Signalen A und B. Der Interrupt als solcher zeigt an, 
daß gedreht wurde und A xor B zeigt an, in welche Richtung. ("A leads B 
for clockwise shaft rotation, B leads A for counter clockwise shaft 
rotation")

Und JA - ich meine wirklich Encoder-Behandlung per Interrupt - und NICHT 
per Polling, denn letzteres ist uneffektiv und einschränkend in der 
Geschwindigkeit.

Und Polling ist etwas, das Leute wählen, die die Realitäten nicht 
verstehen, siehe dieses Zitat aus dem o.g. Artikel:

[zitat]
Im wahren Leben gibt es immer wieder Dinge, welche der Theorie zwar 
widersprechen, dennoch weit verbreitet sind. Da machen Drehgeber keine 
Ausnahme. Gerade die heute so beliebten Drehgeber für manuelle Bedienung 
sind in großer Anzahl von verschiedenen Herstellern verfügbar.

Umso merkwürdiger ist es, dass hier die Rastpunkte oft genau auf dem 
Pegelwechsel einer Spur liegen, meist Spur B. So zum Beispiel beim 
Drehgeber EC11E15244B2 von Alps, welcher u.a bei Pollin ehältlich ist.
[/zitat]

Es ist überhaupt nicht merkwürdig, daß der Umschaltpunkt des einen 
Signales direkt im Rastpunkt liegt, denn dadurch ist der Abstand zu den 
Umschaltpunkten des anderen Signals maximiert.

Man benutzt all diese weit verbreiteten Drehgeber so, daß man das 
Signal, was sich im Rastpunkt ändert, NUR zur Richtungsbestimmung 
hernimmt - und das andere Signal, was sich zwischen den Rastpunkten 
ändert, wird analog entprellt (mit einem simplen kleinen Kondensator 
über den Kontakten und Schmitt-Trigger-Eingang am µC) und dann als 
Interrupt-Signal genommen. Und zwar wieder mit Interrupt auf beide 
(analog gesäuberte) Flanken. Der Rest wird so gerechnet wie ich das oben 
beschrieben habe: A xor B ergibt die Richtung.

Im Prinzip müßte deine Interruptfunktion etwa so aussehen:
1
extern bool DGSignalA;
2
extern bool DGSignalB;
3
4
int  Zählstand;   
5
6
void __int MeinDrehgeberInterrupt (void)
7
{ bool R;
8
  
9
  R = DGSignalA ^ DGSignalB;
10
  if (R)
11
     Zählstand++;
12
  else
13
     Zählstand--;
14
}
15
16
17
18
// und die Auswertung in main:
19
..
20
int AltZählstand;
21
 
22
..
23
  if (Zählstand!=AltZählstand)
24
  { Tu_Irgendwas_jetzt(Zählstand);
25
    AltZählstand = Zählstand;
26
  }
27
..

Soweit klaro?

W.S.

von Falk B. (falk)


Lesenswert?

@W.S. (Gast)

>Und JA - ich meine wirklich Encoder-Behandlung per Interrupt - und NICHT
>per Polling, denn letzteres ist uneffektiv und einschränkend in der
>Geschwindigkeit.

Jaja, der ewige, sinnlose Streit. Wenn deine Ideen wenigstens originell 
und revolutionär wären . . .

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Mit einem optischen (lies: prellfreien) Encoder ist die Interrupt 
Methode zuverlässig und spart auch Ressourcen. Obwohl ich sonst auch die 
Timermethode benutze, spricht bei diesem Encoder nichts gegen eine ISR.

von Torsten K. (Firma: TOKA) (avantasia)


Lesenswert?

Schau doch mal hier als Anregung rein...

http://www.elektronik-labor.de/Elo/Drehgeber.html

von Klaus (Gast)


Lesenswert?

Torsten K. schrieb:
> Schau doch mal hier als Anregung rein...
>
> http://www.elektronik-labor.de/Elo/Drehgeber.html

Das ist wieder Wasser auf die Mühle
im ewigen Streit "Polling vs Interrupt"

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


Lesenswert?

Ja, langsam wirds langweilig...

Matthias S. schrieb:
> Mit einem optischen (lies: prellfreien) Encoder
Auch ein optischer Geber kann wild zappeln, wenn er geschickt auf dem 
Strich steht. Aber richtig: "Prellen" heißt das dann nicht.

von Falk B. (falk)


Lesenswert?

@Klaus (Gast)

>> http://www.elektronik-labor.de/Elo/Drehgeber.html

>Das ist wieder Wasser auf die Mühle
>im ewigen Streit "Polling vs Interrupt"

Wie lange dauert(e) der Streit zwischen den Katholiken und den 
Protestanten?
Den Sunniten und Schiiten?
Den Linksverkehrsnationen und Rechtsverkehrsnationen?
Linksträger gegen Rechtsträger?

Scheint so, also ob der Homo Sapiens (naja) immer irgend einen 
Glaubenskrieg braucht.

von Falk B. (falk)


Lesenswert?

@ Lothar Miller (lkmiller) (Moderator) Benutzerseite

>Auch ein optischer Geber kann wild zappeln, wenn er geschickt auf dem
>Strich steht.

Da ist es nur ein kleiner Schritt (sic!) zum drauf gehen!!! ;-)

von Harald W. (wilhelms)


Lesenswert?

Klaus schrieb:

>> http://www.elektronik-labor.de/Elo/Drehgeber.html
>
> Das ist wieder Wasser auf die Mühle
> im ewigen Streit "Polling vs Interrupt"

Ja, der ewige Streit zwischen richtig und falsch. :-)

von Paul B. (paul_baumann)


Lesenswert?

Falk B. schrieb:
> Scheint so, also ob der Homo Sapiens (naja) immer irgend einen
> Glaubenskrieg braucht.

Ach, das glaube ich nicht...

MfG Paul

von Torsten K. (Firma: TOKA) (avantasia)


Lesenswert?

Klaus schrieb:
> Torsten K. schrieb:
>> Schau doch mal hier als Anregung rein...
>>
>> http://www.elektronik-labor.de/Elo/Drehgeber.html
>
> Das ist wieder Wasser auf die Mühle
> im ewigen Streit "Polling vs Interrupt"

Das war nicht als Wasser auf die Mühlen gedacht, sondern als eine 
Anregung wie sich die Frage des TO ggf. lösen lässt.

Ob er die nun als Beispiel nimmt oder es anders löst, denke ich sollte 
er selbst entscheiden... und nicht irgendwelchen "Glaubenskriegen" 
folgen. Davon gibt es auf dieser Welt leider schon genug.

Beitrag #5241297 wurde von einem Moderator gelöscht.
von m.n. (Gast)


Lesenswert?

MaWin schrie im Beitrag #5241297:
> Es gibt halt nur den Dummbatz W.S. der das bis heute nicht versteht und
> einen Feldzug mit seiner Unwissenheit führt.

Ich finde den Vorschlag von W.S. doch völlig in Ordnung.

Lothar M. schrie im Beitrag #5241115:
> Auch ein optischer Geber kann wild zappeln, wenn er geschickt auf dem
> Strich steht.

Dafür braucht es aber spezielle Zappelencoder ohne jegliche Masse. 
Normale Drehgeber haben keinen Grund zu zappeln.

von Manfred (Gast)


Lesenswert?

m.n. schrieb:
>> einen Feldzug mit seiner Unwissenheit führt.
> Ich finde den Vorschlag von W.S. doch völlig in Ordnung.

Die Standardroutinen zur Abfrage eines Drehencoders in Arduino pollen. 
Da mein Professor auch andere Dinge zu tun hat, habe ich diese für mich 
auf einen Interrupt umgebaut - funktioniert deutlich besser!

von Falk B. (falk)


Lesenswert?

@Manfred (Gast)

>Die Standardroutinen zur Abfrage eines Drehencoders in Arduino pollen.
>Da mein Professor auch andere Dinge zu tun hat, habe ich diese für mich
>auf einen Interrupt umgebaut - funktioniert deutlich besser!

Weil du nicht programmieren kannst und scheinbar noch nie einen 
Timer-Interrupt benutzt hast?

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ich weiß nicht wie man von Ressourcen sparen reden kann wenn man einen 
Interrupt verwendet. Aber egal. Entprellen spielt mit dem Code von PeDa 
auch keine Geige. Ob Interrupt oder pollen? Ich mache das davon abhängig 
wofür der Drehgeber da ist. Ist es ein manueller polle ich. Ist es einer 
der an Motoren u.ä. angeschraubt ist und damit höheren Drehzahlen 
ausgesetzt ist, verwende ich Interrupts. Es gibt kein immer richtig oder 
immer falsch. Es kommt darauf an wofür.

von Dom R. (styrianwarrior)


Lesenswert?

W.S. schrieb:

>
> Und warum?


Wie gesagt ich habe bis jetzt noch kaum mit einen Arduino gearbeitet. 
Deshalb frage ich ja nach einen aller ersten fertigen Quellcode mit 
Kommentaren, damit ich mich durch das Programm arbeiten kann und für 
zukünftige Spielereinen eine vernünftige Vorlage hat. Ob jetzt Interrupt 
oder Polling besser ist oder ob nicht doch gleich weiß ich leider noch 
nicht, da ich keine Erfahrung gemacht habe.

Würde mich sehr über einen fertigen Quellcode freuen.

Lg Dominik

von W.S. (Gast)


Lesenswert?

MaWin schrieb im Beitrag #5241297:
> Bloss hier geht es um Fakten und Wissen.

Naja, das fehlt dir halt.

Fakt ist, daß bei einem optischen Encoder der 300 Dollar-Klasse 
sämtliche Entprellungen, Hysteresen und dergleichen im Encoder 
enthalten sind und damit das Ausgangssignal schlichtweg sauber ist. 
Kapiere das endlich mal. Punkt.

Fakt ist auch, daß ein manueller Encoder (aka Drehgeber) im Ruhezustand 
eben auch nicht prellt, weil er dort eingerastet ist und das Signal, was 
den Interrupt auslöst, im Bereich des Rastpunktes eben stabil ist. Das 
solltest du endlich auch mal kapieren.

Das Einzige, was da übrig bleiben kann, ist ein Prellen beim Schließen 
des Schleifkontaktes während des manuellen Drehens oder durch Dreck in 
dem Bereich, wo der Kontakt eigentlich längst geschlossen sein soll. Dem 
muß man abhelfen durch analoge Entprellung, also das Pendant zum 
Funkenlösch-Kondensator am Kollektormotor.

Das ist alles seit Jahrzehnten bekannt. Bloß du unsachlicher Trampel, 
der du am liebsten mit persönliche Schmähungen ("Dummbatz" und so) 
anstelle von sachlichen Argumenten um dich wirfst, willst das aus 
ideologischen Gründen nicht zur Kenntnis nehmen.

Eigentlich hatte der TO eine Hilfe erwartet - aber nicht so einen 
ideologisch gefärbten Wutausbruch wie den deinigen. Ansonsten rate ich 
dir, vor dem Schreiben auch mal die verlinkten Dokumente anzuschauen, 
damit du überhaupt verstehst, worum es aktuell geht.

W.S.

von Teo D. (teoderix)


Lesenswert?

Veit D. schrieb:
> Ich mache das davon abhängig
> wofür der Drehgeber da ist.

Prellt er, mus recht aufwändig mit Hardware aufpoliert werden, für nen 
Interrupt.
Lohnt für nen popligen Bedien-Dreher nich, da reichen ~200Hz Polling und 
so viel Ressourcen kost das auch nich. Da nen PinCange Int zum 
aufwecken der Polling Routine etc., beruhigt die Nerven....

von W.S. (Gast)


Angehängte Dateien:

Lesenswert?

Dom R. schrieb:
> Wie gesagt ich habe bis jetzt noch kaum mit einen Arduino gearbeitet.
> Deshalb frage ich ja nach einen aller ersten fertigen Quellcode mit
> Kommentaren,

Hmm.. das wird für mich schwierig, weil ich ebenfalls noch nie Arduino's 
benutzt habe.

ich hänge dir trotzdem mal nen Quellcode dran. Er stammt von einem 
Projekt mit einem Freescale Kinetis MK02F... Controller. Das ist ein Arm 
Cortex und somit sind alle Hardware-Zugriffe gewiß anders als bei den 
Arduinos. Deshalb kann er für dich lediglich eine Art Zusatz-Lektüre 
sein.

Das Board hat nen IR-Empfänger (Code dafür hier NICHT enthalten), zwei 
Drucktasten und einen mauellen Drehgeber von Pollin (inzwischen 
ausverkauft). Ist also quasi "historischer" Code.

W.S.

von MaWin (Gast)


Lesenswert?

m.n. schrieb:
> Ich finde den Vorschlag von W.S. doch völlig in Ordnung.

Natürlich, du bist ja auch der Mann der LEDs ohne Vorwiderstand 
betreibt.


> Dafür braucht es aber spezielle Zappelencoder ohne jegliche Masse.
> Normale Drehgeber haben keinen Grund zu zappeln.

Dazu reicht bereits mechanisches Vibrieren einer Anlage, oder 
elektrische Einsteuung bei einer Lichtschranke knapp am Unschaltpunkt, 
oder die beliebten 35kHz Energiesparlampen als Fremdlicht auf einen 
Sensor knapp am Umschaltpunkt.

Wer glaubt, das gäbe es nie, hat halt keine Erfahrung und keine 
Phantasie.

von MaWin (Gast)


Lesenswert?

W.S. schrieb:
> Fakt ist, daß bei einem optischen Encoder der 300 Dollar-Klasse
> sämtliche Entprellungen, Hysteresen und dergleichen im_ Encoder
> enthalten sind und damit das Ausgangssignal schlichtweg _sauber ist.
> Kapiere das endlich mal. Punkt.

Das kann zwar, je nach Modell, tatsächlich mal zufälligerweise der Fall 
sein, ist aber kein Grund dann den bekannt schlechten 
Interrupt-flangengetriggerten Code zu verwenden - er ist keinen Deut 
einfacher schneller oder besser als gleich den richtigen Code der auch 
mit zappelnden billigen Encodern zurecht kommt.

Nur die Dümmsten nutzen Interrupt mit Flankentfiggerung

von Harald W. (wilhelms)


Lesenswert?

Dom R. schrieb:

> Ich habe einen Arduino Nano zu Hause.
> Dieser soll den Drehgeber ausmessen und Richtung, Geschwindigkeit pro
> Rampe und die Umdrehungen seit Richtungsänderung übertragen.
> Mit dieser Auswertung sollte ich hoffentlich die Grundlagen für die
> Programmieren kennen.

Hallo Dom,
in diesem Thread ist m.E. der Eindruck entstanden, das es zwei
gleichwertige Methoden zur Auswertung von Drehgebersignalen gibt,
die von den jeweiligen "Anwendern" vehement verteidigt werden.
Das ist aber so nicht richtig. Drehgeber gibt es schon viele Jahr-
zehnte, und von Anfang an haben zuverlässige Schaltungen immer
die Zustandsauswertung benutzt. Das wird auch Dir klar werden,
wenn Du den Link von Teoderix(erste Antwort) und diesen Link:
www.dse-faq.elektronik-kompendium.de/dse-faq.htm#F.29
liest und verstehst. Erst danach solltest Du mit der Program-
mierung beginnen. Erst später kamen "Sparschaltungen" auf, die
zwar einen etwas geringeren Aufwand haben, aber dafür unzuver-
lässiger sind, insbesondere wenn der Geber etwas älter wird.
Ich denke, nach der Durcharbeitung obiger Links werden auch Dir
diese Zusammenhänge besser klar sein.

von m.n. (Gast)


Lesenswert?

Es gibt noch mehr Beispielprogramme, die ich aber nicht finde bzw. 
aufbereiten will. In der Codesammlung befindet sich für einen Arduino 
Uno dieses: Beitrag "Drehgeber per Interrupt auswerten, AVR"

Da Du keinen mechanischen Drehgeber verwendest, kannst Du Dir das 
RC-Glied am Eingang eigentlich sparen. Die Auswertung per Interrupt ist 
ähnlich, wie sie von W.S. vorgeschlagen wurde.
Damit kannst Du schon einmal 'spielen'.

von Teo D. (teoderix)


Lesenswert?

Harald W. schrieb:
> Hallo Dom,
> in diesem Thread ist m.E. der Eindruck entstanden, das es zwei
> gleichwertige Methoden

Genau, Wolperdinger gibt's nur in Bayern!

von Harald W. (wilhelms)


Lesenswert?

Teo D. schrieb:
> Harald W. schrieb:
>> Hallo Dom,
>> in diesem Thread ist m.E. der Eindruck entstanden, das es zwei
>> gleichwertige Methoden
>
> Genau, Wolperdinger gibt's nur in Bayern!

Zum Glück, denn: "Laut Angaben im Münchner Jagd- und Fischereimuseum
ernährt er sich ausschließlich von preußischen Weichschädeln."

von m.n. (Gast)


Angehängte Dateien:

Lesenswert?

Dom R. schrieb:
> Würde mich sehr über einen fertigen Quellcode freuen.

Ich habe Dir einen anderen Code angepaßt. Schön mit loop() und setup(). 
Dabei wird PCINT18 (PD.2) als Interruptquelle verwendet. Die andere 
Phase kommt an PD.3.
Aufgebaut habe ich die Schaltung jetzt nicht noch einmal, sie sollte 
aber funktionieren.

von Teo D. (teoderix)


Lesenswert?

Harald W. schrieb:
> Zum Glück, denn: "Laut Angaben im Münchner Jagd- und Fischereimuseum
> ernährt er sich ausschließlich von preußischen Weichschädeln."

Naja, das wird den Weichschädeln nur erzählt, damit sie als Köder 
herhalten.
Als Neulinge müssen sie dann natürlich auch in den Sack schauen, ob 
schon einer drinn is.... Dann die Jungs noch schön dekorieren (bsofa 
sans eh scho) und los geht die Party. :D

von m.n. (Gast)


Lesenswert?

Lothar M. schrieb:
> Ja, langsam wirds langweilig...

Vielleicht, weil Du Dich in ungewohnter Weise zurückhälst.
Wie wäre es, wenn Du auch in diesem Beitrag mal kräftig das Zeug löschen 
würdest, was absolut nichts zur Problemlösung beiträgt?

von Teo D. (teoderix)


Lesenswert?

m.n. schrieb:
> Wie wäre es, wenn Du auch in diesem Beitrag mal kräftig das Zeug löschen
> würdest, was absolut nichts zur Problemlösung beiträgt?

Sisyphos!

Der TO hat, oder sollte zumindest, bekommen was ihm fehlte.

Für 'Int/Polling was ist Ultima Ratio' bitte einen eigenen Thread!
Komplett löschen ist für die Mods einfacher.

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.