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!