Drehimpulsgeber

dg2ygq

Neues Mitglied
23. Juli 2007
239
0
0
Bielefeld
Sprachen
Ich hatte bis her einfache Drehimpulgeber genommen, die je nach Drehrichtung den einen Pin oder den anderen Pin kurzzeitig auf Masse schließen.

Nun habe ich mir aber neue gekauft, die nicht richtig "klicken" !
Drehe ich in die eine Richtung, wird der eine Pin richtig auf Masse geschlossen, der andere Pin bekommt allerdings auch einen Impuls auf Masse, der ist zwar verhältnismäßig kurz, aber er reicht schon um die Abfrage mit "Debounce" durcheinander zu bringen.
Mit meinem Messgerät (Durchgangspiepser) ist das Signal nicht zu messen, wohl aber mit dem Oszi.

Port-Pins haben den Pullup Widerstand eingeschaltet, und der Schalter liegt direkt an den Port-Pins und Masse.

Nun hatte ich überlegt, den Drehimpulsgeber erst übern Optokoppler zu schicken, wäre aber wieder mit mehr Hardware verbunden, und ob es dann auch funktioniert ?! ......

Was hättet ihr denn für Ideen, wie ich diese Drehgeber doch noch nutzen könnte?
 
Hallo Michael,

hast du für den Drehimpulsgeber ein Datenblatt oder eine Bezeichnung (Hersteller)?

Wenn der Drehimpulsgeber ein Quadratursignal liefert, kann man ein Signal an einen externen Interrupt anschließen (fallende Flanke). In der Interruptserviceroutine prüft man dann den logischen Zustand des zweiten Signals, man erhält somit die Drehrichtung.

Bessere Drehimpulsgeber liefern die Signale über Lichtschranken, hier gibt es dann auch wenig oder kein Prellverhalten der Signale.

Gruss,
Dirk
 
Hallo Dirk,
nein, natürlich habe ich keinerlei Unterlagen zu dem Ding. Ich habe aber mal 3 STück in verschiedenen Ansichten gescannt (Für Nahaufnahmen taugt mein Scanner besser als die Knipse) .

Was bitte ist ein Quadratursignal ?
Wie oben beschrieben hat dieser Geber 2 Taster eingebaut, die je nach Drehrichtung kurzzeitig geschlossen werden (sollen).
Diese Dinger sind jedenfalls rein mechanisch, ich weiß auch garnicht ob Conrad, Reichelt & Co sowas im Programm hat ?!

Es gibt das Kunststoffteil auch in verschiedenen Farben, Weiß und Grün zB! Ist derKunststoff aber blau, und hat nur 3 Pins, "tickt" er aber ganz anders ?!
 

Anhänge

  • impulsgeber2.JPG
    impulsgeber2.JPG
    37,8 KB · Aufrufe: 91
Hi Michael,

ich habe den Eindruck, dass Du Dir nur Spezialthemen aussuchst um die Zeit zu vertreiben :p
Diesmal hast Du Dir ja wieder was nettes einfallen lassen. Ich glaube das ganze Ding hört sich zimlich nach drehrichtungs abhängiger Phasenverschiebung und damit unterschiedlicher zeitlicher Reihenfolge beim Schalten der Taster an.
Ich glaube aber dass Du hier nicht wirklich weiter kommst wenn wir nicht wissen, wie das Ding genau funktioniert. Da dann in SW irgendwas schnitzen ist die Kühr aber das Pflichprogramm ist die FUnktion von den Dingern.
Drehwertgeben bzw. Inkrementalgeber gibt es wie Sand am Meer und genauso unterschiedlich sind die Methoden wie sie funktionieren. Schau mal in der Wiki unter "Inkrementalgeber" ob da was dabei ist was so ähnlich aussieht.

Kannst ja mal schauen; ich finde - so aus der Ferne nachdem was Du beschreibst - den Ansatz mit den Schleifkontakten nicht ganz unpassen. Was meinst Du?

Wenn Du Neuigkeiten rausgefunden hast oder mit der Programmierung schon fertig bist :D dann lass es uns wissen.

Grüßle,
Markus
 
Ja, und Markus versucht gerade seine neue Vista-Maschine zum rennen zu bekommen so dass er wieder produktiv arbeiten kan aber .....

Ja, der Drehgeber ist heile angekommen, wirft aber mehr Fragen auf als er für Klarheit sorgt :)

Grüße,
Markus
 
Ja ja, schon wieder ich. Alsooooo ......

hmmm.......

mit dem Dreh-Gedönz komm ich mit Bordmitteln nicht weiter. Ich nehme das Ding morgen mal mit in meine Firma. Dort haben wir eine Harware-Abteilung und dort versuche ich mal mein Glück mit Oszilloskopen, Logik-Analyzern und was die Technik so zu bieten hat.

Mir fehlt nach wie vor ein Anhalt, um was es sich genau handelt und wie das Ding funktioniert. Ich glaube eine funktionierende Routine unter BASCOM zum Abfragen von dem Ding schüttel ich mir dann vergleichsweise aus dem Ärmel.

Michaaaeeeeel, hast Du noch mehr so zeug auf Lager? :eek:

Grüße und gute Nacht,
Markus
 
Hallo Markus,

und hast du etwas bei dem "Dreh-Gedönz" :D herausgefunden oder wurdest du von den Mitarbeitern in der Hardware-Abteilung rausgeschmissen? ;)

Naja, von Michael bekommen wir halt immer solche kniffeligen Aufgaben ;)

Grüße,
Dirk
 
Hallo Michael,

neeeee, rausgeschmissen haben die Kollegen mich nicht :p
Aber weiterhelfen konnten sie mir auch nicht :(

Dann habe ich einfach jetzt übers Wochenende ein Oszi mitgenomMen und mich selber gleich ans Werk gemacht. Hast ja lange genug warten müssen.
Und ich muss sagen, ich konnte dem Ding relativ schnell das Geheimniss entlocken *freu*.

Also:
1. Der Drehgeber ist ein primitiver mechanische Drehgeber (vermute Inkrementaldrehgeber) welcher intern mit zwei separaten und voneinander getrennten Schaltern arbeitet.
2. Wenn Du von vorne direkt auf die Achse blickst und die Lötbeinchen nach unten zeigen, dann wird beim Linksdrehen (gegen den Urzeiger) der linke Schalter geschlossen (siehe Bild 1).
3. Wenn Du nach rechts drehst wird der rechte Schalter geschlossen (siehe Bild 2).
4. Die beiden Schalter beeinflussen sicht nicht gegenseitig und auch eine Drehrichtung beeinflusst den jeweils anderen Schalter nicht. Es wird immer nur der Schalter geschlossen welche für die jeweilige Drehrichtung verantwortlich ist. Es gibt keine Phasenverschiebung wie bei manchen anderen Drehgebern, nixe nada.
5. Dann habe ich versucht herauszufinden ob die Schalter prellen. Negativ. Mit meinem Tektronix 300 MHz 4-Kanal-Speicher-Osiz *angeb* :D konnte ich kein Prellen der Schalter finden (siehe hierzu Bild 3 und 4).
6. Aber, ganz wichtig! Die Schalter sind Schließer!
7. Und auch noch wichtig! Die Dauer, wie lange der Schließer schließt hängt vom Bediener ab. Davon also, wie langsam oder schnell Du die Achse drehst. Man kann die Achse "nur andrehen" und dann "zwischendrin" halten und dann bleibt der jeweilige Schalter geschlossen. Dies bedeutet, dieser Zustand muss in der Software entsprechend abgebildet werden, da der Schaltzustand beliebig kurz/lang sein kann. Verstanden?!?!

(Kurze Erläuterung noch zu den Bildern. Ich habe den Drehgeber ohne Vorwiderstände direkt an 10V betrieben. Bedeutet jeweils ein Pin eines Schalters auf 10V das andere via 1MOhm Tastkopf ins Oszi.)

So, was meint Ihr dazu, nun weiß ich endlich wie das Ding funktioniert und wir können uns mal kurz überlegen wie man das technisch in HW und SW gießen könnte.

Was haltet Ihr von folgenden Vorschlag:
1. Beide Schalter mit einem PIN gegen Masse.
2. Im Mega die internen PullUps aktivieren und mit zwei Eingängen auf den jeweiligen Pin für links und rechts.
3. Dann ein 74HCTxxx UND-Gatter spendieren und gleichzeitig beide PIN's über UND Gatter verunden und auf einen Interrupt-Eingang legen.
4. Den Interrupt so konfigurieren das mit fallender Flanke ein Interrupt ausgelöst wird.
5. In ISR-Routine Flag für Drehgeberabfrage setzen und Interrupt sperren. Ggf. sofort auch PIN abfragen.
6. in Drehgeberabfarge PIN abfrage und Auswertung direkt durchführen.
7. Wenn Ausführung durchgeführt Interrupt wieder freigeben.

Wie man so etwas machen könnte, kannst Du Dir bei meinem Tastatur-Matrix-Beispiel hier im Forum unter Thread http://www.avr-praxis.de/forum/showthread.php?t=83 ansehen. Dort lösche ich auch vor der Freigabe des Interrupt das Interruptregister nochmals damit "alter" Müll verschwindet.

@Micha; brauchst Du den Drehgeber wieder zurück? Dann stecke ich ihn in ein Brief und sende ihn Dir zurück. Bitte schick mir dazu nochmals via Email Deinen Kontakt.

Nochmal @Micha; kommst Du mit den Erläuterungen erstmal zurecht um das "Gedönz" zu verfummeln und via SW anzubinden? Wie gesagt, schau mal in die Tastaturmatrix rein. Elementare Dinge findest Du dort sowohl in Schaltplan als auch Software.

Schönes Wochenende!

Grüßle,
Markus
 

Anhänge

  • Bild 1.gif
    Bild 1.gif
    11,1 KB · Aufrufe: 37
  • Bild 2.gif
    Bild 2.gif
    11,1 KB · Aufrufe: 28
  • Bild 3.gif
    Bild 3.gif
    10,6 KB · Aufrufe: 27
  • Bild 4.gif
    Bild 4.gif
    10,7 KB · Aufrufe: 25
Hallo Markus,

so wie du das beschreibst, ist mir das sehr verständlich. Und jetzt wird mir auch klar, warum man diesen Schalter nicht als Inkrementalgeber verwenden kann, es liegen ja keine 90° phasenverschobenen Signale vor.

Dieser Drehgeber verhält sich ja im Prinzip so wie zwei Taster (links/rechts), die mit unterschiedlicher Dauer betätigt werden (können). Ein polling des logischen Zustandes ist somit nicht ausreichend, da man ggf. einen Low-Puls nicht "mitbekommt".

Ich würde die Auswertung auch in einer Interruptroutine eines externen Interrupts machen, wenn möglich würde ich aber jedes Schaltersignal an einen externen Interrupt-Pin (z.B. INT0 und INT1, Interrupt bei flallender Flanke) anschließen, dann benötigt man kein UND-Gatter.

Ebenfalls ein schönes Wochenende!

Grüße,
Dirk

... der dich wegen dem 4 Kanal DPO beneidet :D ;)
 
Hallo Dirk,

den Drehgeber direkt auf zwei externe Interrupts zu legen hatte ich mir auch schon überlegt. Aber meistens, vor allem in größeren Projekten, ist der Mega (z.B. Mega8) nicht so dick mit ExInts ausgestattet. Aus diesem Grund hatte ich mich für die AND-Variante entschieden. Vor allem wenn noch andere Tasten dazu kommen sollten kann man mit der AND-Variante Ressourcen sparen.

Hab dabei auch a bissle an unseren ressourcensparenden Michael gedacht :p

Aber prinzipiell hast Du Recht. Ich für meinen Teil bin erst mal froh, dass es keine Inkrementalgeber mit Phasenverschiebung usw. sind. Ich denke damit bleibt der Aufwand in SW überschaubarer.

Grüßle,
Ma
 
Bahhh Markus, Nach "noch mehr son Zeugs" muss ich mal schauen :p

Ja, es sind 2 Schließer. Wobei ich jeden Schließer je auf Masse auf je einen Portpin beim AVR gelegt habe.
Meiner Meinung nach beeinflussen sich die beiden Schalter aber doch. Wenn ich nach links drehe, schließt der rechte Schalter auch, wenn auch nur sehr kurz, aber das reicht um den AVR in die Irre zu führen.
Ddrc = &B00000000
Portc = &B11111111

Main:
Do
If Pinc.0 = 0 Then Gosub Rauf
If Pinc.1 = 0 Then Gosub Runter
Loop
...

Teilweise funktioniert die Geschichte auch so wie sie soll, aber teilweise nimmt der AVR "runter" statt "rauf".

Schließe den Schalter doch mal nur mit dem einen Taster an, du wirst sehen dass er in beide Drehrichtungen (teilweise) schließt.

Ich melde mich "später" noch mal, bin grad etwas in Hektick :mad:
 
Drehgeber-Horror ohne Ende :D

Hallo Michael,

ja wenn es dann denn so ist, hmmm ich kanns zwar mit meinem Oszi und den Messungen nicht bestätigen aber Dein AVR wird schon stimemn :rolleyes:

Der Impuls des jeweils anderen Schalters muss, wenn er existiert dann schon sehr sehr kurz sein. Das wiederum könnte man ausnutzen.
Ich würde also, wie ich schon geschrieben habe beide Schalter noch auf einen Interrupt legen. ich würde auch das UND verwenden denn wenn die Schalter beide ansprechen ist es um so schwieriger mit zwei Interrupts zu arbeiten.
Also, ich würde die Schalter beschaltet lassen wie Du sie schon hast, würde mit einem UND die Pegel abgreifen und auf einen INT legen.
Wenn nun ein INT auftritt dann würde ich eine konfigurierbare Zeit x warten und danach auf PIN a und PIN b nachsehen welcher Schalter denn nun wirklich geschaltet hat. Vermutlich musst Du mit x ertwas herumexperimentieren damit Du knapp über die Zeit kommst in der Dir der andere Schalter noch in die Suppe spucken kann. Ich bin mir aber sehr sicher, dass der jeweils richtige Schalter lange genug schaltet um auch sauber vom Mega ausgewertet zu werden.
Ich würde auch aus dem grund einen INT nehmen, damit Du nicht ständig die Zustände der Schalter pollen musst. Der Aufwand nämlich dann bei einem Ereignis den richtigen Schalter ausfindig zu machen ist nicht zu unterschätzen.

Was meinst Du dazu?

Grüße,
ma
 
Hmmm, das Problem ist, das nicht immer der richtige Schalter "zuerst" geschlossen wird .....
Da der Impuls vom falschen Schalter ja wesentlich kürzer ist (auch wenn man recht schnell dreht), wäre ein Zeitliche Abfrage wohl der richtige Weg.
Aber wenn der falsche (zu kurze) Impuls zu erst kommt, wird doch der "richtige" Impuls auch nicht mehr registriert..... würde bedeuten dass ich trotz drehen, keinen Schritt weiter mache ?!
 
Welcher Schalter zuerst kommt ist bei der Lösung mit dem Interrupt egal. Das kann sowohl der falsche als auch richtige Schalter sein, egal! Beider Schalter über ein AND auf einen Interrupt, nach interrupt kurz warten und schalter auslesen, so wie ich das schon dargestellt hatte.

Grüße,
Markus
 
Ich glaube jetzt versteh ich.
Der Schalter löst einen Interrupt aus, dazu reicht schon der "kürzeste" Impuls.
Da der "richtige" Schalter aber länger geschlossen ist als der falsche, lese ich nun aus welcher Pin länger geschlossen ist ?!

Ihr immer mit euren IRQ`s ...... werde ich mir das Buch schnappen müssen.
Weitere Fragen folgen :D
 
So, nun aber !

On Int7 Key_isr_routine ' Definition ISR
Test_int_counter = &H0000 ' Testcounter vorinitialisieren
Enable Int7 ' INT7 freigeben
Config Int7 = Falling ' INT bei falling Edge
Enable Interrupts ' Alle Interrupts

Ich benutze statt INT7, den der Mega8 ja nun nicht hat, den INT1 ? Oder den INT0 ?

Wie verträgt sich das mit dem Timer, der die 7Segments multiplext? Oder ist das mehr oder weniger "Gefahrlos" ?

Als zusätzliche Hardware brauche ich also ein fixes UND-Gatter mit mindestens 2 Eingängen. Besorg ich nachher schnell :p

@Markus
Natürlich darfst du den Schalter behalten! Ob du ihn dir einrahmst, oder neckische Versuche damit anstellst...... so wie es dir die meiste Freude bereitet ;)
 
Hi Michael,

danke für den Schalter :)
Werde in als Denkunterstützung einsetzen. Man setze sich in einen Liegestuhl, nehme den Drehschalter in die Finger und klicke sich rechtsdrehend oder linksdrehend durch seine Ideen / Hinwindungen und geistigen Ergüsse :p

Doch nach so vielen Klicks noch a bissle was zum Thema:

In dem angefügten Bild findest Du Deine Mega8 Interrupt-Vector-Tabelle. Prinzipiell gilt, ge kleiner die Vector-Nummer und damit die Adresse desto höher prior Dein Interrupt. Soll heißen, dass egal ob INT0 oder INT1 auf jeden Fall immer Deine Timer durch die ISR unterbrochen werden.
Soll heißen, Du solltest Dir schon sehr genau überlegen, was Du in Deine ISR machst und wie.
Wenn Du die gesamte Auswertung der Ports und die Abfrage der Zustände mit Wartezeiten machst so rechne ich auf jeden Fall 100%ig mit Flacker-Effekten Deiner Anzeige. Du solltest also versuchen die eigentliche ISR so klein wie möglich und damit so schnell wie möglich zu bauen.
Hierzu gibt es einige mögliche Ansätze die man ausprobieren kann.

Ansatz 1:
Du setzt in der ISR nur ein Flag, dass ein Ereignis eingetreten ist und machst die Auswertung in Deinem Hauptprogramm / der Hauptschleife. Natürlich musst Du Dir hier geeignete Wartezeiten überlegen und dann die PIN's abfragen.

Ansatz 2:
Du programmierst die Abfrage für die PIN's in Assembler und überlegst Dir einen Entprellmechanismus (vielleicht auch über einen Timer). BASCOM geht beim Aufruf einer ISR via default hin und sicher alle Register auf den Stack und holt sie bei return wieder vom Stack. Das kann man durch Konfiguration nosave ändern. Dann musst Du aber die Register welche Du in der ISR manipulierst von Hand retten. Hat den Vorteil, Du kannst Rechenzeit sparen und bis schneller durch die ISR durch.

Egal welchen Ansatz Du wählts, Du wirst in jedem Fall nach dem Interrupt eine bestimme Entprellzeit warten müssen. Darum kommst Du - so scheint es mir - nicht herum. Auch wenn sie sehr klein ist sollte sie nicht in höher prioren ISR's ablaufen da ich sonst Flackerffekte erwarte.

Ich würde zuerst mal den Ansatz über Flasgund Auswertung in der Hauptschleife probieren. Wenn das nicht funzt kannst Du immer noch im Interrupt einen Timer aufziehen und dann bei Timer-Interrupt die PIN's auswerten. Ggf. solltest Du darüber nachdenken Dein Display-Multiplexing von Timer 0 auf Timer 1 oder Timer 2 zu verschieben. Das müsste man sich dann aber bzgl. Zeiten und Frequenzen nochmals genau anschauen. Damit hättest Du aber bei Timer 2 den Vorteil den Timer mit der höchsten Prio zu verwenden.

Grüße,
Markus
 

Anhänge

  • IRQs.gif
    IRQs.gif
    47,2 KB · Aufrufe: 25
Drehimpulsgeber auf ein Neues....

Hallo,

da ich auch an einer Anwendung mit 4 Drehgebern tüftle, habe ich mich einmal im Net umgeschaut. Bis auf die Tatsache, dass es die Dinger gibt, hab ich mich ja auch noch nicht damit auseinandergesetzt.

Aber ich hab da was gefunden:

Grundlagen sind hier zu finden:http://www.stefan-buchgeher.info/elektronik/drehimpulsgeber/drehimpulsgeber.html

Und als verwöhnter Tontechniker, der von der Qualität der ALPS-Fader überzeugt ist, noch ein Link.....
http://www3.alps.com/WebObjects/catalog.woa/E/HTML/Switch/Encoder/Encoder_list1.html

Ich hoffe, dass das weiterhilft. Ich werde auf jeden Fall in der nächsten Zeit an diesem Problem herumkauen müssen....

lG Sigi
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)