Hallo miteinander! Ich sitze gerade an der Programmierung einer Motoransteuerung. Es handelt sich dabei um einen DC Motor mit Encoder (512 steps) und einem Getriebe(100:1). Am Getriebe ist ein Zahnrad montiert. Grundsätzlich soll der Motor einer Positions- oder Geschwindigkeitsvorgabe folgen. Zur Bestimmung der aktuellen Motorposition nach dem Einschalten muss eine Referenzfahrt durchgeführt werden. Wie wird üblicherweise die Referenzfahrt und die Auswertung des Encoders "programmiert"? Momentan gehe ich folgendermaßen vor: 1)Motor dreht in eine Richtung bis der Strom ansteigt. 2)Encoderwert (uint32) wird auf uint32/2 + Offset gesetzt --> min. Encoderwert/Motorposition 3) Motor in die andere Richtung drehen bis wiederum der Strom ansteigt 4) Encoderwert -Offset = max. Encoderwert/Motorposition Grundsätzlich funktioniert mein Programm soweit nur habe ich folgendes Problem. Die Sollwertvorgabe erfolgt auch über eine uint32 Zahl. Diese Zahl skaliere ich jedoch auf den Bereich der bei der Referenzfahr ermittelt wurde. (Solltwert = 0 --> minPos; Sollwert = uint32_max -->maxPos)Durch die hohe Getriebeuntersetzung ergibt eine kleine Drehung (per Hand) am Zahnrad bereits einen großen Zahlensprung bei den Encoderwerten. Steuere ich nun den Motor an die min. Position und drehe das Zahnrad per Hand noch weiter springt verständlicherweise der Encoderwert auf einen nicht zulässigen Wert. Gebe ich nun eine Sollpostion vor möchte der Regler die Position wieder einregeln dreht aber danach ewig in die "verkehrte" Richtung. Da ich in diesem Bereich noch wenig Erfahrung habe bitte ich um eure Hilfe wie so eine Ansteuerung üblicherweise programmiert wird. Im tatsächlichen Betrieb ist ein weiterdrehen zwar nicht möglich, ich denke jedoch dass meine Lösung unsauber ist. Das Zahnrad dreht sich im Betrieb wahrscheinlich max. 10x (--> ~1000 Umdrehungen am Encoder) Danke! Nachtrag: Es ist sehr wahrscheinlich dass sich in Zukunft noch die Getriebeuntersetzung und die Größe des Zahnrad ändert. Daher muss ausreichend Puffer für spätere Änderungen sein..
:
Bearbeitet durch User
Bernhard B. schrieb: > Wie wird üblicherweise die Referenzfahrt und die Auswertung des Encoders > "programmiert"? Üblicherweise hat ein Encoder eine dritte Spur mit einem Referenzimpuls. Damit kann man den Nullpunkt auf 1 µ oder besser stellen, kein mechanischer Schalter ist so genau. Das Blockieren des Motors auszuwerten ist nur eine ganz ganz grobe Schätzung. Manuell, z.B. bei meinen Messmaschinen, fährt der Bediener nach dem Einschalten der Steuerung über diesen Referenzpunkt, er weiss wo der ist und/oder da ist eine Markierung. Meine Zähler zeigen "Ref?" an, bis der Punkt überfahren wurde, dann die Position. Automatisch: die Steuerung fährt langsam in eine bestimmte Richtung, bis der Endschalter (!) anspricht, dann zurück bis der Referenzspunkt erreicht ist. Damit ist der Positionszähler betriebsbereit. Hat man keine Referenzspur, muss man einen möglichst genauen Schalter (Mikroswitch) verwenden, immer aus der gleichen Richtung und mit der gleichen Geschwindigkeit. Georg
Bernhard B. schrieb: > Position und drehe > das Zahnrad per Hand noch weiter springt verständlicherweise der > Encoderwert auf einen nicht zulässigen Wert. Du hast eine 32 Bit Zahl. Dein Encoder hat 512 Impulse pro Umdrehung und du hast 100:1 Getriebe das ausgangsseitig max. 10 Umdrehungen machen kann. Also maximal 512000 Impulse. Das macht die 32 Bit Zahl ohne warm zu werden. Warum nimmst du nicht einen signed Zahl? Damit kannst du einfach erkennen dass du "zu weit" gedreht hast weil die Zahl negativ wird und kannst dann in die richtige Richtung fahren. Ausserdem ist nicht klar, warum du eine Referenzfahrt zu beiden Enden unternimmst und dann skalierst? Ändert sich denn die Mechanik? Es sollte doch reichen den "unteren" Endpunkt anzufahren und den Rest aus deinen festen Übersetzungsverhältnissen zu errechnen. Warum skalierst du jedesmal dein Sollwert neu? Die Getriebeübersetzung bleibt doch fest, selbst wenn sich der max. "obere" Punkt verschieben sollte. Als letztes: Ist es wirklich sinnvoll über den Motorstrom zu gehen? Wie mein Vorredner schon gesagt hat ist das nicht besonders präzise, und ausserdem fährst du jedesmal in die Begrenzung und malträtierst unnötig die Mechanik und den Motor.
Der Encoder hat keinen Referenzausgang. Der ganze Aufbau mit dem Motor ist nicht fix. D.h. nur die Motor/Getriebe/Encoder/Zahnrad - Einheit ist fest miteinander verbunden und wird an unterschiedlichen "Gegenzahnräder" montiert. Daher ist auch kein extern Endschalter möglich. Zusätzlich sind die Endanschläge je nach Einsatz unterschiedlich. Die Positionierung muss jetzt nicht extrem genau sein (~0,3°). Das Zahnflankenspiel stört auch nicht. Ich arbeite an einer Überarbeitung des ganzen Systems bei der sowohl die Hardware als auch die Software komplett neu gemacht wird. Die Erkennung des Endanschlags wurde auch vorher über den Strom durchgeführt und war anscheinend ausreichend genau.
> Du hast eine 32 Bit Zahl. Dein Encoder hat 512 Impulse pro Umdrehung und > du hast 100:1 Getriebe das ausgangsseitig max. 10 Umdrehungen machen > kann. > Also maximal 512000 Impulse. > Das macht die 32 Bit Zahl ohne warm zu werden. Warum nimmst du nicht > einen signed Zahl? Damit kannst du einfach erkennen dass du "zu weit" > gedreht hast weil die Zahl negativ wird und kannst dann in die richtige > Richtung fahren. Die Encoder Auswertung erfolgt über das Quadrature Encoder Pulse Modul des Mikrocontroler. Dort wird jede Flanke ausgewertet --> nochmal x4. Aber grundsätzlich ändert dass ja nichts. Die Lib von TI verwendet für den Encoderwert eine Uint32 Zahl deshalb hab ich jetzt auch eine genommen. Aber danke für deinen Input, ich werde es mir durch den Kopf gehen lassen.
Bernhard B. schrieb: > 1)Motor dreht in eine Richtung bis der Strom ansteigt. Nicht so gut. Das heisst noch lange nicht, dass er das Ende erreicht. Er kann auch nur über Dreck/Späne rattern. Ich wurde sagen: maximale Verfahrlänge sei 1000 Inkrementimpulse. Strom anlegen und gucken ob Incrementimpulse kommen, laufen lassen so lange Incrementimpulse in 1 Richtung )kein hin und her zittern) kommen. Bewegt sich laut Encoder nichts mehr, ist er am Anschlag. Hab es 1100 Impulse, ist was defekt. Bei echt viel zu viel Strom kann man auch stoppen. Bernhard B. schrieb: > Gebe ich nun eine Sollpostion vor möchte der Regler die Position wieder > einregeln dreht aber danach ewig in die "verkehrte" Richtung Wieso ?
Bernhard B. schrieb: > Aber danke für deinen Input, ich werde es mir durch den Kopf gehen > lassen. Dann setze deinen Startwert nicht auf 0 sondern auf z.B. 100000. Dann kannst du sicher erkennen ob der Motor "zu weit" gelaufen ist. So habe ich zumindest dein Problem verstanden: Bernhard B. schrieb: > Position und drehe > das Zahnrad per Hand noch weiter springt verständlicherweise der > Encoderwert auf einen nicht zulässigen Wert. Gebe ich nun eine > Sollpostion vor möchte der Regler die Position wieder einregeln dreht > aber danach ewig in die "verkehrte" Richtung. Denn verkehrte Richtung kann ja eigentlich nur bei einem Zahlenüber(unter)lauf vorkommen. Siehe Absturz der ersten Ariane 5.
Hallo, kann dir "nur" erzählen wie das bei unseren Anlagen auf Arbeit ist. Da gibts immer noch Lichtschranken dafür. Egal ob alte Anlagen mit Schrittmotoren oder neuere mit Servomotoren. Encoder habe beide dran. Beim "Homing" wird erstmal pauschal in die Lichtschranke gefahren. Ist das Flag drin wird langsam rausgefahren und langsam rein. Danach wird das nochmal wiederholt. Es wird immer aus der gleichen Richtung in die Lichtschranke gefahren.
> Nicht so gut. Das heisst noch lange nicht, dass er das Ende erreicht. Er > kann auch nur über Dreck/Späne rattern. Das notwendige Drehmoment ist normalerweise sehr gering. Beim Referenzieren wird momentan bei Nennstrom (300mA) abgeschalten. Falls es tastächlich zu einem Fehler beim Initialisieren kommt merkt der Benutzer es bald und hat danach die Möglichkeit neu zu referenzieren. >> Gebe ich nun eine Sollpostion vor möchte der Regler die Position wieder >> einregeln dreht aber danach ewig in die "verkehrte" Richtung > > Wieso ? Das habe ich falsch beschrieben.. Ich gebe als Sollposition 0 (uint32) vor. Dieser Wert wird auf den Encoderwert skaliert. Der Motor fährt auf den Endanschlag (Encoderwert ~Uint32Max / 2 ). Bewege ich den Motor per Hand noch weiter Richtung Anschlag (den Anschlag gibt es momentan noch nicht) dann fährt der Motor in die falsche Richtung. Wieso weiß ich jetzt auch noch nicht. Könnte auch noch ein Fehler beim Regler sein.
> Dann setze deinen Startwert nicht auf 0 sondern auf z.B. 100000. > Dann kannst du sicher erkennen ob der Motor "zu weit" gelaufen ist. > So habe ich zumindest dein Problem verstanden: Ich setze den Startwert mittlerweile auf uint_max /2. Ganz zu Beginn setzte ich den Wert auf 0, erkannte jedoch schnell dass es deswegen zu Problemen kommt ;)
Hallo, ich verstehe nicht was du mit deinem Strom für eine Referenzfahrt anstellen möchtest. Wenn der Antrieb irgendwo unkontrolliert stehen blieb oder der Motor aus irgendwelchen Gründen Schritte verloren hat, muss er doch erstmal zu einem definierten Punkt fahren. Da spielt doch erstmal der Strom keine Rolle. Mittels Strom kannste nebenbei überwachen ob etwas schwergängig geht im Vergleich zu vorher.
> ich verstehe nicht was du mit deinem Strom für eine Referenzfahrt > anstellen möchtest. Wenn der Antrieb irgendwo unkontrolliert stehen > blieb oder der Motor aus irgendwelchen Gründen Schritte verloren hat, > muss er doch erstmal zu einem definierten Punkt fahren. Da spielt doch > erstmal der Strom keine Rolle. Mittels Strom kannste nebenbei überwachen > ob etwas schwergängig geht im Vergleich zu vorher. Die beiden Endanschläge werden durch den Anstieg des Motorstroms erkannt.
Bernhard B. schrieb: > Wieso weiß ich jetzt auch noch nicht. Könnte auch noch ein Fehler beim > Regler sein. Danach klingt deine Beschreibung für mich eher. Oder spreizt du deinen Messwert auf den gesamten Sollwertbereich statt den Sollwert auf den Messbereich runter zu skalieren? Zeig dir doch mal den Positionswert an, wenn du von Hand "über den Anschlag hinaus" drehst. Und dann die Regeldifferenz (wenn du denn einen der klassischen PID-Regler oder sowas verwendest). MfG, Arno
okay. Und wo oder was ist dein Referenzpunkt?
> 1)Motor dreht in eine Richtung bis der Strom ansteigt.
Kompletter Murks.
Veit D. schrieb: > okay. Und wo oder was ist dein Referenzpunkt? Die gesamte Motoreinheit treibt ein weiteres Zahnrad an. Das Zahnrad bzw. es kann auch nur ein Zahnkreissegment sein kann je nach Anwendung einen Drehbereich zwischen 0 und 360° haben. Zu Beginn soll nun ermittelt werden in welchem Bereich das Zahnrad verstellt werden kann.
Bürovorsteher schrieb: > 1)Motor dreht in eine Richtung bis der Strom ansteigt. > > Kompletter Murks. Falls du nichts konstruktives beitragen kannst dann schreibe einfach nichts. Danke!
Die Motoren mit dem Nennstrom gegen den Poller zu fahren, ist Murks. Und Koordinaten kann man auch oder gerade bei 32 bit Wortbreite als signed Integer deklarieren. Die verbleibenden 31 bit reichen bei 1 m Weg dann immer noch fuer 0.05 nm. Deine "Pseudo-"Vorzeicherfassung scheint ja auch nich so optimal zu sein. Wenn das Dingens in die flasche Richtung faehrt...
also ich weiß jetzt gerade nicht, warum so gegen diese blöde Strommessung palavert wird. Das machen die neueren Heizkörperregler alle. Natürlich machen sie es manchmal auch noch etwas schlauer, aber wenn das dem TO reicht, dann ist doch gut :-) Gruß Rainer
Bei der Untersetzung und die Tatsache der Massenträgheit , wirst du wohl oder übel, sehr, seeeehr langsam an einen richtigen Endschalter fahren müssen. Die erste Fahrt an jeden, kann ja erstmal zur groben Orientierung, deutlich schneller erfolgen.
:
Bearbeitet durch User
Wie bereits oben beschrieben. Die Motoreinheit wird zwischen unterschiedlichen "Gengenzahnrädern umgebaut. Ich kann daher keine zusätzlichen Endschalter verwenden! Die Strommessungist zwar nicht das Optimum reichte aber bisher für die Anwendung. Der aktuell verwendete Motor erreicht mit Getriebe ein max. Drehmoment von 0,3Nm...
:
Bearbeitet durch User
Und an der Motoreinheit können auch keine Endschalter/(Laser-)Sensoren etc angebracht werden ?
Thomas W. schrieb: > Und an der Motoreinheit können auch keine Endschalter/(Laser-)Sensoren > etc angebracht werden ? Die Referenzfahrt ist notwendig da das Gegenzahnrad in unterschiedlichen Bereichen verstellt werden soll. z.B: Es werden 3 Motoreinheiten auf 3 verschiedene Stellen montiert: Einheit 1 hat einen Verstellbereich von 0-60° Einheit 2 hat einen Verstellbereich von 0-150° Einheit 3 hat einen Verstellbereich von 0-230° Die Software ist jedoch für alle Einheiten gleich.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.