Som sagt, 6+ år sen...

Letade inte reda på artikeln, utan kollade bara i koden.
Före ugnen kan användas måste den karakteriseras. Jag gör karakteriseringen vid två olika temperaturer, eftersom värdena man får är temperaturberoende. Med två punkter kan jag sedan interpolera/extrapolera fram övriga punkter med någolunda nogrannhet.
Karakterisering går till så att man matar på full effekt till värme elementen upp till en viss temperatur, t.ex. 100'C, och exakt där stänger av effekten. Vid den punkten mäter man uppvärmningsderivatan ['C/s]. Sedan väntar man på att temperaturen skall börja sjunka. Man mäter här hur mycket temperaturen skjuter över ['C].
Dvs. man får två värden per karakteriseringpunkt: maximal uppvärmningderivata vid en given temperatur, samt hur mycket temperaturen skulle skjuta över om man stängde av effekten just vid den temperaturen.
Anta nu att vi befinner oss vid temperaturen T1, och vill höja temperaturen till T2, på ett visst antal sekunder D. Före man börjar sätter man Countdown = D.
Regulatorn updateras en gång per sekund och gör följande:
T = uppmätta temperaturen ['C]
Told = föregående uppmätta temperatur (för en sekund sen) ['C]
// Beräkna maximal derivata och "overheat" för T baserat på karakteriseringsdata
max_derivate = interpolate_derivate(T)
overheat = interpolate_overheat(T)
// Beräkna hur snabbt temperaturen ändras just nu
derivate = T - Told
// Beräkna vilken temperatur vi skulle vilja ha just nu (börvärde)
Twanted = T2 - ((T2 - T1) * Countdown) / D
// Beräkna sluttemperatur om vi stänger av effekten nu
Testimate = T + (derivate * overheat) / max_derivate
// Och nu själva effektstyrningen
if (Testimate < Twanted)
{
output_power = 100%
}
else
{
output_power = 0%
}
Told = T
Countdown = Countdown - 1