温度控制功能/算法
本文关键字:算法 功能 温度控制 | 更新日期: 2023-09-27 17:51:05
double K1 = 50.0 / 300; // Warm up, 5 min, 20 - 70. Subject to change, if wrong
double K2 = -50.0 / 120; // Cool down, 2 min, 20 - 70. Subject to change, if wrong
double T = 20;
const int ON_TIME = 7; // seconds. this should be calculated
const int OFF_TIME = 2; // seconds. this should be calculated
int onCounter = ON_TIME;
int offCounter = 0;
for (int t = 0; t < 1800; t++)
{
if (onCounter > 0)
{
onCounter--;
T += K1;
}
else if(offCounter == 0)
{
onCounter = ON_TIME;
// switch relay off here
}
if (offCounter > 0)
{
T += K2;
offCounter--;
}
else if(onCounter == 0)
{
offCounter = OFF_TIME;
// switch relay on here
}
Console.WriteLine("t: {0}, T: {1:F2}", t, T);
}
这个函数的作用是模拟30分钟内的烤箱温度(Tt)线性上升到70C
。当然,它不会像预期的那样工作。输入参数为两个线性斜率。
- 烘箱温度在5分钟内从
20C
上升到70C
(Tw) - 烘箱将在2分钟内从
70C
冷却到20C
(Tc) 步骤应为
1C
(Ts)因此该功能将控制继电器,该继电器将打开或关闭烤箱。我试图只是搜索那些ON/OFF_TIME常量,但看起来我需要更严肃的方法。
问题是-如何计算ON_TIME
和OFF_TIME
我不确定这一个,但我要给它一个尝试大便和咯咯笑。
你声明K1
为50/300,表示300秒(5分钟)内的δ T,并且你被限制为1度步进。
那么问题不就是,我需要等待多少秒才能完成一个度吗?那么答案不就是…
1/6(time) = 1 -> time = 1/(1/6) -> time = 6 seconds
冷却
5/12(time) = 1 -> time = 1/(5/12) -> time = 12/5 seconds -> time = 2.4 seconds
我意识到我之前评论中的错误,我想我更理解你的问题了。如果我还是错了,让我知道,我会立即删除。
更新你的问题可能出在别的地方。我很有信心我的数学是正确的,所以我写了简单的循环来证明。
这是加热回路。我说过经过的时间应该是6秒。这个循环的结果是70度,因为它模拟了每个请求300秒。
for (int fiveMinutes = 0; fiveMinutes < 300; fiveMinutes += 6)
{
T += (K1 * 6);
Console.WriteLine("t: {0}, T: {1:F2}", fiveMinutes + 6, T);
}
结果:
t: 6, T: 21.00
t: 12, T: 22.00
t: 18, T: 23.00
/*
.....
*/
t: 300, T: 70.00
下面的冷却回路温度为20度。
for (float twoMinutes = 120f; twoMinutes > 0; twoMinutes -= 2.4f)
{
T += (K2 * 2.4);
Console.WriteLine("t: {0:F2}, T: {1:F2}", twoMinutes - 2.4f, T);
}
t: 117.60, T: 69.00
t: 115.20, T: 68.00
/*
...
*/
t: 0, T: 20.00
关于你关于如何计算开/关时间的问题,我觉得它是准确的。 您的常量ON_TIME和OFF_TIME必须分别代表5和2分钟。你期望你的温度以50摄氏度/300秒的速度变化50摄氏度,但在7秒内,上升周期将导致1.17摄氏度的变化,下降周期将使温度降低0.33摄氏度,所以每7秒你将最终得到T+=0.83摄氏度
你的ON_TIME和OFF_TIME应该用秒来表示,或者你可以使用它们*60。
我不知道你是否想在循环中间保持烤箱温暖,这个算法会导致4个加热/冷却循环,你最终会有一个继电器在On位置,你不想在真正的烤箱中这样做:)
考虑以下方法:
double dTemp = 50.0;
int cycleFor = 30*60;
int heatFor = 5*60;
int coolFor = 2*60;
double tBase = 20.0;
double temp = tbase;
for (int t = 0; t<cycleFor; t++){
if (t<heatFor)
temp = tBase + (t*dTemp/heatFor);
else if (t>cycleFor - coolFor)
temp = tBase + ((cycleFor-t)*dTemp/coolFor)
}