Forum: Mikrocontroller und Digitale Elektronik Effezenter Drehgeber decoder in c


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Christian K. (the_kirsch)


Angehängte Dateien:

Lesenswert?

Ich habe einen Drehgeber mit Rasterung (wie diese hier 
https://www.amazon.de/dp/B07CMSHWV6)

Bei Rasterung sind beide Ausgänge logisch '1'.

Jetzt habe ich einmal selber einen Algorithmus geschrieben der perfekt 
funktioniert (Code siehe unten) und nur einen Zählerimpuls liefert wenn 
ich auf eine Rasterposition gehe, was alle vier Schritte ist. Dies habe 
ich aber etwas umständlich über einen Switch mit 4 Cases und weiteren 
if-Abfragen gelöst.

Hier ist ein etwas elegantere Code: 
https://www.mikrocontroller.net/articles/Drehgeber

Der zwar beim Hochzählen gut funktioniert, nur beim runterzählen zählt 
er sofort wenn ich die Rasterung verlasse und nicht erst wenn ich die 
nächste Rasterung erreiche, so das er zwischen zwei Rasterstufen 
wackelt.

Ich hoffe das kann man im angehängten Video gut nachvollziehen.
Oben die beiden Inputsignale
Mitte mein Code
Unten der von dieser Seite

Bekommt man dieses Ergebnis vielleicht auch mit einfachen arithmetischen 
Operationen hin, ohne dies Klotz aus if-eleses?
1
sint8 counterDelta = 0;
2
void decode(bool a, bool b) {
3
  static uint8 last = b11;
4
  static sint8 dir = 0;
5
  uint8 current = ((a) ? b10 : b00) + ((b) ? b01 : b00);
6
7
  if(last == current) {
8
    return;
9
  }
10
11
  switch (last) {
12
  case b11:
13
    if (current == b10) {
14
      dir = 1;
15
    } else if (current == b01) {
16
      dir = -1;
17
    } else {
18
      dir = 0;
19
    }
20
    break;
21
  case b10:
22
    if(current == b11 && dir == -1) {
23
      counterDelta--;
24
      dir = 0;
25
    } else if(current != b00) {
26
      dir = 0;
27
    }
28
    break;
29
  case b00:
30
    if(current != b10 && current != b01) {
31
      dir = 0;
32
    }
33
    break;
34
  case b01:
35
    if(current == b11 && dir == 1) {
36
      counterDelta++;
37
      dir = 0;
38
    } else if(current != b00) {
39
      dir = 0;
40
    }
41
    break;
42
  }
43
  last = current;
44
}

:
von Teo D. (teoderix)


Lesenswert?

dingens einlesen; // ABER bitte nur EINMAL den Port auslesen!
PS: if(last == current) { return;}
if (current == 3) {counterDelta += 1 - last}
last = current;

: Bearbeitet durch User
von leo (Gast)


Lesenswert?

Christian K. schrieb:
> Bekommt man dieses Ergebnis vielleicht auch mit einfachen arithmetischen
> Operationen hin, ohne dies Klotz aus if-eleses?

Ich habe mit ca. sowas gute Erfahrung gemacht, ist auf jeden Fall klarer 
was passiert:

https://github.com/mathertel/RotaryEncoder

(Arduino, aber einfach zu uebersetze)

leo

von MaWin (Gast)


Lesenswert?

Christian K. schrieb:
> Jetzt habe ich einmal selber einen Algorithmus geschrieben der perfekt
> funktioniert

Na dann ist ja gut, aber warum das Rad neu erfinden, es gibt schon 
besseren code:

Am einfachsten realisiert man das mit einer state machine als Tabelle. 
In C sieht das so aus.

  int table[4][4]={{0,1,0,0},{-0,0,0,0},{0,0,0,-1},{0,0,0,0}};
  int position=0; // zaehlen wir mal die absolute Position
  volatile int quadrature_input; // bit 0 und bit 1 sind 
Quadratureingaenge
  int new_quadrature_value, last_quadrature_value=quadrature_input;
Folgenden Code ausreichend oft wiederholen (in der Programm Hauptscheife 
oder einer Zeitgeber gesteuerten Interrupt Routine):
  new_quadrature_value=quadrature_input;
  position+=table[last_quadrature_value][new_quadrature_value];
  last_quadrature_value=new_quadrature_value;

angepasst an deine Encoder aus:

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

von Falk B. (falk)


Lesenswert?

Christian K. schrieb:

> Ich habe einen Drehgeber mit Rasterung (wie diese hier
> https://www.amazon.de/dp/B07CMSHWV6)


> Jetzt habe ich einmal selber einen Algorithmus geschrieben der perfekt
> funktioniert

Wie hast du diese "Perfektion" nachgewiesen?

(Code siehe unten) und nur einen Zählerimpuls liefert wenn
> ich auf eine Rasterposition gehe, was alle vier Schritte ist. Dies habe
> ich aber etwas umständlich über einen Switch mit 4 Cases und weiteren
> if-Abfragen gelöst.
>
> Hier ist ein etwas elegantere Code:
> https://www.mikrocontroller.net/articles/Drehgeber

Der auch sehr gut funktioniert.

> Der zwar beim Hochzählen gut funktioniert, nur beim runterzählen zählt
> er sofort wenn ich die Rasterung verlasse und nicht erst wenn ich die
> nächste Rasterung erreiche, so das er zwischen zwei Rasterstufen
> wackelt.

Den muss man mit einem Trick initialisieren. Nämlich so, daß beim 
Einschalten die aktuellen Werte der Kanäle A und B eingelesen werden, 
der interne Zähler aber auf 1 oder 2 initialisiert wird.

Sprich, in der Funktion encode_init() muss rein

enc_delta = 2;

>   uint8 current = ((a) ? b10 : b00) + ((b) ? b01 : b00);

So einen Käse sollte man lassen, der ? operator ist bestenfalls was für 
Macros oder Hackertricks.
Ein normales i() ist übersichtlicher und am Ende ebenso effizienter 
Maschinencode.

>
>   if(last == current) {
>     return;
>   }

Wozu? Das Thema wurde ja nun schon seit JAHRZEHNTEN durchgekaut, ich 
glaube nicht, daß es da noch einen algorithmischen Durchbruch gibt. 
Entweder die kryptische, wenn gleich effiziente Variante von Peter D. im 
Artikel oder der Klassiker mit Tabelle.

>
>   switch (last) {
>   case b11:
>     if (current == b10) {
>       dir = 1;
>     } else if (current == b01) {
>       dir = -1;
>     } else {
>       dir = 0;
>     }

Diesen ganzen Käse hat man schon damals als solchen erkannt und in eine 
Tabelle gepackt. Diese Variante findet man auch im Artikel 
Drehgeber.

von W.S. (Gast)


Lesenswert?

Christian K. schrieb:
> Bekommt man dieses Ergebnis vielleicht auch mit einfachen arithmetischen
> Operationen hin, ohne dies Klotz aus if-eleses?

Ja - indem du die Hardware deines µC benutzt. Konkret: indem du dir den 
Kontakt deines DG heraussuchst, der am weitesten entfernt von den 
Rastungen seinen Zustand ändert, und den führst du an ein Port-Pin, das 
du so programmieren kannst, daß es auf Zustandswechsel (also sowohl 
H-->L als auch L-->H) einen Interupt auslöst.

Daß du dieses Signal mit einem Kondensator (üblich etwa 22nF) glättest 
und dabei entprellst, sollte klar sein.

Und in der ISR brauchst du dann bloß:
1
bool A, B;  // die Zustände der beiden DG-Signale
2
3
A = Zustand Port-Pin von DG-A
4
B = Zustand Port-Pin von DG-B
5
if (A ^ B) 
6
  AddEvent(idDrehRechts);
7
else
8
  AddEvent(idDrehLinks);
9
// das war's.

W.S.

von S. R. (svenska)


Lesenswert?

W.S. schrieb:
> und den führst du an ein Port-Pin, das du so programmieren kannst,
> daß es auf Zustandswechsel (also sowohl H-->L als auch L-->H)
> einen Interupt auslöst.

Besser: Du nimmst einen Timer, der alle paar Millisekunden einen 
Interrupt auslöst. In dessen ISR liest du dann die Pins ein und wenn 
sich deren Zustand ändert, reagierst du darauf.

Noch besser: Du nimmst die Quadraturdecoder-Hardware deines 
Mikrocontrollers, sofern vorhanden. Dann bist du sämtliche Probleme los.

von Teo D. (teoderix)


Lesenswert?

Teo D. schrieb:
> dingens einlesen; // ABER bitte nur EINMAL den Port auslesen!
> PS: if(last == current) { return;}
> if (current == 3) {counterDelta += 1 - last}
> last = current;

Upps, falschen Code decodiert. :))

dingens einlesen; // ABER bitte nur EINMAL den Port auslesen!
if(last == current) { return;}
if (current == 3) {
     // if (last==0) "ERROR ERROR - Please help ME!!!" <-?!
     if(last==1) counterDelta++; else counterDelta--;
     }
last = current;

von Falk B. (falk)


Lesenswert?

W.S. schrieb:
> Ja - indem du die Hardware deines µC benutzt. Konkret: indem du dir den
> Kontakt deines DG heraussuchst, der am weitesten entfernt von den
> Rastungen seinen Zustand ändert, und den führst du an ein Port-Pin, das
> du so programmieren kannst, daß es auf Zustandswechsel (also sowohl
> H-->L als auch L-->H) einen Interupt auslöst.

NICHT SCHON WIEDER DIE ALTE LEIER! DAS IST UNSINN!

von Martin (Gast)


Lesenswert?

W.S. schrieb:
> Und in der ISR brauchst du dann bloß:bool A, B;  // die Zustände der
> beiden DG-Signale
>
> A = Zustand Port-Pin von DG-A
> B = Zustand Port-Pin von DG-B
> if (A ^ B)
>   AddEvent(idDrehRechts);
> else
>   AddEvent(idDrehLinks);
> // das war's.

Das funktioniert nur nicht, da egal in welche Richtung ich drehe immer 
auf gleichen Pegel ungleicher Pegel folgt und auf ungleiche Pegel 
gleicher Pegel.

von MaWin (Gast)


Lesenswert?

W.S. schrieb:
> nd den führst du an ein Port-Pin, das du so programmieren kannst, daß es
> auf Zustandswechsel (also sowohl H-->L als auch L-->H) einen Interupt
> auslöst.

Man kann quasi drauf warten, in jedem Drehgeber thread kommt so ein 
grober Unsinnn, zumindest EINER hat in seinem Leben bis heute nicht 
begriffen, dass man unentprellte Kontakte niemals auf einen 
Interrupt-Pin gebrn darf.

Und an statt dass dieser Unwissende sein Wissen mal durch Lesen von 
http://www.dse-faq.elektronik-kompendium.de/dse-faq.htm#F.29 oder 
https://www.mikrocontroller.net/articles/Drehgeber ausgebügelt hätte, 
posaunt er es hier in grossen Worten hinaus, damit auch jeder erfährt 
welche groben Fehler er macht.

von il Conte (Gast)


Lesenswert?

Martin schrieb:
> Das funktioniert nur nicht, da egal in welche Richtung ich drehe immer
> auf gleichen Pegel ungleicher Pegel folgt und auf ungleiche Pegel
> gleicher Pegel.

Falk B. schrieb:
> W.S. schrieb:
>> Ja - indem du die Hardware deines µC benutzt. Konkret: indem du dir den
>> Kontakt deines DG heraussuchst, der am weitesten entfernt von den
>> Rastungen seinen Zustand ändert, und den führst du an ein Port-Pin, das
>> du so programmieren kannst, daß es auf Zustandswechsel (also sowohl
>> H-->L als auch L-->H) einen Interupt auslöst.
>
> NICHT SCHON WIEDER DIE ALTE LEIER! DAS IST UNSINN!

Unnsinn ? Schon mal ausprobiert?
Das geht schon, vorausgesetzt man nimmt den richtigen ENCODER.
Seht euch mal die Datenblätter von ALPS die EC11 Serie an,
mit ein bisschen Guggi Luggi findet man das raus.

Die Ausage von W.S. stimmt und ist kein Unsinn! geht aber nicht mit 
jeden ENCODER.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

il Conte schrieb:
> Die Ausage von W.S. stimmt und ist kein Unsinn! geht aber nicht mit
> jeden ENCODER.

Das Problem ist aber, dass W.S. seine Aussage als allgemeingültig 
hinstellt. Und das ist falsch. Korrekterweise hätte er den konkreten Typ 
des Drehgebers angeben müssen, wo es funktioniert. Aber solche 
Spezialfälle helfen im allgemeinen dem TO nicht weiter.

von SaschaFries (Gast)


Lesenswert?

Man braucht ja auch keinen Interrupt und keine Entprellung. Man muss nur 
öfters die Zustände abfragen als die maximale Drehgeschwindigkeit.

von il Conte (Gast)


Lesenswert?

SaschaFries schrieb:
> Man braucht ja auch keinen Interrupt und keine Entprellung. Man muss nur
> öfters die Zustände abfragen als die maximale Drehgeschwindigkeit.

Aha,  haste dein erste Arduino-Programmle ans laufen gebracht?
Genau so kommt das rüber :-(

von Yalu X. (yalu) (Moderator)


Lesenswert?

il Conte schrieb:
>> NICHT SCHON WIEDER DIE ALTE LEIER! DAS IST UNSINN!
>
> Unnsinn ? Schon mal ausprobiert?

Die Frage ist nicht, ob schon ausprobiert, sondern wie ausprobiert.
Es ist nämlich gar nicht so einfach zu prüfen, ob die Encoderauswertung
im Langzeitbetrieb nicht doch hin und wieder ein Inkrement verschluckt
oder zusätzlich generiert. Es ist jedenfalls nicht damit getan, den
Encoder ein paar mal ein paar Rasten erst nach rechts und dann wieder
nach links zu drehen und nachzuschauen, ob der Zähler dann wieder auf 0
steht.

> Das geht schon, vorausgesetzt man nimmt den richtigen ENCODER.
> Seht euch mal die Datenblätter von ALPS die EC11 Serie an,
> mit ein bisschen Guggi Luggi findet man das raus.

Was genau zeichnet die EC11-Serie diesbezüglich gegenüber anderen
Encodern aus? Er ist mechanisch, damit prellt er. Der Hersteller gibt
die Prellzeit wir folgt an:

1
At R=5kΩ Chattering: 2ms max. Bounce: 2ms max.

W.S. schreibt zwar etwas von einem 22nF-Kondensator zur Entprellung, was
aber je nach Pull-Up-Widerstand und Hysteresespannung der µC-Eingänge um
eine bis zwei Größenordnungen zu wenig ist. Macht man ihn aber deutlich
größer, wird die Auswertung entsprechend langsam, was erneut zum
Verschlucken von Inkrementen führt.

Natürlich kann man auf Hardwareseite mehr Aufwand in die Entprellung
stecken, um das Problem zuverlässig zu lösen, aber wozu? Nur um ein paar
Bytes Programmspeicher und ein paar Promille CPU-Leistung bei inaktivem
Encoder einzusparen?

Rein theoretisch könnte man sich noch eine Kombination von Interrupt und
Polling vorstellen, die einerseits immun gegenüber dem Prellen ist und
andererseits bei inaktivem Encoder keine CPU-Zeit verbraucht. Wer aber
schon Schwierigkeit damit hat, eine klassische Encoderauswertung sauber
zu implementieren, sollte mit so etwas gar nicht erst anfangen.

von Falk B. (falk)


Lesenswert?

Yalu X. schrieb:

> W.S. schreibt zwar etwas von einem 22nF-Kondensator zur Entprellung, was
> aber je nach Pull-Up-Widerstand und Hysteresespannung der µC-Eingänge um
> eine bis zwei Größenordnungen zu wenig ist.

Nicht nur das. Auch das DIREKTE anschließen von einem Kondensator, egal 
ob 1 oder 22nF an die Encoderausgänge ist ein Fehler! Denn dabei 
schließt der Schalter im Encoder periodisch einen geladenen Kondensator 
ohne Strombegrenzung kurz! Das erzeugt ordentlich Kontaktverschleiß! 
Wenn schon, dann ein gescheiter RC-Tiefpaß mit dem Pull-Up an der 
richtigen Stelle.

https://www.mikrocontroller.net/articles/Entprellung#Einfacher_Taster

Aber auch damit ist die Flankenauswertung per Interrupt NICHT solide!
Aber das haben wir schon mehrfach bis zum Erbrechen diskutiert. Klar, 
einige WOLLEN es nicht verstehen, das Dogma läßt grüßen!

https://de.wikipedia.org/wiki/Dogma

> stecken, um das Problem zuverlässig zu lösen, aber wozu? Nur um ein paar
> Bytes Programmspeicher und ein paar Promille CPU-Leistung bei inaktivem
> Encoder einzusparen?

Eben!

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


Lesenswert?

Es ist ja auch nicht so, das die Timerroutine den Timer vollständig 
belegt und er damit für andere Zwecke ausfällt.
Ich kombiniere öfter mal Drehgeber- und Tastenentprellung und nebenbei 
ist der gleiche Timer auch noch der Ticker für irgendwelche 
Zeitaufgaben.
Koste' fast gar nix.

von il Conte (Gast)


Lesenswert?

Falk B. schrieb:
> Nicht nur das. Auch das DIREKTE anschließen von einem Kondensator, egal
> ob 1 oder 22nF an die Encoderausgänge ist ein Fehler! Denn dabei
> schließt der Schalter im Encoder periodisch einen geladenen Kondensator
> ohne Strombegrenzung kurz! Das erzeugt ordentlich Kontaktverschleiß!
> Wenn schon, dann ein gescheiter RC-Tiefpaß mit dem Pull-Up an der
> richtigen Stelle.

Jetzt ziehst du aber die Dinge an den Haaren herbei :-(
Das ist eigentlich selbsredend das man den Eingängen ein 'RC-Tiefpass' 
verpasst.
Das traue ich sogar dem W.S. zu (der denkt halt schneller als er 
schreibt)

Falk B. schrieb:
> Aber auch damit ist die Flankenauswertung per Interrupt NICHT solide!
> Aber das haben wir schon mehrfach bis zum Erbrechen diskutiert. Klar,
> einige WOLLEN es nicht verstehen, das Dogma läßt grüßen!

Dann erklär mir warum  unsere verbauten ENCODER genau mit dieser Methode 
bei unseren Kunden problemlos funktionieren?
Ich hab das mal kurz überschlagen: Es kommen da ungefähr 15000000 (15 
Millionen) Inkremente pro Jahr zusammen.
Man muss sich das mal vor Augen führen und das mit dieser 
unzuverlässigen, unsolieden Flankenauswertung  :-)
Ich gebe zu, man muss halt mit Verstand an die Sache rangehen und sich 
damit auseinander setzen.

von Test (Gast)


Lesenswert?

Falk B. schrieb:
> Yalu X. schrieb:
>
>> W.S. schreibt zwar etwas von einem 22nF-Kondensator zur Entprellung, was
>> aber je nach Pull-Up-Widerstand und Hysteresespannung der µC-Eingänge um
>> eine bis zwei Größenordnungen zu wenig ist.
>
> Nicht nur das. Auch das DIREKTE anschließen von einem Kondensator, egal
> ob 1 oder 22nF an die Encoderausgänge ist ein Fehler! Denn dabei
> schließt der Schalter im Encoder periodisch einen geladenen Kondensator
> ohne Strombegrenzung kurz! Das erzeugt ordentlich Kontaktverschleiß!
> Wenn schon, dann ein gescheiter RC-Tiefpaß mit dem Pull-Up an der
> richtigen Stelle.

Oder man macht genau das mit Absicht um die Kontakte vor Oxidation zu 
schützen. (Stichwort "Frittspannung" / engl. "wetting current"). Angaben 
im Datenblatt des Herstellers sollte man natürlich beachten.

von MaWin (Gast)


Lesenswert?

il Conte schrieb:
> Dann erklär mir warum  unsere verbauten ENCODER genau mit dieser Methode
> bei unseren Kunden problemlos funktionieren?

Glauben die Hersteller und die Kunden ärgern sih.

Ich habe auch ein Autoradio das im Inrementalencoder sichtbar falsch 
zählt, einen Funktionsgenerator dessen Incremental-Auswertung offenbar 
euer Qualitätskriterium erfüllt und zickt, und höre von vielen Leuten 
sie sich wundern, warum sie den Knopf schneller drehen können als die 
angeblich so schnelle Elektronik ihm folgen kann.

Schrott ab Werk, von Entwicklern wie dir, die nicht mal die Grundlagen 
beherrschen.

von il Conte (Gast)


Lesenswert?

Yalu X. schrieb:
> Es ist jedenfalls nicht damit getan, den
> Encoder ein paar mal ein paar Rasten erst nach rechts und dann wieder
> nach links zu drehen und nachzuschauen, ob der Zähler dann wieder auf 0
> steht.

Wer redet vom Zähler ?
Im übrigen sollte das deine SW wissen wenn der Zähler wieder auf Null 
steht.
Durch links und rechts drehen ?  Auf so ne Idee muss man erst mal kommen 
:-O

von il Conte (Gast)


Lesenswert?

MaWin schrieb:
> Schrott ab Werk, von Entwicklern wie dir, die nicht mal die Grundlagen
> beherrschen.

Gegenfrage: Was beherschten du ? Bashing ?

von prellen (Gast)


Lesenswert?

>Das ist eigentlich selbsredend das man den Eingängen ein 'RC-Tiefpass'
>verpasst.

Wer einen uC für sich arbeiten läßt und die Kontakte versucht mechanisch 
zu entprellen, nur weil er der Interrupt-Flanken-Glaubensgemeinschaft 
anhängt, der macht doch was grundlegend falsch.

von SaschaFries (Gast)


Lesenswert?

>> Man braucht ja auch keinen Interrupt und keine Entprellung. Man muss nur
>> öfters die Zustände abfragen als die maximale Drehgeschwindigkeit.

>Aha,  haste dein erste Arduino-Programmle ans laufen gebracht?
>Genau so kommt das rüber :-(

Wenn man die Auswertung über Zustände macht, so wie es auch im 
Mikrocontroller-Artikel beschrieben ist, dann gibt es nur dann 
Zählfehler, wenn man zwischen 2 Auswertungen ZWEI Schritte weiterzählt. 
Das passiert aber bei Jittern an einer Flanke nicht.

Bei einer Abfrage in einer 1ms Task kannst Du also am Drehgebener mit 
1000 Zustandsänderungen pro Sekunde arbeiten, also 250Hz wenn Du nur 
einen Kanal A oder B betrachtets.

Ich habe bereits um 2005 ein Messgerät entwickelt, das einen Drehgeber 
mit 900/3600 Pulse pro Umdrehung auswertet. Ca 4 Umdrehungen pro 
Sekunde. Schneller Richtungswechsel. Es verzählt sich nie. PIC18 mit 
5MHz Systemtakt.

von Yalu X. (yalu) (Moderator)


Lesenswert?

il Conte schrieb:
> Yalu X. schrieb:
>> Es ist jedenfalls nicht damit getan, den
>> Encoder ein paar mal ein paar Rasten erst nach rechts und dann wieder
>> nach links zu drehen und nachzuschauen, ob der Zähler dann wieder auf 0
>> steht.
>
> Wer redet vom Zähler ?

Werden bei euch die Impulse etwa nicht gezählt? Was macht ihr denn dann
mit den Encodersignalen?

> Im übrigen sollte das deine SW wissen wenn der Zähler wieder auf Null
> steht.

Da verstehe ich den Zusammenhang mit dem von mir Geschriebenen nicht.

> Durch links und rechts drehen ?  Auf so ne Idee muss man erst mal kommen
> :-O

Dann erzähl doch mal, wie ihr die Encoderauswertung auf Zuverlässigkeit
prüft. Deine bisherigen Informationen vermitteln eher den Eindruck, dass
ihr sie ungetestet an den Kunden ausliefert und auf Reklamationen
wartet. Bleiben diese (aus welchen Gründen auch immer) aus, wird die
Auswertung als perfekt angesehen. Ich hoffe natürlich für dich und deine
Kunden, dass dieser Eindruck falsch ist.


Falk B. schrieb:
> https://www.mikrocontroller.net/articles/Entprellung#Einfacher_Taster
>
> Aber auch damit ist die Flankenauswertung per Interrupt NICHT solide!

Man kann das schon solide hinbekommen, wenn man einen Schmitt-Trigger
mit ausreichend großer Hysterese¹ verwendet und die Zeitkonstante des
RC-Glieds passend zu dieser und zur maximalen Prellzeit des Encoders
dimensioniert. Da viele aber der Copy/Paste-Mentalität verfallen sind
und Nachdenken verlernt (oder gar nie gelernt) haben, wird dieser
wichtige Schritt oft unterlassen.

Aber auch richtig durchgeführt ist diese Entprellmethode nicht sehr
sinnvoll, denn

prellen schrieb:
> Wer einen uC für sich arbeiten läßt und die Kontakte versucht mechanisch
> zu entprellen, nur weil er der Interrupt-Flanken-Glaubensgemeinschaft
> anhängt, der macht doch was grundlegend falsch.

(ersetze "mechanisch" durch "mechanisch oder elektrisch")

——————————————
¹) Die typischen µC-Eingänge erfüllen diese Kriterium nicht, weswegen
   i.Allg. ein externer Schmitt-Trigger benötigt wird.

von Thomas W. (diddl)


Lesenswert?

Yalu X. schrieb:
> Dann erzähl doch mal, wie ihr die Encoderauswertung auf Zuverlässigkeit
> prüft.

Was heißt Zuverlässigkeit?


Ich habe kein Problem damit, wenn er alle tausend Mal ein Inkrement 
verschlampt.
Allerdings glaube ich nicht, dass da auch nur eines verloren geht.
Hätte das Wahrscheinlich bemerkt.


Für was verwendet ihr diese Encoder denn?
Ich verwende die eigentlich nur für die Bedienung am LCD Display.
Und da merkt man schnell, wenn mal ein Impuls fehlt.
Weil man ja mit der Zeit gar nicht mehr am Display guckt, sondern 
gedanklich mit zählt.

von SaschaFries (Gast)


Lesenswert?

> Dann erzähl doch mal, wie ihr die Encoderauswertung auf Zuverlässigkeit
> prüft.
Geht ganz einfach: Es gibt 4 Zustände:
- nix
- hoch
- runter
- Fehler.

Fehler darf nie passieren. Den Fehler auszuwerten geht ganz einfach, 
indem man in die Tabelle noch nen weiteren Wert einfügt, den man dann 
auswerten kann.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Thomas W. schrieb:
> Ich habe kein Problem damit, wenn er alle tausend Mal ein Inkrement
> verschlampt.

Andere vielleicht schon. Außerdem ist damit zu rechnen, dass die
"tausend" mit der Alterung des Encoders allmählich gegen hundert oder
gar zehn tendieren. Was spricht also dagegen, ohne zusätzlichen Aufwand
dafür zu sorgen, dass auch dieses letzte Promille an verschluckten
Inkrementen der Vergangenheit angehört?

SaschaFries schrieb:
>> Dann erzähl doch mal, wie ihr die Encoderauswertung auf Zuverlässigkeit
>> prüft.
> Geht ganz einfach: Es gibt 4 Zustände:
> - nix
> - hoch
> - runter
> - Fehler.

Dieser Fehler stellt einen von mehreren möglichen Fehlern dar. Ursache
dafür ist i.Allg. ein massiver Hardwaredefekt.

Die verschluckten Inkremente auf Grund von Prellen in Verbindung mit
einer ungeeigneten Interruptauswertung fallen jedoch in eine andere
Fehlerkategorie.

von MaWin (Gast)


Lesenswert?

Yalu X. schrieb:
> Was spricht also dagegen, ohne zusätzlichen Aufwand
> dafür zu sorgen, dass auch dieses letzte Promille an verschluckten
> Inkrementen der Vergangenheit angehört?

Die natürliche Renitenz der Leute, einzusehen daß die falsch liegen.

von il Conte (Gast)


Lesenswert?

Yalu X. schrieb:
> Werden bei euch die Impulse etwa nicht gezählt?

Nein - wir tun die nur begutachten:-)

Das zählen der Impulse in der SW ist komplett zweitrangig !

Es geht hier nur darum die Impulse die der Drehgebr liefert in den 
allerwertesten uC zu bekommen und um nichts mehr.

Yalu X. schrieb:
> Dann erzähl doch mal, wie ihr die Encoderauswertung auf Zuverlässigkeit
> prüft. Deine bisherigen Informationen vermitteln eher den Eindruck, dass
> ihr sie ungetestet an den Kunden ausliefert und auf Reklamationen
> wartet. Bleiben diese (aus welchen Gründen auch immer) aus, wird die
> Auswertung als perfekt angesehen. Ich hoffe natürlich für dich und deine
> Kunden, dass dieser Eindruck falsch ist.

Es ist eigentlich noch viel schlimmer:
Ich hab mich seiner Zeit vor jeder Auslieferung so richtig in die Hosen 
gemacht :-))
Mann o Mann!

von Falk B. (falk)


Lesenswert?

il Conte schrieb:

>> Wenn schon, dann ein gescheiter RC-Tiefpaß mit dem Pull-Up an der
>> richtigen Stelle.
>
> Jetzt ziehst du aber die Dinge an den Haaren herbei :-(

Nö.

> Das ist eigentlich selbsredend das man den Eingängen ein 'RC-Tiefpass'
> verpasst.

Das siehst DU so!

> Das traue ich sogar dem W.S. zu (der denkt halt schneller als er
> schreibt)

Das ist gar nicht der Punkt, sondern unerfahrene Mitleser. Die werden 
irritiert bzw. falsch informiert.

>> Aber auch damit ist die Flankenauswertung per Interrupt NICHT solide!
>> Aber das haben wir schon mehrfach bis zum Erbrechen diskutiert. Klar,
>> einige WOLLEN es nicht verstehen, das Dogma läßt grüßen!
>
> Dann erklär mir warum  unsere verbauten ENCODER genau mit dieser Methode
> bei unseren Kunden problemlos funktionieren?

Nur weil eine Sache unter bestimmten Bedingungen funktioniert, ist sie 
noch lange nicht allgemeingültig und wasserdicht. Ich kann auch ohne 
Helm Motorrad fahren und keinerlei Unfall erleiden. Kann sein, muss 
nicht.

> Ich hab das mal kurz überschlagen: Es kommen da ungefähr 15000000 (15
> Millionen) Inkremente pro Jahr zusammen.
> Man muss sich das mal vor Augen führen und das mit dieser
> unzuverlässigen, unsolieden Flankenauswertung  :-)

Jaja, was wäre die Welt ohne hinkende Vergleiche . . .

> Ich gebe zu, man muss halt mit Verstand an die Sache rangehen und sich
> damit auseinander setzen.

In der Tat . . .

von Falk B. (falk)


Lesenswert?

Test schrieb:
> Oder man macht genau das mit Absicht um die Kontakte vor Oxidation zu
> schützen. (Stichwort "Frittspannung" / engl. "wetting current"). Angaben
> im Datenblatt des Herstellers sollte man natürlich beachten.

Du meinst so wie auf dem berühmt, berüchtigten Pollin-Board?

https://www.mikrocontroller.net/articles/Diskussion:Pollin_ATMEL_Evaluations-Board

von il Conte (Gast)


Lesenswert?

Falk B. schrieb:
> Ich kann auch ohne
> Helm Motorrad fahren und keinerlei Unfall erleiden. Kann sein, muss
> nicht.

Oder andersrum:
Ich kann auch mit aufgesetztem Helm zu Fuß durchs Dorf laufen,
Es könnte ja sein dass jemand sich aus dem Fenster lehnt und den 
Nachttopf ausleert :-)

von spess53 (Gast)


Lesenswert?

Hi

>Es könnte ja sein dass jemand sich aus dem Fenster lehnt und den
>Nachttopf ausleert :-)

Ist das bei euch noch üblich?

MfG Spess

von il Conte (Gast)


Lesenswert?

spess53 schrieb:
> Ist das bei euch noch üblich?

Ja durchaus - z.B. wenn ein Jungmann die für ihn Auserwählte verschmät 
hat.
Man muss wissen bei uns hier gibt es noch Hochzeitlader und man wird 
verheiratet. Der Hochzeitslader ist so ne Art 'Anbantel Manager', wenn 
der nichts taugt dann kann es eben  zu solchen Vorfällen kommen ;-)

Übrigens gab es sowas in Schottland wirklich (Die Zeit vor dem 
Spülklosett)
Da ging keiner ohne Regenschirm umher, die besseren Leute hatten sogar 
einen 'Vorausgeher' der die Entsorger zur Zurückhaltung ermahnt hat.
Kein Scherz - das gab es wirklich!

von Carl D. (jcw2)


Lesenswert?

il Conte schrieb:
> Falk B. schrieb:
>> Ich kann auch ohne
>> Helm Motorrad fahren und keinerlei Unfall erleiden. Kann sein, muss
>> nicht.
>
> Oder andersrum:
> Ich kann auch mit aufgesetztem Helm zu Fuß durchs Dorf laufen,
> Es könnte ja sein dass jemand sich aus dem Fenster lehnt und den
> Nachttopf ausleert :-)

Warum dann also ein Signal glätten, das gar nicht glatt sein muß?

Weil der C-Helm so cool aussieht und
man nie sicher sein kann, das die Software sich nicht verrechnet?

von W.S. (Gast)


Lesenswert?

S. R. schrieb:
> Besser: Du nimmst einen Timer, der alle paar Millisekunden einen
> Interrupt auslöst. In dessen ISR liest du dann die Pins ein und wenn
> sich deren Zustand ändert, reagierst du darauf.

Überhaupt nicht besser, sondern schlechter. Man verplempert alle paar 
Mikrosekunden Rechenzeit und ignoriert die ohnehin in der Peripherie 
vorhandene Funktionalität. Die wird dann per Software ersetzt.


> Noch besser: Du nimmst die Quadraturdecoder-Hardware deines
> Mikrocontrollers, sofern vorhanden. Dann bist du sämtliche Probleme los.

Das ist allerdings die beste Lösung - so man sie im Chip vorhanden hat 
und sofern man nicht zu arrogant oder dämlich ist, die Drehgebersignale 
rein analog zu entprellen.

W.S.

von W.S. (Gast)


Lesenswert?

Martin schrieb:
> Das funktioniert nur nicht, da egal in welche Richtung ich drehe immer
> auf gleichen Pegel ungleicher Pegel folgt und auf ungleiche Pegel
> gleicher Pegel.

Da die Signale regelmäßig um etwa 90 Grad versetzt sind, passiert genau 
DAS nicht und alles funktioniert wie gewünscht. Kannste glauben, ich 
weiß das mit 100% Gewissheit.

Mal dir einfach mal zwei um 90° versetzte Signale auf und mach dir klar, 
wie das funktioniert.

W.S.

von schade (Gast)


Lesenswert?

Schade, dass es soweit kommen mußte.

Hardware und Design von Software werden unerbitterlich im Glaubenskrieg 
verteidigt. Agumente kommen zu kurz, oder werden als Blödsinn abgetan, 
ohne widerlegt zu werden. Politik, Soziale Medien und nun auch 
Elektrotechnik.
Dachte immer, grad hier wäre Physik und Mathematik massgebend. Aber 
nein, der Glaube an selbstgeschaffene "Fakten" (die nicht mal belegt 
werden) dominiert.

Willkommen alle in der neuen lernresistenten, bornierten Welt, der 
lauten Argumente und des fehlenden Sachverstands.

Ich bedaure nur alle, die was lernen wollen und denen es dadurch schwer 
gemacht wird. Grad die Unerfahrenen wissen bald nicht mehr wem sie 
glauben sollen.

Vielleicht doch den Trumps dieser Welt? Auch wenn sie hier anders 
heißen.

von signale (Gast)


Lesenswert?

Martin schrieb:
> Das funktioniert nur nicht, da egal in welche Richtung ich drehe immer
> auf gleichen Pegel ungleicher Pegel folgt und auf ungleiche Pegel
> gleicher Pegel.

Klar: Nach Regen folgt Sonnenschein, darauf wieder Regen und dann wieder 
Sonnenschein.

Du vergisst halt völlig, dass es zwei Signale sind. Da ist ein Bezug 
zwischen den Signalen vorhanden, der dient zum Erkennen der Drehrichtung 
und zur Vierfachauswertung.

von Rotations-Symmetrischer (Gast)


Lesenswert?

schade schrieb:
> Schade, dass es soweit kommen mußte.


Das kommt doch hier immer so. Deshalb kann man sich nur noch jeden Tag 
von Neuem darüber be-ömmeln und seine eigenen Routinen verwenden. Dann 
ist man niemandem Dank schuldig und muß sich nicht mit grossfressigen 
Rechthabern auseinandersetzen.

Jahrelange Erfahrung mit diesem Forum lehrt das.

von S. R. (svenska)


Lesenswert?

Yalu X. schrieb:
> Was spricht also dagegen, ohne zusätzlichen Aufwand
> dafür zu sorgen, dass auch dieses letzte Promille an
> verschluckten Inkrementen der Vergangenheit angehört?

Die geplante Obsoleszenz.

von il Conte (Gast)


Lesenswert?

schade schrieb:
> Grad die Unerfahrenen wissen bald nicht mehr wem sie
> glauben sollen.

Du hast es richtig erfasst: Genau deshalb gibt es diese unerbitterlichen 
Glaubneskriege.
Was ich so im Geschichtsunterricht mitbekommen habe, ist das hier nicht
der erste Glaubenskrieg.
Stehst du schon im Arbeitsleben ? Da wird so einer wie du als Mobbing 
Opfer auserkohren. Mach die lieber über sowas Gedanken als hier die 
Forumswelt zu beglücken :-(

von schade (Gast)


Lesenswert?

Dummschwätzer reden und labern ohne Hintergrund und si versuchen nur zu 
provozieren.

Ich hab 30 Jahre lang Hard- und Software entworfen, Geräte gebaut und 
erfolgreich verkauft. Alles im Bereich Fernseh-, Filmstudios und ÜWagen.
Da kamen genug Drehgeber und Tasten vor. Entprellung nur über Software, 
alles andere kostet Geld, ist anfällig bei wechselnden Parametern und 
somit schlechter.

Du kannst glauben was Du willst. Erfahrung ist unbezahlbar.

von il Conte (Gast)


Lesenswert?

schade schrieb:
> Ich hab 30 Jahre lang Hard- und Software entworfen, Geräte gebaut und
> erfolgreich verkauft.

Junge red doch gleich vernünftig!
Was treibt dich dann dazu solche 'GutMensch-Gedanken' an den Mann zu 
bringen :-(

von W.S. (Gast)


Lesenswert?

Frank M. schrieb:
> Das Problem ist aber, dass W.S. seine Aussage als allgemeingültig
> hinstellt. Und das ist falsch. Korrekterweise hätte er den konkreten Typ
> des Drehgebers angeben müssen, wo es funktioniert. Aber solche
> Spezialfälle helfen im allgemeinen dem TO nicht weiter.

Das ist beileibe kein Problem, da so etwa 99.9% aller Drehgeber mit zwei 
um etwa 90° versetzten Signalen arbeiten. Manche verringern den 
Winkelabstand etwas, so daß die Rastungen so zwischen den Signalwechseln 
liegen, daß beide Kontakte offen sind. Das ist zwecks Stromersparnis, 
ändert aber am Schaltverhalten und an der prinzipiellen Auswertung gar 
nichts.

Und wer jetzt auf den verbleibenden 0.1% exotischen Drehgebern 
herumreitet, der mag dafür meinetwegen nen separaten Thread aufmachen.


Falk B. schrieb:
> Nicht nur das. Auch das DIREKTE anschließen von einem Kondensator, egal
> ob 1 oder 22nF an die Encoderausgänge ist ein Fehler! Denn dabei
> schließt der Schalter im Encoder periodisch einen geladenen Kondensator
> ohne Strombegrenzung kurz! Das erzeugt ordentlich Kontaktverschleiß!
> Wenn schon, dann ein gescheiter RC-Tiefpaß mit dem Pull-Up an der
> richtigen Stelle.

Und das ist tatsächlich der 22 nF Kondensator direkt am DG. Der 
Kontaktverschleiß, über den du hier theoretisierst, ist bei dieser 
Anwendung praktisch nicht vorhanden, denn er ist deutlich geringer als 
das Oxidieren der Kontaktstücke, die in den gewöhnlichen 99% aller 
Drehgeber verwendet werden.

Bei fast allen Relais wird ein Mindest-Kontaktstrom vorgeschrieben, um 
eine sichere Kontaktgabe zu erreichen - bloß du meinst, all so etwas 
nicht zur Kenntnis nehmen zu müssen. Hast du eigentlich JEMALS das 
durchgerechnet, was du hier postest? Ich bezweifle das.



il Conte schrieb:
> Das ist eigentlich selbsredend das man den Eingängen ein 'RC-Tiefpass'
> verpasst.
> Das traue ich sogar dem W.S. zu (der denkt halt schneller als er
> schreibt)

Nein, in exakt DIESEM Falle nicht.

Um nicht sinnlos Strom zu verbraten, wählt man oftmals den Hochzieher zu 
22k bis 47k und der Kontaktstrom, der bei 3.3V damit erzeugt wird, ist 
zu klein, um die mit den Jahren gammliger werdenden Kontakte so eines 
handbetätigten DG wieder freizubrennen. Genau dafür dient nebenher der 
Kondensator direkt am Kontakt.

Und die Entprell-Wirkung ist ebenfalls genau daran gebunden, denn wenn 
man ein RC-Glied vom Kontakt zum Portpin einfügt, dann wird der 
Spannungsanstieg am C verlangsamt und der mittlere Pegel angehoben. Das 
ist schlecht, denn dann ist die Spannung am Pin länger im Bereich des 
Umschaltpunktes (wenn der µC keine Hysterese an den Pins hat). Stell dir 
mal einen Kontakt vor, der 10 Sekunden lang mit genau 50% Duty prellt. 
Dann stellt sich am Pin exakt 1.65V konstant ein. Das ist ne 
Übertreibung zwecks Illustration, zeigt aber das Problem: Alles, was zum 
Glätten führt, ist schlecht. Gut ist hier etwas, das möglichst einseitig 
wirkt: also 100 milliOhm für den Kontakt und 22k für den Hochzieher.

Zur Erklärung:
Bei direktem C am Kontakt ist die Spannung am Pin nach Erstkontakt etwa 
null, um dann mit R*C anzusteigen, wenn der Kontakt prellt. Das Prellen 
ist aber nicht so, daß der Kontakt erstmal für 2 ms abhebt um danach den 
endgültigen Kontakt zu geben - sondern es ist so, daß es innerhalb der 
nächsten 2 ms immer mal wieder kurze Unterbrechungen und kurze 
Kontaktgaben gibt - und die werden mit einer Kombi aus 22nF*22K 
zuverlässig unterdrückt, das heißt, daß der in den Unterbrechungen 
ansteigende Pegel nicht einmal ansatzweise in die Nähe des 
Pin-Umschaltpunktes kommt.

Kurzum, diese Schaltung ist nicht nur sehr einfach und sehr billig zu 
realisieren, sie ist auch in ihren diversen subtilen Nebeneffekten genau 
auskalkuliert und tatsächlich das Beste, was man bei mechanischen DG 
machen kann.

Aber damit haben die hier laut werdenden Disputenten ganz offensichtlich 
noch viel zu wenig zu tun gehabt.

W.S.

von Falk B. (falk)


Lesenswert?

schade schrieb:
> Du kannst glauben was Du willst. Erfahrung ist unbezahlbar.

Stimmt. Aber in einer aufgeklärten, rationalen Welt zählt das 
Sachargument und der reale Beweis. Es gibt genügend Felderfahrtung die 
auf wackeligen Füßen steht, manchmal sogar auf einem Irrtum beruht.

Darum geht es hier NICHT um GLAUBEN, sondern Wissen! Wenn ich behaupte, 
daß die ein oder andere Art der Signalverarbeitung wackelig ist, muss 
ich das beweisen.

von W.S. (Gast)


Lesenswert?

Yalu X. schrieb:
> Werden bei euch die Impulse etwa nicht gezählt? Was macht ihr denn dann
> mit den Encodersignalen?

Wir reden hier nicht von Encodern, wie sie z.B. an der Hauptachse der 
Drehbank dran sind, sondern von Drehgebern für einsfuffzig, die am Radio 
zum laut oder leise stellen dran sind.

Und bei mir werden deren Signale dazu benutzt, Botschaften ins 
Event-system der Firmware zu senden. So zum Beispiel "lauter" oder 
"leiser". Und die Auswertung erfolgt dann in einem anderen Teil der 
Firmware, die gelegentlich sich sagt 'lauter als jetzt gibts nicht, ich 
begrenze den Zähler für die Lautstärke auf 99, basta'.

W.S.

von Falk B. (falk)


Lesenswert?

W.S. schrieb:
> Bei fast allen Relais wird ein Mindest-Kontaktstrom vorgeschrieben, um
> eine sichere Kontaktgabe zu erreichen

Klar, weil ja auch ein Drehgeberkontakt mit seinen spezifizierten 
10-50mA Schaltstrom absolut das Gleiche ist wie ein 16 Relais mit fetten 
Hochstromkontakten. AUA!

> - bloß du meinst, all so etwas
> nicht zur Kenntnis nehmen zu müssen. Hast du eigentlich JEMALS das
> durchgerechnet, was du hier postest? Ich bezweifle das.

Rechnen ist, wichtig, aber nicht alles. Was willst du da rechnen? Den 
Kurzschlußstrom, wenn der Kontakt schließt? Das kann in die Ampere 
gehen. Der ESR des Kondensators liegt deutlich unter 1 Ohm, der 
Schalter, naja, keine Ahnung, vermutlich auch.

von il Conte (Gast)


Lesenswert?

W.S. schrieb:
> Zur Erklärung:
> Bei direktem C am Kontakt ist die Spannung am Pin nach Erstkontakt etwa
> null, um dann mit R*C anzusteigen, wenn der Kontakt prellt. Das Prellen
> ist aber nicht so, daß der Kontakt erstmal für 2 ms abhebt um danach den
> endgültigen Kontakt zu geben - sondern es ist so, daß es innerhalb der
> nächsten 2 ms immer mal wieder kurze Unterbrechungen und kurze
> Kontaktgaben gibt - und die werden mit einer Kombi aus 22nF*22K
> zuverlässig unterdrückt, das heißt, daß der in den Unterbrechungen
> ansteigende Pegel nicht einmal ansatzweise in die Nähe des
> Pin-Umschaltpunktes kommt.


Ich staune immer wieder auf neue, dass du Dinge vortägst die richtig 
Hand und Fuss haben. (das würde ich mir auch so bei KiCad wünschen ;-)

Bei uns waren das mal  22nF * 15K.

W.S. schrieb:
> Kurzum, diese Schaltung ist nicht nur sehr einfach und sehr billig zu
> realisieren, sie ist auch in ihren diversen subtilen Nebeneffekten genau
> auskalkuliert und tatsächlich das Beste, was man bei mechanischen DG
> machen kann.

Sagte ich doch oben, 15 Millionen Inkremente/Jahr ohne  irgend welche 
Klagen.

von il Conte (Gast)


Lesenswert?

W.S. schrieb:
> Wir reden hier nicht von Encodern, wie sie z.B. an der Hauptachse der
> Drehbank dran sind, sondern von Drehgebern für einsfuffzig, die am Radio
> zum laut oder leise stellen dran sind.

Zur Richtigstellung:
Mit Encoder werden im amerikanischen Sprachgebrauch auch die Drehgeber 
(siehe Bild im Eingangsposting) so bezeichnet.

von c-hater (Gast)


Lesenswert?

W.S. schrieb:

> Überhaupt nicht besser, sondern schlechter.

Das kommt ganz klar auf die Randbedingungen an.

Wenn ich z.B. acht Encoder auslesen möchte, diese "handbetätigt" sind 
und mein µC nicht auf Batterie läuft, dann würde ich ganz eindeutig die 
Polling-Variante wählen (natürlich in einer Timer-ISR). Also das 
Dannegger-Konzept (wenn auch natürlich in meiner eigenen, C-freien 
Variante).

Warum? Ganz einfach, weil dieses Konzept in dieser Anwendung vollkommen 
zweifelsfrei all seine Vorteile voll ausspielen kann, die Nachteile aber 
wenig bis garnicht in's Gewicht fallen.

Will ich hingegen einen einzelnen Encoder auslesen, dieser ggf. sogar 
"maschinengetrieben" ist und/oder Batteriebetrieb der MCU nötig ist, 
dann würde ich natürlich meine Edge-Interrupt basierte Lösung verwenden.

Warum? Weil die eben hier all ihre Vorteile voll ausspielen kann, 
während die Nachteile wenig bis garnicht in's Gewicht fallen.

Für alle Anwendungen, die zwischen diesen beiden grob umrissenen 
Extremen liegen, muss man halt abwägen, welches Konzept jeweils besser 
geeignet ist.

------------------------------------------------------------------------

Witzig und für dich wahrscheinlich besonders interessant: eine 
Hardware-Entprellung benötigt de facto keins der beiden Konzepte, im 
besten Fall ist sie vollkommen nutzlos, ggf. (bei falscher 
Dimensionierung) stört sie sogar.

Rotary encoder sind eben keine Taster! Selbst dann nicht, wenn die 
einfachen Vertreter ihrer Art nur aus zwei mechanischen Kontakten 
bestehen. Die Logik ihres Aufbaus erspart eine Entprellung, wie sie bei 
einfachen Tastern nötig ist.

Das ist, was du nie wirklich begriffen hast. Deswegen können die 
unbelehrbaren Polling-Fetischisten (von denen allerdings viele das 
ebenfalls nicht begriffen haben, nämlich insbesondere die lautesten 
Schreihälse!) dich auch immer wieder auslachen. Weil deine 
Edge-Interruptlösung diese innere Lögik der Encoder eben nicht 
berücksichtigt und nutzbar macht.

Ich verrate dir noch den Kern des Tricks: man braucht zwei UNABHÄNGIG 
sperrbare Edge-Interrupts pro Encoder. Dann geht das. Zuverlässig und 
ohne jede Hardware-Entprellung. Und zwar selbst bei den Scheiß-Encodern, 
die in Rastlage noch auf einem Kanal zappeln.

von MaWin (Gast)


Lesenswert?

Meine Fresse, jetzt beklatschen sich 2 ewig Lernresistente, il Conte & 
W. S. für ihre Lernresistenz.

Was beide offenbar auch nicht wissen: ja, es gibt einen Mindeststrom und 
einen Maximalstrom pro Kontakt damit der seine Datenblatt Lebensdauer 
auch erreicht, auch bei einem Drehencoder, und ein Kondensator parallel 
zum Kontakt als angebliche RC Entprellung die auf die Art natürlich 
keine ist reisst natürlich beide Grenzwerte.

Selbst richtig gebaute RC Glieder.
1
 +5V
2
  |
3
 4k7 (bei 1 mA Mindeststrom)
4
  |
5
  +--47k--+--|Schmitt-Trigger Eingang
6
  |       |
7
Kontakt 100nF (bei 5ms Prellzeit)
8
  |       |
9
 GND     GND
haben Nachteile, sie begrenzen nämlich die maxinale erkennbare 
Drehgeschwindigjeit auf Werte weit unter der der richtigen 
Softwareauswertung.

von il Conte (Gast)


Lesenswert?

MaWin schrieb:
> Selbst richtig gebaute RC Glieder. +5V
>   |
>  4k7 (bei 1 mA Mindeststrom)
>   |
>   +--47k--+--|Schmitt-Trigger Eingang
>   |       |
> Kontakt 100nF (bei 5ms Prellzeit)
>   |       |
>  GND     GND
> haben Nachteile, sie begrenzen nämlich die maxinale erkennbare
> Drehgeschwindigjeit auf Werte weit unter der der richtigen
> Softwareauswertung.

Meine Fresse, soviel Unverstand  - hast du das Ganze schon mal 
auprobiert ?
Hier grosse Reden schwingen und dazu kleine Notdurft :-( klein scheissen 
darf man ja nicht schreiben)

von Yalu X. (yalu) (Moderator)


Lesenswert?

W.S. schrieb:
>> Noch besser: Du nimmst die Quadraturdecoder-Hardware deines
>> Mikrocontrollers, sofern vorhanden. Dann bist du sämtliche Probleme los.
>
> Das ist allerdings die beste Lösung - so man sie im Chip vorhanden hat

Und was meinst du, nach welchem Prinzip diese Hardware funktioniert?

1
[ ] mit flankengetriggerten Eingängen (die Schaltung wird nur bei
2
    Low-High- und High-Low-Übergängen aktiv)
3
4
[ ] mit periodischem Polling, getriggert durch ein Taktsignal (die
5
    Schaltung wird – unabhängig von den Eingangssignalen – bei jeder
6
    Taktflanke aktiv)
7
8
[ ] auf ganz andere Weise, nämlich so: ___________

> und sofern man nicht zu arrogant oder dämlich ist, die Drehgebersignale
> rein analog zu entprellen.

Genau diese analoge Entprellung ist auch bei den Hardwaredekodern nicht
erforderlich. Warum wohl?

von Michael B. (laberkopp)


Lesenswert?

Yalu X. schrieb:
> [ ] mit flankengetriggerten Eingängen (die Schaltung wird nur bei
>     Low-High- und High-Low-Übergängen aktiv)

Gibt's tatsächlich, die (älteren ? nicht alle?) Chips von 
https://www.lsicsi.com/ arbeiten so.

Allerdings ist schon deren WebSite so Scheisse, daß ich ausser dem Menü 
keine Informationen mehr bekomme und bei SiteMap irgendein XML 
Geschraffel.

von il Conte (Gast)


Lesenswert?

Yalu X. schrieb:
> Genau diese analoge Entprellung ist auch bei den Hardwaredekodern nicht
> erforderlich. Warum wohl?

Beitrag "Re: Effezenter Drehgeber decoder in c"

Wenn du da den 2. Absatz liest wird der Kondensator AUCH wegen der 
Kontakte eingesetzt. Das kann man nicht von der Hand weisen. Wir haben 
unsere Encoder genau so beschaltet und es gab absolut keinen Ärger.
Wir haben zwar nie mettalurgische Untersuchungen durchgeführt, aber das 
schreibe ich diesen 22nF zu! Der Pullup lag bei 15K.

So gesehen ist eine analoge Endprellung notwendig wird aber 
zweckentfremdet.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Michael B. schrieb:
> Yalu X. schrieb:
>> [ ] mit flankengetriggerten Eingängen (die Schaltung wird nur bei
>>     Low-High- und High-Low-Übergängen aktiv)
>
> Gibt's tatsächlich, die (älteren ? nicht alle?) Chips von
> https://www.lsicsi.com/ arbeiten so.

Interessant, kannte ich noch nicht. Deswegen habe ich mir mal die
Datenblätter angeschaut.

Bei LSI/CSI gibt es grundsätzlich drei verschiedenen Typen von
Decoderbausteinen:

1. Mit integrierter Filterung für optische und magnetische Encoder: Da
   diese Encodertypen – anders als die mechanischen – bauartbedingt
   nicht prellen und mit der Rotation einhergehende langsam ansteigende
   und abfallende Signalflanken haben, genügt als Filter ein Schmitt-
   Trigger mit ausreichend großer Hysterese.

2. Mit getakteten Filtern: Diese entsprechen der Softwareentprellung von
   Tastern.

3. Ohne Filter: Der Anwender muss (wie auch immer) dafür sorgen, dass an
   den Eingängen saubere Digitalsignale entsprechend den Timingvorgaben
   anliegen, d.h. High- und Low-Impulse müssen eine Mindestbreite haben.
   Einen Vorschlag für so ein Filter findet man in der zugehörigen AN:
   Es ist weder ein einzelner Kondensator noch ein RC-Glied, sondern
   eine aufwendige Digitalschaltung mit nicht weniger als 6 D-Flipflops,
   2 JK-Flipflops und 4 Gattern mit jeweils 3 Eingängen. Zusätzlich wird
   noch eine Taktquelle benötigt. Auch diese Schaltung entspricht im
   Wesentlichen der Softwareentprellung von Tastern und hat gegenüber
   der Filterung mit RC-Glied und Schmitt-Trigger den Vorteil, dass sie
   viel schneller ist.

Fazit: Auch die Ingenieure bei LSI/CSI haben erkannt, dass das Problem
mit dem Prellen ohne periodisches Polling nicht ganz so leicht in den
Griff zu bekommen ist.

von Yalu X. (yalu) (Moderator)


Lesenswert?

il Conte schrieb:
> Wenn du da den 2. Absatz liest wird der Kondensator AUCH wegen der
> Kontakte eingesetzt.

Normalerweise werden die Kontakte durch das Gegeneinanderreiben der
Kontaktflächen gereinigt (ähnlich wie bei selbstreinigenden Schaltern
und Tastern). Das ist ein wesentlicher Punkt, worin sich Drehgeber- von
Relaiskontakten unterscheiden.

Wenn der Hersteller dennoch einen Mindeststrom angibt, sollte man diesen
natürlich berücksichtigen. Nur sollte man dann konsequenterweise auch
dafür sorgen, dass der angegebene Maximalstrom (bei Alps bspw. 10mA)
nicht überschritten wird, indem man 1kΩ oder 2kΩ zwischen Kontakt und
Kondensator schaltet. Aber dagegen wehrt sich W.S. ja vehement.

: Bearbeitet durch Moderator
von Edson (Gast)


Lesenswert?

il Conte schrieb:
> MaWin schrieb:
>> Schrott ab Werk, von Entwicklern wie dir, die nicht mal die Grundlagen
>> beherrschen.
>
> Gegenfrage: Was beherschten du ? Bashing ?

Heult der Typ, der paar Beiträge darüber völlig unreflektiert einen 
anderen Benutzer als Arduino-User bloßstellen wollte...

LOL

von MaWin (Gast)


Lesenswert?

il Conte schrieb:
> Meine Fresse, soviel Unverstand  - hast du das Ganze schon mal
> auprobiert ?
> Hier grosse Reden schwingen und dazu kleine Notdurft :-( klein scheissen
> darf man ja nicht schreiben

Autsch, nun warst du im Eifer deones Gefechtes zu blöd, jetzt weiss 
Jeder, dass du nicht den Hauch einer Ahnung hast sondern hier nur 
rumtrollst um des Unfriedens Willen.

Verpiss dich.

von spess53 (Gast)


Lesenswert?

Hi

>Heult der Typ, der paar Beiträge darüber völlig unreflektiert einen
>anderen Benutzer als Arduino-User bloßstellen wollte...

Zu recht. Weil das Plagiat ein Arschloch mit Null Ahnung ist.

MfG Spess

Beitrag #5919169 wurde von einem Moderator gelöscht.
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

spess53 schrieb:
> Zu recht. Weil das Plagiat ein Arschloch mit Null Ahnung ist.

Ich muss Dich enttäuschen: Sämtliche in diesem Thread von MaWin 
geschriebenen Beiträge sind vom Original - kein Plagiat.

Wie schon öfter geschrieben: Wir Moderatoren können das eindeutig 
erkennen.

von spess53 (Gast)


Lesenswert?

Hi

Ach il Conte ist auch noch Gesundheitsberater. Du solltest bei dem Jop 
bleiben.

MfG Spess

von il Conte (Gast)


Lesenswert?

Frank M. schrieb:
> Wie schon öfter geschrieben: Wir Moderatoren können das eindeutig
> erkennen.

Eindeutig?
Also wenn jemand auf Arbeit (auch an wechselnden Einsatzorten)  hier 
postet
und dann zu Hause (ein un der gleiche Mann) dann könnt ihr sowas 
feststellen?? das muss mir einer erklären.

Mit den Infos die auf euerer Datenschutzerkärung ersichtlich ist , ist 
das nicht zu machen zumal ihr anscheinend Google Analitics verwendet. 
Softlastige Vereine wie Ihr nemen doch heutzutage Matomo.

von il Conte (Gast)


Lesenswert?

spess53 schrieb:
> Ach il Conte ist auch noch Gesundheitsberater. Du solltest bei dem Jop
> bleiben.

Das wäre mir 10x zu langweilig ;-)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

il Conte schrieb:
> Eindeutig?

In MaWins Fall: Ja. Denn er liefert freiwillig zusätzlich zum Namen 
noch eine weitere eindeutige Kennung, die jeder Gast hier im Forum 
angeben kann.

Von daher greift Dein Argument bzgl. Datenschutz überhaupt nicht.

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


Lesenswert?

Frank M. schrieb:
> il Conte schrieb:
>> Eindeutig?
>
> In MaWins Fall: Ja. Denn er liefert freiwillig zusätzlich zum Namen
> noch eine weitere eindeutige Kennung, die jeder Gast hier im Forum
> angeben kann.

WOW! Aber trotzdem seit Jahren die Paranoia gegenüber einer Anmeldung. 
Damit SIE ihn nicht finden können ;-)

von W.S. (Gast)


Lesenswert?

Yalu X. schrieb:
> Normalerweise werden die Kontakte durch das Gegeneinanderreiben der
> Kontaktflächen gereinigt (ähnlich wie bei selbstreinigenden Schaltern
> und Tastern).

Nö.

Hast du jemals einen billigen DG von innen gsehen? Wohl nicht. Da ist 
ein Plastik-Spritzguß-Zackenrad drin, was auf zwei Blechzungen drückt, 
die ihrerseits auf einen darunter liegenden Kontakt drücken - oder eben 
nicht.

Da gibt es keinerlei Reibung - außer der zwischen der Blechzunge und dem 
Plastikrad.

Du solltest ohne tatsächliche Kenntnisse der Dinge nicht so theoretisch 
aus deiner Vorstellung über eine mögliche Realisierungsvariante des 
Ganzen heraus argumentieren. Sowas trifft nur manchmal zu und kann in 
den übrigen Fällen nur ebenso Unbedarften imponieren.

Und nochwas zum Entprellen: in einigen µC von Kinetis ist in dem 
Pin-Anschluß bereits eine programmierbare Hardware-Entprellung 
eingebaut. Ja, sowas gibt's - wenn man sich den Chip passend zur Aufgabe 
aussucht und nicht immerzu nur auf einer speziellen Marke herumreitet 
und die Aufgabe an den Chip anpassen will.

W.S.

von Axel S. (a-za-z0-9)


Lesenswert?

W.S. schrieb:
> Hast du jemals einen billigen DG von innen gsehen? Wohl nicht. Da ist
> ein Plastik-Spritzguß-Zackenrad drin, was auf zwei Blechzungen drückt,
> die ihrerseits auf einen darunter liegenden Kontakt drücken - oder eben
> nicht.

Als Wissenschaftler wärst du ungeeignet. Nur weil du bis jetzt keine 
anderen Bauformen gesehen hast, heißt das nicht, daß es sie nicht gibt. 
Ich kenne wenigstens einen anderen Encoder, bei dem eine Kontaktfeder 
über Kontakte auf einer Platine schleift. IIRC war das das 
Panasonic-Teil, das es so lange bei Pollin gab.

Beitrag #5919776 wurde von einem Moderator gelöscht.
von Yalu X. (yalu) (Moderator)


Lesenswert?

W.S. schrieb:
> Hast du jemals einen billigen DG von innen gsehen? Wohl nicht. Da ist
> ein Plastik-Spritzguß-Zackenrad drin, was auf zwei Blechzungen drückt,
> die ihrerseits auf einen darunter liegenden Kontakt drücken - oder eben
> nicht.

Gegenfrage: Hast du schon alle Typen von Drehgebern von innen gesehen,
dass du das so verallgemeinern kannst?

von Teo D. (teoderix)


Lesenswert?

Yalu X. schrieb:
> Gegenfrage: Hast du schon alle Typen von Drehgebern von innen gesehen,
> dass du das so verallgemeinern kannst?

Zumindest wars sicherlich NICHT der billigste, den er da aufgehebelt 
hatte. :)
Meine billigst ALPS (irgend eine Restware) schleifen ihre Kontakte so 
schön sauber, das bereits nach ~1000 Touren die ersten Aussetzer 
auftreten.... Natürlich hab ich einen zerlegt und nachgesehen....

: Bearbeitet durch User
Beitrag #5919980 wurde von einem Moderator gelöscht.
Beitrag #5919991 wurde von einem Moderator gelöscht.
Beitrag #5919995 wurde von einem Moderator gelöscht.
Beitrag #5920012 wurde von einem Moderator gelöscht.
Beitrag #5920058 wurde von einem Moderator gelöscht.
Beitrag #5920059 wurde von einem Moderator gelöscht.
Beitrag #5920066 wurde von einem Moderator gelöscht.
von Yalu X. (yalu) (Moderator)


Angehängte Dateien:

Lesenswert?

Axel S. schrieb:
> Ich kenne wenigstens einen anderen Encoder, bei dem eine Kontaktfeder
> über Kontakte auf einer Platine schleift. IIRC war das das
> Panasonic-Teil, das es so lange bei Pollin gab.

Genau so ist es. Für die, die es nicht glauben, habe ich mal ein Foto
gemacht (s. Anhang).

Teo D. schrieb:
> Meine billigst ALPS (irgend eine Restware) schleifen ihre Kontakte so
> schön sauber,
> ...
> Natürlich hab ich einen zerlegt und nachgesehen....

Einen Alps habe ich zwar noch nicht von innen gesehen, aber was du
schreibst, ist plausibel:

Einige der Encodertypen von Alps gibt es wahlweise mit und ohne Rastung.
Bei der von W.S. beschriebenen "Zackenradmechanik" würde man auch bei
den nichtrastenden Varianten leichte Ungleichmäßigkeiten beim Drehen
spüren, weswegen hier vermutlich Schleifkontakte zum Einsatz kommen. Da
ihre rastenden Kollegen äußerlich genau gleich aussehen, ist davon
auszugehen, dass auch die interne Mechanik bis auf den Rastmechanismus
der gleiche ist.

> das bereits nach ~1000 Touren die ersten Aussetzer auftreten....

Die Lebensdauer der meisten Alps-Encoder ist mit 15.000 Cycles angegeben
(einige wenige halten 30.000 oder 100.000 Cycles). Wenn mit einem Cycle
ein Schaltzyklus gemeint ist, verwundert es nicht, dass sie schon nach
1000 Umdrehungen am Ende sind.

Und mit der W.S.-schen Kondensatorgeißel sind es wahrscheinlich nur 500
Umdrehungen ;-)

von Teo D. (teoderix)


Lesenswert?

Yalu X. schrieb:
> Die Lebensdauer der meisten Alps-Encoder ist mit 15.000 Cycles angegeben
> (einige wenige halten 30.000 oder 100.000 Cycles). Wenn mit einem Cycle
> ein Schaltzyklus gemeint ist, verwundert es nicht, dass sie schon nach
> 1000 Umdrehungen am Ende sind.

Ich kann zwar nicht beurteilen, wie die Verarbeitung von außen bei ALPS 
für gewöhnlich aussieht, aber ich glauben nicht, das dieses Säckchen von 
Kurbeldingern direkt aus China, auch wirklich von Alps stammt. Da sie 
bereits für ein Konsumerprodukt vorbereitet (PCB), von einem 
Restehändler für "Zahle einen, nimm 15" stammen und wirklich schlampig 
aussehen.
Da hat die Qualitätskontrolle wohl mal nicht versagt.... Kaufe einmal, 
löte dreimal. Oder wie war das? ;)

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.