I’m trying to control underfloor heating and every room has it’s own temperature sensor and wax actuator. All I have is controlling the actuator to set the temperature. The system is very slow and needs constant pulsing so the floors don’t’ get too cold or too hot. The concrete floors hold so much temperature that if I’m not careful close to the set point then I overshoots by 2°c or so and the temperature in the room is rising for hours after I have turned off the vax actuators.
Hi Stefan
Great question. I am planning a similar application myself (haven’t started yet) but I do have a control engineering education.
Based on your description it sounds like you have a large delay in your system (caused by the concrete heat reservoir between the heat source and the room temperature to be controlled) or possibly a second-order system.
Controlling systems of these types, especially those with delays, is tricky! If you’re not careful, the combined (closed-loop) system with your controller could be unstable, although it sounds like you have already made some good intuitive decisions.
Here are a few pointers which may help:
-
The biggest practical problem with PI/PID control is the various different conventions for defining the two/three parameters. In the following notes, I am using the interacting formulation (as opposed to non-interactive or parallel conventions). They are all mathematically equivalent, it’s just that the parameter values are defined differently in each, so you need to be very careful which convention you are implementing.
-
To control a simple system with a stable exponential dynamic (known as a first-order system), including those with a delay, you only need a PI controller (i.e. no derivative term).
-
A simple but reliable heuristic for setting a PI controller for a first-order system with a delay is:
Kc = (1 / Kp) x (T1 / (T1 + theta) )
Ti = T1
where
Kc = PI controller gain
Ti = PI controller integration time constant (units of time)
Kp = process gain (of the heating process)
T1 = time constant of the process (units of time)
theta = delay of the process.
While this calculation is easy, what you need are good estimates of Kp, T1 and theta. These you can get by doing a step test of your system, provided you can run it in open loop (i.e. manual with no feedback controller). It’s broadly known as system identification but a step test would suffice:
Step 1. Wait until your system reaches an equilibrium point with the heater off or at a constant setting
Step 2. Make a step change in the heater setting (higher or lower) and record the response of your system (i.e. the room temperature) until it reaches a new equilibrium, which could take a while in your case.
Kp = (T2 - T1) / (H2 - H1) where T1, T2 and H1, H2 are the initial and final temperatures, heater settings (e.g. a temp close to the region in which you want to control).
theta = you can probably estimate this as the time from when the heater setting changed to the first indication that the temperature clearly started to change.
T1 = (t_63% - t_step - theta) where t_step is the time when the step change to the input was made, and t_63% is the time when the room temperature reached 63% of it’s final equilibrium temperature (i.e. 0.63*T2).
- If this doesn’t work a more advanced solution to control your system would be possible if you have a temperature measurement for the concrete floor. It sounds like the dynamic between the heater and the floor temperature may be faster than the dynamic between the floor temperature and the room temperature, (I am speculating, but this could be why you are experiencing overshooting of the room temperature). If you can get this extra measurement then you could implement a cascade control system (two control loops running at different sampling rates) which should solve that problem. But this may not be necessary if the PI solution above gives you good enough performance.
Hope this helps! I would be happy to discuss further offline since I will probably be encountering the same problems myself. Feel free to message me directly.
Bill.