Вы находитесь на странице: 1из 6

%numerador y denominador del sistema a compensar n=input('ingrese numerador n = '); d=input('ingrese denominador d = '); %datos del prblema x=input('\n

Para ingrsar Damping y frecuencia (Wn) aprete 1\n para ingresar polo deseado aprete 2\n'); if x==1 e=input('ingrese dampin e = '); wn=input('ingrese frecuencia Wn = '); wd=wn*sqrt(1-e^2); o=-e*wn; elseif x==2 o=input('ingrese termino real '); wd=input('ingrese termino imaginario '); end g=tf(n,d) gr=feedback(g,1) [z,p,k]=tf2zp(n,d); % Hallando la deficiencia angular if o==p(1) t1=90; else t1=180-atand(wd/-o); end if o==p(2) t2=90; else t2=atand(wd/p(2)-o); end tdef=t1+t2-180; fprintf('La defieciencia angular es %2.0f\n',tdef) %hallando el cero y polo compensado zc=[1 abs(o)-tand(tdef/2)*wd]; pc=[1 abs(o)+tand(tdef/2)*wd]; %sistema compensado nuc=conv(n,zc); dec=conv(d,pc); gcg=tf(nuc,dec) rlocus(gcg)

Este Programa Calcula el compensador de adelanto y de atraso para % un sistema en "s" la funcion trabaja de la siguiente manera: % % PID(numerador, denominador, sobreimpulso, tiempo de estabilizacion) % Ejemplo: % num= [1 3 4] % den= [3 2 5 3] % leadlag(num,den,10,2) % El compensador de adelanto es % newnum = % 20.33126550103975 57.98484070119527 % newdenom = % 1.00000000000000 2.87111370360492 % Zero/pole/gain: % 20.3313 (s+2.852) % ----------------% (s+2.871) % % Tener cuidado de no escribir letras en los espacios del spbrimpulso y % el tiempo de estabilizacion % El tiempo de estabilizacion esta calculado por la formula: % ts=3/(chi*wn) % % Para el compensador de adelanto se creo el criterio de ubicar la % parte real del punto a utilizar 0.5 a la izquierda de chi*wn % Para el compensador de atraso se creo el criterio de ubicar el % cero a utilizar 0.25 a la derecha del polo mas a la derecha % % % Elaborado por Irene Brenes P. % Roger Arroyo A. % Ronny Ramirez A. % % Prof: Ing. Eduardo Interiano S. % Fecha: 16/6/03 % Version: 1.0 % function [sistema,atraso] = leadlag(numer, denom, M, ts) ni=nargin; algito=numer; algito1=denom; if (ni==4) warning off MATLAB:divideByZero sirve = isnumeric(M); sirve1 = isnumeric(ts) if (sirve == 1)%&&(sirve1 == 1) colum1=size(numer,2); colum2=size(denom,2); a=0; numerador=0; for a = 1:colum1 syms s; numerador=(numerador+numer(1,a)*s^(colum1-1)) colum1=colum1-1; end

numer=inline(numerador); b=0; denominador=0; for b = 1:colum2 syms s; denominador=(denominador+denom(1,b)*s^(colum2-1)); colum2=colum2-1; end denom=inline(denominador); syms s; funtrans = numer(s)/denom(s); funcion = inline(funtrans); %%Compensador de Adelanto chi = sqrt((log(M/100))^2/(pi^2 + (log(M/100))^2)); wn = 3/(chi*ts); chiwn=-wn*chi; cita = acos(chi); x = chiwn-0.5; y = -chiwn*tan(cita); punto = complex(x,y) eval = funcion(punto); colocho = angle(eval); fi = pi-colocho; n=1; if (fi > (pi/2)) fi = fi/2; n = 2; if (fi >= pi) fi = fi/3; n=3; end end cita2 = pi-angle(punto); cero = -abs(punto)*(cos((cita2+fi)/2))/(cos((cita2-fi)/2)); polo = -abs(punto)*(cos((cita2-fi)/2))/(cos((cita2+fi)/2)); if (n==1) kc =1/abs(funcion(punto)*(cero-punto)/(polo-punto)); elseif(n==2) kc =1/abs(funcion(punto)*(cero-punto)^2/(polo-punto)^2); else kc =1/abs(funcion(punto)*(cero-punto)^3/(polo-punto)^3); end cero = -cero; polo = -polo; if ( n==1 ) disp(['El compensador de adelanto es ']) newnum=conv(kc,[1 cero]) newdenom=conv(1,[1 polo]) sistema = zpk(tf(newnum,newdenom)) else if (n==2) disp(['El compensador de adelanto es ']) newnum=conv([1 cero],conv([1 cero],kc)) newdenom=conv(conv([1 polo],1),[1 polo]) sistema = zpk(tf(newnum,newdenom)) else

newnum=conv(conv([1 cero],[1 cero]),conv([1 cero],kc)) newdenom=conv(conv([1 polo],1),conv([1 polo],[1 polo])) sistema = zpk(tf(newnum,newdenom)) end end %%Compesador de Atraso p=input('Desea Calcular el compensador de atraso 1) si 2) no : ','s'); quiere=str2num(p); if (quiere == 1) resp = 0; c=input('Digite el ess en porcentaje: ','s'); ess=str2num(c); if (ess~=0) while (resp == 0) d=input('Escoja el tipo de entrada (1)[escalon], (2)[rampa], (3)[parabola]: ','s'); in=str2num(d); if (in ~= 1)&&(in~=2)&&(in~=3) resp=0; else resp=1; end end ess = ess/100; if (in ==1) kp=(1-ess)/ess; Z0lP0=kp/(funcion(0)*cero^n*kc/polo^n); syms s; zeros = solve(denom(s),s); zeros = double(zeros); if (max(zeros ~= -0.25 )) if (max(zeros) == 0) disp(['El sistema debe ser de tipo cero']) j=input('Desea intentar de nuevo: 1) Si 2) No:','s'); intente=str2num(j); if (intente==1) compensador2; else disp(['Fin de programa']) end else Z0=-(max(zeros)+0.25); P0=(Z0/Z0lP0); disp(['El compensador de atraso es ']) numatr=conv(1,[1 Z0]) denatr=conv(1,[1 P0]) atraso = tf(numatr,denatr) end end if (max(zeros == -0.25 )) Z0=-(max(zeros)+0.1); P0=(Z0/Z0lP0);

disp(['El compensador de atraso es ']) numatr=conv(1,[1 Z0]) denatr=conv(1,[1 P0]) atraso = tf(numatr,denatr) end end if (in ==2) kv=1/ess; syms s; limite=kv/(s*funcion(s)*cero^n*kc/polo^n);%%Sirve para calcular lim G(s)*s limite=inline(limite); Z0lP0=limite(0); syms s; zeros = solve(denom(s),s); zeros = double(zeros); tamano=size(zeros,1); tipo =0; for p = 1:tamano if (zeros(p)==0) tipo=tipo+1; end end if (tipo == 1) if (max(zeros ~= -0.25 )) Z0=-(max(zeros)+0.25); end if (max(zeros == -0.25 )) Z0=-(max(zeros)+0.3); end P0=(Z0/Z0lP0); disp(['El compensador de atraso es ']) numatr=conv(1,[1 Z0]) denatr=conv(1,[1 P0]) atraso = tf(numatr,denatr) end if (tipo ~= 1) disp(['El sistema debe ser de tipo uno']) disp(['Fin de programa']) end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if (in ==3) ka=1/ess; syms s; limite=ka/(s^2*funcion(s)*cero^n*kc/polo^n);%%Sirve para calcular lim G(s)*s limite=inline(limite); Z0lP0=limite(0); syms s; zeros = solve(denom(s),s); zeros = double(zeros); tamano=size(zeros,1); tipo =0; for p = 1:tamano if (zeros(p)==0)

tipo=tipo+1; end end if (tipo == 2) if (max(zeros ~= -0.25 )) Z0=-(max(zeros)+0.25); end if (max(zeros == -0.25 )) Z0=-(max(zeros)+0.3); end P0=(Z0/Z0lP0); disp(['El compensador de atraso es ']) numatr=conv(1,[1 Z0]) denatr=conv(1,[1 P0]) atraso = tf(numatr,denatr) end if (tipo ~= 2) disp(['El sistema debe ser de tipo dos']) disp(['Fin de programa']) end end else disp(['Para este caso es necesario un compensador filtro de muesca']) disp(['Fin de programa']) end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% end if (quiere~=1) disp(['Fin de Programa']) end else disp(['Error en la introduccion de M o ts. numeros']) end else disp(['Faltan parametros']) end Estos deben ser

Вам также может понравиться