hallo,
ich versuche meinen drehgeber auszulesen,
habe hier im Forum eine Routine von Hannes gefunden,die auch
funktioniert da ist der drehgeber aber an PortB b2,b3 angeschlossen,ich
habe bei mir nur noch den PortB b3,b4 und wollte ich den drehgeber
anschliessen.
aber es funktioniert nicht,ist ja auch klar durch das schiften.
vielleicht kann mir jemand helfen
mfg
danke
Hallo,
da nur an einer Stelle das IO-Port gelesen wird füge nach
>in wl,dgp ;Drehgeber einlesen
ein
>lsr wl
ein und damit wandern die Bits von 3,4 wieder nach 2,3 .
Alles andere lässt du im Originalzustand - also auch dgmsk (0b00001100)
Sascha
Hallo liebe community,
ich möchte mithilfe eines Inkremental Drehgebers die
Verfahrgeschwindigkeit einer Maschine messen, dabei kommt es jedoch
aufgrund von vibrationen der Maschine zu den im Artikel "Drehgeber"
angesprochenen Pendeln, ist es nun auch hardwaretechnisch möglich diese
Nadelimpulse mithilfe eines Kondensators zu unterdrücken? Denn eine
Positions oder Richtungsbestimmung wird nicht benötigt... ggf. kann ja
der zeitliche versatz durch den Kondensator in software korigiert
werden.
Lg Flo
@ Flo (Gast)
>angesprochenen Pendeln, ist es nun auch hardwaretechnisch möglich diese>Nadelimpulse mithilfe eines Kondensators zu unterdrücken?
Man könnte eine Entprellung mit RC-tiefpass machen, allerdings geht
das nur bis zu einem bestimmten Punkt. Denn wenn der Tiefpass so langsam
wird, dass er die normalen Signale zu sehr beeinflußt, ist Feierabend.
> Denn eine>Positions oder Richtungsbestimmung wird nicht benötigt...
Naja, aber der Witz am Drehgeber ist ja, dass er TROTZ
Prellens/Pendelns mit der richtigen Auswertung fehlerfrei ausgewertet
werden kann. Das solltest du tun, dann passt das.
MFG
Falk
Das Problem ist das ich keinen eingang mehr frei habe, würde es auch ein
zwischengeschalteter quadratur clock converter tun (ls7082)?
Kann ich davon ausgehen das dieser mir die taktlänge entsprechend der
weglänge liefert oder gibt es da abweichungen?
@ Flo (Gast)
>Das Problem ist das ich keinen eingang mehr frei habe,
Dann must du irgendwie ein Pin einsparen.
>würde es auch ein>zwischengeschalteter quadratur clock converter tun (ls7082)?
Nö, der braucht ja noch mehr Pins zur Steuerung.
>Kann ich davon ausgehen das dieser mir die taktlänge entsprechend der>weglänge liefert oder gibt es da abweichungen?
???
Das Ding arbeitet schon sauber.
Mfg
Falk
Hätt ich eigentlich schon eher drauf kommen können, ich schalte einfach
nen tiny dazwischen der mir die kanäle überwacht und einen impuls pro
weg gibt.
Dazu könnte ich doch die pin changeinterrupts benutzen??
Das einzige was ich noch nicht so wirklich verstanden hab is die art der
signalabfrage beider spuren, die bit-folge is klar nur muss ich doch
immer 2 aufeinanderfolgenede interrupts anhand der pin zustände
vergleichen, hab ich da nicht einen zeitverlust???
Wär nett wenn jemand mir das nochma erklären könnte.
@ Flo (Gast)
>Dazu könnte ich doch die pin changeinterrupts benutzen??
NEIN!
>Wär nett wenn jemand mir das nochma erklären könnte.
Lies den Artikel Drehgeber in Ruhe und denk drüber nach, dann weißt
du warum das ein schlechte Idee ist.
MFG
Falk
Mich dünkt es, dass Falk Brunner der einzige ist, der für den Artikel
Drehgeber propagiert. Komisch nur, dass nie von jemand anderem der
Verweis auf den Artikel kommt.
...
hagbard celine schrieb:> Mich dünkt es, dass Falk Brunner der einzige ist, der für den Artikel> Drehgeber propagiert. Komisch nur, dass nie von jemand anderem der> Verweis auf den Artikel kommt.
Nunja, der Artikel ist ja gut und schön, deckt aber nicht alle
Einsatzfälle ab und ist vom Anfänger nicht allzuleicht zu verstehen.
Die hier im Eröffnungsbeitrag zitierte Routine von mir ist schon sehr
alt. Ich selbst nutze sie schon lange nicht mehr, obwohl sie recht
zuverlässig ihren Dienst tat. Meine neue Routine (LUT mit Index aus
altem und neuem DG-Zustand) ist da bedeutend flexibler einzusetzen.
Eines haben sie aber gemeinsam: Sie sind für langsames Betätigen
rastender Drehgeber durch manuelle Eingaben konzipiert.
Sie sind nicht für Lage- und Drehzahlbestimmung von Maschinenantrieben
geeignet, denn das ist eine gaaaanz andere Liga und erfordert auch
andere Technologien (höhere Geschwindigkeit, Schutz gegen
Schrittverlust, ...).
>> ...
...
Ich hab im Controller intern schon einen Timerinterrupt der jede µs
ausgeführt wird, hab zudem nun die 2. spur an den controller gehängt,
alle beide an interrupt pins.
ich messe im prinzip über die zeitbasis des timers die zeit bis ein 2.
impuls auf der a-spur kommt. ist es nun möglich das pendeln über eine
zeitgleiche abfrage der spur-zustände jede µs und einem späteren
vergleich dieser nach eintreffen des "stops" zu kompensieren, bzw. zu
ermitteln ob es ein pendel-impuls war oder wirklich der weg verfahren
wurde?
Lg Flo
Flo schrieb:> Ich hab im Controller intern schon einen Timerinterrupt der jede µs> ausgeführt wird,
Also ein Timer-Interrupt je µs (Mikrosekunde)...
Ich denke, jetzt wird es mal langsam Zeit für Fakten.
- Welchen Controller benutzt Du?
- Wie schnell wird er getaktet?
- Was willst Du überhaupt messen? (Position und Richtung des Verfahrens,
also das, wozu man einen Drehgeber benutzt, wohl nicht)
- Wozu brauchst Du einen Timer-Interrupt mit einem Intervall von 1µs?
> hab zudem nun die 2. spur an den controller gehängt,> alle beide an interrupt pins.> ich messe im prinzip über die zeitbasis des timers die zeit bis ein 2.> impuls auf der a-spur kommt. ist es nun möglich das pendeln über eine> zeitgleiche abfrage der spur-zustände jede µs und einem späteren> vergleich dieser nach eintreffen des "stops" zu kompensieren, bzw. zu> ermitteln ob es ein pendel-impuls war oder wirklich der weg verfahren> wurde?
Deine Aussagen sind mir aufgrund fehlender Fakten relativ
unverständlich.
Ich spekuliere mal:
Du willst mit einem Controllerpin eine Drehzahl (Frequenz) ermitteln und
nutzt als Geber einen Drehgeber, weil es mechanisch so schön passt. Die
Impulse kommen so schnell, dass eine normale Auswertung beider Spuren im
Millisekundenraster nicht möglich ist. Da Du nur eine Spur ausliest,
kommt es aufgrund von Vibrationen bei stehender Welle zu Fehlimpulsen.
Wenn das soweit zutrifft, dann stellt sich die Frage, wie schnell
(ehrliche) Impulse kommen können. Denn erst mit dieser Info kann man
Deine Frage beantworten, ob man die Drehgeberimpulse mit einem Tiny
(z.B. Tiny13) so aufarbeiten kann, dass Dein Controller auf nur einer
Leitung saubere Impulse zu sehen bekommt.
Denn wenn es nicht zu schnell wird (µs-Bereich), dann sehe ich eine
Möglichkeit der Signalaufbereitung mit Tiny13, und zwar eine Art
Flipflop. Dabei wird der Zustand beider Spuren in einer Schleife
gescannt, bei 01 der Ausgangspin gesetzt und bei 10 der Ausgangspin
wieder gelöscht. Das Klappern einer Spur wäre damit eliminiert, es wird
erst reagiert, wenn beide Spuren klappern.
Ist das Tempo für einen Tiny13 zu schnell, dann muss eben Logik in
Hardware her, entweder ein Gattergrab oder ein programmierbarer
Logikbaustein.
Habe ich Dich falsch verstanden und Du willst wirklich eine komplette
Auswertung von Position, Richtung und Verfahrweg machen, dann vergiss
was ich geschrieben habe.
>> Lg Flo
...
HALLO;
um nochmal zum anfangspost zu kommen,
ich habe Hannes seine Routine benutzt,die funktioniert auch so nun
wollte ich einen 2 Drehgeber an einen anderen Port
anschliessen(1.Drehgeber PortB 3,4;;2.Drehgeber an PortA 3,4) ich rufe
die Routine dann ein zweites mal auf mit geänderten Port aber es rühert
sich beim 2.drehgeber überhaubt nichts,
kann mir jemand weiterhelfen
mfg
gasst schrieb:> hallo,> kann mir keiner weiterhelfen wie ich 2 Drehgeber auswerten kann>> mfg
Wie ich Dir bereits oben
Beitrag "Re: Problem beim DREHGEBER"
schrieb, ist meine von Dir verwendete Routine bereits recht alt und
nicht übermäßig elegant. Es lohnt sich nicht, weiter darüber
nachzudenken.
In einem anderen Projekt hatte ich mal zwei Drehgeber verwendet, deren
Ergebnisse ich aber als Up/Down-Tasten brauchte. Daher enthält die LUT
keine Increment-Konstanten, sondern Bitwerte für die Tastenflags.
Trotzdem kann man gut erkennen, wie beide Drehgeber quasi gleichzeitig
ausgewertet werden.
Der Aufruf der Routine erfolgt im Zeitraster von etwa 1 ms.
1
drehgeber: ;UP, liest Drehgeber und Taster entprellend ein
2
cbr merker,1<<entprell ;Jobflag löschen
3
push wl ;Variablen beschaffen
4
push wh
5
push r0
6
push r1
7
push zl
8
push zh
9
lds wl,evt ;Entprell-Vorteiler holen,
10
inc wl ;erhöhen
11
sts evt,wl ;und wieder sichern
12
andi wl,15 ;jedes 16. mal Tasten statt Drehgeber abfragen
;in dgfl stehen nun die Drehgeber-Ereignisse, 54=links, 10=rechts
56
57
entprellung: ;Tasten entprellen
58
lds r0,pz0 ;Variablen holen
59
lds r1,pz1
60
lds zl,tfl
61
lds wh,tas
62
debounce8: ;Entprellen der Tasten
63
;wl enthält neuen Wert, wh enthält entprellten Status
64
;r0 enthält Prellzähler0, r1 enthält Prellzähler1
65
;zl enthält Drückflag
66
;Der Algorithmus ist von Peter Dannegger übernommen
67
in wl,tapin ;Tasten einlesen
68
com wl ;und invertieren
69
eor wl,wh ;nur Änderungen werden H
70
and r0,wl ;Prellzähler unveränderter Tasten löschen (Bit0)
71
and r1,wl ;Prellzähler unveränderter Tasten löschen (Bit1)
72
com r0 ;L-Bit zählen 0,2,->1, 1,3,->0
73
eor r1,r0 ;H-Bit zählen 0,2,->tz1 toggeln
74
and wl,r0 ;Änderungen nur dann erhalten, wenn im Prellzähler
75
and wl,r1 ;beide Bits gesetzt sind (Zählerstand 3)
76
eor wh,wl ;erhaltene Änderungen toggeln alten (gültigen) Tastenstatus
77
and wl,wh ;nur (neu) gedrückte Tastenbits bleiben erhalten
78
or zl,wl ;und zugehörige Bits setzen (gelöscht wird nach Abarbeitung)
79
;die eigentliche Entprellung ist fertig, nun noch Variablen ins RAM schreiben
80
sts pz0,r0 ;Prellzähler0,
81
sts pz1,r1 ;Prellzähler1
82
sts tas,wh ;und Tastenstatus zurück ins SRAM
83
;Tastenflags brauchen wir noch, jetzt wird erstmal die Modetaste geprüft:
84
lds wl,mode ;Betriebsmodus holen
85
sbrc zl,t_mode ;Modetaste betätigt? - nein...
86
inc wl ;ja, Mode erhöhen
87
cbr zl,1<<t_mode ;Tastenflag Modetaste löschen
88
cpi wl,4 ;Mode auf
89
brlo debounce8a ;0..3
90
clr wl ;begrenzen
91
debounce8a:
92
sts mode,wl ;Mode wieder sichern
93
sts tfl,zl ;Tastenflags sichern
94
;in tfl stehen die Flags für neu gedrückte Tasten, in tas der entprellte
95
;Zustand der Tasten, die Modetaste wurde bereits ausgewertet
96
rjmp drehgeber_e ;fertig, lokale Variablen entsorgen und zurück...
Da Du die Drehgeber an verschiedene Ports angeschlossen hast, musst Du
das Zusammenführen der Bits in ein gemeinsames Register verändern. Eine
Möglichkeit dazu wäre, die Bits des einen Drehgebers um 2 Bits nach
rechts zu schieben (auf Bit 1 und 0) und die Bits des anderen Drehgebers
um 2 Bit nach links (Bit 5 und 4). Dann können sie zusammengefasst,
maskiert und weiterbehandelt werden.
Wenn Du keine UP/Down-Tastenbits zur Rückgabe brauchst, sondern
Ringzähler, so musst Du zwei Zählregister einsetzen und die LUT anpassen
(statt der Bitmuster Zählschrittweiten eintragen, also '-1' statt '2').
Und hier ist die zugehörige LUT:
1
#ifdef paul
2
dgtab: ;Tabelle mit Drehgeber-Werten (alt-alt-neu-neu als Index)
3
;aa nn, aa nn ;Version für Kameraden mit
4
.db 0, 1 ;00 00, 00 01 ;dem dicken Kopf
5
.db 0, 0 ;00 10, 00 11
6
.db 2, 0 ;01 00, 01 01
7
.db 0, 0 ;01 10, 01 11
8
.db 0, 0 ;10 00, 10 01
9
.db 0, 2 ;10 10, 10 11
10
.db 0, 0 ;11 00, 11 01
11
.db 1, 0 ;11 10, 11 11
12
#else
13
dgtab: ;Tabelle mit Drehgeber-Werten (alt-alt-neu-neu als Index)
14
;aa nn, aa nn ;Version für China-Drehgeber von
15
.db 0, 0 ;00 00, 00 01 ;Sure-Electronic
16
.db 0, 0 ;00 10, 00 11
17
.db 0, 0 ;01 00, 01 01
18
.db 0, 0 ;01 10, 01 11
19
.db 0, 0 ;10 00, 10 01
20
.db 0, 2 ;10 10, 10 11
21
.db 0, 0 ;11 00, 11 01
22
.db 1, 0 ;11 10, 11 11
23
#endif
Die LUT ist für zwei verschiedene Drehgeber-Typen ausgelegt, durch
bedingte Assemblierung wird natürlich immer nur eine der beiden Tabellen
benutzt.
...
hallo,
ich habs mal getestet aber irgendwie spingen die werte immer hin und
her,
habe erstmal die einfache version mit einem drehgeber
getestet,allerdings habe ich die drehgeber von Reichelt STEC12E08 werde
mir nochmal den von pollin bestellen und dann gucken obs denn geht
vielen dank nochmal
mfg
gasst schrieb:> hallo,> ich habs mal getestet aber irgendwie spingen die werte immer hin und> her,
Dann solltest Du die Tabelle an die Eigenheiten Deiner Drehgeber
anpassen.
> habe erstmal die einfache version mit einem drehgeber> getestet,allerdings habe ich die drehgeber von Reichelt STEC12E08
Dann ermittle (durch Messen) doch erstmal, wie Dein Drehgeber überhaupt
reagiert.
- Wieviele Zustände hat er pro Rastung?
Das bestimmt die Anzahl der Einträge in der Tabelle.
- Welche Zustände sind im eingerasteten Zustand stabil?
Das bestimmt die Position der Einträge in der Tabelle
- Welche Flanken (Zustandswechsel) treten im eingerasteten Zustand
(bei leichter Bewegung im Rastpunkt) auf?
Das bestimmt, welche Positionen in der Tabelle gemieden werden müssen.
Die einfachste Methode zum Ermitteln dieser Daten ist das Anschließen
von LEDs (incl. Widerständen) an die Drehgeber und das Beobachten dieser
bei ganz langsamer manueller Betätigung. Damit kann man eindeutig
erkennen, welche Flanke von Rastung zu Rastung nur einmal auftritt, und
zwar soweit zwischen den Rastpunkten, dass sie im halbeingerasteten
Zustand garantiert nicht auftreten kann. Und dann sind die
entsprechenden Einträge (1 für vorwärts und -1 für rückwärts) an die den
Flanken entsprechenden Positionen in die Tabelle einzutragen, der Rest
der Tabelle wird dann mit 0 aufgefüllt. Somit findet ein Zählvorgang nur
dann statt, wenn die zuverlässige Flanke zwischen den Rastpunkten
aufgetreten ist.
Dazu noch ein Hinweis: Die Tabelle enthält 16 Werte (4 Bit). Der Index
(also die Nummer des Wertes in der Tabelle) wird ermittelt aus dem
Pinzustand des Drehgebers der vorhergehenden Abtastung (2 Bit) und dem
Pinzustand des Drehgebers der aktuellen Abtastung (weitere 2 Bit). Eine
Flanke ist dort, wo alter (von der vorherigen Abtastung gemerkter) und
neuer (aktuell eingelesener) Pinzustand unterschiedlich ist. Eine
gültige Flanke ist dort, wo nur ein Pin unterschiedlich ist, der andere
aber unverändert.
> werde> mir nochmal den von pollin bestellen und dann gucken obs denn geht
Der Drehgeber von Pollin funktioniert mit dieser Tabelle auch nur in
einer Polarität. Vertauscht Du die Spuren, musst Du die Tabelle
anpassen.
>> vielen dank nochmal
Noch ein gut gemeinter Rat: Bitte verwende keinen unverstandenen fremden
Code. Du wirst damit nicht froh werden. Wenn Du fremden Code verwendest,
dann nimm Dir die Zeit und mach' Dir die Arbeit und analysiere diesen
Code, damit Du verstehst, was da passiert. Nur so kannst Du ihn bei
Bedarf an Deine persönlichen Ansprüche und Gegebenheiten anpassen.
>> mfg
Noch'n Tip: Lies bitte mal die "Wichtigen Regeln" im Kopf des
Antwortformulars (Groß- und Kleinschreibung verwenden) und richte Dich
bitte auch danach.
...
Flo schrieb:> ich möchte mithilfe eines Inkremental Drehgebers die> Verfahrgeschwindigkeit einer Maschine messen
Und warum hijackst Du dann ein völlig anderes Thema?
Dem OP geht es um einen manuellen Drehgeber STEC12E08.
Er wird sich jetzt schön bei Dir bedanken, weil Du seinen Thread zur Sau
gemacht hast.
Peter
hagbard celine schrieb:> Mich dünkt es, dass Falk Brunner der einzige ist, der für den Artikel> Drehgeber propagiert.
Und mich dünkt (nein, ich bin mir sogar sicher), daß Du ihn noch nie
ausprobiert hast.
Zuverlässiger gehts einfach nicht.
Und obendrein noch universell für alle 3 Encoder-Rasttypen.
Peter
Hallo Hannes,
ich habe es mit den Leds getestet.
>- Wieviele Zustände hat er pro Rastung?> Das bestimmt die Anzahl der Einträge in der Tabelle.>- Welche Zustände sind im eingerasteten Zustand stabil?> Das bestimmt die Position der Einträge in der Tabelle>- Welche Flanken (Zustandswechsel) treten im eingerasteten Zustand> (bei leichter Bewegung im Rastpunkt) auf?> Das bestimmt, welche Positionen in der Tabelle gemieden werden müssen.
Pro Rastung hat er 2 Zustände,
Rechts Drehen von Rastung zu Rastung (Das Anschneiden der
Rastung) erst leuchtet PhaseA kurz
darauf PhaseB,und beim Links Drehen genau umgekehrt,
das wähern dann ja 16 Einträge in der Tabelle wenn ich mich nicht irre
Es leuchtet keine Led wenn er in einer Rastung drin steht
Wenn ich zB. ganz Langsam nach Rechts (Drehe) und die Rastung
Anschneide dann leuchtet nur PhaseA
Hier ist erstmal die Tabelle,ich habs Versucht so umzusetzen wie Du es
vorgeschlagen hast
; PHASE
; A B
.db 0, 0
.db 1, 0 ;Rechts Drehen
.db 0, 1
.db 0, 0
.db -1, 0 ;Links Drehen
.db 0,-1
.db 0, 0
.db 0, 0
in wl, dgp2 ;PORTB B2,B3 ;Drehgeber-Port einlesen
andi wl,dgmsk1 ;nur die benutzten 2 Bits werten
lsl drgn2 ;altes Drehgeber-Bitmuster
lsl drgn2 ;nach oben schieben
or drgn2,wl ;neue Drehgeberbits einblenden
andi drgn2,dgaltmsk ;Index auf 4 Bit begrenzen (uralt löschen)
ldi zl,low(dgtab*2) ;Tabelle mit
ldi zh,high(dgtab*2) ;Dregheber-Increment-Werten
add zl,drgn2 ;Index aufaddieren
adc zh,null ;Übertrag auch
lpm wl,z ;Inkrement-Wert holen (0, +1 oder -1)
add drg2,wl ;Drehgeber-Increment aufaddieren
Aber Funktionieren tuts immer noch nicht
mfg