ultrasound.ControlRoi: fix control mechanism

Change-Id: I9d01de260d3bdc63eb1004ba4f714d38d1c0508c
This commit is contained in:
zolliker 2025-04-02 14:55:33 +02:00
parent 36f2919ec2
commit 75783b211a

View File

@ -98,26 +98,28 @@ class ControlRoi(Roi, Readable):
def doPoll(self): def doPoll(self):
inphase = self.value[0] inphase = self.value[0]
freq = self.freq.target freq = self.freq.target
newfreq = None
if freq != self._freq_target: if freq != self._freq_target:
self._freq_target = freq self._freq_target = freq
# do no control 2 times after changing frequency # do no control 2 times after changing frequency
self._skipctrl = 2 self._skipctrl = 2
fdif = freq - self._old[0] if self._old:
if self.control_active: fdif = freq - self._old[0]
if self._old: if self.control_active:
newfreq = freq + inphase * self.slope newfreq = freq + inphase * self.slope
self.log.info('fdif %r minstep %r', fdif, self.minstep) self.log.info('fdif %r minstep %r', fdif, self.minstep)
else: if abs(fdif) > self.minstep * 0.99:
# do a 'test' step idif = inphase - self._old[1]
newfreq = freq + self.minstep if idif:
if abs(fdif) > self.minstep * 0.99: self.slope = - fdif / idif
idif = inphase - self._old[1] self._old = (freq, inphase)
if idif: else:
self.slope = - fdif / idif
self._old = (freq, inphase) self._old = (freq, inphase)
if self.control_active:
newfreq = freq + self.minstep
if self._skipctrl > 0: # do no control for some time after changing frequency if self._skipctrl > 0: # do no control for some time after changing frequency
self._skipctrl -= 1 self._skipctrl -= 1
elif self.control_active: elif newfreq is not None:
self._freq_target = self.freq.write_target(clamp(freq - self.maxstep, newfreq, freq + self.maxstep)) self._freq_target = self.freq.write_target(clamp(freq - self.maxstep, newfreq, freq + self.maxstep))