%% Simulation / Modélisation de systèmes linéaires
%   Module : Ingénierie Electronique 
%       pour le traitement de l'Information
%--------------------------------------------------------------
%   TD_09 : AOP en boucle ouverte - fermée
%--------------------------------------------------------------
%   Auteur : Julien VILLEMEJANE
%   Date : 11/12/2020
%--------------------------------------------------------------
clear all;
close all;
%% Fonction de transfert d'un AOP
%   Fonction de transfert d'un filtre passe-bas du premier ordre 
%       --> H(jw) = A / (1 + jw/wc)
A = 1e5;            % Amplification différentielle A
funitaire = 1e6;    % Bande-passante unitaire
fc = funitaire/A;   % Fréquence de coupure en boucle ouverte
wc = 2*pi*fc;

f = logspace(-1,7,101);    % vecteur des pulsations entre 10^-1 et 10^7
tf_num = A;
tf_den = 1 + 1*j * (2*pi*f)/wc;

% Fonction de transfert
H_AOP_BO = tf_num ./ tf_den;

% Diagramme de Bode
figure(1);
subplot(2,1,1);
semilogx(f, 20*log10(abs(H_AOP_BO)));
grid on;
xlabel('fréquence (Hz)');
ylabel('Gain (dB)');
legend('AOP boucle ouverte');
subplot(2,1,2);
semilogx(f, angle(H_AOP_BO));
grid on;
xlabel('fréquence (Hz)');
ylabel('Phase (rd)');

%% Fonction de transfert d'un AOP en boucle fermée (Gain de retour = 0dB)
%   Type suiveur
H_RETOUR = 1;
H_AOP_BF = H_AOP_BO ./ (1 + H_AOP_BO.*H_RETOUR);

% Diagramme de Bode
figure(2);
subplot(2,1,1);
semilogx(f, 20*log10(abs(H_AOP_BO)),f, 20*log10(abs(H_AOP_BF)));
grid on;
xlabel('pulsation (rd/s)');
ylabel('Gain (dB)');
legend('AOP boucle ouverte','AOP boucle fermée');
subplot(2,1,2);
semilogx(f, angle(H_AOP_BO),f, angle(H_AOP_BF));
grid on;
xlabel('pulsation (rd/s)');
ylabel('Phase (rd)');

%% Fonction de transfert d'un AOP en boucle fermée (Gain de retour = 20dB)
%   Type inverseur
R2 = 9*1e3;
R1 = 1e3;
H_RETOUR_2 = R1/(R1+R2);
H_ALPHA = -R2/(R1+R2);
H_AOP_BF_2 = H_ALPHA .* H_AOP_BO ./ (1 + H_AOP_BO.*H_RETOUR_2);

% Diagramme de Bode
figure(3);
subplot(2,1,1);
semilogx(f, 20*log10(abs(H_AOP_BO)),f, 20*log10(abs(H_AOP_BF)),f, 20*log10(abs(H_AOP_BF_2)));
grid on;
xlabel('pulsation (rd/s)');
ylabel('Gain (dB)');
legend('AOP boucle ouverte','AOP suiveur','AOP inverseur');
subplot(2,1,2);
semilogx(f, angle(H_AOP_BO),f, angle(H_AOP_BF),f, angle(H_AOP_BF_2));
grid on;
xlabel('pulsation (rd/s)');
ylabel('Phase (rd)');

%% Fonction de transfert d'un AOP en boucle fermée (Gain de retour = 20dB)
%   Type non-inverseur
R2 = 9*1e3;
R1 = 1e3;
H_RETOUR_2 = R1/(R1+R2);
H_AOP_BF_2 = H_AOP_BO ./ (1 + H_AOP_BO.*H_RETOUR_2);

% Diagramme de Bode
figure(4);
subplot(2,1,1);
semilogx(f, 20*log10(abs(H_AOP_BO)),f, 20*log10(abs(H_AOP_BF)),f, 20*log10(abs(H_AOP_BF_2)));
grid on;
xlabel('pulsation (rd/s)');
ylabel('Gain (dB)');
legend('AOP boucle ouverte','AOP suiveur','AOP non-inverseur');
subplot(2,1,2);
semilogx(f, angle(H_AOP_BO),f, angle(H_AOP_BF),f, angle(H_AOP_BF_2));
grid on;
xlabel('pulsation (rd/s)');
ylabel('Phase (rd)');