% Sintesi per tentativi
% Esempio di uso della funzione attenuatrice
% cfr Lanari,Oriolo "Controlli Automatici: Esercizi di Sintesi"
% es. 2.1, p. 53, specifiche a),b),c),d')
% versione 19/4/99
 
close all;clear all;

% processo modificato Fhat(s) ottenuto dal processo P(s)
% con l'aggiunta di un polo nell'origine e opportuno guadagno
% la pulsazione di attraversamento desiderata e' w*_t=7
% il margine di fase desiderato e' m*_fi=40

numFhat=[100];
denFhat=conv([1,0],conv([0.1, 1],[0.01, 1]));

% diagrammi di Bode Fhat(s)

figure(1)
bode(numFhat,denFhat)
pause

% calcolo valori attuali pulsazione di attraversamento e margine di fase 

figure(2)
margin(numFhat,denFhat)
pause

% calcolo modulo e fase di Fhat in corrispondenza alla 
% pulsazione di attraversamento desiderata 

w=7; 
[magw,phasew]=bode(numFhat,denFhat,w);
phasew
magwdB=20*log10(magw)
pause

% per ottenere una attenuazione di circa magwdB=21 dB senza introdurre
% un eccessivo ritardo di fase si sceglie m_i=12
% e w tau_i=60 (con w=w*_t=7) dai diagrammi universali

tau_i=60/7;
m_i=12;
numR=[tau_i/m_i, 1];
denR=[tau_i, 1];

figure(2)
bode(numR,denR)
pause

close all

% verifica soddisfacimento specifiche sui 
% diagrammi di Bode di F(s)=R(s)Fhat(s)=G(s)P(s)

numF=conv(numFhat,numR);
denF=conv(denFhat,denR);

w1=logspace(-2,2,1000);
[magFhat,phaseFhat]=bode(numFhat,denFhat,w1);
[magF,phaseF]=bode(numF,denF,w1);
magFhatdB=20*log10(magFhat);
magFdB=20*log10(magF);
figure(1)
subplot(211)
semilogx(w1,magFhatdB,'y-',w1,magFdB,'c--'),grid
xlabel('Frequency (rad/sec)')
ylabel('Magnitude (dB)')
title('processo compensato (blu) e processo modificato (giallo)')
subplot(212)
semilogx(w1,phaseFhat,'y-',w1,phaseF,'c--',w1,-180*(1+0*w1),'w-'),grid
xlabel('Frequency (rad/sec)')
ylabel('Phase (deg)')
pause

% zoom diagrammi precedenti nella zona di interesse

w2=logspace(0,2,100);
[magFhat,phaseFhat]=bode(numFhat,denFhat,w2);
[magF,phaseF]=bode(numF,denF,w2);
magFhatdB=20*log10(magFhat);
magFdB=20*log10(magF);
figure(1)
subplot(211)
semilogx(w2,magFhatdB,'y-',w2,magFdB,'c--'),grid
xlabel('Frequency (rad/sec)')
ylabel('Magnitude (dB)')
title('processo compensato (blu) e processo modificato (giallo)')
subplot(212)
semilogx(w2,phaseFhat,'y-',w2,phaseF,'c--',w2,-180*(1+0*w2),'w-'),grid
xlabel('Frequency (rad/sec)')
ylabel('Phase (deg)')
pause

% calcolo valori pulsazione di attraversamento e margine di fase 
% dopo la compensazione

figure(2)
margin(numF,denF)
pause
close all

% se le specifiche su margine di fase e pulsazione di attraversamento
% provenivano da specifiche su modulo alla risonanza e banda passante
% ad anello chiuso si possono osservare i diagrammi di Bode
% della funzione di trasferimento ad anello chiuso W(s)=F(s)/1+F(s)...

[numW,denW] = cloop(numF,denF,-1);

w3=logspace(0,2,100);
[magW,phaseW]=bode(numW,denW,w3);
magWdB=20*log10(magW);

figure(1)
semilogx(w3,magWdB,'-',w3,-3+0*w3),grid
xlabel('Frequency (rad/sec)')
ylabel('Magnitude (dB)')
title('anello chiuso')
pause

% ...oppure si puo' usare la carta di Nichols 

figure(2)
deg=-360:0;
ngrid('new')
nichols(numF,denF,w1)
plot(deg,0*deg,'w')
hold off



