Acumular salida desde el controlador PID

0

Me he topado con un puñado de ejemplos de controladores PID donde la entrada del proceso es la salida PID acumulada , es decir, el bucle del controlador es u += pid(...) en lugar de u = pid(...) donde u es la entrada del proceso .

Por ejemplo, digamos que estamos usando PID para controlar la velocidad de un motor a través de PWM,

class PID:
    def __init__(self, kp, ki, kd):
        self.kp = kp
        self.ki = ki
        self.kd = kd

    ...

    def pid(self, set_point, process_variable):
        now = time()
        dt = now - self.last_time

        error = set_point - process_variable
        p = self.kp * error
        i = self.ki * error * dt + self.i_sum
        d = self.kd * (error - self.last_error) / dt
        output = p + i + d

        self.i_sum = i
        self.last_error = error
        self.last_time = now

        return output

Mi comprensión del PID es que deberíamos usar el controlador como

pid = PID(kp, ki, kd)
...
motor_pwm = pid.pid(target_speed, measured_speed)

Pero a menudo lo veo implementado como

pid = PID(kp, ki, kd)
...
motor_pwm += pid.pid(target_speed, measured_speed)

Ahora, para ki = kd = 0 , este último tiene algún sentido intuitivo para mí; de hecho, creo que en realidad te da un tipo de controlador PI con ki = kp , y dt = 1 aplicado. Sin embargo, una vez que introduzcas ki != 0 o kd != 0 , no puedo cuadrar esto con ninguna de las explicaciones de libros de texto de PID que he leído.

¿Este controlador 'acumulado' u += pid(...) simplemente es una implementación incorrecta de PID?

    
pregunta Sam

1 respuesta

2

No es necesariamente una implementación incorrecta, si la señal de realimentación de que su bucle PID está siguiendo y controlando es la primera derivada de la salida de control que necesita emitir. La acumulación continua de la salida PID es equivalente a la integración.

    
respondido por el Andy Walls

Lea otras preguntas en las etiquetas