【发布时间】:2013-01-30 21:27:41
【问题描述】:
我目前正在研究温度控制器。
我有一个 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 控制器。正如您所看到的,温度降低需要更长的时间,因为它不会在温度过冲之前减去,它会等到温度过冲后再从占空比中减去,而且这样做太慢了。我该如何告诉我的控制器在达到最高温度之前降低占空比?
【问题讨论】:
-
欢迎来到 Stack Overflow。很好的第一个问题 (+1)。
-
所以情况有点复杂。您需要阅读 PID (en.wikipedia.org/wiki/PID_controller)。它是一个反馈回路控制系统。您需要做的是更改占空比,读取实际温度(在该 wiki 文章中称为 PV),将误差计算为目标温度(在 wiki 文章中的 SP)与实际温度之间的差异,然后反馈错误进入PID控制器。请注意,您可以调整参数以根据时间更改 PV 的行为 (en.wikipedia.org/wiki/File:Change_with_Kp.png)。
-
我想你应该减去输出,因为模型通常包含负反馈。也就是说,如果不了解有关您的系统和代码的更多详细信息,就很难确定。
-
这就是问题所在。这取决于您的 pid 中实现了什么,但输出实际上应该是 占空比。
标签: c pid-controller