Forum: Mikrocontroller und Digitale Elektronik Regelung Paramter ?


von chris (Gast)


Lesenswert?

hallo,
ich habe für einen Motor eine PI - Regelung programmiert.
Jetzt fehlt mir die Erfahrung beim einstellen der Regelparameter.
hier mein code :
  230     /* PI-Regler rechter Motor // Motorausgang 1 */
  231
  232     FehlerRechts = 0;
  233     FehlerRechts =(sollWert-istRechts);                     //
  234     FehlerRechts += Differenz;                              //
  235
  236     //  Anteil P-Regler
  237     KorrRechts =  (FehlerRechts*0.5);                      // Kp
  238
  239     //  Anteil I-Regler
  240     IntegralRechts += (FehlerRechts*0.2);                   //
  241     if(IntegralRechts > 5) IntegralRechts = 5;              //
  242     if(IntegralRechts < -5) IntegralRechts = -5;            //
  243     KorrRechts += IntegralRechts;                           //
  244
  245     aktuellerWert_Rechts +=KorrRechts;                      //
  246                                                             //
  247                                                             //
  248                                                             //
  249                                                             //
  250     if (aktuellerWert_Rechts>29) aktuellerWert_Rechts=29;
  251     if (aktuellerWert_Rechts<-29) aktuellerWert_Rechts=29;
  252     vRechts =  Ticks_Gesch(aktuellerWert_Rechts);            //
meine parameter sind für prop-Regler : 0.5,
für I-Regler 0.2
bei dieser Einstellung schwingt meine drehzal zwischen langsam -schnell
... wenn ich den I anteil komplett weglasse driftet der Robotor nach
links( der robotor hat 2 Räder , jedes Rad hat seine eigene Regelung )


Wie ist die Vorgehensweise beim Einstellen einer Regelung ?
(nicht durch rechnen, sondern durch "Probefahrten" ? )
  Danke
   chris

von TOM (Gast)


Lesenswert?

Was regelst du? Die Drehzahl? Wenn ja, wie mißt du diese?

Ich würde den I-Anteil erstmal ganz zurücknehmen. Dann die
Proportionalverstärkung schrittweise erhöhen bis die Stabilitätsgrenze
erreicht ist (unter dieser bleiben). Jetzt sollte er ja bis auf die
bleibende Regelabweichung stabil regeln. Nun kannst du Regelabwichung
durch langsames erhöhen des I-Anteiles minimieren. Dabei mußt du aber
gleichzeitig deinen P-Anteil wieder mit zurücknehmen, sonst neigt dein
System zum Überschwingen.
Fehler können natürlich auch von deiner Drehzahlinformation kommen (zu
geringe Auflösung...).

Gruß

Thomas

von Michael Wilhelm (Gast)


Lesenswert?

>if (aktuellerWert_Rechts<-29) aktuellerWert_Rechts=29???;
muß das nicht -29 heißen?

MW

von chris (Gast)


Lesenswert?

guten morgen,
ich regel die Drehzahl per PWM.
An meinnem Motoren sind Lichtschranken und EncoderScheiben(Schwarz weiß
gestrichelt) damit messe ich die Übergänge zwischen weis -schwarz und
schwarz-weis, jeweils 1 Tick.
also ich messe die Ticks die gefahren wurden, vergleiche es mit dem
Sollwert und geben dann einen neuen wert für die PWM ein.
(Fehler bei der Drehazahlinfo sind schon ausgeschlossen)
  Chris
PS: kann mit jemand erklären wie ich rausfinde in welche richtung sich
mein Rad dreht ? habe 2 Lcihtschrenken pro Encoderscheibe,
Encoderscheib e oben im Text beschrieben ?

von chris (Gast)


Lesenswert?

ja .. danke .. bei dem Testfall bin ich noch gar nicht.Sonst wäre ich da
auch reingefallen.
  chris

von Rahu (Gast)


Lesenswert?

Hallo Chris,

zur Funktionsweise, in welche Richtung deine Scheibe dreht, solltest du
dir mal die Funktionsweise von Drehencodern angucken:
Wenn sich die beiden Lichtschranken in einem Segment befinden, dann
wird eine der beiden bei Bewegung dieses Segment verlassen. Durch die
Anordnung der Lichtschranken kann man dann feststellen, in welche
Richtung sich das Rad gedreht hat.

von Ulrich (Gast)


Lesenswert?

andi  enc_last, 0x0    ;Ausmaskieren der letzten 2 Bits
  clr  int_i      ;Löschen des Ergebnis Registers
  sbic  PINC, 2      ; Die nächsten 7 Zeilen sind der Kern für den ich 
20
Minuten gebraucht habe ;-)
  inc  int_i        ;
  ldi  temp, 0b00000011
  sbic  PIND, 2     ;
  eor  int_i, temp     ;
  sub  int_i, enc_last    ;
  add  enc_last, int_i    ;
  sbrs  int_i, 0    ; Es dreht sich sorum
  rjmp  _ioc1a1
  sbrs  int_i, 1    ;   Oder es dreht sich andersrum
  rjmp    _ioc1a2
  sbi  PORTD, 1    ; Zum Beispiel Wert runterzählen
  rjmp  _ioc1a1
_ioc1a2:        ;
  cbi  PORTD, 1    ; Zum Beispiel Wert hochzählen
_ioc1a1:        ; Ende


PS: Ich hoffe es bringt dir was ;-) Bin gerade auch dabei mir einen
PI-Regler zu bauen welcher mit PWM regelt.....

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.