%esercitaz2
clc
clear
s = tf('s');

err = 0.4;
Tr = 0.7
Mr = 2.8 %dB

G = (2.5)/((s+1)*(s+5));
G_zpk = zpk(G)
G_zpk.DisplayFormat = 'Frequency';
G_zpk

kg = dcgain(G);

kd = 8;
kh = 1/kd

%calcolo c

kc = (kd^2)/(err*kg) %in questo caso, sistema di tipo 1 , ho uno zero nel controllore
C = kc/s;

Bw = 3 / Tr

wc = 3 %rad/sec
Mr_lin = 10^(Mr/20);

fm = (2.3-Mr_lin)/1.25
fm_deg = rad2deg(fm)

%voglio margine fase maggiore di 42 deg, alla pulsaz di attrav si 3 rad/sec
%per avere banda passante maggiore di 4.3

L = C * kh * G
%bode(L)
[m,f] = bode(L,wc)
m_db = 20*log10(m)

my_margin = f + 180

%modulo risulta di 5 dB, fase -192. margine fase -12. devo arrivare a
%42...
%devo aumentare la fase almeno di 54, e abbassare modulo di 5.

%%Prova con carta normalizzata
%provo con m = 14, wt = 4 per guadagnare 60 gradi
m = 14
tau = 4 / wc

Ca = (1 + tau * s)/(1 + (tau/m) * s )
L1 = Ca * L;

[m,f] = bode(L1,wc)
m_db = 20*log10(m)

my_margin = f + 180

%%ora voglio perdere 17dB, uso ancora le carte normalizzate
m = 7
wt = 100 %voglio perdere poca fase
tau = wt / wc

Cr = (1+ (tau/m) * s)/ (1 + tau * s)

L2 = Cr * L1
[m,f]=bode(L2,wc)
m_db = 20*log10(m)

my_margin = f + 180

%nichols(L2)

W = feedback(L2,1);
bode(W);

banda = bandwidth(W)

Mr = getPeakGain(W); %in scala lineare
Mr_dB = 20*log10(Mr)

rise_time = stepinfo(W,'RiseTimeLimits',[0 1]);

C1 = Cr * Ca * C; 

fprintf('Funzione di trasferimento del Controllore: \n');
C1
fprintf('Tempo di salita: %.3f secondi \n',rise_time.RiseTime);
fprintf('Picco di risonanza: %.3f dB\n',Mr);





% 
% %specifiche ad anello anello sono rispettate, controllo ad anello chiuso
% 
% %nichols(L2)
% W = feedback(L2,1);
% %bode(W)
% 
% my_Mr =getPeakGain(W);
% my_MrdB = 20*log10(my_Mr)
% rise_time = stepinfo(W,'RiseTimeLimits',[0 1]);
% rise_time.RiseTime
% 
% %rispetta tempo di salita (0.625sec) e picco di risonanza (2.45dB)
