Forum: Mikrocontroller und Digitale Elektronik Maxon Encoderauswertung


von testuser (Gast)


Lesenswert?

Hallo,

ich habe folgendem Datenblatt den Encoder 110511, den ich gerne 
auswerten würde:
http://www.maxonmotor.de/medias/sys_master/8806565412894/13_305-306_DE.pdf

Jetzt habe ich in einem anderen Beitrag im Forum gelesen, dass es zu 
Problemen führen kann, wenn ich diesen Encoder bei einer maximalen 
Drehzahl von 10000Umd/min über die Interrupt Eingänge auswerten möchte.

Das bedeutet an meinem Atmega 8 wären bei 10000 Umd/min 83333 Imp/s, die 
er über die Interrupeingänge auswerten müsste.
Ich takte den Controller mit 16Mhz. Ich bin mir leider nicht im klaren, 
wie schnell er die Interrupeingänge abtasten kann und dadurch die 
Drehzahl berrechnen kann. Geht sich das aus?

Andernfalls könnte man das Problem ja auch vielleicht mit einem Counter 
IC lösen oder?

Danke für eure Antworten!

Liebe Grüße

von Nop (Gast)


Lesenswert?

testuser schrieb:
> Jetzt habe ich in einem anderen Beitrag im Forum gelesen, dass es zu
> Problemen führen kann, wenn ich diesen Encoder bei einer maximalen
> Drehzahl von 10000Umd/min über die Interrupt Eingänge auswerten möchte.

Es kann deshalb zu Problemen führen, da evtl. die Interruptlast so groß 
wird dass Dein Hauptprogramm nicht mehr/nicht mehr richtig ausgefürht 
wird.

testuser schrieb:
> Das bedeutet an meinem Atmega 8

Muss es ein ATMEGA8 sein? Es gibt auch Controller mit integriertem 
Quadraturencoder...da macht Dir die ganze Arbeit die Logik im 
Controller. Dir würde also die volle Performance des Controllers zur 
Verfügung stehen.

testuser schrieb:
> Andernfalls könnte man das Problem ja auch vielleicht mit einem Counter
> IC lösen oder?

Für Geschwindigkeit brauchst Du ja Impulse pro Zeiteinheit oder Zeit 
zwischen Impulsen.
Du müsstest also entweder einen freilaufenden Timer haben der bei 
steigender Flanke startet und bei der nächsten steigenden Flanke stopt 
--> Timerinhalt = Periodendauer.
Oder Du bräuchtest einen Zähler der z.B. alle Sekunde zurückgesetzt 
wird. Bei jedem Reset müsstest Du dann den Zählerinhalt latchen. Das 
wären dann die Impulse pro Sekunde --> Rückrechnung auf Geschwindigkeit 
in RPM.

Normalerweise verwendet man eine Kombination aus beiden Verfahren. Also 
bei langsamen Geschwindigkeiten misst man die Zeit zwischen Impulsen, 
bei schnellen Geschwindigkeiten misst man die Impulse pro Zeiteinheit.

von testuser (Gast)


Lesenswert?

> Muss es ein ATMEGA8 sein? Es gibt auch Controller mit integriertem
> Quadraturencoder...da macht Dir die ganze Arbeit die Logik im
> Controller. Dir würde also die volle Performance des Controllers zur
> Verfügung stehen.

Nein, es muss nicht unbedingt ein ATmega 8 sein. Leider kenne ich keinen 
mit einem Quadraturencoder. Kennst du von Atmel Controller die eine 
solche Logik haben? Aus der ATMEGA oder XMEGA Serie?

Wenn ich einen solchen Kontroller verwende, so würde mir dann die 
Quadraturencoder Logik die Drehrichtung und für die Geschwindigkeit ein 
Taktsignal ausgeben oder?

Wie wäre es dann intelligent im Programm vorzugehen? Also auf die Weise 
mit dem Timer mit Flankenauswertung oder einen Counter, der über einen 
fixen Zeitraster zählt?

Danke für deine Hilfe.

Grüße

von klausy (Gast)


Lesenswert?

ATxmega128A1, läuft allerdings nur mit 3,3V und kann max. 16Bit in 
Hardware

von spess53 (Gast)


Lesenswert?

Hi

>Kennst du von Atmel Controller die eine
>solche Logik haben? Aus der ATMEGA oder XMEGA Serie?

Haben alle XMega.

MfG Spess

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

Für die Enddrehzahl ist der Encoder schlicht zu hochauflösend. Hat der 
Motor keine Hallsensoren, die du auswerten kannst? Oder musst du mit der 
Drehzahl auch noch weit runter regeln können?

Mit freundlichen Grüßen
Thorsten Ostermann

von Falk B. (falk)


Lesenswert?

@ testuser (Gast)

>Das bedeutet an meinem Atmega 8 wären bei 10000 Umd/min 83333 Imp/s, die
>er über die Interrupeingänge auswerten müsste.

Sehtr viel für eine Softwareauswertung. Zuviel.

>wie schnell er die Interrupeingänge abtasten kann und dadurch die
>Drehzahl berrechnen kann. Geht sich das aus?

Nutze für niederige Drehzahlen die Encoderfunktion und für hohe 
Drehzahlen das Indexsignal.

von Nop (Gast)


Lesenswert?

testuser schrieb:
> Nein, es muss nicht unbedingt ein ATmega 8 sein. Leider kenne ich keinen
> mit einem Quadraturencoder. Kennst du von Atmel Controller die eine
> solche Logik haben?

Ich nutze mehr die Piccolos von TI. Da z.B. der TMS320F28032.
Hier ein UserGuide mit ein paar Erklärungen:
http://www.ti.com/litv/pdf/sprufk8

Oder die NXP Fraktion hat das auch drin:
http://www.nxp.com/documents/user_manual/UM10360.pdf

STM natürlich auch...

von Nop (Gast)


Lesenswert?

testuser schrieb:
> Wenn ich einen solchen Kontroller verwende, so würde mir dann die
> Quadraturencoder Logik die Drehrichtung und für die Geschwindigkeit ein
> Taktsignal ausgeben oder?

Drehrichtung und (teilweise) schon "fertige" Geschwindigkeit.

von testuser (Gast)


Lesenswert?

Hallo,

schon mal vielen Dank für die ganzen Antworten.
Als Kontroller würde ich doch lieber für dieses Projekt bei einem ATmega 
bleiben, da ich einfach viel mehr Erfahrung mit denen schon gemacht 
habe.

Das bedeutet ich würde eher auf einen fertigen IC tendieren, der mir die 
Drehrichtung und die Drehzahl zum ATmega weiter gibt.
Kennt ihr da einen IC der das schafft?

Möglicherweise kann ich auch einen Atmega verwenden, der noch schneller 
als 16Mhz taktet.

Ich habe auch einen Indexausgang am Drehgeber. Für was wird der in der 
Praxis verwendet? Kann man den in Bezug auf mein Problem gut einsetzen?

Danke!

von Falk B. (falk)


Lesenswert?

@ testuser (Gast)

>
>Ich habe auch einen Indexausgang am Drehgeber. Für was wird der in der
>Praxis verwendet?

Um den Winkel 0° zu erkennen, das kann ein normaler Drehgeber 
nämlich alleine nicht. Er liefert exakt einen Puls pro Umdrehung, der 
genauso breit ist wei ein Codeschritt des Encoders.

> Kann man den in Bezug auf mein Problem gut einsetzen?

Beitrag "Re: Maxon Encoderauswertung"

von Genervter (Gast)


Lesenswert?

> über die Interrupeingänge auswerten

Wurde schon gefühlt eine Million im Forum erwähnt, dass Interrupt bei 
Encoder-Auswertung Blödsinn ist.

UNd überhaupt, willst Du Position oder Geschwindigkeit messen?

von testuser (Gast)


Lesenswert?

> Um den Winkel 0° zu erkennen, das kann ein normaler Drehgeber
> nämlich alleine nicht. Er liefert exakt einen Puls pro Umdrehung, der
> genauso breit ist wei ein Codeschritt des Encoders.

Alles klar, aber den sollte es ja möglich sein ab einer gewissen 
Drehzahl, bei der der Kontroller Probleme kriegt einfach auf den 
Indexkanal zur Auswertung umzusteigen. Das bedeutet ich habe dann für 
obere Drehzahlen viel weniger Auflösung. Bei 10000Umd/min wären das dann 
genau 10000Imp/min am Indexkanal und somit eine Frequenz von 166 Hz.

Ab welcher Drehzahl denkst du sollte man von der Encoderfunktion zum 
Indexsignal wechseln?
Ist das Indexsignal ausreichend für eine halbwegs genaue 
Drehzahlbestimmung im oberen Drehzahlbereich?
Bezüglich der Auswertung der Drehrichtung könnte ich doch auch einfach 
D-FlipFlops verwenden. Schaffen die die hohe Impulsrate?

Danke!

von M. N. (Gast)


Lesenswert?

testuser schrieb:
> Das bedeutet ich würde eher auf einen fertigen IC tendieren, der mir die
> Drehrichtung und die Drehzahl zum ATmega weiter gibt.
> Kennt ihr da einen IC der das schafft?

Wenn Du ihn verwenden möchtest, kann ich Dir einen THCT12024 schenken. 
Der schafft ein paar MHz und wird parallel über einen 8-Bit-Bus 
ausgelesen.

Oder man verwendet einen separaten AVR (ATmega48) und liest ihn per 
IIC-Bus aus. Hier eine Schaltung, mit der man 100kHz Quadratursignale 
erfassen kann: http://www.mino-elektronik.de/mt12_iic/mt12_iic.htm
Der OPV samt Beschaltung wird bei Rechtecksignalen nicht benötigt. Bei 
Bedarf könnte man die Eingangssignale per D-FF mit 400kHz 
synchronisieren, was aber in der Regel nicht nötig ist, wenn diese von 
einem optischen Drehgeber oder Hallsensoren kommen.

Genervter schrieb:
> Wurde schon gefühlt eine Million im Forum erwähnt, dass Interrupt bei
> Encoder-Auswertung Blödsinn ist.

Und es stimmt dennoch nicht!

von testuser (Gast)


Lesenswert?

> UNd überhaupt, willst Du Position oder Geschwindigkeit messen?

Es geht mir nur um die Geschwindigkeit.

So gut jetzt habe ich drei Varianten, die in Frage kommen.

1) Die mit dem Texas IC...
2) Atmega48 @ 20Mhz mit Auswertung von A/B und bei hohen Drehzahlen 
Indexsignal
3) externer Atmega48@20Mhz der mir über I2C die Daten an meinen 
Hauptkontroller schickt.

Leider bin ich mir nicht im klaren welche Variante ich verwenden soll...

von Floh (Gast)


Lesenswert?

testuser schrieb:
> Es geht mir nur um die Geschwindigkeit.

Wie genau und wie schnell möchtest du die Geschwindigkeit erfassen?

Falls es ausreicht, würde ich dann nur das Indexsignal nehmen. Das 
Indexsignal lässt sich dann z.B. an einen Impuls Capture Pin anschließen 
und man müsste mit aktiviertem Timer nur ein Register für die 
Geschwidigkeit (eigentlich die Zeit für eine Umdrehung) auslesen.
Man muss halt gegenenfalls den Timervorteiler anpassen, um eine 
hinreichend gute Auflösung zu bekommen.

von testuser (Gast)


Lesenswert?

Floh schrieb:
> testuser schrieb:
>> Es geht mir nur um die Geschwindigkeit.
>
> Wie genau und wie schnell möchtest du die Geschwindigkeit erfassen?
>
> Falls es ausreicht, würde ich dann nur das Indexsignal nehmen. Das
> Indexsignal lässt sich dann z.B. an einen Impuls Capture Pin anschließen
> und man müsste mit aktiviertem Timer nur ein Register für die
> Geschwidigkeit (eigentlich die Zeit für eine Umdrehung) auslesen.
> Man muss halt gegenenfalls den Timervorteiler anpassen, um eine
> hinreichend gute Auflösung zu bekommen.

Hm ja die Drehzahl sollte schon auf 10-20Umd/min genau sein.
Würde sich das ausgehen?

von Falk B. (falk)


Lesenswert?

@ testuser (Gast)

>obere Drehzahlen viel weniger Auflösung. Bei 10000Umd/min wären das dann
>genau 10000Imp/min am Indexkanal und somit eine Frequenz von 166 Hz.

Jo. Das ist fast Zeitlupe.

>Ab welcher Drehzahl denkst du sollte man von der Encoderfunktion zum
>Indexsignal wechseln?

Das haben wir mal im 4. Semester in Messtechnik berechnet. Ganz einfach. 
Nämlich dann, wenn die Signalfrequenz höher als deine Referenzfrequnez 
ist, in diesem Fall der Takt deines Mikrocontrollers.

>Ist das Indexsignal ausreichend für eine halbwegs genaue
>Drehzahlbestimmung im oberen Drehzahlbereich?

Mal gerechnet?

Bei 10 MHz CPU-Takt kann man 166 Hz/6ms über eine Periodendauermessung 
auf +/-100ns genau bestimmen, das sind 100ns/6ms = 16,6ppm oder 0,0016% 
bzw. 0,16 U/min.

Wo macht man nun den Schnitt? Bei langsamen Drehzahlen wird die 
Periodendauer recht groß, das kann man zwar sehr hochauflösend messen, 
es dauer aber deutlich länger. Der Encoder liefert 500 Pulse/U, d.h. er 
hat die 500fache Frequenz, die Periode ist somit 500 mal kürzer im 
Vergleich zum Indexsignal.

Nun must du festlegen, welche maximale Messzeit du haben willst. 100ms? 
1s? Daraus kannst du dann errechnen, bei welcher Drehzahl du von Encoder 
auf Indexmessung umschalten musst.

>Bezüglich der Auswertung der Drehrichtung könnte ich doch auch einfach
>D-FlipFlops verwenden. Schaffen die die hohe Impulsrate?

Locker. Aber das allein reicht nicht, man muss die dekodierte 
Information auch sinnvoll weiterverarbeiten. Für eine Drehzahlmessung 
braucht man auch einen Inkremantalgeber.

von testuser (Gast)


Lesenswert?

> Nun must du festlegen, welche maximale Messzeit du haben willst. 100ms?
> 1s? Daraus kannst du dann errechnen, bei welcher Drehzahl du von Encoder
> auf Indexmessung umschalten musst.

Ja ist für mich leider relativ schwer zu sagen, da ich die Drehzahl im 
späteren auch noch regeln möchte.
Ich bin mir leider nicht sicher wie schnell ich die Drehzahl neu 
bestimmen muss um eine gute Regelung der Drehzahl zu ermöglichen.


> Locker. Aber das allein reicht nicht, man muss die dekodierte
> Information auch sinnvoll weiterverarbeiten. Für eine Drehzahlmessung
> braucht man auch einen Inkremantalgeber.

Ja ist klar. Ich wollte mit den FlipFlops nur die Drehrichtung 
auswerten. Die Drehzahl muss dann natürlich noch ermittelt werden.

von Falk B. (falk)


Lesenswert?

fang mal klein an und bau erstmal eine einfache Sache. Die 
Drehzalmessung. Sagen wir mit 100ms Messzeit. Das sind 10 Hz bzw. 
600U/min. Darunter schaltest du auf die Encodermessung um, der liefert 
dann 5kHz. Mit der Input Capture Funktion kann man das sehr einfach sehr 
genau messen.
Wenn das mal halbwegs läuft, kannst du die Regelung angehen.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Für niedrige Drehzahlen kannst du die klassische Softwareabtastung 
beider Encoder-Kanäle verwenden. Für hohe Drehzahlen lässt du die Pulse 
eines der beiden Encoder-Kanäle von einem Hardware-Zähler des ATmega 
zählen (der ist schnell genug). Damit ist bei hohen Drehzahlen zwar 
keine Richtungserkennung mehr möglich, aber bei hohen Drehzahlen ist 
auch keine Richtungsänderung zu erwarten.

von M. N. (Gast)


Lesenswert?

Wenn ich es richtig verstanden habe, wird die Position des Motors gar 
nicht gebraucht, sondern nur Drehrichtung und Drehzahl.

Die Drehzahl kann mit einem ATmega48 gemessen werden - direkt ein Kanal 
des Drehgebers. Selbst mit AVR-GCC sind ohne Vorteiler rund 300kHz 
meßbar.
Die Drehrichtung auszuwerten, ist ein Klacks, indem bei jeder aktiven 
Flanke des Meßsignals der Pegel des anderen Kanals gespeichert wird. 
Beitrag "einfache Drehzahlmessung mit ATmega88"

Und wenn doch noch die Position ermittelt werden sollte, würde ich eher 
einen weiteren ATmega48 verwenden, als zur Laufzeit verschiedene 
Auswerteverfahren umzuschalten. Anstatt IIC-Bus könnte man auch SPI 
verwenden, was schnellere Datenübertragung zuließe.

von testuser (Gast)


Lesenswert?

M. N. schrieb:
> Wenn ich es richtig verstanden habe, wird die Position des Motors
> gar
> nicht gebraucht, sondern nur Drehrichtung und Drehzahl.

Ja genau!

> Die Drehzahl kann mit einem ATmega48 gemessen werden - direkt ein Kanal
> des Drehgebers. Selbst mit AVR-GCC sind ohne Vorteiler rund 300kHz
> meßbar.
> Die Drehrichtung auszuwerten, ist ein Klacks, indem bei jeder aktiven
> Flanke des Meßsignals der Pegel des anderen Kanals gespeichert wird.
> Beitrag "einfache Drehzahlmessung mit ATmega88"

Okey! Danke für die Info. Wie soll das Programm dann genau ablaufen, 
dass es gut funktioniert? Einen Timer mit einem bistimmten Zeitfenster 
laufen lassen und dauernd die steigenden Flanken zählen und dadurch dann 
die Drehzahl ermitteln oder? In welchem Betriebsmodus soll der Timer 
laufen?
Input Capture Funktion?

> Und wenn doch noch die Position ermittelt werden sollte, würde ich eher
> einen weiteren ATmega48 verwenden, als zur Laufzeit verschiedene
> Auswerteverfahren umzuschalten. Anstatt IIC-Bus könnte man auch SPI
> verwenden, was schnellere Datenübertragung zuließe.

Fürs erste mal nicht!

Was haltest du von der Variante Falk?

von M. N. (Gast)


Lesenswert?

testuser schrieb:
> Wie soll das Programm dann genau ablaufen,
> dass es gut funktioniert?

Hast Du Dir das Beispielprogramm angesehen?
Da läuft die Messung über die capture-Funktion von Timer1.
Ferner gibt es eine Konstante MESSZEIT, die mit dem Wert 100 dafür 
sorgt, dass nach ca. 330ms eine Bewertung der Drehzahl erfolgt. In 
dieser Zeit werden die Eingangsimpulse gezählt und synchron dazu die 
Zeit gemessen. Es werden daher nie mehr als 3 Messungen/s gemacht.

Setzt man den Wert auf 1, werden ca. 300 Messungen/s ausgeführt - unter 
der Voraussetzung, dass die Signalfrequenz hoch genug ist. Für eine 
Messung ist schließlich mindestens ein Intervall notwendig.
Da man die LCD-Ausgabe weglassen kann, ist diese Meßrate auch kein 
Problem und kann auch 1000 Messungen/s betragen. Die Berechnung in 
'float' ist hinreichend schnell und für die Ausgabe reicht es 
vermutlich, den Wert für die Drehzahl auf 16 Bit zu reduzieren.

Die Drehrichtung kann man nachfolgend dem Befehl 'count++;' ermitteln.

von Horst H. (horst_h44)


Lesenswert?

Das Problem mit der Softwareabtastung entsteht bei schnellen Änderungen 
der AB-Signale. Hier gibts Lösungen mit schnellen Zähler dafür:
http://www.ichaus.biz/wp2_encoderanschluss die das Problem beschreiben 
und lösen.

von testuser (Gast)


Lesenswert?

Ich habe noch eine Frage M.N.
Ich habe noch Unklarheiten bezüglich des Beispielschaltplans bei deiner 
einfachen Drehzahlmessung mit Atmega 88.

1) Du sagtest zu mir ich soll es über den Input Capture Pin machen. In 
deinem Beispiel bist du aber am Interrupteingang. Wiso?

2) Ich verstehe nicht was die Diode D1 bei einem TTL Signal soll. Die 
ist ja in Sperrichtung gepolt.

Also für meine Schaltung denke ich, dass es reicht den Kanal A mit PB0 
(ICP) zu verbinden und Kanal B mit einem anderen x beliebigen Pin oder?

Damit sollte dann die Auswertung der Drehzahl und der Drehrichtung 
möglich sein oder?

Danke M.N.

von M. N. (Gast)


Lesenswert?

Zu 1.
Das capture-Signal von Timer1 kann von ICP1 (PB0) oder vom 
Analogkomparator kommen. Bei der gezeigten Schaltung ist es der 
Komparator. Nimm einfach ICP1.

Zu 2.
In Verbindung mit R4 und C3 wird die negative Flanke des Eingangssignals 
erfaßt und die max. Eingangsfrequenz begrenzt. Ausführlicher (für einen 
ATtiny2313) ist das hier beschrieben: 
http://www.mino-elektronik.de/fmeter/fmeter.htm#schalt

Falls es zu verwirrend ist, ignoriere den nächsten Link. 
http://www.mino-elektronik.de/7-Segment-Variationen/LCD.htm#led2
Hier ist ein fertiges Programm, was Du auf einen ATmeg328 spielen und 
auf einem Steckbrett testen kannst.
Das Eingangssignal wird hier an AIN1 erwartet und das Ergebnis per UART 
ausgegeben. Den vielen Rest und die 7-Segementanzeige kannst Du 
weglassen.
Wenn Du AVR-Studio verwendest, kannst Du die Umrechung auf Drehzahl 
ergänzen (frequenz *= 60.0;) und auch für einen ATmega48 übersetzen. 
Ferner ist die Auswertezeit in 'ms'-Schritten einstellbar.

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
Noch kein Account? Hier anmelden.