Forum: Mikrocontroller und Digitale Elektronik PID prinzip


von Harald (Gast)


Lesenswert?

Hallo zusammen,

ich beschäftige mich zum ersten Mal mit Reglern(P,PI,PID). Ich habe vor 
mit einem Schrittmotor Jalousien je nach Lichteinstrahlung hoch bzw. 
runter zu fahren. Dabei wird die Lichteinstrahlung durch eine Fotodiode 
gemessen.
Der Schrittmotor bekommt "Tics" vom µC, ob er nun hoch oder runter 
fahren soll.

Ich habe versucht das Prinzip hier zuveanschaulichen:

while(1){
Istposition = ConvertMotorTics(ReadADCPhotodiode());
tics = PID(Sollpos - Istpos, Istpos);
Motor(tics);
}

PID{//prinzip pid
pTerm = Kp * error;//p-Regler

iState += error;
iTerm = Ki * iState; //I-Regler

dTerm = Kd * (Istpos - dState);
dState = Istpos; //D-Regler

return pTerm + iTerm - dTerm;
}

D.h. über einen ADC des µC wird die Lichteinstrahlung gemessen.
Da ich aber die Istposition in Tics brauche muss ich eine fkt erstellen 
mit der ich den HEX-Wert des ADC (Lichteinstrahlung) in Tics für den 
Motor umwandele. Danach über gebe ich dies an die PID fkt. Dieser gibt 
einen Wert in Tics zurück, mit dem ich den Motor ansteuere.

Meine Frage nun ist die Prinzip was ich mir gedacht habe soweit richtig?
Mir ist nicht ganz klar wie ich die Soll bzw. Istposition festlege.
Denn "Istposition = ConvMotorTics(ReadADCPhoto());" ist ja meine 
aktuelle Istposition, aber doch gleichzeitig meine Sollposition, da sich 
der motor an die Helligkeit anpassen muss??

Und brauche ich überhaupt eine pid, reicht nicht ein einfacher p, da der 
Schrittmotor linear mit Tics funktioniert?

Vielen Dank für Tips um meinen Denkfehler aufzulösen!!

von Daniel (Gast)


Lesenswert?

Hi Harald,

so, wie Du deine Anwendungs schilderst, würde ich sagen dass ein 
PID-Regler sicherlich nicht das Richtige für dich ist. Das Problem ist, 
wie Du schon vermutest Soll und Ist Wert identisch sind, soweit nur die 
Photodiode an das System angeschlossen ist. Daher ist der Regelfehler 
immer gleich null und somit besteht auch kein Bedarf an eine Regelung.

Allerdings kannst Du ja sicherlich auch sagen:
OK, dann schreibe ich halt dem Regler vor, wie hell es im Zimmer sein 
SOLL (per Tastaturvorgabe etc), und messe mit der Photodiode IM Zimmer 
die - diffuse - IST Helligkeit.
Daraus bilde ich dann die Abweichung und lasse sie von einem wie auch 
immer gearteten Regler anpasse, indem die Jalusie öffnet oder schließt.
Ein PI-Regler sollte dann aber reichen, den P Anteil brauchst Du um den 
ADC-Wert an die Schrittmotor-Tics (Jalusie-Position) anzupassen und den 
I-Anteil, um eine bleibende Regelabweichung zu korrigieren. Aufgrund des 
extrem langsamen Systems wird ein D- Anteil wohl eher den Schrittmotor 
zerstören, da dann bei jedem an der Diode vorbeifliegendem Insekt die 
Jalusie mit vollgas geöffnet wird....

von Harald (Gast)


Lesenswert?

Super, ich sitze hier schon seit einigen Stunden, und jetzt nach deiner 
Hilfe erscheint mir das Problem doch einfach! Danke!

Eine Frage noch, bitte:
Den Sollwert lege ich vor der Whileschleife fest. Danach läuft die 
Regelung in der Schleife non-stop und richtet sich an den SollWert. 
Richtig?

D.h. ich müsste jetzt einfach nur Kp und Ki bestimmen
(Ich hab da mal was von Ziegler-Nichols-paramenter gehört, wo man 
bestimmte Faktoren an den Kp bzw. Ki setzt.):

Kp bestimmt man, indem man den Ki zuerst weg lässt und den Kp solange 
verstärkt bis der Schrittmotor ozilliert, sprich sich dieser nicht mehr 
an einem bestimmten punkt einpendeln kann, also immer hoch<=>runter.
Ki wird dann so dimensioniert, dass das ozillieren verschwindet.

Hast du vielleicht eine Idee wie man den Wert des ADC(Photodiode) in 
Tics umwandeln kann(ConvertMotorTics)?

Waren wohl mehr als eine Frage ;-)

von Philipp B. (philipp_burch)


Lesenswert?

Hm, warum denn überhaupt so kompliziert? Ist die Helligkeit zu hoch wird 
die Jalousie langsam (Schnell wird wohl eh nicht möglich sein ;) ) 
geschlossen, bis die Abweichung ein bestimmtes Mass unterschritten hat 
(Nennt sich auch Hysterese) und wenn es zu dunkel ist eben umgekehrt. 
Aufwändigere Regelverfahren wie PID brauchst du erst, wenn die Messung 
des Ist-Wertes z.B. relativ langsam ist, wie bei Temperaturregelungen. 
Da beginnt's sonst zu schwingen.
Aber das Licht wird schon genügend schnell durch dein Fenster gehn, 
damit das kein Problem wird. Und mit 20 Messungen pro Sekunde oder sowas 
müsstest du schon eine ausreichend kleine Hysterese hinbekommen, ausser 
deine Jalousie braucht vom einen bis zum anderen Anschlag nur ein paar 
Millisekunden ;)

von Harald (Gast)


Lesenswert?

Hi @Philipp,

eine Hysterese hört sich schon sinnvoller an. Der Motor könnte bei 
Änderung des Lichts mit einer konst. Geschwindikeit hoch,runter fahren 
bis die photodiode den sollwert misst. Bei den PI-Regler würde der Motor 
erst schnell dann langsamer anfahren bis zum Sollwert, oder?

"Aufwändigere Regelverfahren wie PID brauchst du erst, wenn die Messung
des Ist-Wertes z.B. relativ langsam ist, wie bei Temperaturregelungen.
Da beginnt's sonst zu schwingen."

Dies habe ich nicht ganz verstanden. Man kann doch 20 Mal die Sekunde 
die Temperatur messen oder, wo liegt da das Problem?

von Ulrich (Gast)


Lesenswert?

Es ist die Zeitverzögerung zwischen Heizen und messer der erwärmung 
gemeint

von Harald (Gast)


Lesenswert?

Achso,
Verstehe ich das so:
Die Regelstrecke bei Temp/Heizung ist lang, man sieht den Effekt später. 
Daher muss der Istwert langsam an den sollwert anpassen.(keine 
ozillation verursachen)

Bei Licht/Jalousie ist die Streck kurz, den Effekt ist direkt zu 
erkennen.
Daher kann direkt der Istwert auf den Sollwert einstellen werden, da 
aber der Motor nicht unendlich schnell ist, kann man es einfach durch 
eine
while(soll==ist){
 motor++;
 sleep//wartzeit bis der motor ein tic gefahren hat.
}

Natürlich fehlt hier noch das Hystereseverhalten, also
(minGrenze<--->SollHelligkeit<----->maxGrenze)

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.