Forum: Mikrocontroller und Digitale Elektronik Schnelles auslesen von Encoder Daten


von buell24 (Gast)


Lesenswert?

Liebe Gemeinde

Wie es der Titel bereits beschreibt, suche ich nach einer Möglichkeit, 
Encoderdaten auszuwerten. Ich würde gerne mit einem Arduino Due 
gekoppelt mit zwei Motor-Shields, zwei Maxon DC-Motoren regeln. Geregelt 
wird die Geschwindigkeit, Messgrösse sind die Encoderimpulse. Nun habe 
ich die A und B Leitungen der Encoder auf Interrupteingänge des Arduinos 
gelegt. Im unteren Drehzahlbereich funktioniert die Regelung sehr gut, 
sobald ich die Drehzahl jedoch erhöhe ist der Arduino zu langsam und 
verpasst Impulse der Encoder. Die Encoder liefern 500 Impulse pro 
Umdrehung, dies entspricht bei einer Drehzahl von 8'000 min^-1: 67'000 
Impulse/s.

Vielen Dank für eure Hilfe!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Naja, wenn Du mit 67 kHz Interrupts auslöst, dann darf in Deiner 
Interruptroutine nicht viel passieren, denn Du hast nur noch knapp 15 
µsec Zeit zwischen zwei Interrupts.

von Falk B. (falk)


Lesenswert?

@  buell24 (Gast)

>ich die A und B Leitungen der Encoder auf Interrupteingänge des Arduinos
>gelegt.

Macht man so nicht. Deutlich besser ist eine Abtastung in einem 
regelmässigen zeitintervall, siehe Drehgeber.

> Im unteren Drehzahlbereich funktioniert die Regelung sehr gut,
>sobald ich die Drehzahl jedoch erhöhe ist der Arduino zu langsam und
>verpasst Impulse der Encoder. Die Encoder liefern 500 Impulse pro
>Umdrehung, dies entspricht bei einer Drehzahl von 8'000 min^-1: 67'000
>Impulse/s.

Für eine Drehzahlregleung bei 8000 U/min nimmt man keinen Encoder, 
sondern einen einfachen Geber, der EINEN Impuls / U liefert. Wenn du den 
nicht hast, solltest du einen der beiden Kanäle A oder B an einen 
Timereingang legen und mittel Timer die Frequenz teilen. Dann bekommt 
man auch eine vernünftige Signalrate, die dein AVR verarbeiten kann.

von Michi (Gast)


Lesenswert?

Wenn die Drehrichtung bekannt ist, oder anderweitig ermittelt werden 
kann würde ich einen kanal des Encoders auf den Takteingang eines 
16bit-Zählers legen und damit weiter arbeiten...

von Michi (Gast)


Lesenswert?

buell24 schrieb:
> Die Encoder liefern 500 Impulse pro
> Umdrehung, dies entspricht bei einer Drehzahl von 8'000 min^-1: 67'000
> Impulse/s.

Ich gaube da machst du einen fehler. Ich denke mal dein Encoder hat 
500Striche und erzeugt daraus an jeder der Leitungen A und B 500 Pulse, 
in summe also 1000. Und da jeder Puls 2 Flanken hat, die Pulse 90° 
Phasenverschoben sind und du vermutlich die Flanken auswertest, hast du 
in summe 4000 Flanken zum Auswerten die jeweils einen Interrupt 
generieren. Damit hast du dann 8000*4000/60 = 533 kHz...

von Gregor B. (Gast)


Lesenswert?

Die Geber von Maxon Motors haben eigentlich alle einen Index-Ausgang, 
der liefert einen Impuls pro Umdrehung.

von netseal (Gast)


Lesenswert?

Hallo,

man könnte mit Logik up/down signale generieren. Diese gibt man auf 
Counter Eingänge der CPU.

Ich habe mal eine Logik in einem Xilinx pld implementiert. Die 
Zählerstände wurden dann über SPI ausgelesen. Mit 2 16Bit Zählwerken 
passte alles in ein XC36 144

Grüße

von Peter D. (peda)


Lesenswert?

Einen DC-Motor kannst Du eh nicht genau positionieren.
Und die Drehrichtung weißt Du ja durch die Polarität der Steuerspannung.
Es reicht also völlig die Pulsanzahl zu zählen.

67kHz Interrupt ist beim AVR illusorisch, Du mußt also einen Timer 
zählen lassen.

von buell24 (Gast)


Lesenswert?

Beim Encoder handelt es sich um folgenden Maxon-Encoder:
http://www.maxonmotor.ch/medias/sys_master/8801130971166/12_278_279_280_de.pdf

Typ: 110514
Impulszahl pro Umdrehung: 500
Max. Impulsfrequenz: 100 kHz
Anzahl Kanäle: 3

Die Index-Impulse zu zählen, kommt für mich nicht in Frage, da die 
Drehrichtung des Motors schnell ändert und ich diese ebemfalls 
messtechnisch erfassen muss. Gibt es nicht eine Art Vorsteuerung über 
ein MC-Board, welche ich dann seriell oder über i2c den Arduino 
anschliessen könnte? Oder wie würded Ihr das machen?

Vielen Dank für eure Hilfe!

von Clemens S. (zoggl)


Lesenswert?

normalerweise ändert sich die drehrichtugn eiens motors nicht von + auf 
- in null zeit. bei geringen geschwindigkeiten nimmst du den encoder, ab 
XXX umdrehungen schaltest du um und nimmst nur noch den ref impuls. wenn 
die drehzahl wieder sinkt dann eben wieder encoder.

von Peter D. (peda)


Lesenswert?

buell24 schrieb:
> da die
> Drehrichtung des Motors schnell ändert

Sowas macht man ja auch nicht, den DC-Motor bei voller Drehzahl umpolen. 
Setze ihn erst auf 0V und pole dann um, wenn er steht.

von Falk B. (falk)


Lesenswert?

@buell24 (Gast)

>Die Index-Impulse zu zählen, kommt für mich nicht in Frage, da die
>Drehrichtung des Motors schnell ändert und ich diese ebemfalls
>messtechnisch erfassen muss.

Bitte? DU steuerst den Motor, damit weißt du immer, in welche Richtung 
er dreht!

von buell24 (Gast)


Lesenswert?

Zur Erklährung der Anwendung muss ich vielleicht noch erklähren, dass es 
sich um ein inverses Pendel auf Rädern handelt. Darum wird zur Regelung 
die Drehrichtung schnell geändern.

Im Datenblatt von Maxon steht, man solle einer der folgendet IC's 
verwenden:
- MC 3486
- SN 75175
- AM 26 LS 32

Kennt sich jemand damit aus? Lassen sie diese einfach an den Arduino 
anbinden?

von Clemens S. (zoggl)


Lesenswert?

dein rotzemotor kann nur wenige 1000rad/sec² beschleunigung=> genügend 
zeit sich in der Umkehrphase vom refpuls wieder auf encoder Modus zu 
synchronisieren.

deine ICs sind unpassend. die sind nur signalaufbereitung, nehmen dir 
das zählen aber auch nicht ab.

wenn du schon mit dem hammer auf dein problem losgehen willst dann such 
dir einen spi decoder.

http://www.lsicsi.com/pdfs/Data_Sheets/LS7366R.pdf

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.