Forum: Mikrocontroller und Digitale Elektronik Vorgehensweise bei Referenzfahrt eines DC Motor mit Encoder


von B. B. (bebu1)


Lesenswert?

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
von Georg (Gast)


Lesenswert?

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

von Udo S. (urschmitt)


Lesenswert?

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.

von B. B. (bebu1)


Lesenswert?

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.

von B. B. (bebu1)


Lesenswert?

> 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.

von MaWin (Gast)


Lesenswert?

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 ?

von Udo S. (urschmitt)


Lesenswert?

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.

von Veit D. (devil-elec)


Lesenswert?

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.

von B. B. (bebu1)


Lesenswert?

> 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.

von B. B. (bebu1)


Lesenswert?

> 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 ;)

von Veit D. (devil-elec)


Lesenswert?

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.

von B. B. (bebu1)


Lesenswert?

> 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.

von Arno (Gast)


Lesenswert?

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

von Veit D. (devil-elec)


Lesenswert?

okay. Und wo oder was ist dein Referenzpunkt?

von Bürovorsteher (Gast)


Lesenswert?

> 1)Motor dreht in eine Richtung bis der Strom ansteigt.

Kompletter Murks.

von Bernhard (Gast)


Lesenswert?

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.

von Bernhard (Gast)


Lesenswert?

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!

von Homer J. S. (Gast)


Lesenswert?

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...

von Rainer V. (a_zip)


Lesenswert?

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

von Teo D. (teoderix)


Lesenswert?

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
von B. B. (bebu1)


Lesenswert?

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
von Thomas W. (goaty)


Lesenswert?

Und an der Motoreinheit können auch keine Endschalter/(Laser-)Sensoren 
etc angebracht werden ?

von B. B. (bebu1)


Lesenswert?

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