viernes, 14 de diciembre de 2007

Diseño de un Compensador de Adelanto-Atraso en Matlab

Diseño de un Compensador de Adelanto Atraso


Programación en Matlab – Script:


%---------------------------------------------
%Diseño de un Compensador de Atraso - Adelanto
%Ogata K, Ingeniería de Control Moderna
%Tercera Edicion
%Ejemplo 9.3, pag. 632
%---------------------------------------------

close all;clear all;clc;

fprintf('-------------------------------------------\n')
fprintf('Diseño de un Compensador de Atraso-Adelanto\n')
fprintf('Ogata K, Ingeniería de Control Moderna\n')
fprintf('Tercera Edicion\n')
fprintf('Ejemplo 9.3, pag. 632\n')
fprintf('-------------------------------------------\n')

%Requerimientos del sistemas
kv=10; MFD=50;MGD=50;

%Planta
den1=[1 0];
den2=[1 1];
den3=[1 2];
den4=conv(den1,den2);
den=conv(den4,den3);
kva=1/polyval(deconv(den,[1 0]),0);
k=kv/kva;
num=[k];
fprintf('\n**Planta del Sistema**\n')
planta=tf(num,den)

%Diseño del COMPENSADOR DE ATRASO DE FASE

%Diagrama de bode de la planta
w0=logspace(-1,2,500);
[Gan0,Fase0]=bode(planta,w0);
GandB0=20*log10(Gan0);

%Hallamos el margen de fase y ganancia
w1=logspace(-1,2,500);
[Gan1,Fase1]=bode(planta,w1);
Gandb1=20*log10(Gan1);

%Margende fase
indice1=find(Gandb1<=0);
wcg1=w1(indice1(1));
MF=Fase1(indice1(1))+180;

%Margende ganancia
indice2=find(Fase1<=-180);
wcf1=w1(indice2(1));
MG=-Gandb1(indice2(1));

%Margen deseado del compensador
Fadic1=-180+MFD+12;

%Frecuencia del compensador
indice3=find(Fase1<=Fadic1);
wgcomp=w1(indice3(1));

%Hallamos la ganancia de fase a esa frecuencia
Ganf=Gandb1(indice3(1));

%el compensador agrega
beta=10^(Ganf/20);

%Para asegurar una frecuencia alta del compensador se hace
T=5/wgcomp;

z1comp=1/T;
p1comp=1/(beta*T);
k1comp=k/beta;
numcomp=k1comp*[1 z1comp];
dencomp=[1 p1comp];
Comp1=tf(numcomp,dencomp);

Scomp1=series(planta,Comp1);

%COMPENSADOR DE ADELANTO DE FASE

%Planta + Compensador de Atraso
w=logspace(-4,1,500);
[Gan2,Fase2]=bode(Scomp1,w);
Gandb2=20*log10(Gan2);

%Margen de fase
VecIndice1=find(Gandb2<=0);
Indice1=VecIndice1(1);
Wogan=w(Indice1);
MF2=Fase2(Indice1)+180;

%Fase adicional
Fadic2=MFD-MF2;

%Se calcula el factor de atenuacion Alfa
alfa=(1-sin(Fadic2*pi/180))/(1+sin(Fadic2*pi/180));

%Nuevo cruce de ganancia

%Ganancia adicionada por el compensador

r=20*log10(1/sqrt(alfa));
VecIndice2=find(Gandb2<=-r);
Indice2=VecIndice2(1);
Wm=w(Indice2);

T2=1/[sqrt(alfa)*Wm ];

%parametros del compensador

Z2comp=1/T2;
P2comp=1/(alfa*T2);
k2comp=1/alfa;
numcomp2=k2comp*[1 Z2comp];
dencomp2=[1 P2comp];
Comp2=tf(numcomp2,dencomp2);

%Planta Compensada
fprintf('\n**Planta Compensada**\n')
plantacompensada=series(Scomp1,Comp2)

%Respuesta en el Tiempo
figure(1);step(feedback(planta,1)),hold on, grid on
step(feedback(plantacompensada,1))
title('Respuesta en el Tiempo')
legend('Planta Sin Compensador','Planta Compensada')

%Respuesta en Frecuencia
figure(2);bode(planta),hold on, grid on
bode(plantacompensada)
title('Respuesta en Frecuencia')
legend('Planta Sin Compensador','Planta Compensada')

Resultados de la compilación del programa:


Gráficas resultantes


Grafica Nº 1
Grafica Nº 2

1 comentario:

User dijo...

Tenes el de atraso y adelanto por separado?