Forum

Einloggen | Registrieren | RSS  

bastelix(R)

21.09.2021,
00:49
 

Inkrementgeber (Rotary Encoder) besser entprellen (Schaltungstechnik)

Servus Zusammen,

ich hab mir folgenden Schaltung gesteckt um einen Rotary Encoder zu entprellen. (Grundschaltung hab ich irgendwo im Internet gefunden, leider nicht notiert wo genau.)


Das funktioniert soweit relativ gut, nur wenn ich sehr schnell drehe, dann kommt gelegentlich eine falsche Drehrichtung beim µC an.

Wenn ich die Drehrichtung und eine Timestamp rausschreibe sieht das bei sehr schnellem drehen nach links so aus:
25739: links!
25786: links!
25830: links!
26391: links!
26393: rechts!
26455: links!
26457: rechts!
26463: links!
26485: links!

Jetzt ist die Frage an welchen Bauteilen in der Schaltung ich da noch etwas anpassen kann, damit auch bei richtig schnellem Drehen keine falsche Richtung ausgelesen wird. Wenn dabei ein paar Impulse in die richtige Richtung verloren gehen oder das ganze insgesamt etwas Träger wird ist das kein Problem.
Muss ich eher mit den Widerständen experimentieren oder brauche ich größere Kondensatoren oder von allem etwas?

bigdie(R)

21.09.2021,
05:52

@ bastelix

Inkrementgeber (Rotary Encoder) besser entprellen

» Servus Zusammen,
»
» ich hab mir folgenden Schaltung gesteckt um einen Rotary Encoder zu
» entprellen. (Grundschaltung hab ich irgendwo im Internet gefunden, leider
» nicht notiert wo genau.)
»
»
» Das funktioniert soweit relativ gut, nur wenn ich sehr schnell drehe, dann
» kommt gelegentlich eine falsche Drehrichtung beim µC an.
»
» Wenn ich die Drehrichtung und eine Timestamp rausschreibe sieht das bei
» sehr schnellem drehen nach links so aus:
» 25739: links!
» 25786: links!
» 25830: links!
» 26391: links!
» 26393: rechts!
» 26455: links!
» 26457: rechts!
» 26463: links!
» 26485: links!
»
» Jetzt ist die Frage an welchen Bauteilen in der Schaltung ich da noch etwas
» anpassen kann, damit auch bei richtig schnellem Drehen keine falsche
» Richtung ausgelesen wird. Wenn dabei ein paar Impulse in die richtige
» Richtung verloren gehen oder das ganze insgesamt etwas Träger wird ist das
» kein Problem.
» Muss ich eher mit den Widerständen experimentieren oder brauche ich größere
» Kondensatoren oder von allem etwas?
Ich würde mal behaupten an so einem Teil prellt nichts, hat doch keine mech. Kontakte. Ist dann wahrscheinlich eher so, das du Laufzeitprobleme mit dem Rechner hast und evtl das Programm ändern musst. Von Früher weis ich noch, das man so etwas über Interrupts im Programm gemacht hat, wenn es schnell gehen soll, bzw. kein Impuls verloren gehen soll. Ob so etwas heute in der Arduino Programmierung geht???

Hartwig(R)

21.09.2021,
07:42
(editiert von Hartwig
am 21.09.2021 um 09:11)


@ bastelix

Inkrementgeber (Rotary Encoder) besser entprellen

Hallo,
Die Entprellung erfolgt ja über einfache RC-Glieder. Da würde ich mir mal mit dem Oszi die Signale ansehen. Wahrscheinlich ist die Zeitkonstante der RC-Glieder zu groß bemessen. Also erstmal versuchsweise die 47n Kondensatoren verkleinern (22n und schauen, was passiert)- oder natürlich die “Rs“ kleiner machen. Für die Bemessung die impulsbreiten beim schnellen Drehen ermitteln und sicherstellen, daß die on/off-Zeiten sicher zum Umladen der Cs reichen.
Ich kann jetzt aber nicht nachvollziehen, ob die Kontaktauswertung sich auf das Öffnen oder Schließen bezieht, also einfach mal die Funktion genau untersuchen.
Oder eben mit logik/Fliflops entprellen.
Grüße
Hartwig

Strippenzieher(R)

E-Mail

D-14806,
21.09.2021,
08:38
(editiert von Strippenzieher
am 21.09.2021 um 08:57)


@ bastelix

Inkrementgeber (Rotary Encoder) besser entprellen

» Grundschaltung hab ich irgendwo im Internet gefunden
das ist so 'ne Sache mit dem Netz

» Muss ich eher mit den Widerständen experimentieren oder brauche ich größere
» Kondensatoren oder von allem etwas?
Weder noch, andere Schaltung.
Ich gehe davon aus, dass dein Encoder mechanische Kontakte hat.
Die steigende Flanke (vor dem Schmitttrigger) wird abgeflacht/verzögert/entprellt. Kontakt im Encoder offen -> RC wirkt.
Während der fallenden Flanke ist (außer dem Kontaktwiderst) kein R vorhanden - da kann allerlei geschehen.
Wenn schon entprellen durch Hardware, dann würde ich es so versuchen:

R2>>R1
C berechnen nach max. Frequenz/Drehzahl

Mikee

21.09.2021,
13:08

@ bastelix

Inkrementgeber (Rotary Encoder) besser entprellen

Hallo!

die Zeitkonstante aus 100k und 47n ergibt sich zu 4,7ms (Millisekunden).
Dann ist der Kondensator auf 63% geladen. Erst nach 3 Zeitkonstanten
hast Du definitv genug Pegel für eine sichere High-Erkennung.

Bei 3 Ausgängen hast Du einen 1 aus 8 Kodierer, d.h. pro Umdrehung
8 Werte. Drehst Du sehr schnell (ca. 0,2Sek. für eine volle Umdrehung),
dann hat jeder Wert nur 25ms Zeit fürs Springen von Null auf Eins oder
andersherum. Das kommt sich schon bedenklich nahe 15ms und 25ms.
Daher meine Empfehlung die Kondensatoren mal auf 10nF reduzieren.

Geht das Drehen jetzt einwandfrei, würde ich testen ob Du Dir jetzt andere
Störimpulse einfangen kannst. Also Schaltnetzteil, Trafo, Leuchtstoffröhre
und ähnliches mal in der Nähe betreiben und ein- und ausschalten.
Dann aus beiden Grenzwerten den besten Kompromiss finden.

Mikee

bastelix(R)

21.09.2021,
23:43

@ bigdie

Inkrementgeber (Rotary Encoder) besser entprellen

» Ich würde mal behaupten an so einem Teil prellt nichts, hat doch keine
» mech. Kontakte.
Ich hab die günstigen aus der Bucht, laut Wikipedia schauen die innen so aus:


» Ob so etwas heute
» in der Arduino Programmierung geht???
Schon, alles andere wäre ja Kinderspielzeug ;-)

https://www.arduino.cc/reference/de/language/functions/external-interrupts/attachinterrupt/
https://thewanderingengineer.com/2014/08/11/arduino-pin-change-interrupts/

Ich verwende Pin-Change-Interrupts für das drehen, der Taster ist noch nicht angeklemmt. Die zwei externen Interrupts hebe ich mir für wirklich zeitkritische Anwendungsfälle auf ;-)

bastelix(R)

21.09.2021,
23:56

@ bastelix

Danke

Erstmal danke für eure Antworten.

Auf dem Oszi hatte das eigentlich gut ausgeschaut, aber da kann ich Mess/Anwendungsfehler nicht ausschließen.

Ich habe jetzt mal mit 10k statt 100k Pull-Up und 22nF sowie 10nF getestet. Dabei ist mir aufgefallen, dass ich die Fehler meistens gegen ende der Drehbewegung habe. Fast so als würde ich gegen Ende der Drehsequenz nicht nur langsamer werden und dann stoppen sondern auch einen schritt zurück zu machen bevor ich umgreife und von neuem schnell drehe.

Ich hab dann mal den Inkrementgeber in den kleinen Akkuschrauber gespannt um eine konstante Drehgeschwindigkeit zu erzielen. Jetzt nur bei 10k und 10nF getestet aber schon da zeigt sich, dass etliche der Fehler von einer echten Drehung in die falsche Richtung kommen. Ich lasse das jetzt mal so und wenn ich mir anderweitige Störungen einfange teste ich nochmal mit größerem C.

Eine Frage hab ich aber noch: Brauche ich den Schmitt-Trigger dann überhaupt, wenn die Entprellung ja eigentlich nur über das RC-Glied erfolgt?

Mikee

22.09.2021,
07:28

@ bastelix

Danke

Hallo!

» Brauche ich den Schmitt-Trigger dann überhaupt, wenn die
» Entprellung ja eigentlich nur über das RC-Glied erfolgt?

Das RC-Glied verrundet die Anstiegs- bzw. Abfall-Flanke des Signals.
Es kann sein, dass ein damit betriebenes anderes IC nicht zurecht kommt,
da es eine steile Flanke benötigt, z.B. ein über einen Kondensator gekoppelter
Toggle-Eingang. Der liefert nur dann ein Umschaltsignal, wenn die
Flanke steil genug ist. Für solch einen Fall benötigst Du noch einen
Schmitt-Trigger als Flankenformer.

Mikee

xy(R)

E-Mail

22.09.2021,
08:58

@ bigdie

Inkrementgeber (Rotary Encoder) besser entprellen

» Ich würde mal behaupten an so einem Teil prellt nichts, hat doch keine
» mech. Kontakte. Ist dann wahrscheinlich eher so, das du Laufzeitprobleme
» mit dem Rechner hast und evtl das Programm ändern musst. Von Früher weis
» ich noch, das man so etwas über Interrupts im Programm gemacht hat, wenn es
» schnell gehen soll, bzw. kein Impuls verloren gehen soll. Ob so etwas heute
» in der Arduino Programmierung geht???

http://www.dse-faq.elektronik-kompendium.de/dse-faq.htm#F.29

bastelix(R)

23.09.2021,
00:28

@ Mikee

Danke

Hallo und nochmal Danke!
Ich glaub jetzt hab ich das Verstanden :-)