我目前正在开发一个温度控制器。
我有一个Temperature_PID()函数,它返回操作变量(即P、I和D项的总和),但我该如何处理这个输出?
温度是通过PWM控制的,所以0%的占空比表示加热器关闭,而100%的占空比表示加热器打开。
到目前为止,我尝试过:
Duty_Cycle += Temperature_PID();
if(Duty_Cycle > 100) Duty_Cycle = 100;
else if(Duty_Cycle < 0) Duty_Cycle = 0;
对我来说这个方法不起作用,因为I项基本上使得这个系统非常不稳定。想象一下,你在积分一个区域时,添加另一个小数据点,再次积分该区域并将它们相加。一遍又一遍地做这件事。这意味着每个数据点都会让这个控制方案指数级恶化。
我想尝试的另一件事是
Duty_Cycle = Expected_Duty_Cycle + Temperature_PID();
Expected_Duty_Cycle是控制器达到稳定点后应该设定的温度,Temperature_PID()为0。但是这也行不通,因为预期占空比将始终根据加热器的条件而变化,例如不同的天气。
所以我的问题是我该如何处理PID的输出?我不明白如何基于PID输出来分配占空比。理想情况下,它将保持100%的占空比,直到温度接近设定点,并开始下降到较低的占空比。但是使用我的第一种方法(将I增益设置为零),它只在超调之后开始降低占空比。
这是我的第一篇帖子。希望我能找到答案。谢谢stackoverflow。
编辑: 以下是我的PID函数。
double TempCtrl_PID(PID_Data *pid)
{
Thermo_Data tc;
double error, pTerm, iTerm, dTerm;
Thermo_Read(CHIP_TC1, &tc);
pid->last_pv = pid->pv;
pid->pv = Thermo_Temperature(&tc);
error = pid->sp - pid->pv;
if(error/pid->sp < 0.1)
pid->err_sum += error;
pTerm = pid->kp * error;
iTerm = pid->ki * pid->err_sum;
dTerm = pid->kd * (pid->last_pv - pid->pv);
return pTerm + iTerm + dTerm;
}
编辑2: 以前从未使用过,如果链接失效请告诉我。 https://picasaweb.google.com/113881440334423462633/January302013
很抱歉,当我尝试重命名轴或标题时,Excel会崩溃。请注意:系统中还没有风扇,因此我无法像加热那样快速冷却加热器,因此与设定点相比,在设定点以下度过的时间非常短。 第一张图片是简单的开关控制器。 第二张图片是我的PD控制器。如您所见,温度下降需要更长时间,因为它不会在温度超调之前进行减法运算,而是等到温度超调后再从占空比中进行减法运算,并且这样做得太慢了。我应该如何告诉我的控制器在达到最高温度之前降低占空比?