Hallo liebe community,
ich baue seit neuem einen Roboter der einer Linie auf hellem Untergrund
nachfahren soll mit einem PI Regler, ev. auch PID.
Den P-Anteil habe ich schon implementiert und er funktioniert auch.
Beim I Anteil plage ich mich jetzt schon seit Tagen und bekomme kein
vernünftiges Ergebnis.
ich verwende den PI Algorithmus von folgender Seite
http://www.rn-wissen.de/index.php/Regelungstechnik
Ich bekomme von meinen cny70 Sensoren eine Regeldifferenz von -160 ...
+160.
0 bedeutet, dass der Roboter auf der Linie ist. Die Regeldiffernz ist
sehr fließend und linear.
Ich rechne das ganze so aus:
1 | float Integral, Proportional, PI = 0;
|
2 |
|
3 | Proportional = differenz * Kp;
|
4 |
|
5 | esum = esum + abs(differenz);
|
6 | Integral = Ki*esum* differenz;
|
7 |
|
8 | PI = Proportional + Integral;
|
9 |
|
10 | if(PI > 400)
|
11 | PI = 400;
|
12 | else if(PI < -400)
|
13 | PI = -400;
|
14 |
|
15 | PWML = v_gerade - PI;
|
16 | PWMR = v_gerade + PI;
|
Der I Anteil funktioniert schon, aber das Problem ist wenn ich den
ROboter von der Position 0 auf beispielsweise -10 ändere, dann rechnet
er -10-I Anteil der immer weiter noch schwach ansteigt.
Gehe ich jetzt zurück auf null und wieder auf -10 so rechnet er von dem
zuletzt ausgerechnetem Wert weiter.
Ist auch klar weil ja esum nicht gelöscht wird.
Das selbe Problem passiert auch von 20 auf 50 und mit allen anderen
Werten auch.
Es funktioniert alles perfekt und der Roboter fährt auch sehr genau der
Linie nach wenn ich den I Anteil auf 0 drehe.
Drehe ich ihn auf 0,01 so wackelt er einfach sehr stark hin und her und
brauch 3 mal so lang bis er die Strecke schafft, also da darf was nicht
stimmen.
Wie genau kann ich diese blöde Macke mathematisch beheben?