www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Drehimpulsgeber


Autor: Thomas R (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe hier ein Problem welches ich zunächst völlig unterschätzt
habe. Und zwar muss ich 4 Drehimpulsgeber an einen Mega32 angeschlossen
werden. Es soll möglichst nur 1 Interrupt verwendet werden. Eine reine
Softwarelösung habe ich bis jetzt nicht zufriedenstellen hinbekommen,
weshalb ich jetzt eher zu mehr Hardware tendiere. Wie macht man das am
günstigsten? Sollte man einen zusätzlichen Controller verwenden? Ein
CPLD ? Ober gibt es gar etwas fertiges?

Die Impulsgeber haben 30 N/U und werden von Hand betätigt, also max.
1U/s.

Autor: (geloescht) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(Dieser Beitrag wurde geloescht)

Autor: Thomas R (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das klingt interessant. Auf den Mega32 bin ich nicht festgelegt. Der
Mega169 unterstützt Interrupt on Pin Change wenn ich mich richtig
entsinne. Kannst du genauer sagen was du mir "Interrupt Maske
auf den Port mit den Drehencodern" meinst? Du meinst dann vermutlich 8
Interrupts auf die 4 Drehcoder legen und dann jeweils auf die rising
Flanken an A und B reagieren?

Autor: (geloescht) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(Dieser Beitrag wurde geloescht)

Autor: Thomas R (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok hab ich noch nie gemacht aber wieso nicht. Hast du oder sonst jemand
ein C Programm zur Hand in dem das geamcht wurde?

Vielen Dank schon mal für die bisherige Hilfe

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das geht ohne interrupt, benutze einfach einen d flipflop und schließe
die beiden drehgeber bei q und t an. das speichert der ff den letzten
zustand.  so hatte ich es gemacht, läuft super

Autor: Thomas R (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Von dieser Möglichkeit habe ich un auch schon öfter gelesen. Jedoch
verstehte ich die Funktion nicht wirklich. Meinen Ausführungen liegt
das Timing Diagramm im Anhang zu Grunde.
Ich gehe jetzt davon aus dass der DIG in Position 1 steht. An A ist der
Takt des FFs angeschlossen. Jetzt drehe ich gegen den Uhrzeigersinn
weiter auf Position 2. Dann passiert am FF doch gar nichts, da nur eine
fallende Flanke ankommt. drehe ich jetzt wieder im Uhrzeigersinn zurück
auf 1 bekommt ich eine high Flanke und das FF schaltet 0 auf Q. Jetzt
stehe ich wieder am Anfang, habe aber nur 1 Signal bekommen? Wo ist
mein Denkfehler?

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Drehimpulsgeber per Interrupt auswerten, ist ein großer Fehler, wegen
dem Prellen!

Details, wie man es richtig macht, unter:

   http://www.dse-faq.elektronik-kompendium.de/dse-faq.htm#F.29

Autor: Michael Nagler (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Thomas,
über das Auslesen von Drehimpulsgebern habe ich mir auch lange den Kopf
zerbrochen. Mit Hilfe von Peter Danneggers großartigem Grundlagenthread
ist es mir dann gelungen, das Problem perfekt mit minimalem
Ressourcenverbrauch zu lösen:
http://www.mikrocontroller.net/forum/read-4-37992.html#new

In dem Thread steht leider einiger Müll, aber die wertvollen Teile
lassen sich bei aufmerksamem Lesen aber gut extrahieren.

Ich habe die Routine in Assembler übernommen und steuere zum Test nur
die Pulsbreite des PWM. Mit dem Beispiel kann man auch die Auswirkung
unterschiedlicher Abtastraten testen. Bei mir hat sich eine Abtastrate
von ca. 1 kHz bewährt. Ich kann keinerlei Prellen feststellen. Ein
Erweitern auf 4 Drehimpulsgeber sollte den Controller nicht stressen.

Gruß
Michael

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe mich auch viel mit dem Thema beschäftigt. Per Interrupt von einem
Port IO funktioniert es definitiv nie so ganz einwandfrei.

Daher bin ich auch auf die Lösung mit einem Timerinterrupt / Polling
gekommen. Im Timerinterrupt wird dann eine ganz kleine State-Machine
aufgerufen um herauszufinden, ob der Inkrementalgeber bewegt wurde und
in welche Richtung.

Hier ist die Doku / Source Code in C zu einem Projekt wo ich das
verwendet habe (ab Seite 33 im PDF File):
http://www.circuitcellar.com/renesas/winners/Entri...

Projekt homepage:
http://www.circuitcellar.com/renesas/winners/3210.htm

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Thomas

"Eine reine Softwarelösung habe ich bis jetzt nicht zufriedenstellen
hinbekommen"


Dann hast Du bestimmt noch nicht das hier probiert:

http://www.mikrocontroller.net/attachment.php/87902/ENCODE.C



Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.