mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wie funktioniert diese diskrete Drehgeberauswertung


Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

TravelRec hat mich auf eine Idee gebracht Drehgeber in meinem Projekt 
einzusetzen.

Ich müsste dazu 3 Drehgeber mit einem AVR auswerten.

Ich hab jetzt den Artikel

http://www.mikrocontroller.net/articles/Drehgeber

gelesen und am Ende wird eine diskret aufgebaute Auswertung beschrieben, 
die ich leider nicht ganz verstehe.

Kann mir einer von euch grob das Prinzip davon erläutern? Würde das 
meinen AVR entlasten / Pins sparen??

Alternativ, wie kann ich Drehgeber am besten muxen?


Gruß
Tom

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Thomas Burkhart (escamoteur)

>TravelRec hat mich auf eine Idee gebracht Drehgeber in meinem Projekt
>einzusetzen.

Was für Drehgeber?
Welche für manuelle Eingabe?
ODer welche für eine Motorsteuerung?

>Kann mir einer von euch grob das Prinzip davon erläutern?

Steht das nicht im Artikel?

> Würde das meinen AVR entlasten / Pins sparen??

Dafür ist sie nicht gedacht. Dort muss man einen Zähler anschliessen, 
also einen 74xxirgendwas Baustein.

>Alternativ, wie kann ich Drehgeber am besten muxen?

Nein. Wenn du mehr Pins brauchst, nimm einen grösseren Controller oder 
Schieberegister.

MFG
Falk

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Würde das meinen AVR entlasten / Pins sparen??
Es macht keinen Sinn, diese Schaltung an einen AVR anzuschliessen, weil 
die beiden Ausgangssignale einen Zähler brauchen, der einen Richtungs- 
und einen Takteingang hat. So etwas bieten AVR-uC nicht.

>Kann mir einer von euch grob das Prinzip davon erläutern?
Grob gesagt ist das ein Graycode-Zähler, der beim Weiterschalten Takt 
und Richtungssignale ausgibt.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für langsame Drehgeber (<1000 Wechsel/s) kann man drei davon auch direkt 
an einer AVR-Port anschließen und auswerten.
Dabei wird der Port mit ca. 5-10kHz eingelesen, mit dem vorherigen 
Zustand verglichen und bei einer Pegeländerung der betreffende Zähler 
auf-/abgezählt.

Das ist recht einfach, wenn man darauf achtet, den AVR nicht mit 
kleinster Taktrate, sondern mit höchster Frequenz zu betreiben 
(16-20MHz).

Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk: Geht um einen Manuellen drehgeber. Ist bei der Anwendung 
(Laustärkeregelung) auch nicht schlimm wenn man ein Impuls verloren 
geht.

Prinzip Drehgeber habe ich verstanden, mich hat nur interessiert was die 
diskret aufgebaute Schaltung macht.

Also 2 Pins pro Drehgeber spendieren? Macht dann 6 Pins

Und per Timer-IRQ pollen?


Wieso kann ich nicht die 2 Pins mit 2 Selectpins muxen?

Wie macht man so was mit einem Schieberegister?? Alle drehgeber an 1 
Schieberegister anschließen und dann beim Pollen den Schieberegister auf 
einmal auslesen und sich anschauen welche Bits sich verändert haben??

Gruß
Tom

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Thomas Burkhart (escamoteur)

>Prinzip Drehgeber habe ich verstanden, mich hat nur interessiert was die
>diskret aufgebaute Schaltung macht.

Das Gleiche wie die Softwarelösung.

>Also 2 Pins pro Drehgeber spendieren? Macht dann 6 Pins
>Und per Timer-IRQ pollen?

Ja.

>Wieso kann ich nicht die 2 Pins mit 2 Selectpins muxen?

Nicht sinnvoll/praktikabel.

>Wie macht man so was mit einem Schieberegister?? Alle drehgeber an 1
>Schieberegister anschließen und dann beim Pollen den Schieberegister auf
>einmal auslesen und sich anschauen welche Bits sich verändert haben??

Ja, siehe AVR-Tutorial: Schieberegister

MFg
Falk

Autor: Jens PICler (picler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Burkhart schrieb:
>
> Wieso kann ich nicht die 2 Pins mit 2 Selectpins muxen?

Wieso sollst du das nicht können. Dafür brauchst du allerdings einen 
MUX-IC z.B. 74LS253. Das erhöht allerdings den Aufwand bei der 
Auswertung etwas und verursacht etwas mehr Rechenleistung.

> Wie macht man so was mit einem Schieberegister?? Alle drehgeber an 1
> Schieberegister anschließen und dann beim Pollen den Schieberegister auf
> einmal auslesen und sich anschauen welche Bits sich verändert haben??

Genau so wird es gemacht. Allerdings kostet ein Schieberegister auch 
extra Rechenleistung, weil die Daten erst seriell eingelesen werden 
müssen. Deshalb mein Tipp, einen Controller mit mehr IO-Pins zu nehmen. 
Stand weiter oben schon mal...

Autor: Thomas Burkhart (escamoteur)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

würde das demnach so funktionieren? Sehe ich das richtig, dass ich dazu 
die internen Pullups aktivieren muss??

Gruß
Tom

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Schaltung ist aber ein bißchen ungeschickt.
Alle Drehgeber an PORT A würde das Einlesen vereinfachen und 
beschleunigen.

Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Hinweis, hast natürlih recht. Wollte mir nur nicht alle 
ADC-Ports zubauen.

Werds aber wohl ändern.

Gruß
Tom

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Alle Drehgeber an PORT A würde das Einlesen vereinfachen und
> beschleunigen.

Nicht unbedingt...

Vorteilhafter wäre es, immer dieselben Bits der verschiedenen Ports zu 
benutzen. Denn dann könnte einunddieselbe Decodier-Routine ohne 
Bit-Kopier-Orgien nacheinander für alle Drehgeber benutzt werden. Beim 
Decodier-Verfahren mittels LUT ist es auch zweckmäßig (übersichtlicher), 
jeden Encoder einzeln zu bearbeiten. Da jeder Encoder einen 4-Bit-Index 
auf die LUT braucht, lassen sich sowiso nur 2 Encoder zusammen 
auswerten, vor den LUT-Zugriffen muss das Byte doch wieder zerlegt 
werden, da kann man es auch gleich separat machen.

...

Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, guter Punkt!

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Nicht unbedingt...

Aber sicher doch :-)
Normalerweise wird an den Drehgebern nichts passieren. Somit sollte 
dieser Zustand höchste Geschwindigkeit/Priorität bekommen.
Wenn alle paarweise an einem Port liegen reicht im Interrupt der 
einfache Vergleich:
if(porta == alt_porta) return;  // schon fertig

Bei einer Änderung von Port A werden immer die beiden unteren Bits von 
temp (temp=Zustand von Port A) ausgewertet und danach temp um 2 Stellen 
nach rechts geschoben.


>Hmm, guter Punkt!
So ist es!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.