Inkrementalgeber mit Arduino Nano

Hallo!

Ich habe ein Programm für einen Inkrementalgeber welches bereits mit einem optischen Inkrementalgeber einwandfrei funktioniert. Nun habe ich den Inkrementalgeber mit einem Mechanischen Inkrementalgeber ersetzt, welcher identsich funktioniert. Das Problem dabei ist, dass der neue Inkrementalgeber bei einem “klick” +4 dazuzählt anstatt +1.

Könnt ihr mir bitte weiterhelfen, was ich am Programm ändern muss?

Inkrementalgeber: https://at.rs-online.com/web/p/mechanische-drehgeber/7377767/

          //-------------------------   benötigte Bibliotheken hinzufügen   -------------------------

          #include <SPI.h>             // SPI für die Kommunikation des Displays
          
          #include <PinChangeInt.h>    // Bibliothek um aus allen Pins Interrupt-Pins zu machen
         
          //-------------------------   den Arduino Pins Namen zuweisen   --------------------------

          #define Signal_A 2           // Signal A vom Inkrementalgeber an Pin 2
          #define Signal_B 6           // Signal B vom Inkrementalgeber an Pin 6
          #define Taster_Ink 14        // Taster vom Inkrementalgeber an Pin 14

 

          //--------------------   Variablen mit zugehörigen Datentyp definieren   --------------------

          int zaehler;                    // Zähler als Variable für die Werte des Inkrementalgebers
          int zaehler2;                   // Zähler 2 als Variable für die Werte des Inkrementalgebers


         
          void setup()                    // wird nur einmal beim Start des Arduinos ausgeführt
          {
            
            Serial.begin(9600);           // Baudrate für den Serial Monitor einstellen

          //----------   Die Arduino Pins als Eingang oder Augang konfigurieren   -----------

            pinMode(Signal_A, INPUT);            // Signal_A als Eingang                                
           
            pinMode(Signal_B, INPUT);            // Signal_B als Eingang
            pinMode(Taster_Ink, INPUT);          // Inkrementalgeber Taster als Eingang
  
          //-------------------------   Interrupts konfigurieren   -------------------------

            attachInterrupt(digitalPinToInterrupt(Signal_A), encoder_interrupt_A, CHANGE);   
            //Interruptprogramm für das Signal A vom Inkrementalgeber
  
            attachPinChangeInterrupt(Signal_B, encoder_interrupt_B, CHANGE);                 
            //Interruptprogramm für das Signal B vom Inkrementalgeber

         
          //---------------------   interne Pull-up Widerstände einstellen   -------------------

            digitalWrite(Taster_Ink, HIGH);   //interne pull ups für low aktiv
           
          }
          
          void loop()                               // wird in einer Dauerschleife ausgeführt
          {

          }

          
            //----------------    Interruptprogramm für das Signal A vom Inkrementalgeber   --------------
            
          void encoder_interrupt_A()
          {
            
              zaehler += (digitalRead(Signal_A) != digitalRead(Signal_B))?+1:-1;  
              // Signal A mit Signal B vergleichen, um zu prüfen, in welche Richtung gedreht 
              // wird und anschließend "zaehler" um 1 inkrementieren oder dekrementieren


              Serial.print(zaehler, DEC);   // Überprüfung des Wertes im Serial Monitor
              delay(250);                   // Delay mit 250ms

          }

          //------------    Interruptprogramm für das Signal B vom Inkrementalgeber   ------------- 

          void encoder_interrupt_B()
          {
            
              zaehler += (digitalRead(Signal_A) == digitalRead(Signal_B))?+1:-1;    
              // Signal A mit Signal B vergleichen, um zu prüfen, in welche Richtung 
              // gedreht wird und anschließend "zaehler" um 1 inkrementieren oder dekrementieren

             
              Serial.print(zaehler, DEC);   // Überprüfung des Wertes im Serial Monitor
              delay(250);                   // Delay mit 250ms

          }

Hallo,

wenn es nicht am prellen liegt, dann ist die Rastung des Teils so aufgebaut das er nur aller 4 "Signale" rasten kann. Das was du als Klick bezeichnest. Teile den Zählwert durch 4, dann hast du pro Rastung +/- eins. Manche erzeugen 2 Pulse pro Rastung, deiner eben 4. Da muss man flexibel bleiben.

Danke!

Ist das im Datenblatt des Inkrementalgebers dieser Punkt: "4 = PC Pin Horizontal/Rear Facing"?

Wie muss ich das im Programm realisieren? Die Varaible Zahler einfach durch 4 rechnen oder +1 mit +0.25 ersetzen?

Hallo,

"PC Pin Horizontal/Rear Facing" - sicherlich nicht, wird selten im Datenblatt angegeben.
Du benötigst einen internen Zähler und einen externen Zähler. Der Interne zählt sturr alle Pulse korrekt. Der externe mit dem du dann weiterarbeitest ist der interne geteilt durch 4. Ergibt dann Zähler pro Rastung.

Das hier sollte dir auch weiterhelfen.
https://www.mikrocontroller.net/articles/Drehgeber