• Python PID


    import time
    
    class PID:
        """PID Controller
        """
    
        def __init__(self, P=0.2, I=0.0, D=0.0):
    
            self.Kp = P
            self.Ki = I
            self.Kd = D
    
            self.sample_time = 0.00
            self.current_time = time.time()
            self.last_time = self.current_time
    
            self.clear()
    
        def clear(self):
            """Clears PID computations and coefficients"""
            self.SetPoint = 0.0
    
            self.PTerm = 0.0
            self.ITerm = 0.0
            self.DTerm = 0.0
            self.last_error = 0.0
    
            # Windup Guard
            self.int_error = 0.0
            self.windup_guard = 20.0
    
            self.output = 0.0
    
        def update(self, feedback_value):
            """Calculates PID value for given reference feedback
            .. math::
                u(t) = K_p e(t) + K_i int_{0}^{t} e(t)dt + K_d {de}/{dt}
            .. figure:: images/pid_1.png
               :align:   center
               Test PID with Kp=1.2, Ki=1, Kd=0.001 (test_pid.py)
            """
            error = self.SetPoint - feedback_value
    
            self.current_time = time.time()
            delta_time = self.current_time - self.last_time
            delta_error = error - self.last_error
    
            if (delta_time >= self.sample_time):
                self.PTerm = self.Kp * error
                self.ITerm += error * delta_time
    
                if (self.ITerm < -self.windup_guard):
                    self.ITerm = -self.windup_guard
                elif (self.ITerm > self.windup_guard):
                    self.ITerm = self.windup_guard
    
                self.DTerm = 0.0
                if delta_time > 0:
                    self.DTerm = delta_error / delta_time
    
                # Remember last time and last error for next calculation
                self.last_time = self.current_time
                self.last_error = error
    
                self.output = self.PTerm + (self.Ki * self.ITerm) + (self.Kd * self.DTerm)
    
        def setKp(self, proportional_gain):
            """Determines how aggressively the PID reacts to the current error with setting Proportional Gain"""
            self.Kp = proportional_gain
    
        def setKi(self, integral_gain):
            """Determines how aggressively the PID reacts to the current error with setting Integral Gain"""
            self.Ki = integral_gain
    
        def setKd(self, derivative_gain):
            """Determines how aggressively the PID reacts to the current error with setting Derivative Gain"""
            self.Kd = derivative_gain
    
        def setWindup(self, windup):
            """Integral windup, also known as integrator windup or reset windup,
            refers to the situation in a PID feedback controller where
            a large change in setpoint occurs (say a positive change)
            and the integral terms accumulates a significant error
            during the rise (windup), thus overshooting and continuing
            to increase as this accumulated error is unwound
            (offset by errors in the other direction).
            The specific problem is the excess overshooting.
            """
            self.windup_guard = windup
    
        def setSampleTime(self, sample_time):
            """PID that should be updated at a regular interval.
            Based on a pre-determined sampe time, the PID decides if it should compute or return immediately.
            """
    self.sample_time = sample_time
  • 相关阅读:
    Python运算符
    Python中的变量
    Chapter 4. Working with Key/Value Pairs
    Chapter 3. Programming with RDDs
    python常见的特异点
    18.天知道练习
    17.vue+axios搭配使用
    16.axios基本使用
    15.记事本练习
    14.v-model指令
  • 原文地址:https://www.cnblogs.com/qj696/p/10878023.html
Copyright © 2020-2023  润新知