Skip to content

Commit 8797e4f

Browse files
Smooth out noisy feedback from model fit
1 parent 8597538 commit 8797e4f

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

src/boilerdaq/daq.py

+16-5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from datetime import datetime, timedelta
77
from math import isnan
88
from pathlib import Path
9+
from statistics import mean
910
from tempfile import NamedTemporaryFile
1011
from textwrap import dedent
1112
from typing import TYPE_CHECKING, Any, NamedTuple, Self
@@ -621,6 +622,7 @@ def __init__(
621622
gains: tuple[float, float, float],
622623
output_limits: tuple[float, float],
623624
backup_feedback_result: Result | None = None,
625+
periods: int = 1,
624626
):
625627
self.control_result: PowerResult = control_result # type: ignore
626628
self.feedback_result: Result = feedback_result
@@ -635,6 +637,7 @@ def __init__(
635637
self.feedback_value = (
636638
self.feedback_result.value or self.backup_feedback_result.value
637639
)
640+
self.periods = periods
638641

639642
def start(self):
640643
"""Start the controller."""
@@ -646,11 +649,19 @@ def close(self):
646649

647650
def update(self):
648651
"""Update the PID controller."""
649-
self.feedback_value = (
650-
self.backup_feedback_result.value
651-
if isnan(self.feedback_result.value)
652-
else self.backup_feedback_result.value
653-
)
652+
if self.periods == 1:
653+
self.feedback_value = (
654+
self.backup_feedback_result.value
655+
if isnan(self.feedback_result.value)
656+
else self.feedback_result.value
657+
)
658+
else:
659+
feedback_result = mean(list(self.feedback_result.history)[-self.periods :])
660+
self.feedback_value = (
661+
mean(list(self.backup_feedback_result.history)[-self.periods :])
662+
if isnan(feedback_result)
663+
else feedback_result
664+
)
654665
control_value = self.pid(self.feedback_value)
655666
self.control_result.write(control_value)
656667

src/boilerdaq/stages/controlled/surface_control.py

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ def looper(surface_temp_setpoint: float = SURFACE_TEMP_SETPOINT) -> Looper: # n
4141
control_result=get_result(name=CONTROL_SENSOR_NAME, results=results),
4242
feedback_result=fit_result,
4343
backup_feedback_result=get_result(name=BACKUP_TEMP, results=results),
44+
periods=5,
4445
setpoint=surface_temp_setpoint,
4546
gains=PID_GAINS,
4647
output_limits=OUTPUT_LIMITS,

0 commit comments

Comments
 (0)