# PID controller class
# by Kai De La Cruz & Kenzie Goldman 2/17/25
from pyb import Pin, Timer import time
class PIDController:
'''A PID controller class for motor control'''
def__init__(self, kp, ki, kd, setpoint=0):
'''Initializes the PID controller with given gains and setpoint'''
self.kp = kp
self.ki = ki
self.kd = kd
self.setpoint = setpoint
self.integral = 0
self.previous_error = 0
self.previous_time = time.ticks_ms()
def compute(self, measurement):
'''Computes the control effort based on the measurement'''
current_time = time.ticks_ms()
dt = time.ticks_diff(current_time, self.previous_time) / 1000.0
error = self.setpoint - measurement
self.integral += error * dt
derivative = (error - self.previous_error) / dt if dt > 0 else 0
output = self.kp * error + self.ki * self.integral + self.kd * derivative
self.previous_error = error
self.previous_time = current_time
return output
def set_setpoint(self, setpoint):
'''Sets a new setpoint for the PID controller'''
self.setpoint = setpoint
self.integral = 0
self.previous_error = 0
self.previous_time = time.ticks_ms()