%% Simulation / Asservissement d'un système
%   Module : Ingénierie Electronique 
%       pour le Traitement de l'Information
%--------------------------------------------------------------
%   TD_11 : Asservissement / Deuxième ordre
%--------------------------------------------------------------
%   Auteur : Julien VILLEMEJANE
%   Date : 12/12/2020
%--------------------------------------------------------------
clear all;
close all;
f = logspace(0,6,1001);
w = 2*pi.*f;
t = linspace(0,2e-2,1001);

%% Boucle de retour
K = 1;
B0 = K;     % gain

%% Système du second ordre
G0 = 1;
m = [0.2 0.4 0.7 1.5 2];
w0 = 2e3;

%% Correcteur 
G = 2;
tau_PI = 1e-4;

%% Système en boucle ouverte
num_m = max(size(m));
TF_2 = tf(zeros(1,1,num_m));
num_2 = [G0];
for i = 1:num_m
    den_2 = [1/(w0*w0) 2*m(i)/w0 1];
    TF_2(:,:,i) = tf(num_2, den_2);
end
% Affichage des N réponses indicielles
str_titre = 'Systeme_Ordre 2__Boucle_Ouverte';
figure('Name', str_titre, 'NumberTitle','off');
subplot(3,1,1);
for i = 1:num_m
    [y, t] = step(TF_2(:,:,i), t);
    str(i) = 'm = '+string(m(i));
    plot(t, y);
    legend(str);
    hold on;
end
xlabel('Temps(s)');
ylabel('Signal');
title('Reponse indicielle');
grid on;
subplot(3,1,2);
for i = 1:num_m
    [mag, phase, wout] = bode(TF_2(:,:,i), w);
    semilogx(w, 20*log10(squeeze(mag)));
    hold on;
end
xlabel('Fréquence (Hz)');
ylabel('Gain (dB)');
title('Diagramme de Bode - Gain');
grid on;
subplot(3,1,3);
for i = 1:num_m
    [mag, phase, wout] = bode(TF_2(:,:,i), w);
    semilogx(w, squeeze(phase));
    hold on;
end
xlabel('Fréquence (Hz)');
ylabel('Phase (deg)');
title('Diagramme de Bode - Phase');
grid on;

%% Système en boucle fermée sans correction avec K = 1
TF_BF_2 = tf(zeros(1,1,num_m));
for i = 1:num_m
    den_2 = [1/(w0*w0) 2*m(i)/w0 1];
    TF_BF_2(:,:,i) = K*feedback(TF_2(:,:,i), B0);
end
% Affichage des N réponses indicielles
str_titre = 'Systeme_Ordre 2__Boucle_Fermee';
figure('Name', str_titre, 'NumberTitle','off');
subplot(3,1,1);
for i = 1:num_m
    [y, t] = step(TF_BF_2(:,:,i), t);
    str_BF(i) = 'm = '+string(m(i));
    plot(t, y);
    legend(str_BF);
    hold on;
end
xlabel('Temps(s)');
ylabel('Signal');
title('Reponse indicielle');
grid on;
subplot(3,1,2);
for i = 1:num_m
    [mag, phase, wout] = bode(TF_BF_2(:,:,i), w);
    semilogx(w, 20*log10(squeeze(mag)));
    hold on;
end
xlabel('Fréquence (Hz)');
ylabel('Gain (dB)');
title('Diagramme de Bode - Gain');
grid on;
subplot(3,1,3);
for i = 1:num_m
    [mag, phase, wout] = bode(TF_BF_2(:,:,i), w);
    semilogx(w, squeeze(phase));
    hold on;
end
xlabel('Fréquence (Hz)');
ylabel('Phase (deg)');
title('Diagramme de Bode - Phase');
grid on;
%% Système corrigé avec Gain
CorP = tf([G],[1]);
TF_BF_2_C0 = tf(zeros(1,1,num_m));
for i = 1:num_m
    TF_BF_2_C0(:,:,i) = K*feedback(CorP*TF_2(:,:,i), B0);
end
% Affichage des N réponses indicielles
str_titre = 'Systeme_Ordre 2__Boucle_Fermee_Corrigee_P';
figure('Name', str_titre, 'NumberTitle','off');
subplot(3,1,1);
for i = 1:num_m
    [y, t] = step(TF_BF_2_C0(:,:,i), t);
    str_BFC0(i) = 'm = '+string(m(i));
    plot(t, y);
    legend(str_BFC0);
    hold on;
end
xlabel('Temps(s)');
ylabel('Signal');
title('Reponse indicielle');
grid on;
subplot(3,1,2);
for i = 1:num_m
    [mag, phase, wout] = bode(TF_BF_2_C0(:,:,i), w);
    semilogx(w, 20*log10(squeeze(mag)));
    hold on;
end
xlabel('Fréquence (Hz)');
ylabel('Gain (dB)');
title('Diagramme de Bode - Gain');
grid on;
subplot(3,1,3);
for i = 1:num_m
    [mag, phase, wout] = bode(TF_BF_2_C0(:,:,i), w);
    semilogx(w, squeeze(phase));
    hold on;
end
xlabel('Fréquence (Hz)');
ylabel('Phase (deg)');
title('Diagramme de Bode - Phase');
grid on;

%% Système corrigé avec PI
CorI = tf([1],[tau_PI 0]);
TF_BF_2_C1 = tf(zeros(1,1,num_m));
for i = 1:num_m
    TF_BF_2_C1(:,:,i) = K*feedback((CorP+CorI)*TF_2(:,:,i), B0);
end
% Affichage des N réponses indicielles
str_titre = 'Systeme_Ordre 2__Boucle_Fermee_Corrigee_PI';
figure('Name', str_titre, 'NumberTitle','off');
subplot(3,1,1);
for i = 1:num_m
    [y, t] = step(TF_BF_2_C1(:,:,i), t);
    str_BFC1(i) = 'm = '+string(m(i));
    plot(t, y);
    legend(str_BFC1);
    hold on;
end
xlabel('Temps(s)');
ylabel('Signal');
title('Reponse indicielle');
grid on;
subplot(3,1,2);
for i = 1:num_m
    [mag, phase, wout] = bode(TF_BF_2_C1(:,:,i), w);
    semilogx(w, 20*log10(squeeze(mag)));
    hold on;
end
xlabel('Fréquence (Hz)');
ylabel('Gain (dB)');
title('Diagramme de Bode - Gain');
grid on;
subplot(3,1,3);
for i = 1:num_m
    [mag, phase, wout] = bode(TF_BF_2_C1(:,:,i), w);
    semilogx(w, squeeze(phase));
    hold on;
end
xlabel('Fréquence (Hz)');
ylabel('Phase (deg)');
title('Diagramme de Bode - Phase');
grid on;

%% Pour un m
for i = 1:num_m
    str_m(i) = 'Systeme_Ordre_2__m_'+string(m(i));
    figure('Name',str_m(i));
    [yF, tF] = step(TF_BF_2(:,:,i), t);
    [y0, tF] = step(TF_BF_2_C0(:,:,i), t);
    [y1, tF] = step(TF_BF_2_C1(:,:,i), t);
    subplot(3,1,1);
    plot(t, yF, t, y0, t, y1);
    xlabel('Temps (s)'); ylabel('Signal'); grid on;
    [magF, phaseF, wout] = bode(TF_BF_2(:,:,i), w);
    [mag0, phase0, wout] = bode(TF_BF_2_C0(:,:,i), w);
    [mag1, phase1, wout] = bode(TF_BF_2_C1(:,:,i), w);
    subplot(3,1,2);
    semilogx(w, 20*log10(squeeze(magF)), w, 20*log10(squeeze(mag0)), w, 20*log10(squeeze(mag1)));
    xlabel('Fréquence (Hz)'); ylabel('Gain (dB)'); grid on;
    legend('Fermée','Cor P','Cor PI');
    subplot(3,1,3);
    semilogx(w, squeeze(phaseF), w, squeeze(phase0), w, squeeze(phase1));
    ylabel('Phase (deg)'); grid on;
end
