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. :)

:)