Frqpi.m
上传用户:eighthdate
上传日期:2014-05-24
资源大小:270k
文件大小:4k
源码类别:

其他行业

开发平台:

Matlab

  1. function [numopen, denopen, denclsd] = frqpi(num, den)
  2. % Hadi Saadat,  1998
  3. %discr=[
  4. %'                                                                           '
  5. %'  The function [numopen,denopen,denclsd]=frqpi(num, den) is used for the   '
  6. %'  frequency response design of a PI controller.    num & den are           '
  7. %'  row vectors of polynomial coefficients of the uncompensated open-loop    '
  8. %'  plant transfer function. Design is based on the phase margin criterion.  '
  9. %'  The user is prompted to enter the desired Phase Margin. The program finds'
  10. %'  and displays a gain crossover frequency range for an stable controller.  '
  11. %'  The user is then prompted to enter the gain crossover frequency in this  '
  12. %'  range.  The controller transfer function and the frequency-domain        '
  13. %'  specifications before and after compensation are found.  The function    '
  14. %'  returns the open-loop and the closed-loop numerator and denominators of  '
  15. %'  the compensated system transfer function.                                '];
  16. %disp(discr);
  17. r=abs(roots(den));
  18. i=find(r>0); rp=r(i);
  19. rmx=max(rp); rmn=min(rp); wst=0.1*round(rmn); wf=20*round(rmx);;dw=wf/800;
  20. w=wst:dw:wf;
  21. clc
  22. pm=input('Enter desired phase margin -> ');
  23. [mag, phase] = bode(num, den, w);
  24. phase=180/pi*unwrap(phase*pi/180);
  25. if phase(1) > (-180+pm)
  26.      i = find(phase < (-180 + pm));
  27. else
  28.      i = find(phase > (-180 + pm));
  29. end
  30. if length(i)==0
  31.      disp('Phase does not cross (-180 + P.M.). ')
  32. return, else
  33.      i2=i(1); i1 = i2 -1;
  34.      if i1==0 wpm=w(i2); else
  35.      wa = w(i1); wb = w(i2); p1 = phase(i1); p2 = phase(i2);
  36.      wpm = wa + (-180+pm - p1)/(p2-p1)*(wb-wa);
  37.      end
  38. end
  39. w1= wpm;
  40. [M,ph]=bode(num, den, w1);  % Returns the mag. and phase of G(w)H(w1)
  41. thta=-180 + pm - ph;
  42. thtar=thta*pi/180;
  43. stab=0;
  44. wmx=10*w1; dw1=wmx/100;
  45. wmn=w1/10; dw2=w1/10;
  46. while -(sin(thtar)*w1)/M < 0 | cos(thtar) < 0  & w1 > wmn
  47.   w1=w1-dw2;
  48.   [M,ph]=bode(num, den, w1);  % Returns the mag. and phase of G(w)H(w1)
  49.   thta=-180 + pm - ph;
  50.   thtar=thta*pi/180;
  51. end
  52. w1mx=w1;
  53. while -(sin(thtar)*w1)/M > 0 & cos(thtar) > 0  & w1 > wmn
  54.   stab=stab+1;
  55.   w1=w1-dw2;
  56.   [M,ph]=bode(num, den, w1);  % Returns the mag. and phase of G(w)H(w1)
  57.   thta=-180 + pm - ph;
  58.   thtar=thta*pi/180;
  59. end
  60. w1mn=w1;
  61. if stab==0
  62.   fprintf('Unstable controller. Reduce Phase Margin and repeat.n'),
  63.   return
  64.   else
  65.   fprintf('For a stable controller select a compensated gain crossovern')
  66.   fprintf('frequency wgc between %7.3g',w1mn),fprintf(' and %7.3gn',w1mx)
  67. end
  68. w1=input('Enter wgc -> ');
  69. [M,ph]=bode(num, den, w1);  % Returns the mag. and phase of G(w)H(w1)
  70. thta=-180 + pm - ph;
  71. thtar=thta*pi/180;
  72. Kp= cos(thtar)/M;
  73. KI=-(sin(thtar)*w1)/M;
  74. clc
  75. fprintf('Uncompensated control system n')
  76. [Gm1, Pm1, wpc1, wgc1]=margin(mag, phase, w);
  77. fprintf('Gain Margin  = %7.3g',Gm1),fprintf('    Gain crossover w = %7.3gn',wgc1)
  78. fprintf('Phase Margin = %7.3g',Pm1),fprintf('   Phase crossover w = %7.3gn',wpc1)
  79. fprintf('n')
  80. fprintf('Controller transfer function n')
  81. fprintf('     Gc = %g',Kp),fprintf(' + %g',KI),
  82. fprintf('/s nn')
  83. % the following statements will form the characteristic Equation
  84. % of the compensated system.
  85. m=length(num); n=length(den);
  86. if n > m
  87. o=zeros(1,n-m); mk=[o,1]; num1=conv(num,mk);
  88. else, num1=num, end
  89. numgc=[Kp,KI]; numopen=conv(numgc,num1);
  90. P0=0;
  91. dengc=[1,P0];       denopen=conv(dengc,den);
  92. denclsd=denopen+numopen;
  93. %fprintf('Row vectors of polynomial coefficients of the compensated system:n')
  94. %fprintf('Open-loop num. '),disp(numopen)
  95. %fprintf('Open-loop den. '),disp(denopen)
  96. %fprintf('Closed-loop den'),disp(denclsd)
  97. fprintf('Compensated open-loop ')
  98. GH = tf(numopen, denopen)
  99. fprintf('Compensated closed-loop ')
  100. T = tf(numopen, denclsd)
  101. [magp,phasep]=bode(numopen,denopen,w);
  102. [Gm, Pm, wpc,wgc]=margin(magp,phasep,w);
  103. if Pm>360 Pm=Pm-360; else,end
  104. fprintf('Gain Margin  = %7.3g',Gm),fprintf('    Gain crossover w = %7.3gn',wgc)
  105. fprintf('Phase Margin = %7.3g',Pm),fprintf('   Phase crossover w = %7.3gn',wpc)
  106. fprintf('n')
  107. [M,ph]=bode(numopen, denclsd, w);
  108. frqspec(w,M)
  109. discr2=[
  110. 'Roots of the compensated characteristic equation:       '];
  111. disp(discr2)
  112. r=roots(denclsd);
  113. disp(r)
  114. rreal=real(r);
  115.   for l=1:n-1
  116.   if rreal(l) >=0
  117.   fprintf('   Root on the RHP, system is unstable. Change Phase Margin & repeat.nn')
  118.   else,end
  119.   end