Hallo,
ich bin gerade dabei für ein größeres Projekt die Ansteuerung für den verbauten Torque Servomotor zu bauen und zu Programmieren.
Folgende Komponenten werden verwendet:
Motor: 20 Pol 44Watt 3 Phasen Synchronmotor
Endstufe: DRV3801 (Mosfet treiber)
Controller: STM32L152 Cortex M3 mit 32MHz
Positionsgeber: 2000 Pulse pro Umdrehung, Position wird von einem FPGA über SPI ausgelesen

Funktion:
Positionierungssystem das die Position auf einen Teilstrich (Position) genau anfahren und halten soll.

Problem:
Also zunächst mal, die Positionierung funktioniert an sich wirklich gut, nur in der Endposition schwingt es zwischen 2.. 4 Pulsen hin und her.
Ein Schwingen in der Endposition möchte ich natürlich vermeiden. Jeddoch habe ich nun keine Idee mehr wie ich das Anstellen könnte.

Meine aktuelle Regelung:
Da dieses System im normalen Betrieb niemals mehr als eine ganze Umdrehung macht erspare ich mir hier jegliche Transformation oder Vector Controller.
Auch den Strom stelle ich über die Breite der PWM ein, das funktioniert da die PWM mit 21Khz und einer auflösung von 1500 Schritten arbeitet.
Ich versuche das Ganze möglichst einfach und überschaubar zu halten.
Mein Regelansatz sieht folgendermaßen aus:

Lösung 1: Reiner Positionsregler mit digitaler Geschwindigkeit
Ein PID Regler kümmert sich um den Abstand zwischen einem Digitalen Zeiger und der tatsächlichen Motor Position. Ist der Abstand größer als 90° (im Bezug auf die Polpaarzahl) so dreht sich der digitale Zeiger mit in die Richtung des Motor.
Es wird also nur ein kleiner Bereich abgedeckt.
Der überliegende PID Regler, regelt mittels der Geschwindigkeit des digitalen Zeigers den Abstand zwischen dem digitalen Zeiger und der Sollposition.

Steller: Mittels des Stellers wird der synchronmotor zu einem Gleichstrommotor umfunktioniert. Ich gebe lediglich eine Zahl zwischen -100..0..100 an und der Motor fängt an in eine Richtung zu beschleunigen. Diese Zahl ist vergleichbar mit der SPannung an einem DC Motor.

Problem: Der PID der sich um den kleinen Bereich kümmert schwingt. Das liegt hauptsächlich daran das ich sowas von an der Genauigkeitsschwelle des Dekoders hänge.
Da es sich bei dem Motor um eine I Strecke handelt benutze ich lediglich den PD Anteil des Reglers.


Lösung 2:
Positionsregler mit Feldgeschwindigkeit

Es gibt nur ein P Regler welcher ganz einfach eine feste Geschwindigkeit auf das Drehfeld gibt.
Der Motor bewegt sich nun mit dem Feld mit, wird dieser gebremmst so bewegt sich das Feld schneller. Bei einem maximalabstand von 90% (im Bezug auf die Polpaarzahl) wir das Feld nciht weiter gedreht da der Motor nicht hinterher kommt.
Problem: Der Motor bleibt in der Endposition zwar stehen jedoch nicht immer, und auch nur wenn ich den P-Regler wirklich sehr langsam einstelle.

Lösung 3: Geschwindigkeitsregler

Ähnlicher Aufbau wie Lösung 1, allerdings wird der digitale Zeiger durch die Berechnung der echten Geschwindigkeit des Motors ersetzt.
Das geht solange gut wie sich der Motor dreht, sobald er stehen bleibt wackelt er ständig hin und her, liegt wieder an der knappen Anzahl an Pulsen die von Dekoder kommen.


Das klingtnun nach viel Programmieraufwand usw aber ich habe alles in so in Module aufgeteilt das ich nur ein paar Zeilen ändern muss und schon funktoniert das das Regelsystem komplett anders.

Also schon mal danke fürs lesen , über Lösungsvorschläge und Ideen würde ich mich sehr freuen.

Gruß
Feratu