6
6
from datetime import datetime , timedelta
7
7
from math import isnan
8
8
from pathlib import Path
9
+ from statistics import mean
9
10
from tempfile import NamedTemporaryFile
10
11
from textwrap import dedent
11
12
from typing import TYPE_CHECKING , Any , NamedTuple , Self
@@ -621,6 +622,7 @@ def __init__(
621
622
gains : tuple [float , float , float ],
622
623
output_limits : tuple [float , float ],
623
624
backup_feedback_result : Result | None = None ,
625
+ periods : int = 1 ,
624
626
):
625
627
self .control_result : PowerResult = control_result # type: ignore
626
628
self .feedback_result : Result = feedback_result
@@ -635,6 +637,7 @@ def __init__(
635
637
self .feedback_value = (
636
638
self .feedback_result .value or self .backup_feedback_result .value
637
639
)
640
+ self .periods = periods
638
641
639
642
def start (self ):
640
643
"""Start the controller."""
@@ -646,11 +649,19 @@ def close(self):
646
649
647
650
def update (self ):
648
651
"""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
+ )
654
665
control_value = self .pid (self .feedback_value )
655
666
self .control_result .write (control_value )
656
667
0 commit comments