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!
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.
@ 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.
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...
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...
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
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.
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!
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.
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.
@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!
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?
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