PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Drehimpulsgeber per Hardware auslesen?



dreadbrain
16.08.2008, 20:38
Hallo,
ich bräuchte eine Schaltung mit der ich einen Drehimpulsgeber auslesen kann.
Ich bräuchte ein Signal für Links/Rechts und einen Takt.
Hab dazu schon ein paar Schaltungen gefunden:
z.B.
http://www.elektrik-trick.de/sminterf.htm
oder
http://www.dse-faq.elektronik-kompendium.de/dse-faq.htm#F.29

Hat jemand eine solche oder andere Schaltung schon mal erfolgreich mit einem mechanisch Drehgeber in Betrieb genommen?

Oder sollte ich doch einen kleinen Atmega spendiern der diese Auswertung dann übernimmt?

Nur welche Methode is da die Beste?
Polling über Timer
oder Pin-Change Interrupt
oder die
http://www.mikrocontroller.net/topic/1503
und den Automaten in Bascom auf einen ATmega8 draufspielen und dann die jeweilige Operation(plus oder minus) auf die enstprechenden zwei ausgangspinns umcodiern?

Der Controller wäre nur für diese Aufgabe zuständig und der Encoder prellt meiner Meinung nach relativ stark.
(bei csd-electronics nach PEC11 suchen)

www.csd-electronics.de

Der Encoder wird per Hand bedient und sollte schon einigermaßen präzise funtkionieren da eine genaue Eingabe gewünscht wird.

Das Ausganssignal(takt, Links/rechts) wird wiederum einen Controller zugeführt, der aber durch andere Tätigkeiten schon sehr ausgelastet ist.
Ich möchte dadurch dem 2.Controller die Arbeit ersparen den Encoder andauernd zu beobachten und auszuwerten. Er soll praktisch nur an einen Interrupt einen Takt bekommen und dann schauen was das Links/Rechts Signal angibt und dadurch dan die Variable etc. verändern.
Dadurch das da nix mehr prellen sollte sollte der 2. Controller mit der Auswertung der aufbereiteten Signale keine Probleme mehr haben.


Wie kann ich dies Aufgabe am besten lösen?

mfg Benedikt

PS:Sorry für den x. Encoder Thread, aber ich hab dazu keine konkreten Informationen gefunden und weis auch nicht welche Methode die Beste ist solch einen Drehimpulsgeber mit einen µC auszuwerten.

PICture
17.08.2008, 00:02
Hallo dreadbrain!

Ich habe so ein Encoder z.B. für Menüsteuerung benutzt und in

https://www.roboternetz.de/wissen/index.php/PIC_Assembler#Mausrad_bzw._Drehencoder

kannst Du einen ausführlichen Programmablaufdiagram finden, den Du nur in Bascom für einen ATmega8 "übersetzen" brauchst.

Ich hoffe, dass es sogar mit einem µC gehen sollte, da als die zum Entprellen min. 10 ms nötige Verzögerung (Warten), kann jeder immer sich wiederholender Unterprogramm mit entsprechender Laufzeit (z.B. Displayausgabe) benutzt werden, was den µC kaum zusätzlich belastet.

Du kannst das mit zwei µC realisieren, ich glaube aber nicht, dass es einfacher wäre, weil z.B. anstatt des Encoders der zweite µC abgefragt werden müsste oder das laufende Programm bei jeder Betätigung des Encoders per interrupt für einige Zeit unterbrochen würde.

MfG

Slowly
17.08.2008, 09:52
Moin !

ein HCTL-2000 von HP könnte die Drehgeberauswertung übernehmen. Der kann jederzeit ausgelesen werden und dein µC kann sich um wichtigere Dinge kümmern.
Gruß
Slow

dreadbrain
17.08.2008, 10:56
Hi,

@picture
hab mir dein PAD mal angesehen.
Kommt das mit Prellen klar?



Wenn ja dann würde ich das auf einen kleinen µC spielen und die Ausgabe so erweitern das bei decr ein Takt mit 0 an Rechts/Links entsteht und bei incr ein Takt mit 1 an Rechts/Links.

Würde es nämlich gerne trotzdem auf einen kleinen extra Controller auslagern da:

1. Der Haupt-µC is relativ beschäftigt
-Kommunikation mit 3TWI slaves(mindestens 5mal pro Sekunde an 2 der 3 ein Dabenpaket mit 16 Wörtern senden)
-Kommunikation mit dem PC per RS232,
-je 2x8 bit für Porterweiterung(In/out), davon 16 taster die entprellt werden müssen
-Timergesteuerte Aufnahme/Wiedergabe von Werten(mind. 5 werte pro Sekunde aufnehmen und mind. 2 andere Wiedergeben)
und dann noch ein relativ Umfangreiches Menü
etc.

2. Ich würde mir gerne so ein "Modul" mit Drehgeber bauen, das ich dan später nur noch an weiter Schaltungen anschließen muss und dann nur bei jedem Interrupt auswerten ob Rechts oder Links gedreht wurde und je nach dem decr oder incr.

Aus diesen zwei Gründen würde ich mir gerne so eine Art "Signalaufbereiter" für die Encoder bauen.

@slowly

Wo bekomme ich den HCTl 2000 her?

mfg Benedikt

Slowly
17.08.2008, 11:43
Naaa Deadbrain,

da hast Du mich aber erwischt. 8-[
So wie es aussieht, wird das Teil nicht mehr hergestellt.
Es ist schon ein paar Jahre her das ich mich das letzte Mal mit dem Baustein beschäftigt habe.
Avago stellt aber scheinbar einen Nachfolger HCTL-2022 her.
Im RS-components Katalog ist der auf jeden Fall zu finden.
Gruß
Slow

PICture
17.08.2008, 11:50
Ja, der Drehencoder wird dank der ca. 10 ms Wartezeit zwischen zwei nacheinanderfolgenden Prüfungen entprellt.

Bei deiner Kodierung wird ein bit die Richtung zeigen. Der zweite bit (von dir als Takt genannt) könnte Anliegen des neuen Wertes signalisieren. Dieser bit sollte dann nach dem Ablesen vom µC gelöscht werden. Wenn es genug oft abgefragt würde, dass keine Änderung verloren gehen könnte, lässt sich das ganze auch hardwaremässig mit ein paar digitalen ICs (ohne µC) realisieren.

MfG

dreadbrain
17.08.2008, 16:02
Hi,
@picture

Hättest du einen Schaltplan oder eine Idee wie ich das mit einzelnen Digitalgattern lösen könnte?

@ slowly

So weit ich weis kann man bei RS nur als Firma bestellen oder?

mfg Benedikt

PicNick
17.08.2008, 16:35
Wenn du schon bereit bist, dafür einen eigenen Baustein zu nehmen, dann nimm doch gleich irgendeinen Mini-Wuzi-Controller und programmier' ihn nach deinen Bedürfnissen.

PICture
17.08.2008, 18:18
@ dreadbrain

Eine Idee habe ich schon, aber brauche noch Zeit um sie genau zu überdenken und skizzieren. Es wäre sehr schön, wenn du die Portpins vom µC genau definieren könntest, oder sollten es, wie ich oben vorgeschlagen habe, 2 Eingänge zum Einlesen und 1 Ausgang zum Löschen sein?

MfG

dreadbrain
17.08.2008, 19:52
Hi,

@picture

Es wäre möglich einen Interrupt-Pin zu benuten und wenn nötig auch 2 andere Pins.

Wenn ich meine Idee so überdenke mit einem Takt und einer Richtung, dann kann es sein der 2. Controller ein paar Impulse verliert.
Mit dem Lösch-Signal hört sich das besser an.

Nur da muss der Hauptcontroller genug oft antworten sonst verlier ich auch die Impulse, oder versteh ich das falsch?

mfg Benedikt

PICture
17.08.2008, 20:32
Wenn die Hardware um den Encoder bei jeder Drehung um eine Position ein Impuls erzeugt und ein Interrupt auslöst, der die Richtung in ISR einliest, könnte sich die Richtung mit neuem Wert überschreiben und braucht nicht gelöscht werden. Dann braucht man nur 2 Eingangspins beim µC und verliert keine Impulse. Es ist also mit dem Interrupt-Pin (Takt) besser und einfacher.

Ich habe das so überdenken und die einfachste Schaltung, die mir eingefallen ist, im Code skizziert.

Der NAND (N1) mit dem D-Flipflop (FF1) bilden einen Monoflop, dessen Impulslänge (Entprellen und Takt um 10ms) wird von R und C bestimmt. Die Werte können erst nach der Festlegung der Logik-Familie berechnet bzw. ermittelt werden. Die Diode (D) beschleunigt nur die Entladung vom C und kann bei niedriger Drehzahl (Hand) weg gelassen werden.

Die übrigen 2 NAND Gattern (N3 und N4) dienen als Ausgangstreiber. Die Schaltung wurde noch nicht ausprobiert, sollte aber funktionieren.

MfG

Vcc
+
|
+----+
| | _
| .--o--. +-| \
+-------------------|D S Q|-+ |N3)o---> Richtung
| | | _ _| +-|_/
| +---|T R Qo
| Vcc | | '--o--'
| + | | FF2|
| | | +----+
| +----+ |
| | | | _
| | .--o--. | +-| \
Drehencoder D1| _ +-|D S Q|-|--+--+-----+ |N4)o---> Takt
o-+-| \ | _ _| | | | +-|_/
+-o-_ |N1)o-|T R Qo-+ .-. |
| o---|_/ '--o--' R| | - D N1,N2,N3,N4=74XX00
=== D2 FF1| '-' ^
Gnd | _ | | FF1,FF2=74XX74
| / |-+--+
+-o(N2| |
\_|-+
|
- C
-
|
===
Gnd

dreadbrain
18.08.2008, 10:46
Hi,

Danke, für diesen Plan.
Ich werde ihn mir mal durchdenken und dann aufbauen.
ich hab nur ein problem, ich habe die passenden IC´s nicht zuhause.
(Ich möchte auch ungern bestellen, da ich , wenns nicht funtkioniert, erneut bestellen müsste und das belastet einen Azubi-Geldbeutel dan doch etwas)
Hab nur folgende IC´s:
74LS73: JKFF, auf negative Flanke getriggert
-daraus könnte man sich mit 2 Not doch auch ein D-FF bauen können wenn ich nicht irre, oder?
Das D Signal auf den J Eingang und über das NOT auf den K -Eingang, um das ganze positiv zu triggern dan ganz einfach noch ein NOT for den Takt dan sollte es dem 74xx74 entsprechen.

HEF4518:
D-Latch
Waren 4 D-FF´s in einem Gehäuse, nur das der Reset aller verbunden ist.
Wird deshalb nicht Funktionieren, weil das obere D-FF auch mit zurückgesetz wird, wenn das untere Monoflop zurückfällt, oder?

CD4081:
quad 2-input NAND
Das sollte so passen.

Könntest du mir erklären wie ich die Lade/Entladezeit der RC-Kombi für den CD4081 oder für einen 74HCT00 , bzw. 74HC00 (einen von denen werde ich dann später, falls die Schaltung läuft, auf der neuen Platine einsetzen)berechne?

t=R*C
aber was ist mit dem Strom der ins Gatter fließt, und den Schaltschwellen?

und noch eine Frage:
An den Drehencoder müssen schon noch Pullups, oder?

mfg Benedikt

PICture
19.08.2008, 08:07
Hallo!

Wenn du keine Inverter hast, kannst du die Schaltung leider nicht aufbauen, da der 4081 kein NAND, sondern AND ist.

Alle deine Fragen kann ich mit ja beantworten. Die pull-ups habe ich vergessen, weil ich im Kopf die LS gehabt habe und die brauchen sie nicht.

Bei MOS fließt der Strom nur durch R, weil die Gatter praktisch unendlichen Eingangswiderstand haben. Bei TTL bei 0V auf dem C fließt ein Strom von dem Eingang bis die Spannung H-Pegel erreicht. Für standard TTL ist der innere Widerstand ca. 4k und für LS ca. 40k zum +Vcc. Als Ausgangswerte für ca. 10ms kannst du R=100k und C=0,1 µF für MOS nehmen.

Die Schaltschwellen kannst du entsprechendem Datenblatt entnehmen. Wenn ich mich nicht irre, für TTL liegt die Schwelle bei ca. 1,4V und für MOS ca. 0,5*Vcc also für Vcc=5V um 2,5V.

Ich habe die Schaltung für ein Flip-Flop, der auf negative Flanke reagiert, skizziert. Es geht aber nur mit NAND Gatter z.B. 4011 bzw. 4093. Wenn du zumindest Inverter hast kannst du anstatt N1+N3 ein AND aus deinem 4081 nehmen und die Gatter N2 und N4 sind sowieso als Inverter geschaltet. Im Notfall kann man die Inverter mit Transistoren aufbauen.

MfG

Vcc
+
|
.-.
| | Rpu
'-' 10k
| .-----.
+---------------+--------------|J Q|-----> Richtung
| | +----|> _|
| | _ +-|----|K R Qo
| +-| \ | | '--o--'
| | |N4)o-+ | | FF2
| +-|_/ | +
| | Vcc
| Vcc |
| + | +--------------> Takt
Drehencoder D1| _ _ | .-----. | |
o-+-| \ +-| \ +-|J Q|-+-|--+
+-o-_ |N1)o-+ |N3)o---|> _| | |
| o-+-|_/ +-|_/ +-|K R Qo---+ .-.
=== D2| | '--o--' | | R
Gnd .-. === | FF1 '-'
| | Rpu Gnd | _ |
'-' 10k | / |---+ N1,N2,N3,N4=CD40XX
| +-o(N2| | FF1,FF2=74LS73
+ \_|---+
Vcc |
- C
-
|
===
Gnd

dreadbrain
19.08.2008, 11:17
Hi,
danke das du die die Mühe gemacht hast und die Schaltung auf die FFs umgeändert hast.
Das mit dem 4081 stimmt, es ist ein AND und kein NAND
sorry war mein Fehler.

einen 7404 Inverter hab ich da.

Wenn ich heute mal Zeit hab, dann steck ich das mal auf.
Hoffe das es mit den Verschiedenen Arten von IC´s(LS, Cmos) funktioniert.
Hatte damit in der Arbeit schon manchmal Probleme

Danke!
Werde darüber berichten, wies funtkioniert hat.
Wens super läuft könnte man das ja als Miniprojekt für andere öffentlich machen.

mfg Benedikt

dreadbrain
19.08.2008, 13:33
Hallo,
ich hab die Schaltung mal aufgesteckt.
für N1 und N3 hab ich ein AND benutzt und für N4 ein NOT, N2 hab ich aus einem AND und einem NOT zusammengebaut ( um die hochohmigen Eingänge des CMOS zu nutzen)

Die Takterzeugung klappt wunderbar, nur das Richtungssignal ist fehlerhaft.
Es ist meist High und springt nur kurz auf low.
Ab und zu bleibts auch auf low stehen, aber beim nächsten Impuls wechselt es meist.
Ich denke es liegt an den Unentprellten Daten an J und K.

Ich versuche mal die zu Entprellen mit einem TP oder evtl. fällt mir etwas anderes ein wie ich die Richtungsanzeige verbessern könnte.

mfg Benedikt

dreadbrain
19.08.2008, 19:30
Hallo,
hab schon probiert, das Signal vom Encoder, dass das FF für die Richtung ansteuert per TP zu entprelln, leider ohne Erfolg.
Dan hab ich die Entrpellzeit des Monoflops erhöht(anstat 100nF, 200nF), und es funtkioniert, besser aber noch nicht perfekt.
Es schaltet zwar in 75% der Fälle in die Richtige Richtung, wechselt aber dan beim Weiterdrehen immer Kurz in den anderen Zustand.
Diese Verhalten kann ich mir nicht erklären, weil ja durch das verlängern der Zeit des Monoflops der "Speicherzeitpunkt" des Richtungs-FF nach hinten verschoben wird, also in Richtung wechsel des abgefragten Encoderkontaktes.


Wenn ich die Zeit weiter erhöhe verschlechtert sich das Resultat wieder.


Bin z.Z. etwas ratlos.

mfg Benedikt

dreadbrain
19.08.2008, 19:47
Hi, hab mir die Schaltung noch mal angesehen:
http://www.dse-faq.elektronik-kompendium.de/dse-faq.htm#F.29
würde die gerne mal ausprobieren.

Muss mal schauen ob ich irgendwo nen TTL-Takt herbekomme

mfg Benedikt

PICture
20.08.2008, 07:11
Hallo!

Es ist mit der Impulslänge des Monoflops wirklich kritisch. Wenn es 100nF zu wenig ist, ist wahrscheinlich 200nF schon zu viel. Du kannst noch dazwischen probieren und bei irgendeinem Wert sollte es klappen. Es wäre einfacher ein C=100nF und seriell mit dem R=100k noch ein 100k Poti nehmen.

Die Schaltung ist asynchronisch und einfach, daher aber kritisch wenn es um die Drehgeschwindigkeit und Entprellzeit geht. Eine synchronische Schaltung mit festem Takt (z.B. 100 Hz) wird sicher besser aber auch komplizierter.

MfG

dreadbrain
20.08.2008, 10:45
Hallo,

mh habs mit dem Poti schon probiert und egal was man einstellt wird entweder die eine oder die andere Richtung sicher erkannt.

Bin grad am überlegen ob ich nicht doch einen kleinen µC(Tiny oder mega8) und den dann den Encoder auswerten lasse auf Takt und Richtung.

Das hat erstens die Vorteile, dass man so lange probiern kann bis es läuft und es verschiedenste Methoden gibt wie man das angehen kann.
z.B. Polling oder mit 2 Interrupts
wie hier:
z.B.
http://www.mikrocontroller.net/topic/1503
oder deine Version.

Ich muss nur bis nächste Woche warten, biss ich mein µC Board mit ATmega16 wieder zur Verfügung hab und dann werd ich mal probiern so etwas zu proggen.
Da könnte man dan noch so Spielereien wie Impulsvervielfachung(zum durchscrollern größerer Meßbereiche) oder Abfrage über TWI machen.


mfg Benedikt

PICture
21.08.2008, 06:55
Hallo!

Deine Beschreibung zeigt, dass die Impulslänge auf einem Pin des Drehencoders für jede Drehrichtung unterschiedlich ist. Deswegen habe ich kleine Änderung in der Schaltung gemacht (siehe Code). Jetzt ist die negative Flanke am Takt des FF2 von dem Monoflop unabhängig, was den Fehler beseitigen sollte.

Die Impulslänge des Monoflops sollte so lang sein, dass die Interrupt auslösende Flanke erst kommt, wenn die Richtung schon stabil im FF2 gespeichert ist.

Wenn es jetzt nicht richtig funktioniert, lässt sich es mit so einfacher Schaltung nicht realisieren.

MfG

Vcc
+
|
.-.
| | Rpu
'-' 10k
| .-----.
+-----------------+--------------|J Q|-----> Richtung
| | +----|> _|
| | _ +-|----|K R Qo
| +-| \ | | '--o--'
| | |N4)o-+ | | FF2
| +-|_/ | +
| +-------------------------+ Vcc
| | Vcc
| | + +--------------> Takt
Drehencoder D1| | _ _ | .-----. |
o-+-|-| \ +-| \ +-|J Q|---|--+
+-o-_ | |N1)o-+ |N3)o---|> _| | |
| o-+-+-|_/ +-|_/ +-|K R Qo---+ .-.
=== D2| | '--o--' | | R
Gnd .-. === | FF1 '-'
| | Rpu Gnd | _ |
'-' 10k | / |---+ N1,N2,N3,N4=CD40XX
| +-o(N2| | FF1,FF2=74LS73
+ \_|---+
Vcc |
- C
-
|
===
Gnd

dreadbrain
21.08.2008, 17:02
Hallo,
danke das du dir die Mühe gemacht hast, den Schaltplan noch mal anzupassen.

Jetzt ist das Richtungssignal in beide Richtungen gleich unstabil.
Aber da ja jetzt nur der Zustand des Richtungssignals bei negativer Taktflanke zählt, kann ich das mit meinem Analogoszi nicht sicher sagen wie es sich jetzt verhält.

Deshalb muss ich bis nächste Woche warten bis ich wieder ein Controllerboard hier habe.
Der Controller kann dan präzise sagen ob sich die Richtung bei fallender Flanke genau auslesen lässt.





mfg Benedikt

PICture
21.08.2008, 20:05
Hallo!

Du kannst einfach auf einen Ausgang des FF2 eine LED mit Vorwiderstand anschließen und feststellen, ob nach Drehen des Drehencoders die Richtung richtig gespeichert wurde. Im schlimmsten Fall muss man noch am Takt des FF2 die Flanken mit einem Monoflop säubern und dann wird die Fehler verursachende unsaubere steigende Flanke eliminiert.

MfG

dreadbrain
22.08.2008, 13:50
Hallo,
ich schau mir die Signale auf dem Oszilloskop an.
Und nach dem Drehen wird das Richtungssignal nicht richtig gespeichert, er ändert sich aber während der Drehung mehrmals.
Es könte ja deshalb sein, das genau nach der negativen Taktflanke, die passende Richtung anliegt, das würde ja dem µC reichen.
Aber mit meinem Analogoszi kann ich diesen kurzen Zeitpunkt nicht sicher beobachten.

mfg Benedikt

PICture
23.08.2008, 07:00
Hallo!

Damit es verständlicher wird, habe ich jetzt die Signale aus der vorletzter Schaltung im Code skizziert. Alle Flanken von D1, D2 und D1&D2 sind unsauber und bestehen aus mehreren steigenden und fallenden Flanken. Die fallende Flanke von Monoflop (MF), wenn die Impulslänge länger als das Prellen der Kontakte ist, ist sauber und wenn sie zwischen der fallender Flanke von D1&D2 und fallender Flanke von D1 (für 2. Richtung) kommt, müsste die Richtung (der Pegel von D1) richtig gespeichert sein.

Es könnte auch sein, das der Drehencoder nicht richtig angeschlossen ist oder generiert andere Signale. Dann sind die D1 und D2 nicht so wie skizziert und das ganze kann nicht richtig funktionieren. Ich würde noch die Signale D1 und D2 vom Drehencoder kontrollieren.

MfG

______
D1 ___| |______
______ 1. Richtung
D2 ______| |___


______
D1 ______| |___
______ 2. Richtung
D2 ___| |______

___
D1&D2 ______| |______
_
MF __________| |____

dreadbrain
23.08.2008, 09:47
Hallo,
die Funtkion der Schaltung ist mir vom Prinzip her klar.
Aber die Ursache der Fehlfunktion kann ich nur schwer lokalisieren.

Habe anbei das Datenblatt des Encoders.
Laut diesem stimmt meine Anschlussbelegung und das Signal.
Ich aber demnächst mal probieren ob das Signal auch aus dem Encoder kommt.

mfg Benedikt

PICture
23.08.2008, 10:02
Laut Datenblatt des Encoders sollte das Prellen unter 5 ms sein. Ich weiß nicht, ob du den Impuls von MF gemessen hast. Vielleicht ist es bei R=100k und C=100nF schon zu lang? Ich habe beim PIC eine Verzögerung um 10 ms benutzt und es hat einwandfrei funktioniert.

MfG

dreadbrain
09.09.2008, 20:26
Hallo,
ich hab in zwischen mal probiert den Encoder per µC auszulesen

Hab verschiedene Methoden wie State Machine, Bascom-Befehl etc. ausprobiert und bin mit oder ohne hardwaremäßigen Tiefpass auf keinen grünen Zweig gekommen.
Hab auch versucht die Signale des Encoders mal zu checken, nur ist das mit meinem analog Oszi nicht möglich.

Ich hab nämlich den Verdacht das der Encoder defekt oder von mindere Qualität ist, da ich bei langsamen drehen und beobachten der Pegel nie die Richtigen abfolgen 100% beobachten kann.
Außerdem ändern sich schon die Pegel wenn man den Encoder nur etwas erschüttert.

Ich probier nächste Woche mal einen Encoder aus einer alten Maus aus.
Der sieht zwar minderwertiger aus, muss aber funktionieren da er in der Maus als Scrollrad auch gelaufen ist.

Werde mich dann wieder melden.

mfg Benedikt