//********* Temperature Control with Simple Heater ***********************//
//********* A) Version with Continuous P-/I-Controller On Arduino ********//
//********* B) Version with Digital 2-Point Controller On Arduino ********//
//********* HS-Esslingen Prof. Georg Mallebrein 2024 *********************//
// Plant Variables and Parameters
float atHeater = 293.15; // [K]
float atAmb = 293.15; // [K]
float hceHeater = 0.2235; // [J/K]
float hresHeaterAmb = 30; // [K/W]
float hfHeater2Amb; // [W]
// Controller Variables and Parameters
float atHeaterDes = 293.15; // [K] - init wih atAmb
float pwrHeaterUnLim; // [W]
float pwrHeaterLim; // [W]
float pwrHeaterMax = 3.3; // [W]
float I_Gain = 7.74; // [W/(K*s)]
float P_Gain = 3.6; // [W/K]
float pwrHeaterIPart; // [W]
float hresAntiWiUp = 0.25; // [K/W]
float atAntiWiUp; // [K]
float atHysteresis = 2; // [K] only for Two Point Control
// Scheduling Variables and Parameters:
float h = 10; // h in msec
unsigned long printInterval = 20; // in msec
unsigned long oldMillis = 0; // for model if
unsigned long oldPrintMillis = 0; // for print if
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
}
void loop() {
// put your main code here, to run repeatedly:
unsigned long currentMillis = millis();
if (currentMillis-oldMillis >= h)
{
//********** Desired Temperature **************************************//
if (millis() > 2000) atHeaterDes = 345.2; // default: 245.2
//********** A) Controller Continuous ********************************//
pwrHeaterIPart = pwrHeaterIPart + (atHeaterDes-atHeater-atAntiWiUp)
* I_Gain * (h/1000);
pwrHeaterUnLim = pwrHeaterIPart + (atHeaterDes-atHeater)*P_Gain;
pwrHeaterLim = max(0,min(pwrHeaterUnLim,pwrHeaterMax));
atAntiWiUp = (pwrHeaterUnLim - pwrHeaterLim) * hresAntiWiUp;
//**********B) Controller Two Point **********************************//
//if (atHeater < atHeaterDes-atHysteresis/2) pwrHeaterLim = pwrHeaterMax;
//if (atHeater > atHeaterDes+atHysteresis/2) pwrHeaterLim = 0;
//**********Plant Model **********************************************//
if (millis() > 10000) hresHeaterAmb = 20; //higher heating power needed
if (millis() > 15000) hresHeaterAmb = 90; //lower heating power needed
if (millis() > 20000) hresHeaterAmb = 30; //original power needed
hfHeater2Amb = 1/hresHeaterAmb*(atHeater-atAmb);
atHeater = atHeater + h/1000/hceHeater*(pwrHeaterLim-hfHeater2Amb);
oldMillis += h;
}
if (currentMillis-oldPrintMillis >= printInterval){
Serial.print(273.15); // Nr. 1 for printing Scale min. 0°C
Serial.print(" ");
Serial.print(373.15); // Nr. 2 for printing Scale max. 100°C
Serial.print(" ");
Serial.print(5*pwrHeaterLim + 273.15); // Nr. 3 for printing
Serial.print(" ");
Serial.println(atHeater); // Nr. 4 for printing
oldPrintMillis += printInterval;
}
} // end void loop