Translate

10 November 2010

mal wieder was zwischendurch...ein Quadraturdecoder

Was ist denn bitte ein Quadraturdecoder?
Das ist eine Auswerteschaltung für die
Signale von Längen- und Winkel-Messgebern
so wie man sie an Werkzeugmaschinen
etc. vorfindet.
Diese Geber liefern ein Signal aus zwei
zueinander versetzten Rechtecksignalen.
eine Periode entspricht 20µ, so dass
bei 5µ Versatz in 5µ-Schritten ausgewertet
werden kann.
("1µ" = 1µm = 1/1000000 m = 1/1000 mm)



Ganz frisch mal eben nach Feierabend
schnell getippt............
ein "Quadraturdecoder mit Display"
basierend auf einem
Applikationsvorschlag von Bascom.


$regfile = "m88def.dat"
$crystal = 8000000
$baud = 9600

Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4

Config Lcdbus = 4
Config Lcd = 20 * 4a , Chipset = Ks077 'für EA DIP204-4

Cursor Off
Cls

Dim A As Long
Dim Pos As String * 10
A = 0

Enable Interrupts
Enable Int0
Enable Int1


Config Pind.2 = Input
Config Pind.3 = Input
Config Pind.4 = Input
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1

Config Int0 = Change
Config Int1 = Change

On Int0 Inta
On Int1 Intb

Cls

Do
If Pind.4 = 0 Then A = 0
Pos = Str(a)
Pos = Format(pos , "+000.000")
Locate 1 , 1
Lcd "X: " ; Pos ; " mm"
Loop

Inta:
If Pind.2 <> Pind.3 Then
Decr A
Else Incr A
End If
Return

Intb:
If Pind.2 <> Pind.3 Then
Incr A
Else Decr A
End If
Return


Was macht dieses schnuckelige Programm?
Das wird ein Display für inkrementale
Lineargeber.
Bei mir steht eine wunderbare Fräsmaschine
in der Werkstatt (eine Deckel FP2 !!!)
und da ist seit Jahren das Display kaputt.
Das Teil muss mal wieder benutzbar werden
..mal sehen ob das so geht!
Im "Labor" funktionierts grundsätzlich
schon mal prima.
Ganz fertig ist es aber noch nicht.
Ich meine das Programm....
Da brauche ich noch Daten für die
Umrechnung der Takte in mm.
und ich will noch zwischen
absoluten und relativen Werten
umschalten können.
....und die Schnittstelle (RS232 /USB ??)
sollte auch noch irgendwann in Betrieb
gehen.Ich denke da ans Aufzeichnen
von Messwerten, z.B. zum Vermessen
von Bohrungen oder Konturen.
Drei Achsen hat die Maschine ohnehin
und wenn man dann noch einen kleinen
Fühler dranbaut und sich die
Koordinaten berechnet............
......irgendwann mal.......

Nachtrag 11.11.2010:
Heute habe ich erste Tests mit einem Geber
durchgeführt.
Es sieht ganz brauchbar aus..
Die Geschwindigkeit dürfte reichen.
Nachdem ich die Auflösung reduziert habe
und nur noch mit einem Kanal Interrupts
erzeuge und auch die dritte Nachkommastelle
weggelassen habe und mit 12MHz takte
und ausserdem nur noch alle 200
Durchläufe das Display neu schreibe......
(das ist immer noch sehr schnell)
bin ich mit der Geschwindigkeit zufrieden.

Die Auflösung von 10µ (1/100 mm) reicht.
Ich kann pro Sekunde etwa 300mm erfassen.
das sind immerhin mehr als 30 kHz Takt
der zuverlässig gezählt wird. Wow!!!!!!
(das habe ich nicht gemessen, sondern
nur geschätzt, aber das kommt schon hin)

Momentan werden noch zwei Zeilen
geschrieben. Wenns nur noch eine Zeile
wäre und auch die ganzen Buchstaben
wegfielen (Display 1 x 8 Zeichen)
und mit 20 MHz getaktet, dann geht
da noch einiges!!!!!!!!
Leider habe ich keinen 20MHz Quarz
zur Hand.

Ich gehe mal davon aus, dass 500mm/s
möglich sein können.
Das ist eigentlich viel mehr als ich brauche,
aber das ist nötig, falls z.B Vibrationen
so schnelle Störungen verursachen sollten.
Bei Schlägen geht da schon mal ein Takt
verloren!!





Nachtrag vom 30.11.2010:
Heute habe ich mal die OPs zur
Signalaufbereitung eingesetzt
und in Betrieb genommen.
Damit werte ich die invertierten Signale
des Gebers ebenfalls aus.
So werden Störungen die irgendwo
eingefangen werden weitgehend ausgefiltert.
Das ist so was Ähnliches wie bei RS485,
aber zwei Kanäle in eine Richtung.
(da wäre sogar noch ein dritter Kanal, da
kommt ein Impuls um einen absoluten
Nullpunkt zu definieren, aber den nutze
ich in diesem Fall nicht.)
Dafür gäbe es sogar eigens dafür
entwickelte ICs, aber so was habe ich gerade
nicht zur Hand.
Wie es scheint erfüllen die OPs ihre Aufgabe
recht gut.Während es zuvor schon reichte,
einen Draht in die Nähe eines Trafos zu legen
und einzuschalten hat dies nun keine
Auswirkung mehr. Man könnte noch für eine
leichte Hysterese beim Schalten sorgen,
aber ich glaube, das ist gar nicht nötig.
Jetzt muss erst mal das Programm etwas
angepasst werden, damit es wieder auf
einem Atmega48 läuft und eine Umschaltung
Absolut / Relativ muss (wieder) rein.
Das habe ich der Übersicht wegen entfernt
als ich Geschwindigkeitsversuche machte.
Das obige Listing reagiert auf sämtliche
Wechsel des Signals und zählt in 5µ-Schritten.
So genau braucht es hier eigentlich keiner!
Daher habe ich es aufgeteilt, so dass ein Eingang
die positiven und der andere die negativen
Flanken erkennt. Beide Eingänge sind
parallel geschaltet
(So war auch der ursprüngliche
Programmvorschlag, aber hauptsächlich, weil
das Programm für den Attiny 2313 geschrieben
war, und der kann die "Change" Erkennung nicht)
So kann ich mit viel höherer Geschwindigkeit
den Weg messen und 10µ Aulösung reichen
mir auf alle Fälle!
Im Übrigen läuft der Atmega nun auch mit
20MHz Taktfrequenz! Das macht Spass!
da muss man schon den Geber ganz gewaltig
schubsen, bis der sich verzählt!
Das braucht Schläge, beim bloßen Verschieben
mit der Hand schafft er jede Geschwindigkeit,
die ich schaffe!
Das müsste genügen!

mfG
Franz