PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : inkrementaler Drehgeber



AVRbrauns
19.03.2008, 10:36
Hallo Zusammen,
ich wollte euch mal fragen, ob Ihr eine Idee habt, wie sich diese Schaltung in Bascom realisieren lässt, bzw. ob dies überhaupt möglich ist.
http://www.elektrik-trick.de/sminterf.htm

Die Signale A und B liegen bereits am Controler an und die Zustände High und Low kann ich schon abfragen.
Mein Problem ist, dass ich irgendwie auch die A' generieren muss.

Hat von euch hier jemand eine Idee ?

Vielen Dank im vorraus.

MeckPommER
19.03.2008, 13:30
Eigentlich ist es ganz einfach und ich verstehe im ersten Moment nicht so genau, warum das auf der Seite so kompliziert erklärt ist *kopfkratz*. Warum eine Schaltung aufbauen?

Aber vielleicht irre ich mich ja auch komplett und lerne gerne hinzu!

Wenn du diese beiden Signale hast, dann gibt es nur zwei Zustände, die durch ein Drehen des Gebers entstehen können und diese sind ein Zeichen dafür, ob und in welche Richtung gedreht wurde.

Und also so groß kann ich mir die µC-Last nicht vorstellen, als das ein normaler atmega das nicht ohne Weiteres hinbekommt.

AVRbrauns
19.03.2008, 14:23
Ja genau, das dachte ich mir auch.

Mein Problem ist nur, dass ich nicht weiß, wie ich A' bekomme ?
Ich habe gerade keinen Plan, wie ich das in Bascom umsetzen soll.

Hat von euch da jemand eine Idee ?

PicNick
19.03.2008, 15:11
Bascom hat da da was fertiges. "ENCODER"
https://www.roboternetz.de/wissen/index.php/Bascom_Inside-Code#.28Quadratur-.29_ENCODER

vielleicht reicht das ja

AVRbrauns
19.03.2008, 15:58
Cool, das ist genau das was ich suche :-)
VIelen vielen Dank für die Hilfe

Astro
19.03.2008, 17:21
Gib es da auch was fertiges für die Bascom CRC8 Prüfsumme

8-[

Sauerbruch
19.03.2008, 18:20
Also, mit Encodern hab´ ich schon einige Projekte realisiert. Herrliche Bauteile - die wirken so professionell :-)

Ich muss gestehen, die Assembler-Wahrheit hinter dem "ENCODER"-Befehl nicht zu verstehen. Kann halt kein ASM... aber ich hab´s immer mit einer supereinfach-Lösung gemacht, für die man nur einen Interrupt-fähigen Pin und einen beliebigen anderen Pin braucht (können durchaus in verschiedenen Ports sein)


1. Du dimensionierst eine Zähl-Variable
2. "A" legst Du auf den Interrupt-Pin, den Du auf fallende Flanke konfigurierst.
3. In der superkurzen Interrupt-Routine machst Du einfach eine Abfrage, ob der mit B verbundene Pin 1 oder 0 ist (Drehrichtung rechts bzw. links):

Interrupt:
If PinX.Y = 1 then Zähler = Zähler + 1 else Zähler = Zähler - 1
Return

Durch aktivieren bzw. deaktivieren des Interrupts kannst Du den Encoder an genau den Stellen des Programms aktivieren, an denen auch tatsächlich eine Eingabe erfolgen soll. Hier kannst Du dann die Größe "Zähler" weiterverarbeiten (z.B. auf ein Maximum und Minmum begrenzen) und nach Abschluss der Eingabe der eigentlichen Zielvariable den Wert zuweisen.

Ich hoffe, das war jetzt nicht zu wirr - gutes Gelingen!

PicNick
19.03.2008, 18:58
Naja, Herr Doktor, Problem ist bei deiner Methode, daß du bei Richtungsumkehr leicht Schritte verlierst

Sauerbruch
19.03.2008, 19:31
...echt?!

Alle meine bisherigen Encoder-bestückten Schaltungen zeigen auf einem LC-Display die einzustellenden Werte an (klar - wie soll man sonst auch wissen, wie weit man in welche Richtung drehen muss...) - und so vom "Einstell-feeling" hatte ich eigentlich nie den Eindruck, dass irgendetwas verlorengeht. Auch nicht, wenn ich die Drehrichtung öfter mal gewechselt habe. Aber man irrt sich ja doch recht schnell mal...

Funktioniert hat´s immer, aber jetzt bin ich doch neugierig auf die Geschichte mit dem "Encoder"-Befehl geworden. Wenn´s damit weniger "patschert" geht... :-)

AVRbrauns
01.04.2008, 11:03
Vielen Dank für eure Hilfe.
Ich habe von der Firma www.elgo.de das Magnetische Längenmesssystem EMIX2 an die rnControl angeschlossen und eben mit dem Quatratur Encoder ausgewertet.

Ziel ist es ein elektronisches Längenmesssystem zu entwickeln, das bei Bewegung nach rechts eins nach Oben zeigt

Leider habe ich momentan noch ein paar Probleme, vielleicht kann mir aber jemand von euch einen Tipp geben.

Die Rechtsrichtung funktioniert ziemlich gut, wenn ich aber nach "links" fahre, dann zeigt er auch eine rechtsbewegung an :-(

Die Geschwindigkeit ist miserabel. Es funktioniert nur wenn ich ganz ganz langsam über das Magnetband fahre. Bei einer schnelleren Bewegung verschluckt sich mein Programm.
Der Emix liefert 100 Pulse pro mm zurückgelegtem Weg.
Ist die rnControl dafür zu langsam oder mien Code falsch ?

Wäre super wenn ihr mal einen Blick drauf werfen könntet :-)


Nachfolgend noch mein Code



$regfile = "m2560def.dat"
$hwstack = 82 '80
$framesize = 68 ' 64
$swstack = 68 '44

$crystal = 16000000 'Quarzfrequenz
$baud = 9600


Dim Result As Long
Dim X As Integer
X = 0
Result = 0


'Config Pine.5 = Input
'Usb Alias Pine.5 'Ist 1 wenn USB angeschlossen

'Usb Schnittstelle UART initialisierung
'Config Com4 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
'Open "com4:" For Binary As #4 'USB Buchse


'Initialisierung LCD
Config Pinf.6 = Output
Lcd_rw Alias Portf.6
Lcd_rw = 0

Config Lcd = 20 * 4a , Chipset = Ks077
Config Lcdpin = Pin , Db4 = Portf.3 , Db5 = Portf.2 , Db6 = Portf.1 , Db7 = Portf.0 , E = Portf.5 , Rs = Portf.7
Config Lcdbus = 4

Initlcd

Cursor Off Noblink 'Curser ausschalten

'Ansteuerung LCD
Cls
Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte
Lcd "Radlabor Test"
'Print #4 , ""

Locate 2 , 1
Lcd "Result:"

Locate 3 , 1
Lcd "X:"
'Print #4 , "X"

Locate 4 , 1
Lcd "Richtung:"


Config Pina.1 = Input
Config Pina.2 = Input
'Alle internen Pullup Widerstände ein
Pina.0 = 0
Pina.1 = 0

Config Pina.2 = Input
Tasterx Alias Pina.2
'Porta.2 = 1 'Interner Pullup Widerstand ein

'Schleife mit Quadratur Encoder
Do
Result = Encoder(pina.0 , Pina.1 , Links , Rechts , 0)

If Tasterx = 1 Then
X = 0
Locate 3 , 4
Lcd X ; " "
End If
Loop


Links: 'Linksdrehen
Decr X
Locate 2 , 9
Lcd Result
Locate 3 , 4
Lcd X ; " "
Locate 4 , 12
Lcd "Links "
Return
Rechts: 'Rechtsdrehen
Incr X
Locate 2 , 9
Lcd Result
Locate 3 , 4
Lcd X ; " "
Locate 4 , 12
Lcd "Rechts "
Return

End

Andy_KEH
04.04.2008, 23:02
Was mir an deinem Code aufgefallen ist, ist folgendes:

Config Pina.1 = Input
Config Pina.2 = Input

werden deffiniert aber bei Pina.0 = 0 und Pina.1 = 0 werden dann die Pulldown Widerstände eingeschaltet und es werden dann auch Pin 0 und 1 weiter verwendet.