%   Script KONVOI.M
%
%   Entwurf des Konvoireglers für eine Fahrzeugkette
%
% J. Lunze
% 12.2.1999
% für 3. Auflage: 2.4.2001
% für 4. Auflage: 19.9.2003
% für 5. Auflage: 18.4.2005
% für 6. Auflage: 4.12.2006
% für 7. Auflage: 28.4.2008
% für 8. Auflage: 3.1.2010
% für 9. Auflage: 16.2.2012
% für 10. Auflage: 27.1.2014
% für 12. Auflage: 23.03.2020
%
%   
clear
close all
%
%   Maßeinheiten
%
% Zeit in Sekunden
% Abstand in Metern
% Geschwindigkeit in m/s
% Kraft in Newton
%
% Modellgrößen
%
% Störgröße       v1 = Geschwindigkeit des vorausfahrenden Fahrzeugs
% Stellgröße       u = Motorkraft
% Zustandsgrößen  x1 = Geschwindigkeit v2
%                 x2 = Abstand d zum vorausfahrenden Fahrzeug
% Ausgangsgröße    y = Abstand zum vorausfahrenden Fahrzeug
A=[-0.04  0
   -1     0];
b=[0.001
    0 ];
c=[0 1];
d=0;
Auto=ss(A, b, c, d);


%%    Bodediagramm der Regelstrecke
%
%   
figure(1)
W=logspace(-3, 1, 1000);
[Betrag, Phase]=bode(Auto, W);
%
subplot(2,1,1)
semilogx(W, 20*log10(Betrag(:)),'b');
latextitle('Regelstrecke der Abstandsregelung');
hold on
Wapprox=[0.001, 0.9, 10];
[Betragappr, Phaseappr]=bode(Auto, Wapprox);
B1=20*log10(Betragappr(1));
Bknick=B1-20*log10(Wapprox(1,2)/Wapprox(1,1));
B2=Bknick-40*log10(Wapprox(1,3)/Wapprox(1,2));
semilogx(Wapprox,[B1,Bknick,B2],'b--');
semilogx(Wapprox,[B1+20,Bknick+20,B2+20],'b--');
latexylabel('$$|G|$$ in dB');
rotateY;
axis([0.001 10 -100 50]);
yticks([-100 -50 0 50]);
xleer;
grid('on');
hold off
%
subplot(2,1,2);
semilogx(W, Phase(:)-180,'b');
latexylabel('$$\phi$$ in Grad');
rotateY;
xticks([0.001 0.01 0.1 1 10]);
yticks([-360 -270 -180 -90 0]);
latexxlabel('$$\omega$$ in rad/s');
xticks([0.001 0.01 0.1 1 10]);
axis([0.001 10 -200 0]);
grid('on');


%%  Offene Kette mit differenzierendem Korrekturglied
%
figure(2)
%z=0.001;      % Vorzeichenumkehr, wird bei Wahl der
              % Reglerparameter berücksichtigt
zr=[25 1];
nr=[1/0.9 1];
Regler=tf(zr, nr);
offeneKette=series(Regler, -Auto);
offeneKette2=minreal(offeneKette, 0.01);
[Betrag, Phase]=bode(offeneKette2, W);
%
subplot(2,1,1);
semilogx(W, 20*log10(Betrag(:)), 'b--');
xleer;
latexylabel('$$|G_0|$$ in dB');
rotateY;
grid on;
axis([0.001, 10, -100, 50]);
yticks([-100 -50 0 50]);
hold on
%
subplot(2,1,2);
semilogx(W, Phase(:),'b');
latexxlabel('$$\omega$$ in rad/s');
xticks([0.001 0.01 0.1 1 10]);
latexylabel('$$\phi_0$$ in Grad');
rotateY;
grid on;
axis([0.001 10 -200 0]);
xticks([0.001 0.01 0.1 1 10]);
yticks([-360 -270 -180 -90 0]);
%
%         Verstärkungserhöhung
kP=10;
[Betrag, Phase]=bode(kP*offeneKette2, W);
subplot(2,1,1);
semilogx(W, 20*log10(Betrag(:)),'b');
hold off


%%   Führungsverhalten des Abstandsregelkreises
%
figure(3)
subplot(6,1,[1,2])
Regelkreis=feedback(kP*offeneKette2, 1);
[Y, T]=step(Regelkreis);
plot(T, Y, 'b', [-1 0 0],[0 0 Y(1,1)],'b', [-1 0 0 14],[0 0 1 1],'k:');
axis([-1 14 -0.3 1.1]);
yticks([0 1]);
latexylabel('$$h_{\rm w}$$ in m');
rotateY;
xleer;
latextitle('F\"uhrungs\"ubergangsfunktion der Konvoiregelung');
%
subplot(6,1,[3,4])
RegelkreisStellgr=feedback(kP*Regler, -Auto);
[U, T]=step(RegelkreisStellgr);
plot(T, U, 'b', [-1 0 0],[0 0 U(1,1)],'b');
axis([-1 14 -50 250]);
xticks([0 5 10 15]);
yticks([0 200]);
latexylabel('$$u$$ in N');
rotateY;
latexxlabel('$$t$$ in s');
 

%%  Betrachtung der Entwurfsaufgabe im PN-Bild
%
figure(4)
subplot(4,4,[1 2 5 6]);
rlocprintblue(-Auto);
latextitle('Abstandsregelung mit P-Regler');
axis([-0.3 0.3 -0.3 0.3]);
xticks([-0.2 0.2]);
yticks([-0.2 0.2]);
%
subplot(4,4,[3 4 7 8]);
rlocprintblue(offeneKette2);
ylabel('');
latextitle('... mit Korrekturglied');
axis([-1 1 -1 1]);
xticks([-1 1]);
yticks([-1 1]);
[r, k]=rlocus(offeneKette2, [kP]);
plot(real(r(1)), imag(r(1)), 'bs');
plot(real(r(2)), imag(r(2)), 'bs');
hold off

%% Herstellung von .ps und .eps-Bildern
%
Epsbildc15('konvoi');
