我如何使用PID控制器?

时间:2013-01-30 21:27:41

标签: c pid-controller

我目前正在研究温度控制器。

我有一个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控制器。正如您所看到的,温度降低需要更长的时间,因为它不会在温度过冲之前减去,它会等到温度超调之后再减去占空比,并且速度太慢。我怎么告诉控制器在达到最高温度之前降低占空比?

3 个答案:

答案 0 :(得分:11)

PID 的输出占空比。您必须调整kpkikd才能将PID输出放在Duty_Cycle的范围内,例如0到100.通常一个好主意显式限制PID函数本身的输出。

您应该以简单的步骤“调整”您的PID。

  1. 关闭整数和衍生术语(将kikd设为零)

  2. 慢慢增加kp,直到设定值的10%步进变化使输出振荡

  3. kp减少30%左右,这样可以消除振荡

  4. ki设置为kp的一小部分并进行调整以获得所需的超调与时间的权衡以达到设定值

  5. 希望您不需要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术语真的是我。
  • 仅从P术语开始并继续增加它直到系统变得不稳定。然后退出(例如,使用它变得不稳定的值的1/2到1/4)并开始添加I项。从I项的非常低的值开始,然后逐渐增加。此过程是一种调整循环的方法。因为系统可能会有很长的时间常数,所以这可能很耗时...
  • 您可以按照建议添加一些前馈(给定设定值的预期占空比 - 通过设置占空比并让系统稳定来映射它)。如果该术语不完美并不重要,因为循环将取出剩余的错误。您还可以简单地为占空比添加一些恒定偏置。请记住,当集成商将其取出时,常数不会产生任何差异。它只会影响冷启动。
  • 确保您拥有此循环的某种固定时基。例如。每隔10毫秒做一次调整。
  • 我现在不担心D术语。对于大多数应用程序,PI控制器应该足够好。