Regelen met PID
Waarom zou je als thuisbrouwer een aparte pagina over PID regelaars nodig hebben? Als je een RIMS / HERMS installatie hebt en je koopt een kant en klare PID regelaar, die alles voor zijn rekening neemt, waarom zou je dan nog moeilijk doen over een PID regelaar?Ook als thuisbrouwer moet je echter een idee hebben hoe een PID regelaar werkt, omdat je zelfs met een kant-en-klaar apparaat makkelijk een verkeerde instelling kunt realiseren, wat kan leiden tot een flink temperatuur doorschot of een te langzame responsie.
Je zou ook kunnen bedenken dat je geen regelaar nodig hebt, je zet gewoon de brander uit wanneer de temperatuur bereikt is. Wat je zult zien met zo'n "regeling" is dat er een behoorlijk temperatuur doorschot optreedt. De brander moet geleidelijk aan uitgezet gaan worden, lang voordat de gewenste temperatuur bereikt is. En dat is waarvoor je zo'n regelaar nodig hebt. En een PID regelaar is dan de meest gebruikte regelaar.
PID staat voor Proportioneel, Integrerend en Differentiërend. Als je in het binnenste kijkt van een PID regelaar, dan zie je dat het daadwerkelijk bestaat uit drie paden.
Het was heel gebruikelijk om zo'n PID regelaar op te bouwen met discrete elektronica, maar tegenwoordig is iedere PID regelaar in software gerealiseerd, we spreken dan ook van een digitale PID regelaar.
Zo'n softwarematige PID regelaar zit ook in de kant en klare kastjes die je kunt kopen. En als je deze pagina in zijn geheel bestudeerd hebt, dan moet je constateren dat je erg veel geld moet betalen voor die paar regels code (zelfbouw kan dus lonend zijn)!
Op deze pagina probeer ik de volgende zaken uit te leggen:
- 1. Basiskennis Regelen met PID: enkele basisbegrippen die noodzakelijk zijn om de rest van het verhaal te begrijpen.
- 2. Implementatie van een PID regelaar: een echte PID regelaar met (pseudo) C broncode
- 3. Instellen van een PID regelaar: het vinden van een optimale set parameters voor het brouwsysteem.
Deze paragraaf bestaat wederom uit de volgende deelparagrafen:
1. Basiskennis Regelen met PID
De belangrijkste componenten van een PID regellus zijn weergegeven in onderstaande figuur.
Het Proportioneel-Integrerend-Differentiërend (PID) algoritme wordt zeer veel gebruikt in de meet- en regeltechniek en in de procesautomatisering. De PID methode is makkelijk te realiseren in elektronica, dat kan zowel in hardware als in software. Het brouwprogramma kent een aparte software routine, geschreven in de programmeertaal C, die de PID regelaar implementeert.
Er zijn twee soorten basisvormen voor PID regelaars:
Een andere belangrijke eigenschap van een regellus is of deze inverterend of niet-inverterend werkt:
In bovenstaande figuur waren er drie parallelle paden te zien in de PID regelaar:

De P, I en D termen werken samen als een team. Om iedere term afzonderlijk te kunnen controleren, wordt iedere term uitgerust met een instelbare parameter:
Er is nog 1 aanvullende opmerking te maken en die betreft het type PID regelaar (voor details zie wederom het document PID controller Calculus with full C source):
Terug naar boven
2. Implementatie van een PID regelaar
Er zijn vele verschillende manieren om een PID regelaar te implementeren. In feite kent iedere moderne PLC een of meerdere implementatievormen van een PID regelaar, die vaak onderling weer verschillend zijn. Dit is bij het bouwen van je eigen regelaar vaak verwarrend (welke implementatie moeten we kiezen?).De afleiding van een vorm, die geschikt is voor implementatie in software, is nogal wiskundig van aard (Z-transformaties). Die wiskundige afleiding heb ik niet op deze pagina staan, maar wel in een apart document gezet. In dit document staat direct ook de volledige C source code gegeven, zodat je hiermee direct je eigen regelaar kunt bouwen. Ben je hierin geïnteresseerd, lees dan dit document: PID Controller Calculus with full C source.
Aan de andere kant, als de wiskundige kant je niet echt boeit en je meer geïnteresseerd bent hoe je zelf zo'n regelaar kunt maken, dan moet je de rest van dit verhaal zeker doornemen.
Ik heb hier gekozen voor een PID regelaar die volgens het PID snelheids algoritme werkt, die een Type A regelaar is, die niet-inverterend werkt en met filtering van de D-actie. Onderstaande figuur laat de pseudo code hiervan zien (die overigens al redelijk dicht tegen de echte C code aanligt). Deze figuur maakt hopelijk duidelijk hoe je je eigen regelaar kunt maken in je favoriete programmeertaal (de groene regels zijn commentaar). Op basis van deze pseudo-code kun je makkelijk andere regelaars maken (bijv. een 'echte' Takahashi type C regelaar).
Over de implementatie van zo'n PID regelaar zijn nog een paar opmerkingen te maken:
Ik hoor graag van je of je deze listing makkelijk of moeilijk te lezen vond!
Voordat deze routine voor deze eerste keer aangeroepen wordt, moet deze worden geïnitialiseerd. Hiervoor heb ik de pid_init() functie geschreven, die de waarden van de diverse constanten berekent. Als je goed naar de pseudo code van de PID regelaar kijkt, dan zie je dat er nog wel wat aan verbeterd kan worden. Bijv. de I-term berekent iedere keer de waarde van Kc * Ts / Ti opnieuw. Dit is op zich niet nodig, je kunt hier ook een constante voor definiëren, die eenmalig in de pid_init() functie wordt uitgerekend en die vervolgens gebruikt kan worden in de PID regelaar routine (scheelt weer rekentijd).
Terug naar boven
3. Instellen van een PID regelaar
Het instellen van de PID regelaar omvat het vinden van zodanige waarden voor Kc, Ti en Td, dat de PID regelaar snel reageert op veranderingen in de referentie temperatuur en/of de gemeten temperatuur, waarbij de temperatuur doorschot wordt geminimaliseerd.Het instellen of tunen van een PID regelaar is altijd nodig, of je nu een kant en klare regelaar gekocht hebt, of dat je er zelf eentje gemaakt hebt. Het voordeel van zo'n kant en klare regelaar is dat ze vaak een auto-setup functie bevatten, die de optimale parameterwaarden automatisch voor je vindt (meestal dan...)
Maar zelfs zo'n kant en klare regelaar gebruikt dezelfde algoritmen als die ik hier beschrijf. Deze informatie kan dus ook zinvol zijn als je regelaar niet zelf gemaakt hebt, maar gekocht hebt.
Om de specifieke metingen te begrijpen, die we gaan doen, is het van belang om enkele grootheden uit te leggen / te definiëren:
Verwoord in een formule: a = temperatuurverandering gedeeld door het tijdsinterval gedeeld door de output van de PID regelaar.
3.1 Bepalen van de dode tijd en de relatieve helling van het brouwsysteem
Fixeer de output van de PID regelaar op een bepaalde waarde (bijv. 20 %). Bij een grote ketel met veel water erin, is 100 % beter (nauwkeuriger), maar als je de capaciteit van het systeem niet kent, is het beter om met een lagere waarde te beginnen. Nadat de output van de regelaar op een vaste waarde is gezet, zal de temperatuur gaan stijgen en ongeveer de volgende curve volgen:
Na het uitvoeren van dit experiment met mijn warmwaterketel (HLT, 90 L water, geen deksel op de pan, PID regelaar output op 100 %, alleen elektrisch verwarmingselement), heb ik berekend dat de dode tijd voor mijn HLT systeem gelijk is aan 115 seconden (zie het document PID Controller Calculus voor details.
Tijdens dit experiment, was de temperatuurverandering ongeveer 0.4 °C per minuut (PID regelaar output op 100 %). De relatieve helling is dan gelijk aan 0.004 °C / (%.minuten) of 6.68E-5 °C/(%.s).
MAAR... omdat ik recentelijk overgeschakeld ben op nieuwe gasbranders met veel meer vermogen, zal ik dit experiment nog eens moeten herhalen.
3.2 Bepalen van de tijdconstante van het brouwsysteem
Vanwege de grote tijdconstante die meestal in zo'n HLT systeem zit, is het voorgaande experiment niet erg geschikt om de ook de tijdconstante van het systeem te bepalen (niet nauwkeurig genoeg). Dit is dan ook de belangrijkste reden om twee experimenten uit te voeren (theoretisch gesproken geeft het meten van de stapresponsie uit het vorige experiment alle benodigde informatie om de parameters te kunnen bepalen).In dit experiment moet de output van de PID regelaar met de hand op een bepaalde waarde gezet worden (bijv. 20 %). De temperatuur zal nu wederom gaan stijgen en wel volgens deze curve:

Het verschil met het vorige experiment is dat we nu het HLT systeem naar zijn eindwaarde zullen laten convergeren (in mijn experiment duurde dit het grootste deel van de dag, omdat ik een zo nauwkeurig mogelijke meting wilde hebben).
Na het uitvoeren van dit experiment (90 L water, geen deksel op de pan, PID regelaar output op 20 % gezet, alleen elektrisch verwarmingselement), heb ik de volgende data verzameld:
3.3 Berekenen van de optimale parameters voor de PID regelaar (Kc, Ti en Td)
Om te beginnen, een samenvatting van de gevonden waarden uit de twee experimenten voor mijn HLT systeem:- Dode Tijd TD = 115 seconden
- Relatieve helling a = 6.68E-5 °C/(%.s).
- Versterking (K) = 1.69 °C / %.
- Tijdconstante (tau) = 14961 seconden.
Deze algoritmen zijn:
- Ziegler-Nichols Open Loop
- Ziegler-Nichols Closed Loop
- Cohen-Coon
- Integral of Time weighted Absolute Error (ITAE-Load): dit algoritme geeft normaliter de beste resultaten. Het foutsignaal wordt geminimaliseerd over de gemeten tijd.
- Ziegler-Nichols Open Loop:
PID Kc [%/(°C)] Ti [sec.] Td [sec.] 1.2 / (TD * a) 2.0 * TD 0.5 * TD
Alleen PI, geen D term Kc [%/(°C)] Ti [sec.] 0.9 / (TD * a) 3.33 * TD
- Ziegler-Nichols Closed Loop:
PID Kc [%/(°C)] Ti [sec.] Td [sec.] (1.2 * tau) / (K * TD) 2.0 * TD 0.5 * TD
Alleen PI, geen D term Kc [%/(°C)] Ti [sec.] (0.9 * tau) / (K * TD) 3.33 * TD
- Cohen-Coon:
PID Kc [%/(°C)] Ti [sec.] Td [sec.] (tau / (K * TD)) *
(TD / (4 * tau) + 4 / 3)TD * (32 * tau + 6 * TD) /
(13 * tau + 8 * TD)4 * TD * tau /
(2 * TD + 11 * tau)
Alleen PI, geen D term Kc [%/(°C)] Ti [sec.] (tau / (K * TD)) *
(TD / (12 * tau) + 9 / 10)TD * ((30 * tau + 3 * TD) /
(9 * tau + 20 * TD))
- Integral of Time weighted Absolute Error (ITAE-Load):
PID Kc [%/(°C)] Ti [sec.] Td [sec.] (1.357 / K) *
[(TD / tau)^-0.947](tau / 0.842) *
[(TD / tau)^0.738](0.381 * tau * [(TD / tau)^0.995]
Alleen PI, geen D term Kc [%/(°C)] Ti [sec.] (0.859 / K) *
[(TD / tau)^-0.977](tau / 0.674) *
[(TD / tau)^0.680]
| Numerieke waarden | |||
| Algoritme | Kc [%/(°C)] | Ti [sec.] | Td [sec.] |
| Ziegler-Nichols Open Loop |
156.2 | 230.0 | 57.5 |
| 117.2 | 383.0 | ||
| Ziegler-Nichols Closed Loop |
92.4 | 230.0 | 57.5 |
| 69.3 | 383.0 | ||
| Cohen-Coon | 102.8 | 282.3 | 41.8 |
| 69.4 | 377.2 | ||
| ITAE-Load | 80.8 | 489.0 | 44.9 |
| 59.2 | 810.2 | ||
Al deze oplossingen zijn uitgeprobeerd voor mijn HLT systeem en eigenlijk gaven ze allemaal goede resultaten. Wat wel geconstateerd werd, was dat de D-term nogal gevoelig ingesteld stond, speciaal met de ITAE-Load waarden. Daarom is de D-term nog wat verkleind en heb ik meer filtering toegepast (de constante voor het laagdoorlaat filter heeft nu de waarde 10).
Bij Hoe werkt het? kun je een tweetal grafieken zien, die de performance laten zien van de PID regelaar (vooral de onderste grafiek, die is met bovenstaande waarden gemaakt).
Na al dit werk, begin ik redelijk te begrijpen hoe de PID regelaar werkt in combinatie met mijn HLT systeem. De werking van de PID regelaar is zodanig goed, dat ik erg blij ben met het resultaat hiervan. Het is grappig om te zien dat het bedenken van dit alles mij maanden gekost heeft, maar dat de uiteindelijke implementatie met slechts een paar regels code te realiseren valt.
Voor de volledigheid nog een aantal bronvermeldingen (een deel van bovenstaande informatie is hiervan afkomstig):
Wil je na het lezen van dit verhaal zelf je eigen PID regelaar maken, kijk dan met name op de pagina PID Zelfbouw. Hier wordt het complete ontwerp, bouw en test van zo'n PID regelaar beschreven, inclusief alle schema's en software.
Terug naar boven