Regulator PID w Python’ie
Kto szukał kodu regulatora PID do zastosowania w malinie, ten wie czym taki regulator jest. Dla nie wtajemniczonych wyjaśniam, że jest to regulator którego zadaniem jest jak naszybsza (z zachowanie stabilności funkcjonowania) reakcja na błąd, a dokładniej jak najszybsza jego eliminację.
Klasycznym przykładem zastosowania jest regulator temperatury np. w pomieszczeniu. Wyobraźmy sobie że zimą, ktoś otwiera wszystkie okna w domu, co powoduje że temperatura drastycznie spada. Zadaniem regulatora jest tak sterować źródłem ciepła (piecem, grzejnikami) aby temperatura w pomieszczeniu jak najszybciej powróciła do pożądanej temperatury. W tym celu wykorzystuje trzy elementy regulacji – proporcjonalny, różniczkowy i całkujący (PID – proportional, integral, derivative).
No ale może tyle na temat wyjaśnień co to jest, więcej na temat doboru nastaw pojawi się w innym wpisie. Teraz skupmy się na samym kodzie regulatora.
p=PID(3.0,0.4,1.2) # podajesz nastawy PID p.setPoint(5.0) # podajesz punkt odniesienia dla mierzenia błędu while True: pid = p.update(measurement_value) # w pętli wywołujesz fukncję odświeżania wartości regulatora 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
current value jest zmienną którą monitorujesz i wpływasz na układ aby regulować jej wartość. Może to być tempreatura, ciśnienie czy odchylenie w danej osi.
Powodzenia w projektach. 🙂