Frage:
Wie kann man einen Quadraturcodierer mit PIC verbinden?
Bergamin
2012-05-10 03:08:36 UTC
view on stackexchange narkive permalink

Ich entwickle einen Prototyp, der einen Quadraturcodierer verwendet, um seine lineare Verschiebung zu messen. Der Encoder ist am Prototypgehäuse befestigt und hat ein Rad in der Welle. Wenn sich der Prototyp geradeaus bewegt, misst der Encoder den linearen Abstand. Alle Probleme bei der Umrechnung zwischen Linear- / Winkeleinheiten wurden behoben.

Der Grund für die Messung der Entfernung mit einem Encoder ist, dass ich jedes Mal wissen muss, dass der Prototyp genau 1 mm (1 Millimeter) zurückgelegt hat = 0,0393 Zoll). Jedes Mal, wenn sich der PIC um 1 mm bewegt, aktiviert er ein anderes System.

Bevor ich mit der Arbeit begonnen habe, habe ich den Encoder mit einem PIC (16F688) in den E / A-Ports gelesen. Es war ein bisschen in Ordnung, aber als ich dem PIC-Code einige Funktionen hinzufügte, fehlt dem PIC die Encoderanzahl, wenn die lineare Geschwindigkeit des Prototyps größer als ~ 45 mm / s ist.

I. Ich habe versucht, das IOC (Interrupt bei Änderung) von PortA zum Lesen des Quadratursignals (Kanäle A und B) zu verwenden, aber es war nicht effektiv.

Ich weiß, dass es dsPICs gibt, aber ich muss dies lösen in meinem Board und ich habe nur 14 Pins, um dies zu tun lol. Also habe ich diesen PIC16F1825 gefunden, der eine höhere (4x) Frequenz hat. Könnte das (meine niedrige PIC-Frequenz) mein Hauptproblem sein?

Ich habe darüber nachgedacht, die UPa> / UP-Signale LFLS7183 mit dem Timer / Zähler von PIC oder einem anderen zu verwenden Zähler-IC, so dass die Menge der Signalisierung an PIC reduziert würde. Funktioniert das? Welchen Zähler soll ich verwenden? Ich habe keine 8 Pins in meinem PIC, die ich verwenden könnte, wie in diesen http://goo.gl/2Wc3d.

Mein Encoder ist nicht mein Problem, das habe ich überprüft und es kann bis zu 76 Fuß / s für meinen Radradius verfolgen.

Über welche Frequenzen sprichst du? Wie schnell wechselt der Encoder und wie schnell läuft Ihre MCU-Uhr?
Sechs antworten:
Olin Lathrop
2012-05-10 17:03:09 UTC
view on stackexchange narkive permalink

Sie haben die wichtigen Informationen darüber, wie schnell die Impulse eingehen, ausgelassen. Ich gehe also davon aus, dass die Impulse im schlimmsten Fall immer noch langsam genug sind, damit die ordnungsgemäß geschriebene Firmware abfängt.

I. Ich habe einige Tricks gefunden, um die Quadraturdecodierung in der Firmware durchzuführen:

  1. Versuchen Sie nicht, einzelne Änderungen zu erfassen, sondern rufen Sie stattdessen in regelmäßigen Abständen ab. Angenommen, der Encoder kann für eine Kante direkt am Übergang hängen bleiben, und diese Kante kann daher schnell zittern. Dies würde jede Unterbrechung der Änderungstechnik durcheinander bringen.

    Bei regelmäßigen Abfragen können Sie das System sorgfältig darauf abstimmen, wie viel Zeit Sie in der Unterbrechungsroutine verbringen möchten. Die Obergrenze der Encodergeschwindigkeit ist ebenfalls bekannt und nicht langsamer als im schlimmsten Fall mit der Interrupt-on-Change-Methode. Die Abfragemethode funktioniert garantiert korrekt bis zu einer maximalen Bewegungsgeschwindigkeit i>, die Sie leicht berechnen können. Die Interrupt-on-Change-Methode verschlechtert sich unvorhersehbar, da Übergänge abprallen.

  2. Dekodieren Sie immer die volle 4x-Position. Versuchen Sie nicht, niedlich zu werden und dumme Dinge wie Count +1 zu tun, wenn A übergeht, während B hoch ist usw. Diese "Verknüpfungen" sind tatsächlich schwieriger zu implementieren und haben Eckfälle, die Sie in Schwierigkeiten bringen. Selbst wenn die oberen Ebenen die Position nur für einen einzelnen vollständigen Zyklus kennen möchten, vermeiden Sie Probleme, indem Sie die neue Position bei jeder Zustandsänderung dekodieren.

  3. Dekodieren Sie mithilfe einer Nachschlagetabelle. Bei jedem Interrupt machen Sie eine Momentaufnahme des aktuellen Status der beiden Encoderleitungen. Dies zusammen mit dem Schnappschuss vom vorherigen Interrupt sind 4 Datenbits. Aus dem vorherigen und dem neuen Status können Sie erkennen, ob die 4x-Anzahl gleich geblieben ist oder nach oben oder unten gegangen ist. 1. Da es nur 16 mögliche Fälle gibt, können Sie diese zum Versenden von einer Tabelle verwenden. Es gibt 4 Fälle, in denen jeder gleich bleibt, +1 und -1.

    Es gibt auch die 4 Fälle, in denen sich die Anzahl um 2 geändert hat und die eine besondere Behandlung erfordern. Eine Änderung von 2 bedeutet, dass ein Übergang übersehen wurde und sich der Encoder schnell bewegt. Wenn man nur den alten und den neuen Zustand betrachtet, weiß man nicht, ob er einen halben Zyklus vorwärts oder rückwärts ging. Beachten Sie, dass 1/2 Zyklus in diesem System eine Zählung von +2 oder -2 ist. Ich gehe damit um, indem ich eine letzte bekannte Richtungsflagge behalte. Der Code, der +1 und -1 ausführt, setzt dieses Flag gemäß der bekannten Richtung. Wenn Sie einen Schritt von 2 erhalten, nehmen Sie an, dass er in die gleiche Richtung wie der letzte Schritt von 1 geht. Dies ist eine ziemlich gute Annahme, wenn man die Trägheit realer mechanischer Systeme berücksichtigt.

    In Wirklichkeit haben Sie also wirklich 5 Bits Informationen zur Verarbeitung jedes Interrupts, die 2 vorherigen Geberleitungspegel, die neuen Geberleitungspegel und die letzte bekannte Richtung. Für die ultimative Geschwindigkeit machen Sie dies zu einer 32-Eintragstabelle und behandeln jeden möglichen Fall mit explizitem Code. Der Code für jeden Fall addiert sich von -2 bis +2 zur aktuellen Position und aktualisiert möglicherweise das bekannte Richtungsflag.

    ol>

    Wie Sie sehen können, nur Für jeden Polling-Interrupt sind einige Anweisungen erforderlich. Ihr PIC (16F1825) kann mit einer Taktrate von bis zu 32 MHz betrieben werden, was einer Befehlsrate von 8 MHz entspricht. Angenommen, Sie richten alle 50 Anweisungen einen Interrupt ein. Dies ist weit mehr als erforderlich, um das zu tun, was ich oben beschrieben habe. Das heißt, Sie können mit 160 kHz abfragen. Da sich der Encoder pro Interrupt um bis zu 1/2 Zyklus ändern kann, unterstützt dies die volle Zyklusrate des Encoders mit bis zu 80 kHz.

tcrosley
2012-05-10 04:10:25 UTC
view on stackexchange narkive permalink

Ich habe kürzlich ein ähnliches Projekt mit einem Freescale-Mikrocontroller durchgeführt. Ich habe die Timer-Erfassungsfunktion verwendet, um die Zeit der Ereignisse zu erfassen, ohne dass ein Interrupt (z. B. Interrupt bei Änderung) genau zum Zeitpunkt des Ereignisses auftreten muss. Ihre Interrupt-Routine liest und speichert nur einen Zählerwert, und der Rest der Berechnung befindet sich im Code auf Basisebene.

Ich habe dies überprüft, und der PIC16F1825 verfügt auch über diese Funktion. Abschnitt 24.1 (Erfassungsmodus) des von mir heruntergeladenen Datenblattes:

Der Erfassungsmodus verwendet die 16-Bit-Ressource Timer1. Wenn ein Ereignis am CCPx-Pin auftritt, erfasst und speichert das 16-Bit-Registerpaar CCPRxH: CCPRxL den 16-Bit-Wert des Registerpaars TMR1H: TMR1L. Ein Ereignis ist als eines der folgenden definiert und wird durch die CCPxM<3 konfiguriert: 0> Bits des CCPxCON-Registers:

• Jede fallende Flanke

• Jede steigende Flanke

• Jede 4. ansteigende Flanke

• Jede 16. ansteigende Flanke

Wenn eine Erfassung durchgeführt wird, wird das Interrupt Request Flag-Bit CCPxIF des PIRx-Registers gesetzt. Das Interrupt-Flag muss in der Software gelöscht werden. Wenn eine weitere Erfassung erfolgt, bevor der Wert im CCPRxH, CCPRxL-Registerpaar gelesen wird, wird der alte erfasste Wert durch den neuen erfassten Wert überschrieben.

Sie müssen die erfassten Werte immer noch schnell verarbeiten genug, um zu vermeiden, dass ein Ereignis verpasst wird.

narendra
2012-09-06 21:54:34 UTC
view on stackexchange narkive permalink

Verwenden Sie Port B zum Erkennen der Flankenänderung für Encoderimpulse. Sie müssen die Software zum Lesen von Impulsen verwalten, unabhängig davon, ob der Encoder im Uhrzeigersinn oder im Uhrzeigersinn dreht.

AngryEE
2012-05-10 03:48:07 UTC
view on stackexchange narkive permalink

Ihr Problem ist, dass die vom Encoder erzeugten Pin-Wechsel-Interrupts zu schnell auftreten, als dass Ihre Software sie verarbeiten könnte. Dies liegt wahrscheinlich daran, dass Ihr Interrupt-Handler zu lange läuft. Die Abfolge der Ereignisse ist wahrscheinlich wie folgt:

  1. Wellenbewegungen
  2. Encoder erzeugt steigende Flanke
  3. Pinwechsel-Interrupt tritt auf
  4. Pin-Interrupt-Handler beginnt
  5. Die Welle bewegt sich erneut, bevor der Interrupt-Handler beendet ist.
  6. Ein weiterer Interrupt wird generiert, aber nicht behandelt, da Sie immer noch den letzten
  7. Der Pin-Interrupt-Handler endet und löscht das Interrupt-Flag.
  8. Der zweite Interrupt wird nie behandelt.
  9. ol>

    So verpassen Sie Interrupts mit hoher Geschwindigkeit - der nächste Interrupt erfolgt vor Ihnen. ' Die erste Behandlung ist abgeschlossen und wird nie behandelt.

    Zunächst sollten Sie nichts tun, was in einem Interrupt-Handler viel Zeit in Anspruch nimmt. Interrupt-Handler sollten so kurz wie möglich sein, um das Problem zu vermeiden, das Sie gerade sehen. Sie versuchen wahrscheinlich, alles unter der Sonne in Ihrem Handler zu tun. Tu es nicht.

    Zweitens sollten Sie zu einer weniger softwarelastigen Methode zum Lesen des Encoders wechseln. Wenn Sie einen freien Timer haben, können Sie damit die Verschiebung Ihrer Welle messen. Wenn Sie sich nicht für Richtung oder Wellendrehzahl interessieren , können Sie die Verschiebung Ihrer Welle in Intervallen von 1 mm wie folgt messen:

    1. Berechnen Sie, wie viele Encoder zählen sind in 1mm. Hoffentlich ist es eine ziemlich große Zahl - in den 100ern oder so
    2. Verbinden Sie den Encoder mit einem externen Taktsignal eines Ihrer Timer - beim 16F88 ist es wahrscheinlich vorzuziehen, Timer 1 zu verwenden, da er als Zähler fungieren kann
    3. Konfigurieren Sie den Timer so, dass er als Zähler fungiert, von der externen Uhr gesteuert wird und bei Überlauf unterbrochen wird.
    4. Laden Sie das Timer-Zählregister mit dem Wert MAX - (# of Encoder zählt in 1mm). Timer 1 ist ein 16-Bit-Timer, also ist MAX 0xFFFF.
    5. Starten Sie den Timer und aktivieren Sie Interrupts.
    6. Jedes Mal, wenn Ihr Timer überläuft, laden Sie im Handler das Zählregister mit dem ursprünglichen Wert von MAX- # count in 1 mm neu.
    7. ol>

      Jedes Mal, wenn Ihr Timer unterbricht, wird Ihre Welle habe 1mm bewegt. Dies ist nicht perfekt - es ist nur wichtig, dass sich Ihre Welle um 1 mm bewegt, aber es hat keine Ahnung, in welche Richtung sich die Welle bewegt oder wie schnell sie fährt. Dies ist jedoch eine schnelle und einfache Methode, um eine Unterbrechung zu erhalten, wenn sich die Welle 1 mm in eine beliebige Richtung bewegt.

Die meisten Quadraturcodierer können im Ruhezustand schwingen. Dadurch zählt Ihr Timer die Anzahl der gefälschten Positionsänderungen. Bei richtiger Dekodierung hat diese Schwingung jedoch normalerweise keine negativen Auswirkungen.
Er sollte die Encoder-Pins nicht mit Eingängen verbinden, die Interrupts erzeugen. Verwenden Sie die CCP und fragen Sie nach der Richtung, verwenden Sie einen Auf- / Ab-Zähler und lesen Sie die Zählung oder verwenden Sie einen Timer-Interrupt und suchen Sie nach Änderungen des Quadraturzustands.
Dies kann im Echtzeit-Datenerfassungsmodus oder im asynchronen IRQ-Ereignismodus erfolgen. In beiden Fällen benötigt der uC genügend Geschwindigkeit, um das Ereignis in Echtzeit zu zählen. Der Punkt ist, dass das Problem nicht spezifiziert wurde, so dass jeder Rat für jeden ungewiss ist, eine perfekte Lösung zu geben. Schritt 1 definiert die Eingänge, die Rate und die Zustände
Soweit ich weiß, sind 45 mm / s bei 1 mm pro Ereignis 45 pps. Die Eingaberate ist verdammt langsam. Es stimmt etwas nicht mit seinem Code, der diese Ereignisse übersieht. Ich glaube, es liegt an einem Mangel an Ereignisspeicher und er muss zwischengespeichert werden. Wir wissen nicht, warum das Ereignis verloren geht. in dieser 22-ms-Periode (1 / 45pps) Aber wir kennen die genaue Natur dieses Signals nicht, zum Beispiel wenn es eine Hysterese usw. gibt, wie es für 1/4 eines Quadraturzyklus sein sollte. Wenn der Code länger als diese Zeit dauern kann. dann muss es sicherlich synchron angesteuert werden (zB 15 ms Rate), wenn Routinen nicht unterbrochen werden können. (schlechtes Design)
Malife
2012-05-10 09:33:35 UTC
view on stackexchange narkive permalink

Ich weiß, dass Sie ausdrücklich gesagt haben, dass Sie nur 14 Pins haben, um Ihr Problem zu lösen, aber ich verstehe nicht, ob dies mit dem tatsächlichen Zustand auf der Leiterplatte zusammenhängt oder ob es sich um eine Legacy-Karte handelt. Wenn dies auf den realen Zustand zurückzuführen ist, können Sie ein dsPIC33FJ12MC201 verwenden, ein 20-poliges Teil, das nicht weit von Ihrer 14-poligen Grenze entfernt ist und ein QEI-Modul enthält, das Ihnen das Leben erheblich erleichtern würde ;; Vielleicht kannst du diesen Teil in deinem Board quetschen.

Hoffe, das hilft.

Tony Stewart Sunnyskyguy EE75
2012-05-10 04:07:31 UTC
view on stackexchange narkive permalink

War Ihr PIC ISR einfach?

  • Berechnungssprung basierend auf dem Quadraturwert

  • +1 oder -1 oder 0 zurückgeben

  • und dann zum aktuellen Wert addieren.

Es sollte in der Lage sein, damit umzugehen, denke ich ...

.... irgendwelche Metastasen? Speichern Sie dann die Eingabewerte.

Wenn immer noch nogo. Verwenden Sie dann eine CPLD mit Aufwärts- / Abwärtszählern und wechseln Sie an einem seriellen E / A-Pin zu PIC. Wählen Sie nach Belieben Binär oder Dezimal.

1978 erinnere ich mich an einen winzigen Aspekt eines Hauptentwurfs eines Wirbelstrom-Roboterinspektionssystems für das Candu-Sekundärwärmetauschersystem, an dessen Entwurf ich mitgewirkt habe. Die Wirbelstromsonde wurde alle 0,1 mm entlang der Röhre mit Geschwindigkeiten von bis zu 5000 mm pro Sekunde verfolgt, und die Impedanzwerte der 12-Bit-Quadratursonde wurden mit der Sondenposition kombiniert, die von einem einfachen Quadratur-Drehgeber wie Ihrem übernommen wurde. Wir haben benutzerdefinierte Hardware und eine 6800 mpu verwendet. Wenn Ihr Design zu langsam ist, besorgen Sie sich die richtigen Werkzeuge für den Job. Aber nicht annehmen. Erstellen Sie bei jedem ISR einen Ausgangsimpuls und überprüfen Sie ihn.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...