clc
clear all
close all

s = tf('s')

%%dati
kd = 0.2
err = 1/1500
Bw = 90
overshoot = 0.2

G = (100*(s+10))/(s*(s+20)*(s+50));
G_zpk = zpk(G)
G_zpk.DisplayFormat = 'Frequency';
G_zpk;

kg = 1;
kh = 1/kd; %kh = 5

kc = (kd^2) / err * kg ; % kc = 60

wc = 60;
Mr = 1.3;

fm = (2.3 - 1.3)/1.25; 
fm_deg = rad2deg(fm)

C = kc/s;

L = C * G * kh;
[m,f] = bode(L,wc);

my_margin = f + 180
m_dB = 20*log10(m)

%Devo guadagnare almeno 86 deg di fase e 20dB, mi servono 2 reti
%ritardatrici

epsilon = 0;

dfm = (fm_deg-my_margin + epsilon)

if dfm > 60
    dfm = floor(dfm/2)
end

%faccio rete ritardatrice, per 60 gradi

alpha = (1 - sind(dfm))/(1 + sind(dfm))
tau = 1/(wc * sqrt(alpha))

Ca1 = (1 + tau*s)/(1 + alpha*tau*s)


L1 = Ca1 * L;
[m,f]=bode(L1,wc)
my_margin = f + 180
m_dB = 20*log10(m)

epsilon = 0;
dfm = fm_deg - my_margin + epsilon

%uso carta normalizzata per anticipatrice
% m = 7, wt = 4
m = 7
wt = 4
tau = wt / wc

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

L2 = Ca2 * L1
%Ca3 = (1+0.05*s)/(1+0.0071*s); %prof ha usato due reti ritardatrici uguali
%L2 = Ca3*Ca3*L


[m,f]=bode(L2,wc)
my_margin = f + 180
m_dB = 20*log10(m)

W = feedback(L2,1);

W_info = stepinfo(W);
W_Bw = bandwidth(W);

fprintf('Banda Passante: %.3f \n',W_Bw);
fprintf('Overshoot: %.3f \n',W_info.Overshoot);


