PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom und Drehgeber



Holzwurm56
01.03.2013, 09:17
Hallo ,
hat jemand ein Bascom-Programmbeispiel für eine Schaltung mit der man mit einem MC z. B. ATMega 8 ein Inkrementaldrehgebersignal erfassen und die Position auf einem Display ausgeben kann .
Wie ist die erreichbare Zählfrequenz ? Es gibt viele Beiträge zu diesem Thema im www aber ich habe es leider nicht so ganz kapiert .

Vielen Dank für jede Antwort

Hans

Sauerbruch
01.03.2013, 16:08
Hallo Hans,

in Bascom gibt es einen eigenen Befehl, der "Encoder" heißt. Dieser Befehl muss allerdings sehr engmaschig ausgeführt werden, damit ihm keine Aktionen des Drehgebers "entgehen".

Um genau dies zu vermeiden (dass eine Aktion am Drehgeber nicht erkannt wird), benutze ich eigentlich immer eine Interrupt-basierte Lösung.
Im anhängenden Bild sieht man schön die Funktionsweise eines Drehgebers (oder Encoders): Er besteht im wesentlichen aus zwei Schließkontakten, die mit einer gewissen Phasenverschiebung geschlossen und geöffnet werden, wenn man an der Achse dreht. Legt man die Kontakte A und B über PullUp-Widerstände auf +5V, gibt es zwei Rechtecksignale, wie im Bild dargestellt. Die senkrechten, gestrichelten Linien stellen hierbei die "Rast"-Postition des Encoders dar.

Du legst Kontakt A auf einen Interrupt-Eingang und konfigurierst den Interrupt als falling, und Kontakt B auf einen beliebigen Eingang (PINX.Y). In der Interrupt-Routine wird PINX.Y abgefragt: Ist dieser Eingang low, dann wurde gegen den Uhrzeigersinn gedreht, ist er high, wurde im Uhrzeigersinn gedreht (CW = clockwise = im Uhrzeigersinn, CCW = counterclockwise = gegen den Uhrzeigersinn).

Ich entprelle den Interrupt-Eingang immer mit einem kleinen Kondensator (z.B. 10nF vom Eingang gegen Masse), weil sonst die Kontakte oft mehrfach gezählt werden. Als Code könnte das so aussehen:



Dim Variable as Byte

Config INT0=falling
On INT0 Drehregler
Enable INT0
Enable Interrupts

Do
..
..
..
Loop

Dehregler:
If PINX.Y=1 then Variable = Variable + 1 else Variable = Variable - 1
Return



So entgeht dem Controller keine einzige Bewegung am Drehgeber - und bei einer halbwegs vernünftigen Taktfrequenz müsste man schon eine hochtourige Bohrmaschine an den Encoder anschließen, um an die zeitliche Auflösungsgrenze zu kommen :-)

24693

malthy
01.03.2013, 17:51
Hallo Hans,

ich habe mal einen einführenden kleinen Artikel zu dem Signal, das Drehencoder ausgeben geschrieben. Da stehen zumindest die Basics drin, ich denke er sollte einigermaßen gut zu verstehen sein. Kannst ja mal einen Blick darauf werfen (http://www.mtahlers.de/index.php/grundlagen/robolink/quadratursignal). Dann kann ich dir noch den Artikel über Drehgeber auf mikrocontroller.net (http://www.mikrocontroller.net/articles/Drehgeber) empfehlen, da sind Varianten der Auswertung mit ihren Vor- und Nachteilen diskutiert, auch der o.g. Und auch hier im RN-Wissen gibt es einige Beispielcodes in Bascom (http://www.rn-wissen.de/index.php/Drehencoder) zu dem Thema.

Gruß
Malte