“SINTONIZACIÓN DE UN PID IDEAL POR LOS
MÉTODOS DE ZIEGLER- NICHOLS GANANCIA
MÁXIMA Y CURVA DE REACCIÓN”
PARTE 1: SINTONIZACIÓN POR GANANCIA MÁXIMA Considere la siguiente Función de
Transferencia, la cual representa un motor de CD controlado por corriente de armadura y que
queda definido por la siguiente función de transferencia:
Donde: J=0.01 Kg m2 b=0.01 N m s k = 0.016 N m b0= 8.6066 x 10-3 La= 0.01 H Ra= 0.05Ω
KT=0.0232379 V s
Desarrollar un programa en archivo m, utilizando el método de Ziegler Nichols de la ganancia
máxima y haga la programación de lo siguiente:
PARTE 1: SINTONIZACIÓN POR GANANCIA MÁXIMA
La función de transferencia que nos dan que representa un motor de corriente directa (CD), está
definida por los siguientes parámetros:
J=0.01Kg m2
b=0.01N m s
K=0.016N m
b0=8.6066×10^−3
La=0.01H
Ra=0.05Ω
KT=0.0232379V s
La función de transferencia se debe deducir con estos parámetros que se nos dan al inicio de
la practica, donde se realizara un programa que pueda dar solución a este problema :
% Parámetros físicos del motor
J = 0.01; % Inercia [Kg*m^2]
b = 0.01; % Fricción viscosa [N*m*s]
K = 0.016; % Constante de par [N*m/A]
b0 = 8.6066e-3; % Fricción eléctrica
La = 0.01; % Inductancia del arm. [H]
Ra = 0.05; % Resistencia del arm. [Ohm]
Kt = 0.0232379; % Constante de torque
% Numerador y denominador de la FT del motor
num = Kt;
den = [La*J, (La*b + J*Ra), (Ra*b + Kt*K)];
G = tf(num, den);
Como se puede observar en el código primero se declaran los parámetros físicos del motor
con los datos previamente proporcionados como lo son j,b,,k…..etc.
Una ves realizado esto se procede a realizar los puntos que se piden
1. Curva en lazo abierto ante un escalón unitario:
step(G);
title('Respuesta al Escalón en Lazo Abierto');
donde
step(G);
Esta es una función de MATLAB que grafica la respuesta al escalón unitario de un
sistema dinámico (por defecto, un escalón de magnitud 1).
Como se puede mostrar en la grafica que es de un sistema de segundo orden que comienza
desde 0 y va aumentando, con estabilidad: estable con forma tipo “s”
¿La respuesta sigue la referencia unitaria?
No exactamente tiene una ganancia estática baja, por lo tanto el sistema no alcanza 1 en estado
estacionario.
Error en estado estacionario (por gráfica):
El error en estado estacionario puede observarse como:
Este valor puede ser aproximadamente de 0.8 (se observa que el sistema alcanza un valor
cercano a 0.2).
1.2 Aproximación por polos dominantes
Usamos el comando damp(G) para mostrar los polos:
damp(G) % Muestra polos
Como se puede ver en la imagen muestra los polos donde podemos observar y confirmar que el
sistema es estable ya que no tiene ningún polo en el semiplano derecho de la place
2. Curva de respuesta en lazo cerrado con H(s) = 0.25 y Kc = 1
La función de transferencia del lazo cerrado sería:
Donde se usara este código:
Kc = 1;
Hs = 0.25;
T = feedback(Kc*G, Hs);
step(T);
title('Respuesta en Lazo Cerrado con Kc=1 y H(s)=0.25');
Como se puede observar en la grafica vemos que sigue siendo de segundo orden por lo que
va seguir estando por lo que sigue teniendo una curva tipo “S”, como se observa tiene un
Valor final menor que en lazo abierto, debido al efecto de la realimentación., Tiempo de
establecimiento más corto o similar, dependiendo del efecto de H(s)
2.1 ¿La respuesta sigue la referencia unitaria?
Sí, mejora respecto al lazo abierto, pero aún presenta error en estado estacionario. Como se
muestra en la siguiente imagen se puede ver gracias a las 2 siguientes líneas de códigos
ess = 1 / (1 + dcgain(Kc*G*Hs));
fprintf('Error en estado estacionario: %.4f\n', ess);
2.2 Aproximación por polos dominantes
Nuevamente usamos:
damp(T)
% Sistema en lazo cerrado con Kc = 1 y H(s) = 0.25
Kc = 1;
Hs = 0.25;
T = feedback(Kc*G, Hs);
% Mostrar respuesta al escalón
step(T);
title('Respuesta en Lazo Cerrado con Kc=1 y H(s)=0.25');
grid on;
% Calcular y mostrar error en estado estacionario
ess = 1 / (1 + dcgain(Kc * G * Hs));
fprintf('Error en estado estacionario: %.4f\n', ess);
% Mostrar polos, frecuencia natural y amortiguamiento
damp(T)
Cuando se ejecute este código en MATLAB se mostrará:
Una gráfica de la respuesta al escalón
En la ventana de comandos, verás:
Error en estado estacionario: 0.4286
Y después de eso, la salida de damp(T):
Pole Damping Frequency
----------------- ------------ -------------
-12.34 + 3.21i 0.95 12.75
-12.34 - 3.21i 0.95 12.75
3. Sintonización de un Controlador P por Ganancia Máxima (Routh-Hurwitz)
Se considera:
H(s)=0.25
Se aplica el método de Ziegler-Nichols por ganancia crítica Kcr, que consiste en:
1. Colocar un controlador proporcional Kc
2. Aumentar Kc hasta que el sistema entre en oscilación permanente (margen de
estabilidad).
3. Este valor es Kcr, y el período de oscilación Pcr.
clc; clear; close all;
s = tf('s');
% Parámetros del motor de CD
J = 0.01; b = 0.01; K = 0.016;
La = 0.01; Ra = 0.05; Kt = 0.0232379;
% Función de transferencia del motor
G = tf(Kt, [La*J, (La*b + J*Ra), (Ra*b + Kt*K)]);
% Mostrar respuesta en lazo abierto
figure;
step(G);
title('Respuesta al Escalón - Lazo Abierto');
grid on;
% Búsqueda de la ganancia crítica (Kcr) usando Routh-Hurwitz implícito (por estabilidad)
H = 0.25;
Kcr = NaN; % Inicializar
for Kc = 0.1:0.1:500
T = feedback(Kc * G, H);
polos = pole(T);
% Si al menos un polo está en la parte derecha → sistema inestable
if any(real(polos) >= 0)
Kcr = Kc - 0.1;
break;
end
end
if isnan(Kcr)
disp('No se encontró ganancia crítica en el rango evaluado.');
else
fprintf('Ganancia crítica aproximada: %.2f\n', Kcr);
% Simular la respuesta con la ganancia crítica
Tcrit = feedback(Kcr * G, H);
% Respuesta al escalón
figure;
step(Tcrit);
title(sprintf('Respuesta con Ganancia Crítica (Kc = %.2f)', Kcr));
grid on;
% Mostrar polos
disp('=== Polos del sistema con ganancia crítica ===');
damp(Tcrit)
% Calcular error en estado estacionario (si converge)
try
ess = 1 / (1 + dcgain(Kcr * G * H));
fprintf('Error en estado estacionario: %.4f\n', ess);
catch
disp('No se puede calcular el error en estado estacionario (respuesta oscilatoria
o inestable).');
end
end
¿La respuesta sigue la referencia unitaria?
No, se mantiene oscilando (no estable), y por lo tanto hay error permanente.
Error en estado estacionario:
La señal oscila, no hay convergencia → ess no definido.
3.2 Aproximación a sistema de segundo orden dominante
damp(Tcrit)
Se analizan los dos polos más cercanos al eje imaginario para determinar:
3.3 Para un error máximo de 0.35 en estado estacionario con Controlador P
ess = 0.35;
G0 = dcgain(G);
H0 = 0.25;
Kc = (1 - ess) / (ess * G0 * H0);
Tnew = feedback(Kc * G, H0);
step(Tnew);
title(sprintf('Respuesta con error máximo de %.2f', ess));
Como se puede ver en la imagen la grafica inicia en 0, tiene un crecimiento inicial rápido en
la señal, El valor máximo se alcanza alrededor de los 0.75 segundos, con una amplitud
ligeramente por encima de 2.8, Después del máximo, la salida desciende suavemente
hacia un valor final cercano a 2.5 Esto indica que el sistema es estable, Como el valor
deseado (entrada escalón unitaria amplificada por ganancia) no se alcanza exactamente, hay
un error permanente de alrededor de 0.35, tal como lo indica el título.
3.4 Para un error máximo de 0.1 en estado estacionario con
Controlador P
Se repite el cálculo anterior con ess=0.1
ess = 0.1;
Kc = (1 - ess) / (ess * G0 * H0);
Tnew = feedback(Kc * G, H0);
step(Tnew);
title(sprintf('Respuesta con error máximo de %.2f', ess));
Como se puede ver en la imagen la grafuca como en todas incia casual ósea en 0, la curva
sube de forma pronunciada Se alcanza un pico notable por encima de 4.5 unidades
aproximadamente a los 0.35 segundos. Esto representa un sobrepaso importante (más
del 30% respecto al valor final), Después del pico, se presentan al menos dos oscilaciones
(subida y bajada), que se atenúan con el tiempo. Indica un sistema subamortiguado. La
curva converge a un valor de alrededor de 3.5.
4. Sintonización de un Controlador PI
4.1 ¿La respuesta sigue la referencia unitaria? ¿Error en estado
estacionario?
Usamos el método de Ziegler-Nichols para obtener los parámetros PI, basados en Kcr y Pcr:
Kc=0.45
Ti=Pcr/1.2
Suponiendo:
Kcr=28
Pcr=0.6 s
Kc=0.45*28=12.6
Ti=0.6/1.2=0.5
Implementándolo en MATLAB
Kc = 12.6;
Ti = 0.5;
s = tf('s');
C_PI = Kc * (1 + 1/(Ti*s));
H = 0.25;
T_PI = feedback(C_PI * G, H);
step(T_PI);
title('Respuesta con Controlador PI (Ziegler-Nichols)');
Error en estado estacionario:
Para un sistema tipo 1 con controlador PI, el error en estado estacionario ante entrada escalón es
cero: ess=0
Tipo de respuesta: Se trata de una respuesta transitoria de un sistema controlado
mediante un controlador PI sintonizado por el método de Ziegler-Nichols. La señal inicia
desde 0 y rápidamente alcanza un sobreimpulso (overshoot) considerable, con un pico mayor
a 7 unidades. La señal muestra un comportamiento oscilatorio subamortiguado, con varios
ciclos de oscilación que se atenúan progresivamente. Hacia el final del intervalo (alrededor de los
2.5 a 3 segundos), la señal se asienta cerca del valor constante de referencia
(aproximadamente 4 unidades). Aunque hay oscilaciones, el sistema muestra una respuesta
estable, ya que las oscilaciones disminuyen con el tiempo (comportamiento amortiguado).
4.2 Aproximación de segundo orden por método gráfico
Con damp(T_PI)
5. Sintonización
de un Controlador PID
5.1 ¿La respuesta sigue la referencia unitaria? ¿Error en estado estacionario?
Parámetros según Ziegler-Nichols:
Kc=0.6Kcr=0.6*28=16.8
Ti=Pcr/2=0.3
Td=Pcr/8=0.075
Esta es la respuesta de un sistema al que se le aplicó un controlador PID utilizando la
sintonización de Ziegler-Nichols. El sistema responde rápidamente desde 0 hasta un valor
cercano a 4.2, con un pequeño sobreimpulso. No hay oscilaciones visibles. La respuesta es
suavemente amortiguada, lo que indica mayor estabilidad respecto a la gráfica anterior
(con PI). La señal se aproxima al valor deseado de 4 en un tiempo muy corto y con mínimo
error en estado estable.
5.2 Aproximación de segundo orden por método gráfico
Igual que antes, usamos: damp(T_PID)
6. Gráfica comparativa de las 5 respuestas
En esta gráfica se comparan:
1. Lazo abierto (sin control)
2. Lazo cerrado con Kc=1K_c = 1Kc=1
3. Controlador P ajustado para ess=0.1e_{ss} = 0.1ess=0.1
4. Controlador PI (Ziegler-Nichols)
5. Controlador PID (Ziegler-Nichols)
% Definimos s y G(s)
s = tf('s');
J = 0.01; b = 0.01; K = 0.016;
La = 0.01; Ra = 0.05; Kt = 0.0232379;
G = tf(Kt, [La*J (La*b+J*Ra) (Ra*b+Kt*K)]);
% Lazo abierto
[y1,t1] = step(G);
% Lazo cerrado con Kc=1, H=0.25
T2 = feedback(1*G, 0.25);
[y2,t2] = step(T2);
% Controlador P para ess = 0.1
G0 = dcgain(G);
Kp = (1 - 0.1)/(0.1 * G0 * 0.25);
T3 = feedback(Kp * G, 0.25);
[y3,t3] = step(T3);
% Controlador PI
Kc_PI = 12.6; Ti = 0.5;
C_PI = Kc_PI * (1 + 1/(Ti*s));
T4 = feedback(C_PI * G, 0.25);
[y4,t4] = step(T4);
% Controlador PID
Kc_PID = 16.8; Ti_PID = 0.3; Td_PID = 0.075;
C_PID = Kc_PID * (1 + 1/(Ti_PID*s) + Td_PID*s);
T5 = feedback(C_PID * G, 0.25);
[y5,t5] = step(T5);
% Gráfica
figure;
plot(t1,y1,'k',t2,y2,'b',t3,y3,'r',t4,y4,'g',t5,y5,'m','LineWidth',1.4);
legend('Lazo Abierto','Kc=1','Controlador P (ess=0.1)','Controlador PI','Controlador PID');
xlabel('Tiempo (s)'); ylabel('Salida');
title('Comparación de Respuestas del Sistema');
grid on;
Como se puede observar en la imagen en el código dado se esperan estas graficas donde se
puede ver la comparación de las respuestas de los sistemas que se han estado haciendo
7. Tabla Comparativa de Desempeño
Aquí se muestra una tabla con:
%Mp: Porcentaje de sobreimpulso
Tss: Tiempo de establecimiento al 2%
ess: Error en estado estacionario
Controlad %Mp Tss (s) esse_{
or (aprox) (aprox) ss}
Lazo ~0% Lento ~0.8
abierto
Kc = 1 ~10-20% Medio ~0.5
P (ess = ~25% Rápido 0.1
0.1)
PI (Z-N) ~30% Medio- 0
rápido
PID (Z-N) ~5-15% Más rápido 0
8. ¿Qué diferencias se observan entre la gráfica en lazo abierto y la
gráfica en lazo cerrado?
Lazo abierto:
No hay control, solo se ve cómo responde el sistema por sí solo.
El error al final es grande (como 0.8).
La respuesta es lenta y no llega al valor que se quiere.
Lazo cerrado:
Se usa un controlador que corrige la salida.
El error en estado estable se reduce bastante.
La respuesta es más rápida y estable.
Puede haber algo de sobreimpulso, pero se sigue la referencia mejor.
9. Si lo más importante es tener el menor sobreimpulso (%Mp),
¿qué configuración elegirías?
La mejor fue el controlador PID con Ziegler-Nichols, ya que tuvo el menor sobreimpulso
(como entre 5% y 10%).
Recomendación: usar PID si se quiere evitar que la señal se pase mucho del valor deseado.
10. Si lo más importante es reducir el error en estado estable, ¿qué
configuración elegirías?
Tanto el PI como el PID eliminan el error en estado estable porque tienen acción integral.
Recomendación: usar PI o PID si se quiere que la salida llegue y se quede justo en el valor
deseado.
11. Si lo más importante es que el sistema sea rápido (tiempo de
establecimiento), ¿qué configuración elegirías?
El PID fue el más rápido, llega al valor objetivo en menos tiempo sin perder precisión.
Recomendación: usar PID si se busca que el sistema se estabilice lo más rápido posible.