Handboek · hoofdstuk 39PID-regeling
Drie getallen die van een verwarming, een drone of een insulinepomp een regelaar maken
Een aan/uit-thermostaat schommelt, een P-regelaar komt er nooit helemaal, en een slecht afgestelde regelaar slingert of schiet ver door. De PID-regelaar lost dat op met drie acties: reageren op de fout, op hoe lang ze al duurt, en op hoe snel ze verandert. Je leidt af waarom elke actie doet wat ze doet, simuleert de temperatuurregeling van het station, en schrijft een regelaar die op een microcontroller draait.

- Je kan een gesloten regelkring tekenen als blokschema en de begrippen setpoint, fout, stuurgrootheid, storing en meting gebruiken.
- Je kan voor een eerstegraadsproces met P-regeling de gesloten-lusvergelijking afleiden en er de blijvende afwijking en de tijdconstante uit halen.
- Je kan verklaren waarom een I-actie de blijvende afwijking wegwerkt en een D-actie demping geeft, en wat de nadelen van elk zijn.
- Je kan uit een staprespons stijgtijd, doorschot, piektijd, insteltijd en blijvende afwijking bepalen.
- Je kan een discrete PID-regelaar programmeren met een vaste bemonsteringstijd, D op de meting en anti-windup.
- Je kan een regelaar afstellen met de methode van Ziegler-Nichols en de uitkomst kritisch bijsturen.
- Je kan een regeling ontwerpen tegen eisen (nauwkeurigheid, snelheid, begrenzing van de actuator) en je keuzes verantwoorden.
Een stuurman in drie reflexen
In 1922 publiceerde de Russisch-Amerikaanse ingenieur Nicolas Minorsky een artikel over het automatisch sturen van schepen. Hij had bekeken hoe een ervaren stuurman werkt, en zag drie reflexen. Hij draait aan het roer in verhouding tot hoe ver het schip van koers is. Hij draait harder bij als het schip al lang aan dezelfde kant uit de koers ligt, bijvoorbeeld door een zijwind. En hij remt zijn eigen correctie af als hij ziet dat het schip al snel terugdraait, zodat het niet voorbij de koers zwaait.
Die drie reflexen schreef Minorsky als één formule: een term evenredig met de fout, een term evenredig met de opgestapelde fout, en een term evenredig met de verandering van de fout. Dat is de PID-regelaar: proportioneel, integrerend, differentiërend. Een eeuw later zit hij in thermostaten, cruisecontrols, drones, 3D-printers, chemische fabrieken en insulinepompen. Het idee van automatisch terugkoppelen is nog ouder: de centrifugaalregulateur die James Watt rond 1788 op zijn stoommachines zette, was al een proportionele regelaar van het toerental.
In Intermediate regelde je met aan/uit en hysterese (hoofdstuk 31). Dat werkt, maar de temperatuur schommelt altijd. Het brein van het station moet de binnentemperatuur, de vochtigheid en de waterdruk strak houden, met zo weinig mogelijk energie. Daarvoor heb je PID nodig, en het model van het station uit hoofdstuk 38.

De regelkring: symbolen en afspraken
Elke regeling heeft dezelfde bouw. Een proces (het station met zijn warmtecapaciteit en warmteverlies) wordt gestuurd door een actuator (de verwarming). Een sensor meet de geregelde grootheid . De regelaar vergelijkt de meting met het setpoint , berekent de fout en stuurt daaruit de stuurgrootheid . Van buitenaf werken storingen in: een deur die opengaat, wind, een ploeg die binnenkomt.
Het procesmodel komt uit hoofdstuk 38. Kies als geregelde grootheid de temperatuurstijging boven de buitentemperatuur (in °C). Een warmtebalans geeft een eerstegraadsvergelijking:
Met constant en gaat exponentieel naar , met tijdconstante (hoofdstuk 4). Regelen betekent: zo kiezen, op elk ogenblik, dat snel en zonder slingeren bij komt en er blijft, ook als verandert.
De P-actie: evenredig met de fout
De eenvoudigste regelaar maakt evenredig met de fout: . Is het 5 °C te koud en , dan stuurt hij 500 W. Vul die regelwet in het procesmodel in (zonder storing, en zolang tussen 0 en 2000 W blijft):
De gesloten lus is weer een eerstegraadssysteem, met twee eigenschappen die je er meteen uit leest:
Waarom blijft er een fout? Omdat de P-regelaar alleen vermogen levert als er een fout is. Het station verliest continu warmte; om 12 °C boven buiten te blijven, is nodig, en een P-regelaar met levert die 600 W alleen bij een fout van 3 °C. Evenwicht betekent dus: precies zoveel fout dat het vermogen het verlies dekt.
In dit ideale model mag onbeperkt groeien. In werkelijkheid botst je op de grens van de actuator (de curve voor start met 2000 W, niet met 6000 W), op ruis die versterkt naar de actuator gaat, en op vertragingen in sensor en proces die de lus bij hoge versterking laten slingeren.
P-regeling van het station doorrekenen
Het station staat op buitentemperatuur (). Het setpoint springt naar boven buiten. De regelaar is een P-regelaar met . Bereken de eindtemperatuur, het eindvermogen, de blijvende afwijking en de tijd tot 95 % van de eindwaarde. Controleer of de verwarming ergens aan haar grens komt.
- ,
- ,
- , ,
- 1Lusversterking: (eenheden: °C/W · W/°C, dus zonder eenheid).
- 2Blijvende afwijking: , dus .
- 3Eindvermogen: . Controle met het proces: . Klopt.
- 4Begrenzing: het grootste vermogen is er bij de start, . De verwarming raakt haar grens niet, dus het lineaire model geldt.
- 5Tijdconstante van de gesloten lus: , precies één uur.
- 6Een eerstegraadssysteem bereikt 95 % na (want ): .
De I-actie: het geheugen van de regelaar
Voeg een term toe die de fout optelt over de tijd:
Het argument waarom de blijvende afwijking verdwijnt, is kort en krachtig. Stel dat de lus tot rust komt: alles is constant, ook . Dan is ook de integraal constant, dus haar afgeleide is nul. Maar die afgeleide is de fout: . In een rusttoestand is de fout dus precies nul, welke storing er ook werkt. De I-term levert dan in zijn eentje de 750 W die nodig zijn om 15 °C boven buiten te blijven.
De prijs: de integraal reageert pas nadat er fout opgestapeld is, en ze blijft reageren nadat de fout al van teken gewisseld is. Daardoor kan de temperatuur voorbij het setpoint schieten. Wiskundig voegt de I-actie een orde toe: de gesloten lus wordt een tweedegraadssysteem, dat kan slingeren (hoofdstuk 38).
moet watt zijn, dus in W/°C. heeft als eenheid °C·s, dus in W/(°C·s). Vaak schrijft men met een integratietijd in seconden: na seconden constante fout heeft de I-term evenveel bijgedragen als de P-term.
De D-actie: vooruitkijken
De derde term reageert op de snelheid waarmee de fout verandert:
Stijgt de temperatuur snel naar het setpoint, dan daalt de fout snel: is negatief en de D-term neemt vermogen terug nog voor het setpoint bereikt is. Dat is demping: de regelaar remt af voor de bocht. Het effect is het grootst waar er vertraging in de lus zit, zoals een trage sensor: zonder D reageert de regelaar op een meting die achterloopt.
Twee praktische regels maken de D-actie bruikbaar:
- D op de meting, niet op de fout. Als het setpoint springt, springt ook, en wordt één ogenblik oneindig groot: een schok naar de actuator (derivative kick). Omdat en tussen twee sprongen constant is, geldt . Neem dus de afgeleide van de meting, met een min.
- Filter de D-term. Afleiden versterkt ruis: een meting die 0,1 °C op en neer springt tussen twee samples van 1 s, geeft met sprongen van 6000 W. Filter de meting eerst (hoofdstuk 21), of laat de D-actie weg. Veel industriële regelaars zijn gewoon PI.
Een staprespons lezen
Om regelaars te vergelijken, geef je een stap op het setpoint en meet je vijf kenmerken. Hier: de PI-regelaar met en , met anti-windup, van 0 naar 15 °C.
- 1Stijgtijd
Tijd van 10 % naar 90 % van de stap: hier 67 minuten (van 7 tot 74 min). Maat voor snelheid.
- 2Verzadiging
Het eerste stuk loopt de verwarming op haar maximum van 2000 W (40,7 minuten). Sneller kan niet, hoe je ook afstelt.
- 3Doorschot en piektijd
Piek 16,91 °C na 2,1 uur: 12,8 % doorschot. Een verwarming mag wat doorschieten; een chemische reactor of een robotarm vaak niet.
- 4Insteltijd
Vanaf 4,3 uur blijft de temperatuur binnen ±2 % (±0,3 °C) van het setpoint.
- 5Blijvende afwijking
Na negen uur 15,01 °C: praktisch nul, dankzij de I-actie.
Formules, vuistregels en afstelling
| symbool | betekenis | eenheid |
|---|---|---|
| fout r − y | °C | |
| proportionele versterking | W/°C | |
| integrerende versterking | W/(°C·s) | |
| differentiërende versterking | W·s/°C |
| symbool | betekenis | eenheid |
|---|---|---|
| integratietijd | s | |
| differentiatietijd | s |
| symbool | betekenis | eenheid |
|---|---|---|
| bemonsteringstijd | s | |
| nummer van het sample | – |
| parameter omhoog | stijgtijd | doorschot | insteltijd | blijvende afwijking |
|---|---|---|---|---|
| korter | groter | weinig effect | kleiner | |
| korter | groter | langer | verdwijnt | |
| weinig effect | kleiner | korter | geen effect |
Vuistregels, geen wetten: bij een proces met veel vertraging of bij verzadiging kan een parameter het omgekeerde doen.
| Ziegler-Nichols (gesloten lus) | |||
|---|---|---|---|
| P | – | – | |
| PI | – | ||
| PID |
: de P-versterking waarbij de lus net aanhoudend slingert; : de periode van die slingering.
De regeling simuleren
Een simulatie laat je regelaars uitproberen zonder het station te laten bevriezen. De procesvergelijking wordt stap per stap vooruit gerekend met de methode van Euler (hoofdstuk 4): elke seconde meten, berekenen, begrenzen, en een stapje verder zetten. Alle grafieken van dit hoofdstuk zijn met deze code gemaakt.
# PI(D)-regeling van de stationtemperatuur: simulatie met de methode van EulerTAU = 10800.0 # tijdconstante van het station (s): 3 uurK = 0.02 # statische versterking (graden Celsius per watt)U_MAX = 2000.0 # vermogen van de verwarming (W) def simuleer(Kp, Ki, Kd=0.0, r=15.0, T=32400, dt=10.0, anti_windup=True): y = 0.0 # temperatuurstijging boven de buitentemperatuur (graden Celsius) integraal = 0.0 vorige = y tijden, temps = [], [] for k in range(int(T / dt) + 1): e = r - y afgeleide = -(y - vorige) / dt # D op de meting: geen sprong bij een nieuw setpoint u_vrij = Kp * e + Ki * integraal + Kd * afgeleide u = min(max(u_vrij, 0.0), U_MAX) # de verwarming kan enkel 0 tot 2000 W leveren verzadigd = u != u_vrij if not (anti_windup and verzadigd and (u_vrij > 0) == (e > 0)): integraal += e * dt # anti-windup: niet verder integreren tegen de grens vorige = y y += dt * (-y + K * u) / TAU # Euler-stap van tau * dy/dt = -y + K * u tijden.append(k * dt) temps.append(y) return tijden, temps t, y = simuleer(Kp=200, Ki=0.17)print("met anti-windup: maximum %.2f, na negen uur %.2f" % (max(y), y[-1]))t, y = simuleer(Kp=200, Ki=0.17, anti_windup=False)print("zonder anti-windup: maximum %.2f, na negen uur %.2f" % (max(y), y[-1]))Uitvoer:
met anti-windup: maximum 16.91, na negen uur 15.01 zonder anti-windup: maximum 22.85, na negen uur 14.95
Let op drie details. De begrenzing min(max(...)) is geen detail: elke echte actuator heeft grenzen. De integraal telt op, dus de eenheid klopt. En de stapgrootte van 10 s is klein tegenover s: de Euler-fout is verwaarloosbaar (probeer s en kijk wat er gebeurt).
Integrator-windup en anti-windup
Bij de start is de fout 15 °C. De regelaar vraagt meer dan 2000 W, maar de verwarming kan niet meer. Zolang dat duurt, is het station trager dan de regelaar 'denkt', en de integraal blijft oplopen met een fout die niet sneller kleiner kan worden. Tegen dat het setpoint bereikt is, zit er zoveel opgestapelde fout in de integraal dat de regelaar nog lang vol blijft stoken: de temperatuur schiet ver door. Dat heet integrator-windup.
De remedie is eenvoudig: stop met integreren zolang de actuator aan zijn grens zit en de fout hem verder die grens in zou duwen. In de code is dat één voorwaarde. Het resultaat in cijfers: zonder anti-windup 22,8 °C piek (52 % doorschot), met anti-windup 16,9 °C (13 %). De verwarming staat zonder anti-windup 147,7 minuten op vol vermogen, met anti-windup 40,7 minuten.
Windup gebeurt ook in een perfect geprogrammeerde PID. Het is een wisselwerking tussen de I-actie en de begrenzing van de actuator, die in de formule van de PID niet voorkomt. Daarom moet je die begrenzing expliciet in je regelaar inbouwen.
Afstellen met Ziegler-Nichols
Op het echte station (met een trage sensor en wat dode tijd) zet een technicus de I- en D-actie uit en verhoogt ze tot de temperatuur net blijvend slingert. Dat gebeurt bij ; de slingering heeft een periode (72 minuten). Bereken de instellingen voor een PI- en een PID-regelaar, in de parallelvorm (, , ).
- PI: ,
- PID: , ,
- 1PI volgens de tabel: en .
- 2Omrekenen naar de parallelvorm: .
- 3PID: , , .
- 4Parallelvorm: en .
De regelaar op een microcontroller
Op het station draait de regelaar op een microcontroller. Drie verschillen met de simulatie: de bemonsteringstijd wordt bewaakt met millis() (hoofdstuk 29 van Intermediate), de temperatuur komt van een echte sensor, en een verwarming van 2 kW stuur je niet met PWM van 490 Hz aan maar met een solid-state relais (SSR) dat per venster van 5 s een deel van de tijd aanstaat (tijdproportionele sturing).
// Discrete PI(D)-regelaar voor de stationtemperatuur (Arduino)// Sensor: TMP36 op A0 (10 mV per graad, 0,5 V bij 0 graden). Actuator: SSR met tijdproportionele sturing.const float KP = 200.0; // W per graadconst float KI = 0.17; // W per (graad * s)const float KD = 0.0; // W * s per graadconst float U_MAX = 2000.0; // Wconst unsigned long DT_MS = 1000; // bemonsteringstijd: 1 sconst unsigned long VENSTER_MS = 5000; // tijdvenster van het SSR: 5 sconst int SSR_PIN = 8; float setpoint = 20.0; // gewenste binnentemperatuur (graden Celsius)float integraal = 0.0;float vorigeMeting = 0.0;float u = 0.0; // gevraagd vermogen (W)unsigned long vorigeRegeling = 0;unsigned long vensterStart = 0; float leesTemperatuur() { float spanning = analogRead(A0) * 5.0 / 1023.0; return (spanning - 0.5) * 100.0;} void setup() { pinMode(SSR_PIN, OUTPUT); Serial.begin(115200); vorigeMeting = leesTemperatuur();} void loop() { unsigned long nu = millis(); if (nu - vorigeRegeling >= DT_MS) { // elke seconde: meten en regelen vorigeRegeling += DT_MS; float dt = DT_MS / 1000.0; float meting = leesTemperatuur(); float e = setpoint - meting; float afgeleide = -(meting - vorigeMeting) / dt; // D op de meting vorigeMeting = meting; float uVrij = KP * e + KI * integraal + KD * afgeleide; u = constrain(uVrij, 0.0, U_MAX); bool verzadigd = (u != uVrij); if (!(verzadigd && ((uVrij > 0) == (e > 0)))) { integraal += e * dt; // anti-windup } Serial.print(meting); Serial.print(','); Serial.println(u); } // tijdproportioneel: het SSR staat u / U_MAX van elk venster van 5 s aan if (nu - vensterStart >= VENSTER_MS) { vensterStart += VENSTER_MS; } unsigned long aanTijd = (unsigned long)(u / U_MAX * VENSTER_MS); digitalWrite(SSR_PIN, (nu - vensterStart) < aanTijd ? HIGH : LOW);}Het venster van 5 s is kort tegenover de tijdconstante van 3 uur: het station 'ziet' alleen het gemiddelde vermogen. De TMP36 geeft 10 mV per graad met 0,5 V bij 0 °C; met de 10-bits ADC van een Uno op 5 V is één stap ongeveer 0,49 °C. Dat is grof voor een D-actie, en precies waarom KD hier op nul staat.
Een SSR schakelt netspanning. In de klas werk je met een vermogensweerstand of een lamp op 12 V en een MOSFET (hoofdstuk 23 van Intermediate). Het principe en de code zijn dezelfde.
Waar PID vandaan komt en waar het heen gaat
PID is het punt waar bijna alle leerlijnen samenkomen: het procesmodel is energie (E) en wiskunde (W), de meting is onderzoeken en elektronica (O, L), de uitvoering is programmeren (P), en het geheel is regelen (R). Ook de natuur regelt zo: je lichaam houdt je temperatuur en je bloedsuiker constant met terugkoppeling.
De eerste regeling: aan/uit met een drempelwaarde.
Open en gesloten lus, blokschema's, hysterese: de taal van dit hoofdstuk.
De D-actie is een afgeleide; numeriek afleiden versterkt ruis.
De I-actie is een integraal, numeriek een som.
Het procesmodel en de methode van Euler waarmee je simuleert.
Tijdconstante, tweedegraadssystemen en doorschot: waarom een PI-lus kan slingeren.
Een regelaar is zo goed als zijn meting: filteren en schatten.
Glucose en insuline: een biologische regelkring, en de insulinepomp als technische.
In het kort
- Een gesloten regelkring meet , vergelijkt met het setpoint en stuurt uit de fout .
- P-regeling van een eerstegraadsproces: en een blijvende afwijking die nooit nul is.
- De I-actie maakt de fout in rust precies nul, omdat de integraal anders niet constant kan zijn; ze kan doorschot geven.
- De D-actie dempt door op de verandering te reageren; neem ze op de meting en filter ze, want ze versterkt ruis.
- Elke actuator is begrensd: zonder anti-windup geeft de I-actie groot doorschot na verzadiging.
- Discreet: , met een vaste bemonsteringstijd.
- Ziegler-Nichols geeft een snel startpunt uit en ; bijregelen op de gemeten staprespons blijft nodig.
Wat je nu kent
- setpoint (gewenste waarde)
- De waarde die de regeling moet bereiken, bv. 20 °C binnentemperatuur.
- regelfout
- Het verschil tussen setpoint en gemeten waarde.
- stuurgrootheid
- Wat de regelaar naar de actuator stuurt, (hier: verwarmingsvermogen in W).
- blijvende regelafwijking
- De fout die overblijft als alles tot rust gekomen is; bij zuivere P-regeling niet nul.
- doorschot
- Hoeveel de gemeten waarde voorbij het setpoint gaat, in procent van de stap.
- insteltijd
- De tijd tot de waarde binnen een band (hier ±2 %) rond het setpoint blijft.
- integrator-windup
- Het oplopen van de I-term terwijl de actuator aan zijn grens zit, met groot doorschot als gevolg.
- anti-windup
- Maatregel die de I-term niet verder laat groeien zolang de actuator verzadigd is.
- Ziegler-Nichols
- Afstelmethode die de regelaar instelt vanuit de kritische versterking en de periode van een aanhoudende slingering.