-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Inkrementalgeber mit nur einem Puls

  1. #1

    Inkrementalgeber mit nur einem Puls

    Anzeige

    Hallo,

    steuer derzeit einen alten Roboter an. Dieser ist mit mehreren Linearantrieben mit Inkrementalgebern ausgestattet. Jedoch habe ich nur eine Pulsleitung, die pro Umdrehung 8 Flankenwechsel erfährt.

    Bisher werte ich den Inkrementalgeber so aus, dass er hochzählt, wenn der Motor rechts dreht und entsprechend runter, wenn er links dreht. Das geht auch gut, solange keine Richtungwechsel kommen. Durch die Trägheit dreht der Motor sich noch weiter, und der Zähler zählt aber schon in die andere Richtung, da er davon ausgeht, dass der Motor sich anders herum dreht. Was könnte ich da optimieren, so dass der Zähler tatsächlich immer richtig zählt. Bis jetzt muss der Roboter sehr oft in seine Referenzposition gefahren werden, damit die Positionen wieder stimmen, da er sich sehr oft bei eben Richtungswechseln verzählt.

    Mein erster Gedanke war, einfach vor einem Richtungswechsel etwas zu warten, jedoch muss die Wartezeit so hoch sein, dass die Bewegung abgehackt aussehen, was natürlich nicht mehr schön ist. Hat vielleicht jemand schon mal einen solchen Inkrementalgeber ausgewertet oder hat noch eine Idee, das Signal besser auszuwerten?

    MfG
    Der Eisvogel

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    ... steuer ... Roboter ... mit Inkrementalgebern ... eine Pulsleitung ...
    Wenn Du jemanden vorbeigehen hörst (weit genug entfern) und Du hörst seine Schritte - geht der von links nach rechts oder von rechts nach links??? Eben. Mit nur einer Leitung gehts nur mit warten - und hoffen - und glauben.

    Drehrichtungserkennung geht nur mit zwei Signalleitungen (und GND *gg*) die etwa solche Signale liefern:

    ......

    nämlich Flanken mit Phasenversatz. Dann kann man vier Zustände ablesen: AhBh (A high, B high), AhBl, Albl, AlBh - damit kannst Du am Bildchen schon mal ablesen ob diese Folge von links nach rechts oder umgekehrt geht.

    ABER man kann natürlich auch in einer Rampe bremsen und dann, wenns wirklich langsam geht, umschalten. DANN kann man (wieder glauben - aber diesmal nur gaaanz kurz), dass sich die Richtung ändert oder geändert hat. Sieht dann schon eher glatt aus (klick - für´n Video).
    Ciao sagt der JoeamBerg

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    59
    Beiträge
    2.435
    Hallo Eisvogel,

    Mit nur einem Signal ist nichts mit Richtungserkennung.

    Anstelle einer Zeit, welche abgewartet wird, kann man die Drehzahl messen, also die Zeit zwischen zwei Impulsen. Dort wo die minimale Drehzahl erreicht wurde, hat der Motor auch die Drehrichtung geändert.
    Also immer die Zeit zwischen den letzten beiden Impulsen messen und abspeichern.

    1. Motor umpolen
    2. Ist dann die die aktuelle Zeit kleiner als die Letzte, die Zählrichtung umschalten Zähler umschalten.

    Diese Routine muss nur ausgeführt werden, wenn der Motor umgepolt wurde und die Zählrichtung noch nicht umgeschaltet wurde.
    Sollte eigentlich dann +/-1 Impuls richtig zählen.

    MfG Peter(TOO)

  4. #4
    Hallo ihr Beiden,

    vielen Dank für eure beiden Lösungansätze! Das sind zwei Ansätze die mir definitiv besser gefallen als das mit dem Stoppen. Ich denke ich werde zuerst mal den Ansatz von Peter mit den Zeitabständen der Impulse probieren. Er klingt zwar komplizierter, aber dabei bleibt die weiche Bewegung erhalten. Das wird mal wieder ein Spaß in Assembler.

    Eine Frage habe ich noch an oberallgeier: Es ist jetzt das erste Mal, dass ich das Wort in Verbindung mit Robotern und Elektronik höre. Ich habe hier noch einen anderen digitalen Roboter, den ich über ein Two-Line-Bus-Protocol ansteuern kann. In dem Datenblatt steht ebenfalls etwas von einer Rampe, dieser sind 4 Bit bzw. das high nibble eines Bytes zugeordnet. Was genau hat es mit diesem Begriff aus sich, und was vesteht man darunter?

    MfG
    Der Eisvogel

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    24558
    Alter
    39
    Beiträge
    1.356
    Eine Rampe wird es genannt wenn Du zu eine bestimmt Wert hochzählst z.B. PWM bis zur vollen Leistung. Um dann die Rampe andersrum beim langsamer werden wieder runter zählst. Meist benutz man das um eine langsame Anfangsbewegung zu erhalten und erst mehr Power zu geben, damit man nicht so viel Trägheitbelastung im Getriebe hat. Dann wenn die Masse sich bewegt erhöht man weiter.. Ahnlichkeit mit Fahradschaltung oder Schatung im Auto

    Ich treffe bestimmt nicht ganz genau die Fachworte, aber sinngemäss ist es das.
    Ein Zeitwert/Impulszählwert kann auch eine Rampe darstellen.
    "Es ist schwierig, jemanden dazu zu bringen, etwas zu verstehen, wenn er sein Gehalt dafür bekommt, dass er es nicht versteht" [Upton Sinclair] gez-boykott

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    59
    Beiträge
    2.435
    Hallo Eisvogel,

    Rampe:

    Wenn man ein Zeit/Irgendwas-Diagramm zeichnet, werden die An- und abstiege der Kurve immer als Rampe bezeichnet.

    Hier geht's um die Drehzahl, welche kontrolliert verändert wird, gilt aber z.B. auch für Temperaturveränderungen, z.B. beim SMD-Löten.
    http://cdn.shopify.com/s/files/1/004...jpg?1273253254

    MfG Peter(TOO)

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    ... das erste Mal, dass ich das Wort in Verbindung mit Robotern und Elektronik höre ...
    Na ja, es gibt ja für alles ein erstes Mal. Hexplorer und Peter haben es ja im Prinzip schon erklärt.

    Hier mal Links zu meinen Messprotokollen zur Geschwindigkeitsmessung bei einem "... Inkrementalgeber mit nur einem Puls ...". In diesen Diagrammen gibts einmal ne Sprungvorgabe für die Geschwindigkeit beim Anfahren und verschieden Abfahrmethoden. Hier (klick) ist mal Bewegungsende durch einfaches Abschalten des Motortreibers: "Sprung ab ohne Bremse". Das kann man auch mit ner >>Rampe<< machen, siehe hier, bei der die MotorPWM stufenweise runtergefahren wird (das sagt Dir etwas?). Du siehst, dass die Geschwindigkeit deutlich langsamer zurückgeht - klar, wenn Du beim Radfahren aufhörst zu treten wirds viel schneller langsam als wenn Du immer langsamer trittst . . . Schließlich kannst Du auch den Motor aktiv bremsen (bei fast allen Motortreibern) dann deutlich schneller runter als mit dem einfachen Abschalten, hier das Diagramm dazu, oder Du machst das, was die Schiffe manchmal machen: vollen (oder wenigstens etwas) Gegenschub. Dann geht die GEschwindigkeit deutlich schneller zurück - und es wird massig viel Strom gezogen ! ! ! Auch dieses aktive Gegenschub-Bremsen hatte ich ausprobiert - wie erwähnt muss dabei der Motortreiber viel Strom liefern (können). Dazu zeige ich kein Diagramm - es ging ja vornehmlich drum, Dir die Rampe zu erklären. Die Diagramme und Erklärungen dazu gibts in diesem Thread/Posting.

    Nun kommt Peters Zeitmessung dazu (ich hatte bei meiner Regelung sowieso die Geschwindigkeit auslesen müssen - details würden jetzt zu weit führen) - wie das funktioniert sieht man ja auch an den Diagrammen, die gut zeigen wie das Tempo abnimmt. Nun bedeutet abnehmendes Tempo die Zunahme der Zeit zwischen zwei Interrupts (von den Flanken meines incrementalen Encoders). Diese Zeit zwischen zwei Encoder-Interrupts heißt bei mir Izdiff_12, für den Motor 12; sie ist mathematisch der Kehrwert der Geschwindigkeit *ggg*.
    Ciao sagt der JoeamBerg

  8. #8
    Hallo,

    vielen Dank für die ausführlichen Erlärungen. Da werde ich wohl doch noch mal mit den Werten bei dem anderen Roboter rumspielen müssen, vielleicht bewegt der sich dann tatsächlich auch weich.

    Nun zurück zur ursprünglichen Frage: Ich habe nun Peters Ansatz mit dem Messen der zeit zwischen zwei Pulsen implementiert. Theoretisch funktioniert das. Wenn ich nur wenig Spannung auf die Motoren gebe, den Motor festhalte und dann umpole, da wechselt der Zähler seine Zählrichtung erst, wenn der Motor sich dreht, d.h. das es funktionieren müsste. Aber wenn ich das ganze jetzt wieder bei voller Spannung auf 6 Motoren anwende, dann kommen leider dennoch Abweichungen zustande. Insbesondere bei den leichtgängigeren Motoren. Ich hab die Vermutung, dass mein Controller mit seinen süßen 2 MHz einfach nicht schnell genug ist, um die Zeitwerte präzise genug aufnehmen zu können, da er noch mit sehr vielen anderen Zeitintensiven Aufgaben betraut ist.

    Ich werde da jetzt noch ein bisschen rumspielen und gucken, ob ich das noch irgendwie hingebogen bekommen. Ansonsten muss ich wohl leider in den sauren Apfel beißen und eine Pause bzw. Rampe einbauen oder mit den Abweichungen leben. Ein schnellerer Controller kommt leider nicht in Frage, da dieser von der Schule vorgegeben ist.

    Auf jeden Fall vielen Dank euch allen, für die Ansätze und die Erklärungen zur Rampe.

    MfG
    Der Eisvogel

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    ... mein Controller mit seinen süßen 2 MHz ...
    Das ist das erste Mal, dass ich etwas von einer süßen Frequenz höre *ggg*.

    Mal im Ernst: ist das noch ´n Z80 (ABER mit Z meine ich jetzt Zilog nicht Zuse ;.-.) )? Oder was hast Du als Controller? Nächste Frage: wie misst Du die Zeit?
    Ciao sagt der JoeamBerg

  10. #10
    Hallo oberallgeier,

    das ist ein AT89C5131A aus der 8051 Baureihe. Theorethisch kann der Controller mehr, aber die von der Schule vorgeschriebene Platine hat nur ein 12 MHz Quarz drauf, womit maximal 2 MHz Systemtakt möglich sind.

    Die Zeit Messe ich wie folgt:
    Code:
    				;Calculate time since last call
    				mov A,TL1
    				subb A,PULS1_TIME
    				mov R0,A
    				
    				mov A,TH1
    				subb A,PULS1_TIME+1
    				mov B,A
    				
    				mov A,THH
    				subb A,PULS1_TIME+2
    				
    				;Change in direction?
    				jnb PULS1_CHANGE,mPStore
    				
    				;Calculate time difference
    				xch A,R0
    				push ACC
    				clr C
    				subb A,PULS1_DIF
    				mov A,B
    				subb A,PULS1_DIF+1
    				mov A,R0
    				subb A,PULS1_DIF+2
    				pop ACC
    				
    				;C set: Umschalten
    				jnc mPStore
    				mov C,MOTOR1_DIRECTION
    				mov PULS1_COUNTER,C
    				mov P0.0,C
    				
    mPStore:		;Store time
    				mov PULS1_DIF,A
    				mov PULS1_DIF+1,B
    				mov PULS1_DIF+2,R0
    				
    				;Store Timestamp
    				mov PULS1_TIME,TL1
    				mov PULS1_TIME+1,TH1
    				mov PULS1_TIME+2,THH
    Diese Routine wird immer bei eine Flanke des Inkrementalgebers aufgerufen. TL1, TH1 gehören zu einem 16 Bit Timer, der bei Überlauf THH um 1 erhöht. PULS1_TIME, PULS1_DIF haben je 3 Byte reserviert. In PULS1_TIME wird immer der Zeitpunkt (TL1, TH1, THH) des letzten Aufrufs gespeichert. In PULS1_DIF wird die Differenz zum letzten Aufruf gespeichert. Die neue Differenz wird berechnet und liegt dann in A, B und R0. Dann findet der Vergleich statt. Wenn die vorherige Differenz in PULS1_DIF größer ist, wird das Carry-Flag gesetzt und dann findet die Umschaltung des Zählers statt.
    Direkt hinter dieser Routine wird dann PULS1_COUNTER abgefragt. Wenn es gesetzt ist, wird erhöht, wenn nicht, dann erniedrigt.

    MfG
    Der Eisvogel

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Antworten: 44
    Letzter Beitrag: 30.07.2009, 19:11
  2. Asuro Linienverfolgung nur mit EINEM Sensor
    Von rbaleksandar im Forum Asuro
    Antworten: 9
    Letzter Beitrag: 28.06.2009, 21:54
  3. Kettenantrieb mit nur einem Fahrtregler
    Von Marten83 im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 14.03.2009, 14:27
  4. Roboter mit nur einem Moter
    Von Singapur im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 2
    Letzter Beitrag: 19.09.2006, 23:42
  5. Widerstandswert ( Poti ) mit nur einem I/O Pin einlesen ?
    Von Kaiser-F im Forum C - Programmierung (GCC u.a.)
    Antworten: 8
    Letzter Beitrag: 04.02.2005, 14:51

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •