Hallo!
Ganz kurz zu mir: Ich heiße Andreas, ich komme aus Wiesbaden und
studiere Maschinenbau.
Seit einigen Wochen schreibe ich an einer Projektarbeit, im Rahmen derer
ich den bestehenden Programmcode eines Segway-Nachbaus verbessern soll.
Chip ist ein Atmega32, programmiert wird mit BASCOM.
Momentan beschäftige ich mich mit dem Herzstück, dem Regelalgorithmus.
Im Originalcode übernimmt ein PI-Regler diese Aufgabe, ich würde nun
gerne testen (erstmal virtuell), ob ein PID-Regler Vorteile haben
könnte.
Das ist der originale PI-Regler im Code:
1 | Sub Algo
|
2 |
|
3 | 'calculate balance moment
|
4 | controller_input = Angle_rate + Tilt_angle
|
5 |
|
6 | 'calculate drive_sum
|
7 | Controller_input_sum = Controller_input_sum + controller_input
|
8 |
|
9 | ' limitting
|
10 | If Controller_input_sum > 55000 Then
|
11 | Controller_input_sum = 55000
|
12 | End If
|
13 | If Controller_input_sum < -55000 Then
|
14 | Controller_input_sum = -55000
|
15 | End If
|
16 |
|
17 |
|
18 | 'calculate drive speed'
|
19 | Buf = Controller_input_sum / 155
|
20 | Buf1 = Controller_input / 165
|
21 | Drivespeed = Buf + Buf1
|
22 |
|
23 | Return
|
24 |
|
25 | End Sub
|
Und das ist meine Version des PID-Reglers:
1 | Sub Algo
|
2 |
|
3 | 'calculate controller_input for P-controller_part
|
4 | Controller_input = Tilt_angle + Angle_rate
|
5 |
|
6 | 'calculate controller_input_sum for I-controller_part
|
7 | Controller_input_sum = Controller_input_sum + Controller_input
|
8 |
|
9 |
|
10 | 'prevent overflow of I_controller_part
|
11 | If Controller_input_sum > 65000 Then '
|
12 | Controller_input_sum = 65000
|
13 | End If
|
14 | If Controller_input_sum < -65000 Then
|
15 | Controller_input_sum = -65000
|
16 | End If
|
17 |
|
18 |
|
19 | Buf3 = Controller_input * Kp_faktor
|
20 | Buf4 = Controller_input_sum * Ki_faktor
|
21 | Buf5 = Controller_input - Former_controller_input
|
22 | Buf5 = Buf5 * Kd_faktor
|
23 |
|
24 | Drivespeed = Buf3 + Buf4
|
25 | Drivespeed = Drivespeed + Buf5 ' controller output
|
26 |
|
27 | Former_controller_input = Controller_input 'difference for D_controller_part
|
28 | Return
|
29 |
|
30 | End Sub
|
Bascom kann nur eine Operation pro Zeile ausführen, daher der etwas
umständliche Code.
Meine erste Frage: Passt das so?
Nun habe ich beide Regler in Simulink modelliert und beide als
Screenshot angehangen. Es wäre toll, wenn ihr Euch die Modelle mal
anschauen könnten und Euren Senf dazu geben könntet. ;) Es sind meine
ersten zwei Modelle.
Ich würde nun gerne vergleichen, wie groß die Vorteile des PID-Reglers
sind. Ich habe ein Delay-Glied in die Rückführung eingebaut und die
Regler mit unterschiedlichen Anstiegsfunktionen gefüttert, allerdings
dürften die Ergebnisse wohl sehr weit ab von der Realität liegen,
alleine natürlich schon, weil ich nur die Regelung betrachte und den
Rest ignoriere.
- Gibt es trotzdem eine Möglichkeit mit vertretbarem Aufwand auszusagen,
in wie weit das D-Glied Vorteile bringt?
- Und was für eine Steptime sollte ich in Simulink einstellen? Der Chip
läuft mit 16 Megahertz.
- Wie ist die gängige Praxis bzgl. des D-Glieds: Wird der alte Wert vom
neuen Wert abgezogen oder umgekehrt?
Und die letzte Frage: Ist es richtig, dass ein falsch eingesteller
Kd-Wert das System in krasse Schwingungen bringen kann? Eigentlich soll
es ja einem vorhaltenden und damit dämpfenden Effekt haben.
Es wäre super, wenn ich da etwas Licht ins Dunkel bringen könntet.
Beste Grüße
Andreas