Simulando controlador PID en Matlab

Estoy tratando de explorar el control PID con una simulación. Mi problema es que el término derivado no se comporta como se esperaba en mi simulación: no importa cuán grande sea su coeficiente, parece incapaz de evitar los sobreimpulsos.

Traté de ajustar el sistema con el método Ziegler-Nichols y usando los parámetros debería producir "sin sobreimpulso" de acuerdo con la entrada de Wikipedia del método Ziegler-Nichols.

Mi "proceso" es simplemente el promedio móvil exponencial de 5 muestras de la salida del controlador PID. La salida del controlador está limitada a [-1,1]

¿Alguien puede ver cuál es el problema con este código?

PVset = 0.5;            % set point for process variable

steps = 100;          % time periods/steps to simulate

PV = 0;               % process variable (time series)
error = 0;            % error in PV (time series)
der = 0;              % derivative of error (time series)

Ku = 1;
Tu = 2;

Kp = Ku*.2;
Ki = 2*Kp/Tu;
Kd = Kp*Tu/3;

for k=2:steps
    % calculate error
    error(end+1) = PVset-PV(end);
    % P term
    delta = Kp*error(end);
    % I term
    delta = Ki*sum(error) + delta;
    % D term
        % instantaneous derivative time series
    der = error(2:end)-error(1:end-1);
        % average derivative over x periods
    per = 4;
    if k >= per+1
        avgDer = mean(der(end-(per-1):end));
        delta = Kd*avgDer+delta;
    end
    % limit PID controller output to -1 -> 1
    if abs(delta) > 1
        delta = sign(delta);
    end
    % simulate process behaviour
    p = 5;
    PV(k+1) = (p-1)/p*PV(k-1) + 1/p*delta;
end

figure
hold on
plot((0:steps), PV)
plot((1:steps), error, 'r')

Respuestas (1)

Probé tu código. cuando intento

Tu=8

la amortiguación derivada es suficiente para evitar el sobreimpulso. Vea el resultado:

pid

Gracias, pero ¿cómo encontraste a Tu=8? Siguiendo ZN obtengo un valor de Tu=2.