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
hallo, kann mir keiner weiterhelfen wie ich 2 Drehgeber auswerten kann 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 |
13 | brne drehgeber1 ;16. mal? - nein, Drehgeber abfragen... |
14 | rjmp entprellung ;ja, Tasten entprellen... |
15 | drehgeber1: ;Drehgeber abfragen |
16 | in wl,dgpin ;Drehgeberport lesen |
17 | andi wl,dgmsk ;nur Drehgeberpins maskieren |
18 | mov wh,wl ;Kopie für zweiten Drehgeber |
19 | lsr wh ;um 2 Bits nach rechts |
20 | lsr wh ;verschieben (54 -> 32) |
21 | or wl,wh ;zusammenfassen |
22 | andi wl,$cc ;nur Drehgeberbits maskieren (7632) |
23 | lds wh,dgalt ;Zustand der letzten Abfrage holen |
24 | sts dgalt,wl ;jetzigen Zuastand für nächstes mal merken |
25 | lsr wh ;Referenz um 2 Bits nach rechts |
26 | lsr wh ;verschieben (7632 -> 5410) |
27 | or wl,wh ;Zustände zusammenfassen (neu 7632, alt 5410) |
28 | mov wh,wl ;und kopieren, jedes Nibble ist ein Drehgeber |
29 | swap wh ;oberes Nibble der Kopie nach unten |
30 | andi wl,15 ;Index für linken Drehgeber isolieren |
31 | andi wh,15 ;Index für rechten Drehgeber isolieren |
32 | lds r1,dgfl ;Drehgeber-Flags holen |
33 | ldi zl,low(dgtab*2) ;Pointer auf Tabelle |
34 | ldi zh,high(dgtab*2) ;mit Drehgeberflag-Bitmustern |
35 | add zl,wl ;Index links |
36 | adc zh,null ;mit Übertrag addieren |
37 | lpm r0,z ;Flags aus Tabelle holen |
38 | or r1,r0 ;und übernehmen |
39 | ldi zl,low(dgtab*2) ;Pointer auf Tabelle |
40 | ldi zh,high(dgtab*2) ;mit Drehgeberflag-Bitmustern |
41 | add zl,wh ;Index rechts |
42 | adc zh,null ;mit Übertrag addieren |
43 | lpm r0,z ;Flags aus Tabelle holen, |
44 | swap r0 ;ins obere Nibble swappen |
45 | or r1,r0 ;und übernehmen |
46 | sts dgfl,r1 ;DG-Flags zurückschreiben |
47 | drehgeber_e: ;Ende Drehgeber-Routine |
48 | pop zh ;Variablen entsorgen |
49 | pop zl |
50 | pop r1 |
51 | pop r0 |
52 | pop wh |
53 | pop wl |
54 | ret ;fertig, zurück... |
55 | ;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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.