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
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.
@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 . . .
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.
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"
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.
@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.
@ 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!!! ;-)
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. :-)
Falk B. schrieb: > Scheint so, also ob der Homo Sapiens (naja) immer irgend einen > Glaubenskrieg braucht. Ach, das glaube ich nicht... MfG Paul
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.
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.
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!
@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?
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.
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
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.
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....
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.
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.
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
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.
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'.
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!
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."
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.
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.