Hallo!
Ich benutze den Code vom AVR221 Beispiel. Mir geht es aber nicht um den
Regelalgorithmus selbst, sondern eher um die Skalierung auf meinen
gewünschten Stellwert.
Beschreibung:
Eine Konstantstromquelle wird über eine PWM eingestellt.
Wobei der Wert 2806 der Maximalwert ist(entspricht 400mA, aber nur 78%
der PWM). Ein Temperatursensor liefert mir den aktuellen Temperaturwert
in Grad C. Mein Grenzwert(Sollwert) ist auf 85 GradC eingestellt. Ich
möchte nun, dass die Konstantstromquelle bis 60 GradC mit dem maximalen
Strom läuft und dann pro Grad in ca. 10mA-Schritten(entspricht ca. einer
2% Verminderung der PWM) fällt und bei >=85GradC nur mehr 200mA hat.
Wenn ich nun eine einfache Proportionalregelung verwende, wie muss ich
die Skalierung vornehmen damit ich vernünftige PWM-Werte erziele?
Mein maxError ist auf 25 eingestellt, damit der Regler erst bei einer
Temperatur von 60 GradC anfängt zu regeln. Der Faktor P_Factor ist auf
0,5 eingestellt.
Mir ist nicht ganz klar wie mit welchen Faktor x ich (P_Factor error
x) multiplizieren muss um ein p_term zu bekommen was meiner PWM
entspricht.
Bsp.: bei 60GradC
error = 85 - 60 = 25
p_term = 0,5 * 25 = 12,5 um nun den PWM Wert 2734 für 76% zu erhalten
muss p_term mit 218 multipliziert werden.
bei 61GradC
error = 85 - 61 = 24
p_term = 0,5 * 24 = 12 um nun den PWM Wert 2662 für 74% zu erhalten muss
p_term mit 221 multipliziert werden usw.
Wie realisiere ich das am besten?
Ich kann doch nicht für jedes GradC mit if Abfragen den richtigen Faktor
suchen. Es geht sicher noch einfacher...
1 | error = setpoint - process_val;
|
2 |
|
3 | /* Calculate Pterm and limit error overflow */
|
4 | if (error > pid_st->maxError) {
|
5 | p_term = 2880;
|
6 | } else if (error < -pid_st->maxError) {
|
7 | p_term = -MAX_INT;
|
8 | } else {
|
9 | p_term = pid_st->P_Factor * error * ???
|
Bitte um einwenig Hilfestellung...
lg