Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.sci.electronics > #344400

Re: Drehgeber Signale auftrennen, IC dafür?

From stefan <adresse@ist.invalid>
Newsgroups de.sci.electronics
Subject Re: Drehgeber Signale auftrennen, IC dafür?
Date 2023-09-23 16:27 +0200
Message-ID <uemsk6$gsc0$1@solani.org> (permalink)
References (4 earlier) <slrnugqvkr.6mh.news-1513678000@a-tuin.ms.intern> <uekiib$fp74$6@solani.org> <slrnugrpon.6mh.news-1513678000@a-tuin.ms.intern> <kn6o24F139gU9@mid.individual.net> <slrnugtdkg.3o6.news-1513678000@a-tuin.ms.intern>

Show all headers | View raw


Am 23.09.2023 um 11:57 schrieb Michael Schwingen:
 > On 2023-09-22, Hans-Peter Diettrich <DrDiettrich1@aol.com> wrote:
 >> Frage: wie schnell darf ein mechanischer Encoder überhaupt drehen, bevor
 >> die Kontakte abheben? Die sind doch nur für manuelle Bedienung geeignet,
 >> wo selbst eine falsche Zählung von dem korrigiert wird, der dran dreht.
 >
 > Klar gibt es da Grenzen, und wenn das selten genug passiert, ist das OK.
 > Aber: man merkt das (bei Encodern mit mechanischer Rastung) schon recht
 > deutlich, wenn Pulse nicht gezählt werden, auch bei schnellerem Drehen.
 >
 >> Eine Maus wird ja auch so lange verschoben, bis der Zeiger an der
 >> richtigen Stelle steht - da dürfen Impulse auch mal verschütt gehen,
 >
 > Auch dort merkt man dann, daß das ruckelt.

Wenn man es richtig macht, ruckelt da nichts.

Auf jede fallende Flanke muss eine steigende Flanke folgen. Wenn es 
jetzt wie auf dem Bild in dem von dir verlinkten Artikel aussieht, 
könnte es theoretisch passieren, dass Flanken nicht erfasst werden.
Das ist richtig, und sollte berücksichtigt werden, ist aber trivial.

https://hackaday.com/2022/04/20/a-rotary-encoder-how-hard-can-it-be/

https://i0.wp.com/hackaday.com/wp-content/uploads/2022/04/real-encoder_had.jpg?w=425&h=275&ssl=1

Wenn es also eine fallende Flanke gibt, die einen INT auslöst und noch 
während dieser INT verarbeitet wird eine steigende Flanke kommt die dann 
keinen INT auslöst weil der Prozessor noch nicht bereit ist und danach 
eine weitere fallende Flanke, würde der Zähler einmal zuviel zählen. 
Wenn die Zahl der "verschluckten" Flanken geradzahlig ist, passiert das 
aber nicht.

Es kommt also drauf an, ob es vor der Flanke eine entgegengesetzte 
Flanke gab.

In dem folgenden Beispielcode reagiert der INT auf jede Flanke, also 
egal ob fallend oder steigend. Wenn eine Flanke verschluckt wurde, hat 
man also zwei gleichartige Flanken nacheinander. Das würde zu einem 
Zählfehler führen. Das passiert auch bei jeder ungeradzahligen Anzahl
von verschluckten Flanken.

Wenn man das entsprechend berücksichtigt, gibt es keine Zählfehler. 
"Falsche" INT-Aufrufe belasten natürlich den Prozessor. Ob das ein 
Problem ist hängt von den Rahmenbedingungen ab.

Das Signal kann man vor der Auswertung natürlich noch verbessern, z.B. 
mit einem RC Tiefpass und Schmitt-Trigger.

Hier mal ein Code-Beispiel wo verschluckte Flanken berücksichtig werden:

Man kann das natürlich auch per Timer machen. Da "vernichten" sich die 
falschen Flanken dann automatisch.

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

int counter;        // Zähler
bool SigA;        // alter Zustand von Eingang A
bool SigB;        // alter Zustand von Eingang B

void Interrupt_A()
// Flankengetriggerter INT, reagiert auf
// steigende und fallende Flanken an Signal A
{ InA = Encodersignal_A();    // Signal in InA speichern
   InB = Encodersignal_B();
   if (InA != SigA)
   { // nur wenn es einen Signalwechsel gab wird das Bit verarbeitet
     if (InA == InB) { counter++; }
     else counter--;
     SigA = InA;    // am Ende den Zustand des Bits speichern
   }
}

void Interupt_B()
// Flankengetriggerter INT, reagiert auf
// steigende und fallende Flanken an Signal B
{ InB = Encodersignal_B();
   InA = Encodersignal_A();
   if (InB != SigB)    // InB ist das Eingangsbit von Kanal B
   { // nur wenn es einen Signalwechsel gab wird das Bit verarbeitet
     if (InA == InB) { counter--; }
     else counter++;
     SigB = InB;    // am Ende den Zustand des Bits speichern
   }
}

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

Hier mit Timer, ist sogar noch etwas weniger Code:

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

void Timer_int()
{
   InA = Encodersignal_A();    // Bit A einlesen
   InB = Encodersignal_B();      // Bit B einlesen

   if (InA != SigA)     // wenn Flanke an Signal A
   { if (InA == InB) { counter++; }
     else counter--;
     SigA = InA;    // am Ende den Zustand des Bits speichern
   }

   if (InB != SigB)    // wenn Flanke an Signal B
   { if (InA == InB) { counter--; }
     else counter++;
     SigB = InB;    // am Ende den Zustand des Bits speichern
   }
}


Back to de.sci.electronics | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Drehgeber Signale auftrennen, IC dafür? Kay Martinen <usenet@martinen.de> - 2023-09-21 19:04 +0200
  Re: Drehgeber Signale auftrennen, IC dafür? Gerrit Heitsch <gerrit@laosinh.s.bawue.de> - 2023-09-21 19:37 +0200
    Re: Drehgeber Signale auftrennen, IC dafür? Michael Schwingen <news-1513678000@discworld.dascon.de> - 2023-09-21 18:40 +0000
      Re: Drehgeber Signale auftrennen, IC dafür? stefan <adresse@ist.invalid> - 2023-09-22 07:22 +0200
        Re: Drehgeber Signale auftrennen, IC dafür? Michael Schwingen <news-1513678000@discworld.dascon.de> - 2023-09-22 11:46 +0000
          Re: Drehgeber Signale auftrennen, IC dafür? stefan <adresse@ist.invalid> - 2023-09-22 19:23 +0200
            Re: Drehgeber Signale auftrennen, IC dafür? Michael Schwingen <news-1513678000@discworld.dascon.de> - 2023-09-22 19:12 +0000
              Re: Drehgeber Signale auftrennen, IC dafür? stefan <adresse@ist.invalid> - 2023-09-22 21:27 +0200
              Re: Drehgeber Signale auftrennen, IC dafür? Hans-Peter Diettrich <DrDiettrich1@aol.com> - 2023-09-23 01:48 +0200
                Re: Drehgeber Signale auftrennen, IC dafür? Michael Schwingen <news-1513678000@discworld.dascon.de> - 2023-09-23 09:57 +0000
                Re: Drehgeber Signale auftrennen, IC dafür? stefan <adresse@ist.invalid> - 2023-09-23 16:27 +0200
              Re: Drehgeber Signale auftrennen, IC dafür? Helmut Schellong <var@schellong.biz> - 2023-09-23 12:27 +0200
                Re: Drehgeber Signale auftrennen, IC dafür? Michael Schwingen <news-1513678000@discworld.dascon.de> - 2023-09-23 13:08 +0000
                Re: Drehgeber Signale auftrennen, IC dafür? Helmut Schellong <var@schellong.biz> - 2023-09-23 20:43 +0200
    Re: Drehgeber Signale auftrennen, IC dafür? olaf <olaf@criseis.ruhr.de> - 2023-09-23 07:00 +0200
  Re: Drehgeber Signale auftrennen, IC dafür? stefan <adresse@ist.invalid> - 2023-09-21 19:42 +0200
  Re: Drehgeber Signale auftrennen, IC dafür? Hans-Juergen Schneider <echo@hrz.tu-chemnitz.de> - 2023-09-21 20:54 +0200
  Re: Drehgeber Signale auftrennen, IC dafür? Gunther Mannigel <newsgroups@mannigel.net> - 2023-09-22 19:44 +0200
  Re: Drehgeber Signale auftrennen, IC dafür? olaf <olaf@criseis.ruhr.de> - 2023-09-23 06:55 +0200
    Re: Drehgeber Signale auftrennen, IC dafür? Winfried Bue <w-buechsenschuetz@web.de> - 2023-09-26 04:39 -0700
      Re: Drehgeber Signale auftrennen, IC dafür? Michael Wöstenfeld <michael.woestenfeld@gmail.com> - 2023-09-26 08:07 -0700
        Re: Drehgeber Signale auftrennen, IC dafür? Michael Wöstenfeld <michael.woestenfeld@gmail.com> - 2023-09-26 08:12 -0700
        Re: Drehgeber Signale auftrennen, IC dafür? Michael Schwingen <news-1513678000@discworld.dascon.de> - 2023-09-27 09:49 +0000
  Re: Drehgeber Signale auftrennen, IC dafür? Andreas Graebe <andreasgraebe@arcor.de> - 2023-09-30 15:51 +0000

csiph-web