%% Simulation / Modélisation d'un système de photodétection
%   Module : Ingénierie Electronique 
%       pour le Traitement de l'Information
%--------------------------------------------------------------
%   TD_10 : Photodétection - Modélisation
%--------------------------------------------------------------
%   Auteur : Julien VILLEMEJANE
%   Date : 27/08/2020
%--------------------------------------------------------------
clear all;
close all;
affichage_int = 0;
%% Constantes
RT = 1e6;           % resistance de contre-reaction
Cphd = 70e-12;      % capacité de la photodiode
wc = 1/(RT*Cphd);   % pulsation de coupure RT Cphd
fc = wc/(2*pi)

f = logspace(0,9,10001);
w = 2*pi.*f;

%% Ampli Opérationnel / ALI
% Modèle de l'ALI
A0 = 1e5;               % Amplification différentielle A
funitaire = 1e6;        % Bande-passante unitaire
f0 = funitaire/A0       % Fréquence de coupure en boucle ouverte
w0 = 2*pi*f0;

% Modèle premier ordre
num_AOP = [A0];
den_AOP = [1/w0 1];
TF_AOP = tf(num_AOP, den_AOP)
[mag_AOP, phase_AOP, w_AOP] = bode(TF_AOP, w);
mag_AOP = squeeze(mag_AOP); phase_AOP = squeeze(phase_AOP);

% Diagramme de Bode
if affichage_int == 1
    figure;
    subplot(2,1,1); semilogx(f, 20*log10(abs(mag_AOP)));
    grid on; title('Réponse en fréquence de l''ALI'); 
    xlabel('fréquence (Hz)'); ylabel('Gain (dB) / ALI');
    subplot(2,1,2); semilogx(f, phase_AOP);
    grid on; xlabel('fréquence (Hz)'); ylabel('Phase (deg)');
end

%% Contre-réaction avec RT
num_moins = [1];
den_moins = [1/wc 1];
TF_moins = tf(num_moins, den_moins)
[mag_moins, phase_moins, w_moins] = bode(TF_moins, w);
mag_moins = squeeze(mag_moins); phase_moins = squeeze(phase_moins);

% Diagramme de Bode
if affichage_int == 1
    figure;
    subplot(2,1,1); semilogx(f, 20*log10(abs(mag_moins)));
    grid on; title('Réponse en fréquence de la contre reaction'); 
    xlabel('fréquence (Hz)'); ylabel('Gain (dB) / Réaction');
    subplot(2,1,2); semilogx(f, phase_moins);
    grid on; xlabel('fréquence (Hz)'); ylabel('Phase (deg)');
end

%% Action avec iphd
num_plus = [RT];
den_plus = [1/wc 1];
TF_plus = tf(num_plus, den_plus)
[mag_plus, phase_plus, w_plus] = bode(TF_plus, w);
mag_plus = squeeze(mag_plus); phase_plus = squeeze(phase_plus);

% Diagramme de Bode
if affichage_int == 1
    figure;
    subplot(2,1,1); semilogx(f, 20*log10(abs(mag_plus)));
    grid on; title('Réponse en fréquence de l''action'); 
    xlabel('fréquence (Hz)'); ylabel('Gain (dB) / Action');
    subplot(2,1,2); semilogx(f, phase_plus);
    grid on; xlabel('fréquence (Hz)'); ylabel('Phase (deg)');
end

%% Système rebouclé
TF_Vphd = feedback(TF_AOP, TF_moins, -1);
[mag_Vphd, phase_Vphd, w_Vphd] = bode(TF_Vphd, w);
mag_Vphd = squeeze(mag_Vphd); phase_Vphd = squeeze(phase_Vphd);

% Diagramme de Bode
if affichage_int == 1
    figure;
    subplot(2,1,1); semilogx(f, 20*log10(abs(mag_Vphd)));
    grid on; title('Réponse en fréquence du transimpédance'); 
    xlabel('fréquence (Hz)'); ylabel('Gain (dB) / Trans V');
    subplot(2,1,2); semilogx(f, phase_Vphd);
    grid on; xlabel('fréquence (Hz)'); ylabel('Phase (deg)');
end


% Système complet
TF_Iphd = TF_plus*TF_Vphd;
[mag_Iphd, phase_Iphd, w_Iphd] = bode(TF_Iphd, w);
mag_Iphd = squeeze(mag_Iphd); phase_Iphd = squeeze(phase_Iphd);

% Diagramme de Bode
if affichage_int == 1
    figure;
    subplot(2,1,1); semilogx(f, 20*log10(abs(mag_Iphd)));
    grid on; title('Réponse en fréquence du transimpédance'); 
    xlabel('fréquence (Hz)'); ylabel('Gain (dB) / Trans I');
    subplot(2,1,2); semilogx(f, phase_Iphd);
    grid on; xlabel('fréquence (Hz)'); ylabel('Phase (deg)');
end

%% Modèle équivalent simplifié
wc
wu = funitaire*2*pi
wtrans = sqrt(wc*2*pi*funitaire)
Qtrans = sqrt(funitaire/fc)
num_trans = [RT*A0/(1+A0)];
den_trans = [1/(wtrans*wtrans) 1/(wtrans*Qtrans) 1];
TF_trans = tf(num_trans, den_trans)
[mag_trans, phase_trans, w_Iphd] = bode(TF_trans, w);
mag_trans = squeeze(mag_trans); phase_trans = squeeze(phase_trans);

% Diagramme de Bode / Comparaison
figure;
subplot(2,1,1); semilogx(f, 20*log10(abs(mag_trans)), f, 20*log10(abs(mag_Iphd)));
grid on; title('Réponse en fréquence du transimpédance - modele'); 
xlabel('fréquence (Hz)'); ylabel('Gain (dB) / Trans M');
legend('Modele','Transimpedance');
subplot(2,1,2); semilogx(f, phase_trans, f, phase_Iphd);
grid on; xlabel('fréquence (Hz)'); ylabel('Phase (deg)');
