Implementering av PID-regulatorer med dator PID-reglering Styrlagen för en PID-regulator på standardform kan skrivas ) u(t) = K (e(t)+ 1Ti de e(τ)dτ +T d (t) = u P (t)+u I (t)+u D (t) där u(t) är styrsignalen ut från regulatorn oc e(t) = r(t) y(t) är reglerfelet (differensen mellan ärvärdet y(t) oc börvärdet r(t)). De tre delarna av styrsignalen kommer att kallas P-delen, I-delen respektive D-delen. PIDregulatorn kan efter laplacetransformering skrivas ( U(s) = K 1+ 1 ) T i s +T ds E(s) = U P (s)+u I (s)+u D (s) Det finns ett par olika modifieringar av D-delen vilka beror på dels att man vill undvika derivering av börvärdet(för att undvika onödiga spikar i D-delen) oc dels att inverkan av ögfrekvent brus ska minska. D-delen kommer därvid att ändras från U D (s) = KT d se(s) till U D (s) = KT ds 1+ T Y(s) d N s Lågpassfiltreringen minskar känsligeten för ögfrekvent brus i mätsignalen (ärvärdet) y(t). Filterfaktorn N definierar ur ögt i frekvens som deriveringen ska verka. Då N återfås den fulla deriverande effekten. Typiska val av N är 5 eller 1. Den modifierade D-delen kan beskrivas av differentialekvationen T d du D N (t)+u dy D(t) = KT d (t) Diskretisering Vid styrning med dator eller mikroprocessor är det vanligast att man väljer enfixperioid(alt. T s )kalladsamplingsintervalleteller samplingsperioden för vilken man periodiskt utför följande uppgifter: 1. Läs in ärvärdet från AD-omvandlare 2. Beräkna styrsignalen baserat på börvärdet oc ärvärdet 1
3. Skicka den beräknade styrsignalen till DA-omvandlare Ofta tillkommer en fjärde uppgift där vissa tillståndsvariabler uppdateras. Med enbart P-reglering blir detta problem enkelt, vilket följande C-liknande kod visar: y = adin(); // 1. e = r-y; // 2. u = K*e; // 2. daout(u,); // 3. Problem uppstår när I-delen oc D-delen ska implementeras. Vad som krävs då är att approximera integrering oc derivering i diskret tid vid vissa tidpunkter t = k där k är ett eltal (k =,1,2,...). Integralen i(t) = kan skrivas om som differentialekvationen e(τ)dτ di (t) = e(t) vilket betyder att diskretiseringen kan återföras på att approximera tidsderiveringsoperatorn d. Någon form av differentialkvot är alltid involverad men detta kan göras på olika sätt, t.ex.: df f(t+) f(t) (t) eller df f(t) f(t ) (t) Det kan tyckas oväsenligt vilken av dessa som väljs oc detta stämmer i analysen då man använder gränsvärdesövergången lim. För fixt värde på > är dessa dock inte likvärdiga. Detta ar med stabilitet os tidsdiskreta system att göra oc kommer inte att beandlas är. De två approximationerna ovan kallas för framåt-euler respektive bakåt-euler. Approximation av integraldelen Vid approximation av integraldelen u I (t) = K T i i(t) 2
där i(t) = e(τ)dτ di (t) = e(t) kan bakåt-euler användas, vilket undviker stabilitetsproblem för stora samplingsintervall (till skillnad från framåt-euler). Approximationen blir då i(t) i(t ) = e(t) i(t) = i(t )+e(t) Med i k = i(k) oc e k = e(k) där k =,1,2,... kan detta skrivas i k = i k 1 +e k I tidsdiskret reglerteknik används ofta beteckningarna i(k) oc e(k) istället för i k respektive e k även om detta leder till tvetydigeter: Detta kan i C-kod skrivas i = i + *e i(k) = i(k 1)+e(k) För kodningen av en PI-regulator blir därför C-koden y = adin(); // 1. e = r-y; // 2. u = K*(e + i/ti); // 2. daout(u,); // 3. // 4. där den fjärde uppgiften (uppdatering av vissa variabler) också finns med. Ytterligare praktiska aspekter i detta sammanang är om räkningarna kan genomföras med flyttal (double t.ex.) eller om effektivitetskrav gör att eltal måste användas. Denna problematik tas dock inte upp är. Mättning av styrsignalen I praktiken måste alltid styrsignalen u(t) begränsas beroende på vad det är som ska styras (regleras). Detta görs genom att välja lämpliga gränser u min oc u max så att den begränsade styrsignalen blir u min om u < u min u lim (t) = u max om u > u max u annars 3
Detta leder till C-kodmodifieringen y = adin(); e = r-y; u = K*(e + i/ti); if (u < umin) ulim = umin; else if (u > umax) ulim = umax; else ulim = u; daout(ulim,); Anti-windup Begränsningen i styrsignalen ställer till med problem för integraldelen. När styrsignalen ligger i mättning integreras ett reglerfel som inte kan påverkas av styrsignalen på önskvärt sätt eftersom denna är låst vid ett konstant värde under mättningen. Integraldelen fortsätter trots detta att summeras upp baserat på reglerfelet (s.k. integratoruppvridning eller integrator windup). Detta innebär att det tar onödigt lång tid för integraldelen att jobba sig tillbaka till rätt värde även efter styrsignalen kommer ur mättningen. Det finns ett antal olika metoder för att minska denna skadliga effekt men den i särklass enklaste består i att elt enkelt frysa uppdateringen av integraldelen (ålla den konstant) så länge styrsignalen ligger i mättning. Den sista raden i C-koden modifieras då till if (ulim == u) vilket undviker de vid stora börvärdesändringar förekommande onödigt stora översvängar oc undersvängar i processens utsignal. Approximation av derivatadelen I standardversionen blir D-delen (med bakåt-euler): u d (k) = KT d e(k) e(k 1) Med modifieringar blir den tidskontinuerliga D-delen av regulatorn T d du D N (t)+u dy D(t) = KT d (t) 4
vilket med bakåt-euler blir T d u D (k) u D (k 1) y(k) y(k 1) +u D (k) = KT d N Efter lite omflyttning oc manipulerande kan detta skrivas på formen ( 1+ T ) d u D (k) = T d N N u D(k 1) KT d (y(k) y(k 1)) vilket slutligen ger u D (k) = T d u D (k 1) KT dn (y(k) y(k 1)) N+T d N+T d Implementeringen av själva regleralgoritmen i sin elet blir alltså y1 = y; // Spara undan gamla y-värdet innan y = adin(); // inläsningen av det nya y-värdet c = Td/(N* + Td); ud = c*ud - K*N*c*(y - y1); //... vilket utnyttjas är u = K*(e + i/ti) + ud; if (u < umin) ulim = umin; else if (u > umax) ulim = umax; else ulim = u; daout(ulim,); if (ulim == u) Denna implementering är långt ifrån optimerad. Fler av koefficienterna bör beräknas utanför själva reglerslingan oc bara i det fall då någon parameter (t.ex. förstärkningen K) begärs ändrad. Vid öga samplingsfrekvenser (kortaresamplingsperiod(t s ))kandetvarabefogatattgenomföraberäkningarna med eltal istället för flyttal. Det finns då en del skalningstricks för att förbättra precisionen i beräkningarna. 5