我目前正在研究温度控制器。
我有一个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时应设置的温度。但是,这也不起作用,因为Expected_Duty_Cycle总是会根据加热器的条件而改变,例如不同的天气。
所以我的问题是我究竟如何处理PID的输出?我不明白如何根据PID输出分配占空比。理想情况下,这将保持100%的占空比,直到温度几乎达到设定点并开始下降到较低的占空比。但是使用我的第一种方法(我的增益设置为零)它只会在已经超调之后开始降低占空比。
这是我的第一篇文章。希望我找到答案。谢谢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控制器。正如您所看到的,温度降低需要更长的时间,因为它不会在温度过冲之前减去,它会等到温度超调之后再减去占空比,并且速度太慢。我怎么告诉控制器在达到最高温度之前降低占空比?
答案 0 :(得分:11)
PID 的输出占空比。您必须调整kp
,ki
和kd
才能将PID输出放在Duty_Cycle
的范围内,例如0到100.通常一个好主意显式限制PID函数本身的输出。
您应该以简单的步骤“调整”您的PID。
关闭整数和衍生术语(将ki
和kd
设为零)
慢慢增加kp
,直到设定值的10%步进变化使输出振荡
将kp
减少30%左右,这样可以消除振荡
将ki
设置为kp
的一小部分并进行调整以获得所需的超调与时间的权衡以达到设定值
希望您不需要kd
,但如果您这样做,请将其缩小
答案 1 :(得分:3)
您的PID控制器输出应直接设置占空比的值。
基本上,您将根据实际温度与温度设定值的差异来控制加热器设置。
您需要调整PID参数的值以获得您正在寻找的性能。
首先,将I和D设置为零,并为P输入一个值,比如说2开始。
更改设定值并查看您的回复。增加P并进行另一个设定值更改,看看会发生什么。最终,您将看到温度始终如一地振荡,并且永远不会达到任何稳定值。该值被称为“ulitmate增益”。也要注意振荡的频率。设定P等于最终增益的一半。
从I开始,值为1.2(最终增益)/(振荡频率),并更改设定值。从这些值调整P和I的值以到达您想去的地方,跟踪过程并查看增加或减少值是否会改善事物。
一旦你拥有了P和我,你可以在D上工作,但是根据过程动态给D的值可能会让你的生活变得更糟。
The Ziegler-Nichols method为您提供了一些PID值的指导方针,这些指导方针可以让您参与其中。从那里你可以进行调整以获得更好的性能。
您必须权衡过冲的选项与温度达到新设定值所需的时间。温度调节越快,您将有越多的过冲。没有过冲会大大增加这段时间。
答案 2 :(得分:2)
一些建议:
TempCtrl_PID
功能后进入外部。 Duty_Cycle +=
。所以现在你的P术语真的是我。