aboutsummaryrefslogtreecommitdiff
path: root/qolab/feedback/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'qolab/feedback/__init__.py')
-rw-r--r--qolab/feedback/__init__.py66
1 files changed, 33 insertions, 33 deletions
diff --git a/qolab/feedback/__init__.py b/qolab/feedback/__init__.py
index f04a735..6f375ee 100644
--- a/qolab/feedback/__init__.py
+++ b/qolab/feedback/__init__.py
@@ -1,16 +1,18 @@
import time
from qolab.hardware.basic import BasicInstrument
+
class PID(BasicInstrument):
"""Proportional–integral–derivative controller.
Calculates feedback based on gains, time, and previous error signal measurements.
"""
+
def __init__(self, Gp=0, Gi=0, Gd=0, sign=1, enable=True, *args, **kwds):
super().__init__(*args, **kwds)
- self.config['Device model'] = 'Generic Software PID loop'
- self.config['Device type']='PID loop'
- self.config['FnamePrefix'] = 'pid'
- self.deviceProperties.update({'Gp', 'Gi', 'Gd', 'Sign', 'Enable'})
+ self.config["Device model"] = "Generic Software PID loop"
+ self.config["Device type"] = "PID loop"
+ self.config["FnamePrefix"] = "pid"
+ self.deviceProperties.update({"Gp", "Gi", "Gd", "Sign", "Enable"})
self.setGp(Gp)
self.setGi(Gi)
self.setGd(Gd)
@@ -20,83 +22,81 @@ class PID(BasicInstrument):
self.reset()
def __repr__(self):
- s = ''
- s += f'{self.__class__.__name__}('
- s += f'Gp={self.Gp}'
- s += f', Gi={self.Gi}'
- s += f', Gd={self.Gd}'
- s += f', sign={self.enable}'
- if self.config['DeviceNickname'] is not None:
+ s = ""
+ s += f"{self.__class__.__name__}("
+ s += f"Gp={self.Gp}"
+ s += f", Gi={self.Gi}"
+ s += f", Gd={self.Gd}"
+ s += f", sign={self.enable}"
+ if self.config["DeviceNickname"] is not None:
s += ", device_nickname='"
s += f"{self.config['DeviceNickname']}"
s += "'"
- s += ')'
- return(s)
+ s += ")"
+ return s
@BasicInstrument.tsdb_append
def getGp(self):
return self.Gp
@BasicInstrument.tsdb_append
- def setGp(self,val):
- self.Gp=val
+ def setGp(self, val):
+ self.Gp = val
@BasicInstrument.tsdb_append
def getGi(self):
return self.Gi
@BasicInstrument.tsdb_append
- def setGi(self,val):
- self.Gi=val
+ def setGi(self, val):
+ self.Gi = val
@BasicInstrument.tsdb_append
def getGd(self):
return self.Gd
@BasicInstrument.tsdb_append
- def setGd(self,val):
- self.Gd=val
+ def setGd(self, val):
+ self.Gd = val
@BasicInstrument.tsdb_append
def getSign(self):
return self.sign
@BasicInstrument.tsdb_append
- def setSign(self,val):
- self.sign=val
+ def setSign(self, val):
+ self.sign = val
@BasicInstrument.tsdb_append
def getEnable(self):
return self.enable
@BasicInstrument.tsdb_append
- def setEnable(self,val):
- self.enable=val
+ def setEnable(self, val):
+ self.enable = val
-
def reset(self):
self.err_1dt_back = 0
self.err_2dt_back = 0
- self.err_now = 0
- self.last_update = time.time()
+ self.err_now = 0
+ self.last_update = time.time()
def feedback(self, err):
# PID feedback
# see https://en.wikipedia.org/wiki/PID_controller#Pseudocode
- self.err_2dt_back = self.err_1dt_back;
- self.err_1dt_back = self.err_now;
+ self.err_2dt_back = self.err_1dt_back
+ self.err_1dt_back = self.err_now
self.err_now = err
tnow = time.time()
dt = tnow - self.last_update
self.last_update = tnow
- A0= self.Gp+self.Gi*dt + self.Gd/dt;
- A1= -self.Gp-2*self.Gd/dt;
- A2= self.Gd/dt;
+ A0 = self.Gp + self.Gi * dt + self.Gd / dt
+ A1 = -self.Gp - 2 * self.Gd / dt
+ A2 = self.Gd / dt
- u = A0*self.err_now + A1*self.err_1dt_back + A2*self.err_2dt_back;
+ u = A0 * self.err_now + A1 * self.err_1dt_back + A2 * self.err_2dt_back
u *= self.sign
if not self.enable:
return 0
return u
-