%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Uebung 3 - Regelungstechnik
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% Aufgabe 3.2:
% Parameterfiles fuer das Simulink Modell des elektrischen Systems.
close all;
clear all;
clc;

% Widerstandsverhaeltnis R4
K = 3;

% Kapazitaet
C1 = 1e-6;
C2 = 1e-6;

% Aufgabe 3.2.1
% -------------
% Ergaenzen Sie an dieser Stelle die Widerstaende.
% Widerstaende
R1 = 0.625e3;
R2 = 0.3486796226e4;

% Anfangswerte der Zustaende
x0 = [0,0];

%% Eingangsspannung und Stoerspannung
% Sprungfoermige Eingangsspannung
t_ein = 0;      % Einschaltzeitpunkt
U_ein = 10;     % Sprunghoehe    

% Sinusfoermige Eingangsspannung
U_sinus = 10;   % Amplitude des Sinus    
f_ein = 100;    % Frequenz des Sinus    

% Sprungfoermige Stoerspannung
t_s = 10;    % Einschaltzeitpunkt   
U_s = 2;     % Sprunghoehe 

%% Modell des Systems

% Aufgabe 3.2.1
% -------------
% Ergaenzen Sie die Systemmatrix A (Asys), die Eingangsvektoren bu (busys)
% und bd (bdsys) sowie den Ausgangsvektor c (csys) und den Durchgriff d (dsys)!

Asys = [-(R2 + R1) / C1 / R1 / R2 -(K * R1 + K * R2 - R1) / C1 / R1 / R2; 0.1e1 / C2 / R2 (K - 2) / C2 / R2;];
busys = [0.1e1 / C1 / R1; 0;];
bdsys = [0; 0.1e1 / C2 / R2;];
csys = [0 K;];
dsys = [0 0;];

bsys=[busys bdsys]
%% Uebertragungsfunktion G (Eingang u, Ausgang y)

% Aufgabe 3.2.2 - Simulink
% -------------
% Bestimmen Sie das System (Sys) in Zustandsdarstellung mittels ss() und
% die Uebertragungsfunktion (Gsys) mittels tf()!
Sys = ss(Asys,busys,csys,dsys(1))
Gsys = tf(Sys)

% Uebertragungsfunktion Gd (Störung d, Ausgang y)
Sysd = ss(Asys,bdsys,csys,dsys(2))
Gdsys = tf(Sysd)


%% Aufgabe 3.2.3 - Simulationsergebnisse
% Da es sich wie bereits gesagt, um einen Tiefpassfilter 2. Ordnung
% handelt, wird die Amplitude immer kleiner, je groesser die Frequenz wird.
% Allerdings wird die Stoerung nach ein bisschen Ueberschwingen direkt am
% Ausgang uebernommen.
% Da die Stoerung nur Gleichspannung ist, wird diese nicht gefiltert und
% die Stoerspannung wirkt sich am Ausgang gegenueber einem Hochfrequenten
% Eingang ueberproportional aus.

%% Aufgabe 3.3
% Eine Uebertragungsfunktion des Typs 
% T_{ry}(s)=1/(1+2*xi(s*T)+(s*T)^2) kann immer 
% exakt hergeleitet werden. (lt. 5.11 im Skriptum)

%Entwursvorgaben:
einf = 0;       %bleibende Regelabweichung: e_{inf}=0
ueb = 5;        %Ueberschwingen: ue<=5%
tr = 3*10^(-3); %Anstiegszeit: 3ms

wc = 1.5/tr             %Durchtrittsfreq: Beziehung lt. Skriptum 5.2
                        %Durchtrittsfreq. ist die Freq, an der
                        %Betragskennl. die 0-dB-Linie schneidet.
phi = degtorad(70-ueb)  %Phasenreserve: Beziehung lt. Skriptum 5.3
                        %Um BIBO-Stabilitaet zu erreichen, muss diese Pos.
                        %sein.
s = tf('s');

%gesucht ist ein R in der Form R = VI(1+s*TI)/s:
% (mit LI=RI(s)*Gsys(s))

%Einzelnen Steps, des Frequenzkennl. verf. siehe Kapitel 5.1 im Skriptum
%Step 1: zuerst Integrator hinzufuegen: (der offene Kreis muss mindestens 
%eine einfache Polstelle bei s = 0 haben, damit die bleibende 
%Regelabweichung zufolge eines Eingangssprunges r(t)=sigma(t) Null ist.)
R1 = 1/s;
L1 = R1*Gsys;

%Step 2.1: adjustpahse berechnen: (gewuenschter Phasenoffset)
%Es sollte folgende Beziehung gelten: phi = arg(L(Iwc))+pi
%Um nun den Offset zu dieser Beziehung bestimmen zu koennen, muss folgendes
%gelten: --> -pi-arg(L(Iwc))+phi = offset zu dieser Beziehung
adjustphase = degtorad(-180) - angle(evalfr(L1, j*wc)) + phi

%Step 2.2: TI berechnen, um die Phase zu korrigieren. 
%aus (arctan(wc*TI)=adjustpahse). (Skr. 5.16) 
TI=tan(adjustphase)/wc
R2=(1+s*TI)/s;
L2 = R2*Gsys;

%Step 3: Verstaerkungsfaktor V berechnen 
%(Phase bleibt nach diesem Schritt gleich)
%Bei wc soll 0dB-Linie geschnitten werden.
V = 1/abs(evalfr(L2, j*wc))
R3=V*(1+s*TI)/s
L3 = R3*Gsys; %offener Kreis

%Step 4: geschlossenen Kreis gemaess L(s)/(1+L(s)) Skr 5.1
%Fuehrungsuebertragungsfunktion:
%Try = minreal(L3/(1+L3)) %minreal: Kuerzen von Pol- und Nullstellen
Try = feedback(L3,1)     %Alternative zu L3/(1+L3)
%Stoerungsuebertragungsfunktion:
Tdy = Gdsys/(1+L3)

figure
step(Try);
grid on
hold on
step(Tdy);
legend('Try - Fuehrungsuebertragungsfunktion', 'Tdy - Stoeruebertragungsfunktion')
title('Sprungantwort')

figure
bode(Gsys)
grid on
hold on
bode(L1)
bode(L2)
bode(L3)
bode(Try)
bode(Tdy)
plot(wc,0,'*')
title('Regelkreis: Schritt für Schritt')
legend('Gsys', 'offen L1', 'offen L2', 'offen L3', 'geschlossen Try', 'geschlossen Tdy','wc')
%Im Bode-Diagramm ist die Pahsenreserve phi bei L3 mit 65Grad ueber 180Grad
%gut sichtbar.
%Ausserdem sieht man, dass die Betragskennlinie von L3 bei wc um mind.
%20dB/dek. abfaellt.
%% Stabilitaetsbetrachtung:
%Wenn die folgenden Bedingungen (Satz 4.6 (Nyquist-Kriterium)) erfuellt
%sind (und die Phasenreserve phi pos. ist, das wurde bereits richtig 
%gewaehlt):
%Ausgehend von folgender Gleichung: 
% L(s) = V/s^rho*zL(s)/nL(s)*exp(-s*Tt)  mit xl(0)=zl(0)=1

%Bed. 1: Verstaerkungsfaktor V und Totzeit Tt sind pos: \
%       Tt = 0, erfuellt!(Tt ist die Verschiebung des Eingangs)
%       -> V = 369, erfuellt!
V

%Bed. 2: grad(nL(s)) + rho > grad(zL(s)): 
%       -> 2+1 > 2, erfuellt!
L3
[num,den]=tfdata(L3)
den = cell2mat(den)
num = cell2mat(num)
syms s
gradn = length(coeffs(poly2sym(num,s)))
gradd = length(coeffs(poly2sym(den,s)))

%Bed. 3: Das Polynom nL(s) ist ein Hurwitzpolynom und für rho gilt:
%   rho ist Elem. {0, 1, 2}
%Hurwitz: Ein reelles Polynom, dessen Nullstellen einen echt neg. Realteil
%besitzen.
%       -> rho=1, roots sind neg, erfuellt!
hurwitz=poly2sym(den(1:end-1),s)
hurroots=roots(den(1:end-1))

%Bed. 4: die Betragskennlinie von L(Iw) weist genau einen Schnittpunkt mit
%der 0-dB-Linie (eine Durchtrittsfrequenz wC ) auf
%       -> erfuellt!
figure
bodemag(L3)
hold on
grid on
plot(wc,0,'*')

%Bed. 5: im Bereich |L(Iw)| >= 0 gilt: -540° < arg(L(Iw)) < 180°
%(d. h. die Ortskurve des offenen Kreises L(s) kann vor ihrem Eintauchen 
%in den Einheitskreis den Nullpunkt höchstens einmal vollständig umkreisen)
%       -> erfuellt!
figure
bode(L3)
grid on

%Da alle Bedingungen erfuellt sind, ist der Regelkreis stabil!