Forum: Mikrocontroller und Digitale Elektronik Softwaregesteuerte Positionsregelung


von Peter S. (Gast)


Lesenswert?

Hi!

Ich habe einen Motor mit einer seperaten Steuerung. Die Drehzahl des 
Motors kann durch diese Steuerung durch einen Analogwert eingestellt 
werden. D.h. per DAC meiner mikrocontrollerbasierten Haupsteuerung kann 
ich der Motorsteuerung einen Wert übergeben. Diese betreibt den Motor 
dann mit der gewünschten Geschwindigkeit.
Zusätzlich bekomme ich über einen Drehgeber die momentane Position der 
durch den Motor betriebenen Achse. => mein ISTWERT
Der SOLLWERT ändert sich permanent (aber konstant) um einen gewissen 
Wert. Dieser wird von der Hauptsteuerung berrechnet. Der Motor soll 
natürlich immer möglichst auf der Sollposition sein. => Wäre das 
Programm bereits lauffähig, würde sich der Motor im idealfall mit der 
Geschwindigkeit drehen, mit der sich der SOLLWERT ändert. Zusätzlich 
würde er Reibungsverluste oder ähnliche Stöhrungen (anrempeln, Wind, 
etc.) ausgleichen (die Qualität hängt dann natürlich von der Optimierung 
des Regelkreises ab).

Zuerst habe ich es mit einem reinen P-Regler versucht (=> da einfach!):
1
//Interrupt der alle 50ms aufgerufen wird:
2
Stellgroesse = SollWert - IstWert;
3
DAC_Write(Stellgroesse * kp);

Wobei kp ein Faktor ist der mir die Stellgröße in eine entsprechende 
Geschwindigkeit "umwandelt".
Sofort macht sich der Nachteil eines P-Reglers bemerkbar: eine 
permanente Regelabweichung

=> Meine Idee wäre nun das Problem per I-Regler zu lösen:
1
//Interrupt der alle 50ms aufgerufen wird:
2
Stellgroesse = SollWert - IstWert;
3
I += Stellgroesse * ki; //I ist als static deklariert
4
//Verhindert ungültige DAC-Werte:
5
if(I > 4096) I = 4096;
6
if(I < 0) I = 0;
7
DAC_Write(I);

Es funktioniert auf alle Fälle besser als mit dem P-Regler (die 
Sollposition wird genauer eingehalten) aber leider schaffe ich es nicht 
das Schwingen um die Sollposition genug zu kompensieren, sodass die 
Anforderungen an die Genauigkeit erfüllt werden... Theoretisch müsste es 
doch so sein, dass sich nach einer gewissen Einschwingzeit der Motor 
immer genau auf der Sollposition befindet.

Hat jemand einen Vorschlag wie ich das besser lösen könnte bzw. was ist 
mein Fehler im Gedankengang der I-Regler-Lösung? Warum wird das 
Schwingen nie 0? Liegt es an falschen Werten für ki?

Vielen Dank für eure Hilfe!

von Artur R. (artur2000)


Lesenswert?

versuche mal kp zu verringern

von Karl H. (kbuchegg)


Lesenswert?

Peter S. schrieb:

> Es funktioniert auf alle Fälle besser als mit dem P-Regler (die
> Sollposition wird genauer eingehalten) aber leider schaffe ich es nicht
> das Schwingen um die Sollposition genug zu kompensieren,

dann ist dein kI zu gross.

Die Abweichung wird größer, wodurch dein Regler mehr Gas gibt. Doch 
leider schiesst er übers Ziel hinaus (weil dein I Regler ja nicht 
bremst, wenn er in die Nähe der Sollposition kommt). Damit wächst jetzt 
der Fehler in die andere Richtung der Regler nimmt die Drehzahl zurück 
und schiesst wieder in die andere Richtung übers Ziel hinaus. etc. ad 
infinitum.

> Hat jemand einen Vorschlag wie ich das besser lösen könnte

Mach einen PI Regler, also eine Kombination aus beiden.
Den I Anteil nimmst du zerst auf 0 und stellst das kP so ein dass der 
Regler gerade nicht schwingt. Natürlich hast du dann eine 
Regelabweichung aber die kümmert dich erst mal nicht. Mit kP gehst du so 
hoch, bis der Regler zu schwingen anfängt. Dann nimmst du das noch ein 
wenig zurück und fängst an das kI ein wenig zu erhöhen. Das sorgt dann 
dafür dass die Regelabweichung des reinen P-Reglers ausgeglichen wird.

von Karl H. (kbuchegg)


Lesenswert?

Hier findest du einiges über Regler sowie auch Einstellverfahren

http://www.rn-wissen.de/index.php/Regelungstechnik

von Peter S. (Gast)


Lesenswert?

Vielen Dank für eure schnellen Antworten!

Karl heinz Buchegger schrieb:
> Mach einen PI Regler, also eine Kombination aus beiden.
> Den I Anteil nimmst du zerst auf 0 und stellst das kP so ein dass der
> Regler gerade nicht schwingt. Natürlich hast du dann eine
> Regelabweichung aber die kümmert dich erst mal nicht. Mit kP gehst du so
> hoch, bis der Regler zu schwingen anfängt. Dann nimmst du das noch ein
> wenig zurück und fängst an das kI ein wenig zu erhöhen. Das sorgt dann
> dafür dass die Regelabweichung des reinen P-Reglers ausgeglichen wird.

Ok also kp sollte ich so optimieren, dass die Regelabweichung möglichst 
gering ist aber gerade kein Schwingen auftritt. Danach kI so lange 
erhöhen bis meine gewünschte Genauigkeit erfüllt ist bzw. das ganze 
wieder zu schwingen beginnt. Habe ich das richtig verstanden?

Der Code würde dann in etwa so aussehen:
1
void RegelungsTask()
2
{
3
double Stellgroesse;
4
static double I = 0;
5
double P;
6
7
Stellgroesse = SollWert - IstWert;
8
9
//I-Regler:
10
I += Stellgroesse * ki;
11
//... I entsprechend begrenzen
12
13
//P-Regler:
14
P = Stellgroesse * kp;
15
16
DAC_Write(P + I);
17
}

Ist es richtig, P und I zu addieren?

von Karl H. (kbuchegg)


Lesenswert?

Nenns nicht Stellgroesse, denn das ist es nicht.

SollWert - IstWert  ist der Regelfehler, den der Regler ausgleichen 
muss.

> Ist es richtig, P und I zu addieren?

SChau in den Link weiter oben rein. Da findest du alles was du brauchst. 
Auch Code.

von Peter S. (Gast)


Lesenswert?

Peter S. schrieb:
> Ist es richtig, P und I zu addieren?

Ok dies wird eigentlich hier: 
http://www.rn-wissen.de/index.php/Regelungstechnik
bereits bestens erklärt! Danke für diesen wirklich guten Artikel!

von Peter S. (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Nenns nicht Stellgroesse, denn das ist es nicht.
>
> SollWert - IstWert  ist der Regelfehler, den der Regler ausgleichen
> muss.

Jap das ist natürlich Blödsinn...

Ok ich glaube mit diesem Link werde ich es schaffen die gewünschten 
Anforderungen zu erfüllen. Eventuell werde ich es auch noch mit einem 
PID-Regler versuchen (da es mich interessiert, ob dies in meinem Fall 
Vorteile bringen würde).

Danke nochmal für die schnelle und exakte Hilfe! :)

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.