%   Script FKLLeerlauf.M zur Herstellung von Bildern
%
%   Reglerentwurf für die Leerlaufdrehzahl eines Verbrennungsmotors
%
% J. Lunze, A. Mosebach
% für 10. Auflage: 15.4.2014
% für 12. Auflage: 03.07.2019
%
%   
clear
close all
%   Verbrennungsmotor als Regelstrecke
%
% Parameter
Ta=0.4;        % Zeitkonstante des Zylinders
ka=115.2;      % Proportionalitätsfaktor des Zylinders
J=0.07;       % Trägheitsmoment
gamma=0.43;    % Proportionalitätsfaktor der Reibung
%  Messglied
Tm=0.01;
%   Störung
dmax=12;        % Störamplitude
% Komponenten der Regelstrecke
Ga=tf(ka,[Ta 1]);
Gw=tf(1,[J gamma]);
Gm=tf(1,[Tm 1]);
% Regelstrecke
Strecke=Gm*60/2/pi*Gw*Ga;
Gyd=-Gm*60/2/pi*Gw;           % Störverhalten der Strecke

% Forderungen an die offenen Kette
Tr=2.9;
TSigma=Tm+J/gamma;
T=TSigma/Tr;
d=0.5;
ws=1/2/d/T;
w1=4*d*d*ws;
s1=1/Ta;
s2=gamma/J;

% Wunschverhalten
GWunsch=tf([ws],[1/w1 1 0]);

%%       Bodediagramm der Strecke+Wunschverhalten
%
figure(1);
O=logspace(-1, 3, 300);
[BetragMotor, PhaseMotor]=bode(Strecke, O);
[BetragWunsch, PhaseWunsch]=bode(GWunsch, O);
phimin=min(PhaseMotor);
subplot(2, 1, 1);
semilogx(O, 20*log10(BetragMotor(:)), 'b', O, 20*log10(BetragWunsch(:)), 'b--');
hold on
plot(ws, 0, 'bo');
latextext(7, 16,'$$\omega_{\rm s}=\omega_1$$');
%plot(w1, 0, 'bo');
%latextext(w1, 16,'$$\omega_1$$');
plot(s1, 0, 'bx');
latextext(s1, -16,'$$s_1$$');
plot(s2, 0, 'bx');
latextext(s2, -16,'$$s_2$$');
latextitle('Verbrennungsmotor als Regelstrecke');
xleer;
latexylabel('$$|G|$$ in dB');
rotateY;
axis([0.1 1000 -80 70]);
yticks([-50 0 50]);
grid('on');
hold off
%
subplot(2, 1, 2);
semilogx(O, PhaseMotor(:), 'b', O, PhaseWunsch(:),'b--');
latexxlabel('$$\omega$$ in rad/s');
grid('on');
latexylabel('$$\phi$$ in Grad');
rotateY;
axis([0.1 1000 phimin 0]);
xticks([0.1 1 10 100 1000]);
yticks([-360 -270 -180 -90 0]);
grid('on');
hold off


%%     Reglerentwurf
% 
% Reglerparameter
kp=ws*sqrt((ws/w1)^2+1)/(60*ka/(2*pi*gamma));
Regler=tf(kp*[Ta*J/gamma (J/gamma+Ta) 1],[1/w1 1 0]);
%
figure(2);
offeneKette=series(Strecke, Regler);
offeneKette=minreal(offeneKette);
[BetragGo, PhaseGo]=bode(offeneKette, O);
subplot(2, 1, 1);
semilogx(O, 20*log10(BetragGo(:)), 'b', O, 20*log10(BetragWunsch(:)), 'b--');
axis([0.1 1000 -100 40]);
yticks([-100 -50 0]);
latextitle('Offene Kette');
latexylabel('$$|G_0|$$ in dB');
rotateY;
xleer;
grid('on');
%
subplot(2, 1, 2);
semilogx(O, PhaseGo(:), 'b', O, PhaseWunsch(:),'b--');
grid('on');
latexxlabel('$$\omega$$ in rad/s');
latexylabel('$$\phi_0$$ in Grad');
rotateY;
axis([0.1 1000 phimin 0]);
xticks([0.1 1 10 100 1000]);
yticks([-360 -270 -180 -90 0]);




%%  Störverhalten des Regelkreises
%
figure(3)
Regelkreis=feedback(1,offeneKette);
RegelkreisStor=series(Regelkreis, Gyd);
subplot(2,1,1);
[Y, T]=step(RegelkreisStor);
plot(T, dmax*Y, 'b');
latextitle('F\"uhrungs\"ubergangsfunktion des geregelten Motors');
latexxlabel('$$t$$ in s');
latexylabel('$$h_{\rm d}$$ in $$\frac{1}{\rm min}$$');
rotateY;
grid('on');
axis([0 1 -100 20]);
xticks([0 0.5 1]);
yticks([-100 -50 0]);
hold off;

%%
%     Bilder auf .EPS- und .PS-Dateien
%
Epsbildc15('FKLLeerlauf');

