Wie genau kann ich Arduino mit Drehgebern bekommen?

15

Schrittmotoren sind oft teuer für einen großen Motor. Mit einem leistungsstarken Standard-Gleichstrommotor und einem Drehgeber können Sie jedoch einen Schrittmotor "simulieren". Wie genau sind Drehgeber mit Arduino nur mit einer einfachen Schleife und nicht viel anderem Code? Wird es einen Puls "verfehlen" und nicht oft genug drehen? Wie kann ich mit viel mehr Code umgehen? Gibt es einen besseren Weg, dies zu tun? Würden Interrupts helfen? Gibt es eine Art von Schaltung, die bei diesem Problem helfen würde?

Hinweis: Wahrscheinlich werden es nicht mehr als 4 Umdrehungen pro Sekunde sein ... (Das mag eine Menge sein, aber wenn Sie einen Mechanismus mit Gewindespindel verwenden, wären es nur 24 Zoll pro Minute, wenn es 10 Umdrehungen pro Zoll Linearbewegung gibt. )

Anonymer Pinguin
quelle
Ich habe Drehgeber verwendet, die sich weigerten, richtig zu funktionieren, wenn sie schnell gedreht wurden. Ich denke, es variiert mit dem Preis.
Jippie

Antworten:

10

Interrupts würden Sie in dieser Situation verwenden.

Die von Ihnen erwähnten Raten sind langsam genug, sodass Sie sie wahrscheinlich innerhalb einer Schleife zählen können. Dies wird jedoch nicht empfohlen, da eine typische Schleife viele Taktzyklen in Anspruch nimmt und von der Anzahl der Instuktionen pro Schleife abhängt Sie können einige Zählungen verpassen.

Zu diesem Zweck werden Interrupts erstellt, die unabhängig vom Zustand der Schleife jederzeit ausgelöst werden können.

Es gibt eine Funktion mit dem Namen attachInterrupt(), die drei Argumente akzeptiert.

  1. Pin unterbrechen
  2. Serviceroutine unterbrechen
  3. Modus

Unten sehen Sie ein Beispiel für das Zählen eines Interrupts

volatile int myCounter = 0;

void setup(){
    attachInterrupt(0, count, RISING);
}

void count(){
    myCounter++;
}

Die Modi sind wie folgt:

LOW, CHANGE, RISING, FALLING

Weitere Informationen zur Verwendung von Interrupts finden Sie hier .

Abhängig vom verwendeten Encoder müssen Sie den Code an Ihre Bedürfnisse anpassen und weitere Berechnungen durchführen, um Ihre Position zu bestimmen. Dies sollte jedoch ein guter Ausgangspunkt sein.

Bearbeiten Hier ist ein Beispielcode von Arduino Sandbox für die Verwendung eines Drehgebers.

Matt Clark
quelle
1
Ein Interrupt-gesteuerter Flankendetektor bei einem Duemilanove verarbeitet problemlos 100 Flanken pro Sekunde (6500 U / min bei einem Motor).
Wayfaring Stranger
@WayfaringStranger Dann gibt es also kein Problem mit einem Uno. Vielen Dank!
Anonymous Penguin
1
@AnnonomusPerson - Wie viel Arbeit sind Sie bereit zu investieren? Wenn Sie nackt gehen ( ISR_NAKED()), können Sie das automatische Speichern des C-Kontexts überspringen und Interrupt-Raten von 100-500 kHz ohne Probleme erzielen, aber Sie schreiben Assembler an diesem Punkt im Grunde genommen in C.
Connor Wolf
1
Wenn Sie ein vollständig bananes Dokument zur Optimierung der Interrupt-Reaktion benötigen, klicken Sie hier . Platzieren Sie den Code direkt in der Interrupt-Tabelle, um die Interrupt-Latenzzeit weiter zu reduzieren!
Connor Wolf
1
Beachten Sie auch, dass die Funktion arduino attachInterrupt bei Interrupts mit niedriger Latenz einen zusätzlichen Funktionsaufruf-Overhead verursacht, als wenn der Interrupt ISR()direkt verwendet wird.
Connor Wolf
3

Hinzufügen einiger Verweise auf bereits geschriebene Bibliotheken und Beispiele, um einen Vergleich zwischen verschiedenen Ansätzen und Erfahrungen mit Geschwindigkeit und Anfälligkeit für fehlende Schritte zu ermöglichen.

Drehgeber lesen: http://playground.arduino.cc/Main/RotaryEncoders

Quadratur-Encoder zu schnell für Arduino (mit Lösung): http://www.hessmer.org/blog/2011/01/30/quadrature-encoder-too-fast-for-arduino/

Teensy Encoder-Bibliothek: https://www.pjrc.com/teensy/td_libs_Encoder.html

Drehgeber auf Arduino lesen: http://www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino/

Wideman
quelle