#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不加热。
答案 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.