www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PID-Regeler Leuchtsteuerung


Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Ich bin ein bisschen am verzweifeln. Folgendes:

Ich hab einen Lichtsensor. Und eine Lampe die per PWM angesteuert wird. 
Soweit zu gut. Die soll einen gewissen Luxwert halten.

Ich hab versucht mittels eine PID, PD, PI diese Regelung aufzubauen. Ich 
schaffe es einen fast stabile Reglung hinzubekommen. Allerdings nie mit 
der vollen Helligkeit.

Angenommen ich hab einen Luxsollwert von 300 Lux. Halte jetzt den 
Lichtsensor zu, dann schaffe ich maximal 180 (0 - 254). Eigentlich 
sollte er 254 erreichen in dem Fall.

Kp wurde so bestimmt, dass ich fast an einer schlechter werden Dämpfung 
bin. Dann habe ich versucht Ki einzustellen. Das geht allerdings nur bis 
zu einem gewissen Grad. Dann fängt das System dermaßen anzuschwingen, 
dass es nimmer lustig ist.

Vielleicht kann mir ja jemand helfen... Wäre super! ;-)

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da wirst du dich schon etwas ausfühlicher über dein Programm verbeiten 
müssen - Hellseher sind hier leider ziemlich rar.

Autor: BlabLa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

also ein komilitone von mir hat im labor so nen ähnlichen versuch 
gemacht wie du den gerade vorhast. ich erinnere mich jetzt nichtmehr an 
alle einzelheiten, aber ich weiss noch das er den messwert mit einem 
p-t1 glied dämpfenb musste, weil das messsignal sehr verrauscht war um 
das system einiger massen gut regeln zu können.

hoffe das ich dir weiter geholfen habe.

Gruß
BlaBla

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Max schrieb:
> Angenommen ich hab einen Luxsollwert von 300 Lux. Halte jetzt den
> Lichtsensor zu, dann schaffe ich maximal 180 (0 - 254). Eigentlich
> sollte er 254 erreichen in dem Fall.

Ich fürchte dein I-Anteil ist zu gering.

Im fall einer Helligkeitsregelung würde ich 2-Stufig vorgehen.
1. Steuerung des PWM-Wertes anhand von Sollwert (und ggf. 
Betriebsspannung)
   Die Steuerung sollte auch ohne Regleranteil die PWM schon auf +/- 10%
   Genauigkeit stellen.

2. Regler für Feinabgleich
   (Umgebungshelligkeit, Alterung des Leuchtmittels usw.)

Gruß Anja

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@uhuu

Ich hab versucht einen einfachen PID Regler zu realisieren. Leider 
bisher ohne erfolgt

http://www.rn-wissen.de/index.php/Regelungstechnik

@Bla

Das mit der Dämpfung ist ein sehr guter Tip. Dann schau ich mir das 
nochmal an. Denn mit einem normalen PID Regler komm ich irgendwie nicht 
weiter.
Regelungstechnik ist leider bei mir schon fast 2 Jahre ehr. Und damals 
hätte ich nicht gedacht, dass ich das nochmal so schnell brauche! ;-) 
Studenteneinbildung halt! :P

@Anja

Ja das habe ich mir auch gedacht. Deswegen hab ich ihn hochgesetzt. Und 
dann flackerte es bei direkter Rückkopplung (Sensor - Lichtquelle) noch 
stärker.


Komisch ist nur, dass wenn ich den Lichsensor direkt auf die Lampe halte 
Blinkt es nicht mehr!??! Nur wenn er horizontal bzw. in weiterer 
Entfernung zur Lichtquelle ist.

Autor: BlabLa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schau dir doch einfach mal das signal vom lichtsensor mal mit einem 
oszilloskop an, ich habe die vermutung das es da rauscht wie nichts 
gutes, aber das hatte ich ja schon erwähnt. aber dann hättest du ja 
zumindest mal gewissen darüber :-)

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ich mal gemacht habe ich, die abfallende Spannung am Lichtsensor 
gemessen. Na ja ist nicht gerade eine dünne Linie, aber extrem rauschen 
tut die jetzt nicht. Ich schau mal, dass ich heute abend mal ein Foto 
davon mache! ;-)

Kann es auch am AD Wandler liegen?! Bzw. warum kann ich nur bis zu einer 
gewissen Lichthelligkeit kontrolliert regeln?!

Autor: Michael Roek (mexman) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Max,


von "...bis xxx regeln" kann man ja wohl nicht sprechen.
Da regelt nichts!
Und wenn Du bei einer Vorgabe von 300 einen Wert von 256 erreichen 
willst, ist da auch noch nichts von PID zu sehen.

Da hier keiner Deine Regler und Strecken-Eigenschaften kennt, stimmt der 
Tip schon:

Oszilliskop anschliessen, altes Regelungstechnik Skript rausholen oder 
im Netz suchen, Sprungantwort ansehen......

Kann Dir keiner abnehmen.


Gruss

Michael


(PS.: Vielleicht rennt irgendwo irgendwas an einen Anschlage.... 
Oszilloskop findet's)

Autor: Di Pi (drpepper) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich vermute einen fehler im code.
zeig den doch mal.

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Michael Roek-ramirez
Wer ich machen!

Ist es denn richtig, dass wenn ich den Lichtsensor zu halte die Regelung 
die maximal mögliche Stellgröße anlegen müsste - also 254 in meinem 
Fall?!

@ Di Pi
Ich habe mich praktisch daran orientiere. Werde aber heute abend mal den 
Code posten. :-)

http://spurt.uni-rostock.de/lego.pdf

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint16_t controlEVG (uint8_t *channel, uint16_t *sollLuxWert)
{
  static float esum = 0;
  static float ealt = 0;
  uint16_t istADCWert;
  float sollADCWert;
  float differenz;
  int16_t controlResult;
  float taInSek = (float) TA / 1000;

  //Auslesen des Istwerts
  istADCWert = readLightSensor(channel);

  //Umrechnung von LUX -> ADC-Wert
  //0 für 0 Volt und 1023 für VREF
  sollADCWert =  ((float) MAXADCATMAXLUX / (float) MAXLUXATMAXADC) * (*sollLuxWert);

  /* PID Regler berechnung */
  differenz = sollADCWert - istADCWert;                //Vergleich
  esum = esum + differenz;                      //Integration I-Anteil
  
  //Begrenzung des I-Anteils um einen Windup Effekt zu verhindern.
  if (esum < -BEGRENZUGIANTEIL) 
  {
    esum = -BEGRENZUGIANTEIL;
  }
  if (esum > BEGRENZUGIANTEIL)
  {
    esum = BEGRENZUGIANTEIL;
  }                    
  controlResult = KP * differenz +                   //PID - Reglergleichung
          KI * taInSek * esum + 
          KD/TA * (differenz - ealt);              
  ealt = differenz;

  if (controlResult < MINSTELLGROESSE)                //Begrenzung Stellgröße 
  {
    controlResult = MINSTELLGROESSE;
  }                          
  if (controlResult > MAXSTELLGROESSE) 
  {
    controlResult = MAXSTELLGROESSE;
  }

  return controlResult;
}


So einmal der Code

Autor: Michael Roek (mexman) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>
> Ist es denn richtig, dass wenn ich den Lichtsensor zu halte die Regelung
> die maximal mögliche Stellgröße anlegen müsste - also 254 in meinem
> Fall?!


Richtig.

Gruss

Michael

Autor: Di Pi (drpepper) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Reglergleichung teilst du Kd durch TA und nicht wie Ki durch 
taInSek.

Auf den ersten Blick sollte das zumindest das gleiche sein.

Außerdem solltest du mal das Ergebnis deines float-cast überprüfen und 
ggf. über eine alternative (hochskalierunge, Festkomma) nachdenken.

Autor: loverboy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann es sein, dass du dich bei "BEGRENZUGIANTEIL" (für I-Anteil) 
verschrieben hast?
Rechtschreibmäßig vermisse ich da nämlich ein "N". Sonst klappen alle 
deine vergleich nicht, aber wahrscheinlich würde da auch dein Compiler 
meckern...
--> In dem fall: einfach ignorieren, was ich geschrieben habe ;)

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also viel hin und ehr. Viele Versuche. Aber alles schlägt fehl. Ich bin 
echt am verzweifeln. Das Ding schwingt periodisch. Aber will nicht 
aufhören. Zu mindest bei der Helligkeit, wie ich es betreiben möchte. 
Verstehe auch nicht, dass es bis zu 190 (0 - 254) nicht schwingt.

kann mir jemand erklären, wie ich noch Einfluss auf meine "unbekannte" 
Regelstrecke mit einem Regler nehmen kann. Wie bedämpfe ich zum Beispiel 
den Lichtsensor.

LG Max

Autor: BlabLa (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Zum glätten eignet sich immer ein P-T1-Glied, womit du das Sensorsignal 
glättest. für K kannst du 1 annehmen, da du ja keine 
verstärkung/dämpfung haben willst.
Ich habs mal just for fun mal per hand eben mal ausgerechnet, hoffe du 
kannst meine schrift lesen.
Die obere Differenzengleichung sollte eigentlich genügen.
T ist die Abtastzeit und mit T1 müsstest du ein wenig rumspielen oder 
gegebenfalls mal durch simulieren.

Gruß
Blabla

ich hoffe das ich mich nicht verrechnet habe g

Autor: BlabLa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was du noch machen könntest wäre das du zum Beispiel die 
Übertragungsfunktion der Regelstrecke bestimmst.

Dafür nimmst du die Sprungantwort des Systems auf und bestimmst ihre 
Parameter nach dem Verfahren wie im Link beschrieben.

Mit der Übertragungsfunktion der Regelstrecke und dem P-T1 Glied des 
Sensors könntest du dann anschliessend Die Reglerparameter nach einem 
Verfahren deiner Wahl bestimmen.

http://techni.tachemie.uni-leipzig.de/reg/rs_tn.html

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BlabLa schrieb:
> BEGRENZUGIANTEIL

Vermutlich hatte ich doch recht mit dem zu kleinen I-Anteil (Ich meinte 
damit nicht die Regelzeitkonstante sondern den Betrag der auf den 
Ausgang wirkt).

BEGRENZUGIANTEIL muß die Möglichkeit haben bis nach 254 zu laufen.

Eine Willkürliche Begrenzung des I-Anteils als Anti-Windup ist 
normalerweise Unsinnig.
Besser ist ein Einfrieren des I-Anteils wenn der Regler an die 
Begrenzung (0 oder 254 läuft).
Damit das einfacher berechenbar ist wird auch nicht die Fehlersumme als 
I-Anteil gespeichert sondern die Summe aller  "KI  taInSek  esum"

Wenn Du das ganze analog aufbaust begrenzt Du ja auch nicht die 
Eingangsfehlersumme, sondern den Ausgang (an der Versorgungsspannung).

Gruß Anja

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Boar Leute ihr seit die Besten! ;-) Ich werde das mal ausprobieren. Hab 
jetzt 1 - 2 Tage Pause gemacht. Sonst hätte ich die Hardware aus dem 
Fenster geschmissen! ;-)

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@BlaBla

Du bist der Killer! ;-) War die richtige Lösung mit dem PT1 Glied. In 
Kombination mit dem PID Regler super Ergebnis. Anbei die Source. ggf. 
braucht das ja noch jemand! ;-)
uint16_t readLightSensor(uint8_t *channel)
{
    static uint8_t i = 0;
  static uint32_t result = 0;
  
  // Den ADC aktivieren und Teilungsfaktor auf 64 stellen
  ADCSRA = INITADC;

  // Kanal des Multiplexers waehlen
  // Interne Referenzspannung verwenden (also 2,56 V)
  ADMUX = REFVOLTAGE;
  
  // Den ADC initialisieren und einen sog. Dummyreadout machen
  ADCSRA |= (1<<ADSC);
  while(ADCSRA & (1<<ADSC));
  
  for(uint8_t i = 0; i < ADC_CIRCLES; i++)
  {
    ADCSRA |= (1<<ADSC);
    // Auf Ergebnis warten...
    while(ADCSRA & (1<<ADSC));
  
    result += ADCW;  
  }
  
  result /= ADC_CIRCLES;

  return (uint16_t) result;
}

uint16_t pt1GliedADC(uint8_t *channel)
{
  static float e = 0; // Ausgang
  float temp;
  float inputADC = readLightSensor(channel);  

  temp = ADC_T_T1 * (ADC_K * inputADC - e); //Rekursionsgleichung
  e =  e + temp;

  return (uint16_t) e;
}

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok ich will mal das Thema nochmal aufgreifen. Die Regelung funktioniert 
für einen festen Sollwert (sollLuxWert = 500). Soweit so gut. Wenn ich 
jetzt den sollLuxWert auf 50 Lux ändere, dann steuert er bei zu 
gehaltenden Lichtsensor nicht auf die geforderten 254. Dies liegt daran 
das esum in den Begrenzer läuft und Kp z.B. zu klein ist. Vergrößere ich 
die Grenzen, dann dann schwingt es bei großen Luxwerten extrem.

HILFE! :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.