www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Softwaregesteuerte Positionsregelung


Autor: Peter S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!):
//Interrupt der alle 50ms aufgerufen wird:
Stellgroesse = SollWert - IstWert;
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:
//Interrupt der alle 50ms aufgerufen wird:
Stellgroesse = SollWert - IstWert;
I += Stellgroesse * ki; //I ist als static deklariert
//Verhindert ungültige DAC-Werte:
if(I > 4096) I = 4096;
if(I < 0) I = 0;
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!

Autor: Artur R. (artur2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
versuche mal kp zu verringern

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier findest du einiges über Regler sowie auch Einstellverfahren

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

Autor: Peter S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void RegelungsTask()
{
double Stellgroesse;
static double I = 0;
double P;

Stellgroesse = SollWert - IstWert;

//I-Regler:
I += Stellgroesse * ki;
//... I entsprechend begrenzen

//P-Regler:
P = Stellgroesse * kp;

DAC_Write(P + I);
}

Ist es richtig, P und I zu addieren?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Peter S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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! :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.