Sida 1 av 2

PID-regulator ... tänker jag rätt?

Postat: 8 september 2013, 15:00:43
av jesse
eh.. ska försöka formulera mig så att det går att begripa frågeställningen ...

Jag har gjort en modell av en PID-regulator i ett open-office-calc dokument. Den exakta modellen av den externa processen känner jag inte till helt och hållet (fördröjning / förstärkning etc. är inte helt kända), men på ett ungefär.

Värdet jag ska reglera är en ström mellan 0 och 25 ampere. Utsignalen är en analog spänning på 2-5 volt som styr strömmen någorlunda proportionellt. Men det kan förekomma plötsliga avvikelser på flera ampere som måste kompenseras för. Modellen fungerar som jag önskar.

Men det jag undrar över är egentligen de tre parametrarna - P, I och D. Som det är nu så verkar det som om det är parametern I som har den viktigaste rollen - ja, man kan faktiskt helt ta bort de andra två och jag har en ungefär lika bra reglering ändå. Utan den så fungerar det inte alls. Kan det vara så? Jag funderar bara på om jag på något vis använd den här PID-algoritmen på ett udda eller felaktigt sätt på något vis? Jag trodde det var P-variabeln som var den viktigaste, "grunden", och de båda andra, I och D bara kompenserade för mindre fel.

Bifogar .ods filen samt en bild. Tar även med lite kod. (Har ej kunnat testa koden i praktiken än, då jag inte har all hårdvara tillgänglig).
PID simulator.png
X-axeln är tiden i sekunder. under 14-17 sek läggs en störning på utifrån (en last börjar dra ström som måste kompenseras för).
PID-formeln visas i inmatningsfönstret på bilden.


kod:

Kod: Markera allt

/// reglerar laddarens ut-ström. kompenserar mot snabba förändringar.
/// anropas 15 ggr/sek
/// set_point och measured_val är ampere*100. (25.00A = 2500)
void PID_regulator()
{
	const u8 K_faktor = 5; //  betyder att förstärkningen är 1 / 2^K_faktor
	const u8 K = (1 << K_faktor);
	static s32 Pold, I;
	s32 P,D,out;
	
	if (!PID.run) 
	{
		/* stäng av - återställ värden */
		I = 0;
		Pold = 0;
		PID.softstart = 0;
		PID.set_curr = 0;
		out = 0;
	}
	else
	{
		/*** sätt önskat värde ***/
		s16 want = PID.set_curr;
		if (want > PID.max_curr) want = PID.max_curr;
		if (want > PID.softstart) want = PID.softstart;
		if (PID.softstart < PID.max_curr) PID.softstart += 3; // öka 0.03*15 A / sek = 1 ampere på 2.22 sek eller 25A på 56 sek.
		else if (PID.softstart > PID.max_curr) PID.softstart--;
			
		/*** beräkna PID-variablerna ***/
		P = PID.set_curr - PID.is_curr; // skillnad - Proportionell
		I += Pold;						// intregral del
		D = P - Pold;					// derivativ del
		Pold = P;					// minns tidigare skillnad
			
		/*** begränsa I -delen ***/
		if (I > 1200L * K) I = 1200L * K;
		else if ( I < -1200L * K) I = -1200L * K;
			
		/*** beräkna utsignal ***/
		out = (P + I + D) >> K_faktor; // K = 0.03125
			
		/*** justera utsignal till tillåtet område ***/
		if (out < 0)
		{
			out = 0;
			Pold = 0; // öka inte på integraldelen vid overflow!
		}
		out += 400; // botten PWM = 2.00 volt
		if (out > 1023)
		{
			out = 1023; // max PWM
			Pold = 0; // öka inte på integraldelen vid overflow!
		}
	}
	

	
	/*** skicka ut signal ***/
	SetPWM(out);
}

Re: PID-regulator ... tänker jag rätt?

Postat: 8 september 2013, 15:24:49
av sodjan
Det låter lite underligt, utan "P" så har du ingen absolut referens mellan in och utsignal alls.
I och D är bara rellativa till ett föregående läge, ingen av dom ger någon absolut nivå.
Som jag minns det:

P: Sätter entydigt den önskade utsignalen ("förstärkningen").
I: Hjälper till att fånga upp små fel (t.ex från statiska belastningar)
D: Hjälper till att fånga upp snabba ändringar.

Re: PID-regulator ... tänker jag rätt?

Postat: 8 september 2013, 15:36:33
av blueint
Kanske simuleringen saknar relevant brus för att ge realistiska förutsättningar?

Re: PID-regulator ... tänker jag rätt?

Postat: 8 september 2013, 16:15:21
av psynoise
Finns inget som säger att alla termer måste vara med. Inomhustemperatur i ett hus styrs lämpligen via en I-regulator.

Re: PID-regulator ... tänker jag rätt?

Postat: 8 september 2013, 16:25:43
av kimmen
Om man implementerar den där formeln från Wikipedia

\(u(t) = K(r(t)-y(t) + \frac{1}{T_i} \int_{0}^{t} (r(\tau) - y(\tau)) d\tau + T_d \frac{d(r(t)-y(t))}{dt})\)

så går det ju inte att vara utan P-del om man vill ha någon reglering över huvud taget, men med en alternativ implementation på formen

\(u(t) = K_p(r(t)-y(t)) + K_i \int_{0}^{t} (r(\tau) - y(\tau)) d\tau + K_d \frac{d(r(t)-y(t))}{dt}\)

så går det ju att få reglering med endast I-del.

Om man har I-del går felet mot 0 när tiden går mot oändligheten om störningar och referens är ickevarierande. Fördelen med att också ha P-del är att regleringen blir snabbare. Vissa processer är dessutom omöjliga att reglera stabilt med endast I-del.

Om man tar ditt exempel här och använder endast I-reglering (försummande samplingen och fördröjning och liknande hos spänningskällan) så får man ju en krets som är en tvåpol som beter sig enligt

\(u(t) = K_i \int_{0}^{t} (i_{ref}(\tau) - i(\tau)) d\tau\)

där u(t) är terminalspänningen och i(t) utströmmen. Detta är ju samma egenskap som man får av en ideal strömgenerator givande strömmen \(i_{ref}(\tau)\) i parallell med en kondensator med kapacitansen \(K_i\). Man skulle kunna säga att regulatorn simulerar den kretsen. Lägger man till P-delen får man ett motstånd i serie med kondensatorgrenen med resistansen \(K_p\) och med D-del simulerar man även induktans.

Att köra med endast I-reglering fungerar bra så länge systemet man försöker reglera har mindre än 45 graders fasfördröjning vid den skärfrekvens man vill ha om man siktar på 45 graders fasmarginal (max 30 grader om man vill ha 60 graders marginal).

Re: PID-regulator ... tänker jag rätt?

Postat: 8 september 2013, 17:42:45
av Greve Hamilton
Har inte tittat på .ods-filen, men som jag förstår din kod kör du med samma koefficient för alla delar (P, I och D). Du bör ju snarare implementera den något i stil med:

e := want-meas
I := I + e*dt
D := (e - e_old)/dt
e_old := e
out := Kp*e + Ki*I + Kd*D

Samt anti-windup på integreringen och andra detaljer. Men som sagt, det finns inget som säger att inte enbart I-verkan skulle fungera. Det beror ju så klart på önskad snabbhet/störkänslighet etc. Men du borde kunna se en klar skillnad med/utan P-del om du gör stegsvarsimuleringar.

Re: PID-regulator ... tänker jag rätt?

Postat: 8 september 2013, 20:52:54
av baron3d
Du har rätt! Det går att bara använda I. Men det blir INTE bra.
Vanligt är bara P. Om ditt P inte har så stor effekt, så är P för liten!

P är den faktorn som sköter regleringen, I fixar bara till det i slutändan, liksom.

Till börja med sätt D=0. D bara krånglar till det. När allt fungerar lägger du till D.

Re: PID-regulator ... tänker jag rätt?

Postat: 8 september 2013, 21:03:44
av jesse
Tack för svaren.

Kimmen: eh.. lite för sent på kvällen just nu för att hänga med i resonemanget...

Hamilton: Jo, jag vet, men eftersom det i min simulering fukande bäst när alla tre var lika så förenklade jag lite :wink:

3d: Det är så jag tänker också. Problemet är att den blir instabil innan jag kommer upp i Kp-värde tillräckligt stort för att kunna reglera. Kp måste vara litet.

(jag kapade bort titeln "Greve" från Hamilton, så därför tog jag även bort baron från 3d. Det ska ju vara rättvist! :D )

Re: PID-regulator ... tänker jag rätt?

Postat: 9 september 2013, 06:58:33
av svanted
teoretiskt....
har man ingen fasföskjutning i systemet behöver man inte I och D bara P.
har man en med viss fasförskjutning går det inte att ha full P, det ger då självsvängning, vid vissa frekvenser, det blir det när
frekvensen när fasförskjutningen är 180° och förstärkningsfaktorn > 1,
därför sänker man P till under 1 och lägger till I dvs felet multiplicerat med en konstant....
som ger rätt slutvärde men efter en viss tid..
och för att kompensera för "I"s fördröjning lägger man till D som förstärker snabba förlopp...


att simulera PID med ett teoretiskt system utan fördröjningar säger e.g. ganska lite...
iom att man kan ta bort I och D utan att få självsvängning...

edit:
tänkte fort där...
har inte riktigt koll på vad jag menade med "P till under 1", ska fundera sen.... :?
edit igen..
ska vara 360° och inte 180...
lämnar tråden nu.... :)

Re: PID-regulator ... tänker jag rätt?

Postat: 9 september 2013, 08:58:18
av Nerre
Med bara P så uppnår man ju aldrig bör-värdet?

Det är ju P-regleringen som är "felet multiplicerat med en konstant"?

Utsignal = K * (bör - är)

Re: PID-regulator ... tänker jag rätt?

Postat: 9 september 2013, 09:24:37
av Walle
Svanted kanske menar det ackumulerade felet gånger en konstant? För det är väl just det I är? Poängen är väl i alla fall delvis att I ska kompensera för många småfel (t.ex. avrundningsfel) som ackumuleras över tiden?

Re: PID-regulator ... tänker jag rätt?

Postat: 9 september 2013, 09:30:26
av SeniorLemuren
Lite läsbart om PID-reglering:
Idiot Guide to PID Algorithm.pdf
Ziegler-Nicholsmetoden.pdf
Edit: A PID controller example explained in simple words:
PID Theory.pdf

Re: PID-regulator ... tänker jag rätt?

Postat: 9 september 2013, 09:53:36
av svanted
det borde man, se Utsignalen som en drivspänning till servomotorn...
i en hypotetisk servostyrning...

med bör = 1
är = 0.5
K = 1
då kommer servomotorn att få +0.5V och att typ snurra medurs och felet minskar,

men om K är liten kommer man att nå en så låg spänning att motorn inte snurrar alls trots att det finns ett fel,
här kommer I in, om man adderar felet över tid ökar det utspänningen ovanför motorns tröskelspänning tills det lilla felet är åtgärdat...

Re: PID-regulator ... tänker jag rätt?

Postat: 9 september 2013, 10:09:49
av Nerre
Walle skrev:Svanted kanske menar det ackumulerade felet gånger en konstant? För det är väl just det I är? Poängen är väl i alla fall delvis att I ska kompensera för många småfel (t.ex. avrundningsfel) som ackumuleras över tiden?
Nej, I ska se till att man uppnår börvärdet.

Grejen är ju att ju närmare bör-värdet man kommer desto mindre blir felet, och desto mindre blir signalen som ska ta dig mot felet.

Om vi ett exempel med en enkel reglering med en P-faktor på 0,5 och ska göra ett "steg" från 0 till 10. Och så räknar vi "diskret" för varje sekund istället för kontinuerligt (för att det blir tydligare).

Vid T=0 är felet 10 och styrsignalen blir 5.
Vid T=1 är är-värdet 5, felet är också 5 och styrsignalen blir 2,5.
Vid T=2 är är-värdet 7,5, felet är 2,5 och styrsgnalen blir 1,25.
Vid T=3 är då är-värdet 8,75

Som du ser konvergerar är-värdet mot bör-värdet men eftersom felet minskar så kommer styrsignalen att minska så vi kommer aldrig att nåt riktigt hela vägen fram.

Det är det som I-regleringen kompenserar för.


När vi läste reglerteknik i plugget så hade boken fina kurvor som visade just problemet med ren P-reglering och hur I fixade det, men jag har inte lyckats googla fram några såna kurvor:(

Re: PID-regulator ... tänker jag rätt?

Postat: 9 september 2013, 10:54:45
av sodjan
Ett problem utan "I" är att om det finns en statisk belastning
på systemet (tänk en vanlig hiss) så kommer det hela att
stanna då styrsignalen är samma som belastningen. Beroende
på hur "flexiblelt" systemet är så kan hissen stanna med en tröskel.
"I" ser till att hissen krypkör den sista biten...

Sen så kanske man har andra givare i just en hiss, men i princip...