- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 12

Thema: Hall Motor auslesen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Hab noch mal nachgedacht: Ein Hardware-Interrupt reicht aus. Und 2 Sensoren.
    Wenn Flanke an Sensor1 (per Hardware-Interrupt detektiert), wird Zustand an Sensor2 gemessen: Wenn High: Drehrichtung A, wenn Low: Drehrichtung -A.
    Anzahl Impulse / Zeiteinheit ist Drehgeschwindigkeit.
    So schafft der UNO das locker. Das Programmieren ist auch nicht schwer.
    Vorausgesetzt das Signal der Sensoren sieht so aus.
    Geändert von Sisor (04.09.2017 um 22:05 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Sisor Beitrag anzeigen
    Hab noch mal nachgedacht: Ein Hardware-Interrupt reicht aus. Und 2 Sensoren.
    Wenn Flanke an Sensor1 (per Hardware-Interrupt detektiert), wird Zustand an Sensor2 gemessen: Wenn High: Drehrichtung A, wenn Low: Drehrichtung -A.
    Anzahl Impulse / Zeiteinheit ist Drehgeschwindigkeit.[/URL].
    Wenn man den Input Capture des Prozessors nutzen und dieser einen Interrupt hat, bekommt man auch die Drehzahl recht präzise gemessen. Weiß jetzt nicht, ob der UNO das hat.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    15.05.2012
    Beiträge
    19
    Moin Moin,
    ich habe mal folgende Lib probiert: RotaryEncoder.h
    Code:
    #include <RotaryEncoder.h>
    
    // Setup a RoraryEncoder for pins A2 and A3:
    RotaryEncoder encoder(A2, A3);
    
    void setup()
    {
      Serial.begin(9600);
      Serial.println("SimplePollRotator example for the RotaryEncoder library.");
    
      // You may have to modify the next 2 lines if using other pins than A2 and A3
      PCICR |= (1 << PCIE1);    // This enables Pin Change Interrupt 1 that covers the Analog input pins or Port C.
      PCMSK1 |= (1 << PCINT10) | (1 << PCINT11);  // This enables the interrupt for pin 2 and 3 of Port C.
    } // setup()
    
    
    
    // The Interrupt Service Routine for Pin Change Interrupt 1
    // This routine will only be called on any signal change on A2 and A3: exactly where we need to check.
    ISR(PCINT1_vect) {
      encoder.tick(); // just call tick() to check the state.
    }
    
    
    long position  = -999;
    void loop()
    {
      static int pos = 0;
    
      int newPos = encoder.getPosition();
      if (pos != newPos) {
    
         if(newPos < position){
         Serial.print("Vor");
      }else{
       Serial.print("Zurueck");
    }
        position = newPos;
     
        Serial.println();
        pos = newPos;
    
        if (newPos == 66)
          delay(6600);
      } // if
    } // loop ()
    
    // The End
    Damit kann ich schon mal zuverlässig Vor und Zurück erkennen. Der Uno ist also schnell genug hab es nur scheiße programmiert....

    werde es weiter versuchen

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Zitat Zitat von Sinnloserknopf Beitrag anzeigen
    Moin Moin,
    ich habe mal folgende Lib probiert: RotaryEncoder.h

    Damit kann ich schon mal zuverlässig Vor und Zurück erkennen. Der Uno ist also schnell genug hab es nur scheiße programmiert....

    werde es weiter versuchen
    Hi, in dein Code hat noch Schwächen:
    - Ein Motor kann auch stehen
    - Überflüssige Variable: Position
    - Die Zeilen 'if (newPos == 66) delay(6600);' sind sinnlos
    - Test 'if(newPos < position) ...': Die Variable newPos läuft irgendwann über. Dann ist einmal newPos kleiner als pos -> Test liefert einmalig falsche Richtung.
    Vorschlag:
    Code:
    #include <RotaryEncoder.h>
    
    // Setup a RoraryEncoder for pins A2 and A3:
    RotaryEncoder encoder(A2, A3);
    
    enum {zurueck =-1, still, vor}; // Motorrichtung
    sign(int x) { return (x>0)-(x<0); } // Vorzeichen einer Zahl : -1, 0, +1
    
    void setup() {
      Serial.begin(9600);
      Serial.println("SimplePollRotator example for the RotaryEncoder library.");
    
      // Interrupt für Encoder festlegen
      PCICR |= (1 << PCIE1);    
      PCMSK1 |= (1 << PCINT10) | (1 << PCINT11);
    }
    
    //  Interrupt Service Routine für Pin Change Interrupt 1
    ISR(PCINT1_vect) { encoder.tick(); }
    
    void loop() {
      static int pos = 0;
      int newPos = encoder.getPosition();
      int richtung = sign(newPos - pos);
    
      switch(richtung) {
       case zurueck:
         Serial.println("Zurueck!"); break;
       case still:
         Serial.println("Still!"); break;
       case vor:
         Serial.println("Vor!"); break;
      }
      Serial.println();
    
      pos = newPos;
      }
    }

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    15.05.2012
    Beiträge
    19
    chic, danke

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    15.05.2012
    Beiträge
    19
    So,
    ich bins mal wieder.


    Ich wollte mich nochmal bei Sisor bedanken.

    Er hat mich bei meinem Projekt kräftig weitergebracht.

    Hier sein Meisterwerk:

    Zum Code



    vielen Dank dafür!

Ähnliche Themen

  1. Hall Sensor Linear
    Von Dj EKI im Forum Sensoren / Sensorik
    Antworten: 2
    Letzter Beitrag: 04.03.2017, 14:00
  2. HAll - Sensor Wahl
    Von Clemens.Lang im Forum Sensoren / Sensorik
    Antworten: 5
    Letzter Beitrag: 20.02.2010, 20:22
  3. Hall-Generator, Hallsensor
    Von tobi.robotz im Forum Elektronik
    Antworten: 17
    Letzter Beitrag: 23.12.2009, 17:30
  4. Hall Sensor mit Fet Ausgang
    Von ssalbach im Forum Sensoren / Sensorik
    Antworten: 6
    Letzter Beitrag: 23.09.2009, 22:46
  5. Hall Sensor
    Von RoboLeo im Forum Sensoren / Sensorik
    Antworten: 3
    Letzter Beitrag: 19.10.2005, 19:24

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen