This is post #8 describing the wine storage unit upgrade. See the introduction post for the background.
When I put the temperature probe into the bottle, I set it up as a nested control loop system where the bottle temperature would regulate the desired air temperature in the cabinet and then the cooler would be regulated based on the actual air temperature. This did not work well. The air temperature measurement is seriously hampered by the fact that the probes are in the walls, so what resulted was just a very unstable regulation. Not acceptable.
So I reverted to one control loop where the bottle temperature would directly control the cooler. Because of the slow response of the water-filled bottle probe, I lowered the gains on the loop and left it for a while to test. This worked better than before, but due to the nature of the setup, the loop obviously couldn’t respond to a change in temperature until the bottle temp changed by .07C (the resolution of the DS18B20). By the time the temperature had changed this much, the system was well out of equilibrium (perhaps due to changing ambient temperature, like the heater turning on in the morning), and it would then take a long time to find the new equilibrium. The result was that the temperature was always swinging from +0.2 to -0.3C around the set point, and the cooler would ramp up and down on timescales of about an hour. Better, but not very good.
I figured that part of the problem was that the controller is only reactive. If the ambient temperature (which we measure) goes up, we know that the cooler will have to ramp up, so if it could do this immediately, without waiting for the bottle to have changed temperature, that would improve the regulation. The solution was to use the feed-forward input on the PID loop to add an open-loop control to the system. After taking some datapoints on about how much cooling was needed to maintain a certain delta-T between the bottle and ambient, I came up with a roughly linear relationship (which is what one would expect from a simple thermal conduction model) where each degree C of delta-T required 9% of cooling power.
So, setting the cooler according to
cooler output in % = (ambient temp – setpoint)*9
should be a pretty good approximation of the steady state of the system, and this has the advantage that it does not depend on any tuning constants. By letting the control loop work on top of this value, we only rely on the PID loop to take out any error in this model, not on primary control. (Incidentally, the same feature is found in high-end building thermostats under the name “outdoor reset”. It’s a similar idea, a building has a large thermal inertia and if you wait to turn the heat up when it gets cold until it’s cold inside, you’re already behind.)
This works great! The bottle temperature is now rock solid at 13.0C, with occasional short excursions to 13.1C or 12.9C. The cooler output is also much more stable. Now I could actually imagine trusting it to keep a bottle of Ridge Monte Bello… 😉