2017-07-06 8 views
0
#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 
# 
#[email protected] 
# 
####### 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 

このコードを使用して、お湯でタンクの温度を制御したいと考えています。入力は水の実際の温度であり、出力シュールはガスストーブが加熱するか、何もしないための情報(1または0)だけです。しかし、このファイルを実行すると、私はpid値を受け取ります。例えば、設定値は20度で、15度の測定値は23度の答えを与えます。今、私はどのように解釈しなければならないのですか?ちょうど熱? 次の測定まで?温度が20度以上に達すると、pid値は0未満、すなわち-5未満となる。それは目を止めることを意味します。しかし、出力結果は、0より大きい場合よりも何かを与えますか?= < 0熱がない場合。PIDのRpi - 結果の解釈

答えて

0

実際にあなたのガスバルブをどのように制御したいのですか?デューティサイクルの割合を制御するためにPIDを使用するものがあります。あなたのタンクが大きく、熱くなるのが遅い場合は、火災時間が10秒間と600秒間の連続燃焼の間に制限された状態で、10分間の火災/無火災サイクルのようなものが必要な場合があります。

手でコントロールしていた場合、フレームのオン/オフをどれくらい早くしたいですか?そして目標のテンポにどれくらい近づくでしょうか?例えば、完全燃焼でタンクが0.5C /分で増加し、それをオフにしてから安定するまでに10分かかる場合は、PIDを60秒ごとにサンプリング/アップデートし、20分または10℃セットポイント。

私はその遅い(60秒?)をサンプリングし、PIDを使用して、燃焼サイクル中に火を何秒間実行するかを決定します。たとえば、dt = 60sec、kP = 60sec/10degC = 6s/degC_error、kI = 0.6sec/integrated_degC_error、kD = 0です。

関連する問題