Rpi上的PID - 结果的解释

时间:2017-07-06 08:12:28

标签: pid

#The recipe gives simple implementation of a Discrete Proportional-Integral-Derivative (PID) controller. PID controller gives output value for error between desired reference input and measurement feedback to minimize error value.
#More information: http://en.wikipedia.org/wiki/PID_controller
#
#cnr437@gmail.com
#
####### Example #########
#
#p=PID(3.0,0.4,1.2)
#p.setPoint(5.0)
#while True:
#     pid = p.update(measurement_value)
#
#


class PID:
    """
    Discrete PID control
    """

    def __init__(self, P=2.0, I=0.0, D=1.0, Derivator=0, Integrator=0, Integrator_max=500, Integrator_min=-500):

        self.Kp=P
        self.Ki=I
        self.Kd=D
        self.Derivator=Derivator
        self.Integrator=Integrator
        self.Integrator_max=Integrator_max
        self.Integrator_min=Integrator_min

        self.set_point=0.0
        self.error=0.0

    def update(self,current_value):
        """
        Calculate PID output value for given reference input and feedback
        """

        self.error = self.set_point - current_value

        self.P_value = self.Kp * self.error
        self.D_value = self.Kd * ( self.error - self.Derivator)
        self.Derivator = self.error

        self.Integrator = self.Integrator + self.error

        if self.Integrator > self.Integrator_max:
            self.Integrator = self.Integrator_max
        elif self.Integrator < self.Integrator_min:
            self.Integrator = self.Integrator_min

        self.I_value = self.Integrator * self.Ki

        PID = self.P_value + self.I_value + self.D_value

        return PID

    def setPoint(self,set_point):
        """
        Initilize the setpoint of PID
        """
        self.set_point = set_point
        self.Integrator=0
        self.Derivator=0

    def setIntegrator(self, Integrator):
        self.Integrator = Integrator

    def setDerivator(self, Derivator):
        self.Derivator = Derivator

    def setKp(self,P):
        self.Kp=P

    def setKi(self,I):
        self.Ki=I

    def setKd(self,D):
        self.Kd=D

    def getPoint(self):
        return self.set_point

    def getError(self):
        return self.error

    def getIntegrator(self):
        return self.Integrator

    def getDerivator(self):
        return self.Derivator

我想用这个代码用热水来控制水箱的温度。输入是水的实际温度,输出sholud只是燃气灶加热或什么也不做(1或0)的信息。但是执行这个文件我收到了pid值。例如,设定点为20度,15度的测量值给出23度的答案。现在我应该如何解释asnwer。刚加热? 直到下一次测量?当温度达到20度且高于pid值时,obviolsuly将低于0,即= -5。而且显然它意味着停止加热。但是输出结果是否给了我更多的东西,如果&gt; 0加热,如果=&lt; 0不加热。

1 个答案:

答案 0 :(得分:0)

这实际上取决于您想如何控制燃气阀门?有些人使用PID来控制占空比的比例。如果您的坦克很大并且加热缓慢,您可能需要10分钟的火灾/无火周期,火焰时间限制在10秒到600秒的连续燃烧之间,并通过PID进行调整。

如果您是手动控制它,您想要多快地循环打开和关闭火焰?如何接近目标温度,你会开始逐渐减少?例如,如果在完全燃烧时,油箱以0.5C /分钟的速度增加,并且在关闭后需要10分钟稳定,您可以每隔60秒采样/更新PID,并开始从您的20分钟或10C开始逐渐减少设定值。

为此我采样慢(60秒?)并使用PID来决定在燃烧循环期间运行火焰的秒数。例如:dt = 60sec,kP = 60sec / 10degC = 6s / degC_error,kI = 0.6秒/ integrated_degC_error,kD = 0.