Forum: Mikrocontroller und Digitale Elektronik Roboter I Anteil dimensionieren


von Markus P. (Gast)


Lesenswert?

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?

von Mark 0815 (Gast)


Lesenswert?

Hi!
hast du den PI-Regler von der Seite: 
http://www.rn-wissen.de/index.php/Regelungstechnik#PI-Regler?
Falls ja, dann übernehme den Code mal komplett. Ich glaube du hast da 
nämlich einen Fehler drin!
1
  e = w - x;        //Vergleich
2
  esum = esum + e;      //Integration I-Anteil
3
  if (esum < -400) {esum = -400;}          //Begrenzung I-Anteil
4
  if (esum > 400) {esum = 400;}
5
  y = Kp*e + Ki*Ta*esum;      //Reglergleichung
6
  if (y < 0) {y = 0;}      //Begrenzung Stellgröße
7
  if (y > 255) {y = 255;}
8
  PWM = y;        //Übergabe Stellgröße

Der I-Anteil ist dazu da, den entstehenden Lagefehler wegzubügeln.
Einstellen machst du folgendermaßen:
I-Anteil sehr klein stellen.
P-Anteil solange hoch drehen, bist du bemerkst das der Regler instabil 
wird (der Roboter fängt an zu schlingern).
Dann den I-Anteil langsam hochdrehen.

Alternativ & besser: Ein Modell aufstellen und mit Hilfe eines Programms 
(z.B. Matlab) Reglerparameter suchen.

PS: Eine Hystereseregelung würde vielleicht auch funktionieren! ;)

von Karl H. (kbuchegg)


Lesenswert?

Markus P. schrieb:

>     esum = esum + abs(differenz);

Häää?
Wieso abs?
Wie soll denn da der Fehler wieder kleiner werden können?

>     Integral = Ki*esum* differenz;

und warum dann noch * differenz?

von Markus P. (Gast)


Lesenswert?

Hmm, ihr habts da irgendwie recht.

wieso noch mal differenz
hab das mal so umgeändert:
1
Proportional = differenz * Kp;
2
3
    esum = esum + (0-differenz);
4
    Integral = Ki*esum;
5
6
    PI = Proportional + Integral;
7
8
    if(PI > 400){PI = 400;}
9
    else if(PI < -400){PI = -400;}

Da ja 0 meine Sollposition ist.

Ein weiteres Problem ist, dass ich eine 2 Größen Regelung habe, das 
bedeutet der eine Motor muss so und der andere anders. Momentan sage ich
Motor Links = 500 + PI;
Motor Rechts = 500 - PI;

Es schaut zwar jetzt ein bisschen besser aus von dem I Regler her, aber 
wirklich funltionierten tut es trotzdem nicht.
Den I Anteil habe ich auf 0,001.
Zu einem Dauerschwingen kommt er wenn mal die Linie nicht so erwischt 
wie immer ansosnsten schwingt er nur mit P nicht.
Aber wenn er mal schwingt dann hört er nicht mehr auf deswegen den I 
Anteil, aber ich weiß nicht so recht.

Das Problem ist jetzt ich kann den I Anteil soweit runter drehen wie ich 
will, es hilft einfach nicht.
Ich werde da morgen weiter machen und danke erstmal für die sehr gute 
Hilfe

von Karl H. (kbuchegg)


Lesenswert?

Markus P. schrieb:
> Hmm, ihr habts da irgendwie recht.


Eigentlich steht der Code schon in der von dir verlinkten Seite. Du 
musst ihn nur abschreiben. Einfach nur abschreiben. So wie er dort 
steht. Einfach nur abschreiben. Ist doch nicht so schwer. Sind doch nur 
2 Zeilen. Einfach abschreiben.

>
>     esum = esum + (0-differenz);

Man kann es so schreiben. Man muss aber nicht.
Man kann das nämlich auch so schreiben


      esum = esum - differenz;

Ist das zu einfach oder warum bevorzugst du die komplizierte Variante? 
Prinzip der maximalen Konfusion?

PS: Im übrigen steht im Original dann aber auch ein + und kein -.
Gut, dass ist nicht so schlimm, dreht sich halt bei der Konstanten Ki 
ebenfalls das Vorzeichen um damit sich wieder alles ausbügelt.

Ob man jetzt

      esum = esum - differenz;

und dafür ein Ki von -0.0001 nimmt oder

      esum = esum + differenz;

mit einem Ki von 0.0001 kommt sich hier

      Integral = Ki*esum;

aufs gleiche raus.

Nur
      esum = esum - differenz;
und ein positives Ki von 0.0001 sollte man dann aber nicht nehmen, denn 
anstelle dass der I-Regler die Regelabweichung verkleinert, versucht er 
dann sie zu vergrößern. Und das ist ja nicht Sinn der Sache.

In der Computational Geometrie gibt es ein geflügeltes Wort:
Was immer du auch tust, stell sicher dass du eine gerade Anzahl an 
Vorzeichenfehlern hast.

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.