Egyszerűen csak kicsi volt az arányos tag. Ha kétszer akkora, már jó ez. Most annyi trükk van benne, hogy ha messze vagyok a célhőmérséklettől, akkor nagyobb az arányos tagom, ha néhány tized fokon belül, akkor fele akkora. Az integrátorom fixen nulla bázisú - erre még visszatérek -, s van egy alsó és felső limit, ami viszonylag szűk, itt telít, ezen a margón nem mehet túl. Van továbbá egy exponenciális átlagoló, ami az eddigi áramok átlagát képezi úgy, hogy a régebbi mérési eredmények súlya exponenciálisan, aszimptotikusan tűnik el a semmibe, de összességében hiába az új eredmény súlya a legnagyobb, az mégis nagyon kicsi. Ez adja a az integrátor offszetjét, a kószálásának középvonalát. Valami ilyesmire gondolj, bár nem ezekkel a számokkal:
középvonal = 4095 / 4096 * középvonal + 1 / 4096 * új_érték
Itt az új érték az, amiben minden benne van. A középvonallal offszetelt I szabályozás, és az arányos P is. Természetesen a különféle alul- és túlcsordulásokat, telítéseket gondosan kezelem. Azt is könnyű belátni, hogy ha kettő egész kitevőjű hatványaival dolgozom, megúszom a szorzást, osztást. A fenti összefüggésben csak shiftelés, összeadás, kivonás van. Csinálok benne olyat is, hogy ha az integrátor nagyon a margón kívülre kíván menni - akkor a hibajel adott korlátnál nagyobb értéke esetén néhány másodpercenként egyszer ezt megteheti úgy, hogy a középvonalat arrébb teszem egy integrátor margónyi értékkel abba az irányba, amerre menni akar. Viszont kis hibajel esetén csak lassan hagyom „tanulni” a középvonalat. Az aktuális gyors, mégis szerény beavatkozásra ott van a viszonylag kis erősítésű P tag és a korlátok között mocorgó I tag.
Ezeken felül a holtidő kompenzálására van egy jövőbe látó algoritmusa. Egy ring bufferbe minden n-edik mért hőmérsékleti értéket letárolom. Mivel nincs elég memóriám, nem az összeset, de két pont között lineáris interpolációval álmodom meg, mi lenne ott, ha azt is letároltam volna. A jelenérték és a múlt interpolált értékének különbségeként van egy deriváltam, egy meredekségem. Ezen egyenes mentén a jövőbe extrapolálok. Tehát, ha a jelenleg mért értékem ugyanolyan sebességgel változna, mint eddig, egy becsült holtidő múlva hány fok lesz a hőmérséklet. Ebből a jövőbeli hőmérsékletből és az alapjelből képezem a hibajelet. Ugye ez a jövőbeli hőmérséklet van jelenleg a beavatkozó szervnél nagyjából, csak a holtidő miatt még nem érkezett meg a hőmérőhöz.
Van még benne olyan is, hogy az integrátor kétszer gyorsabban jön lefelé, mint megy felfelé, mert hűteni nem tudunk. Ennek az értelméről nem vagyok meggyőződve.
Ez egy intuitív szabályozó így. Nem vettem fel a szabályozott tag paramétereit, nem tudom sem az időállandóját, sem a holtidejét. Tudom, hogy ezzel ősbűnt követtem el, de szeretem az intuitív, empirikus megoldásokat. :) Annál is inkább, mert ezen paraméterek változhatnak.