Click here to load reader
Upload
trancong
View
212
Download
0
Embed Size (px)
Citation preview
Prof.Dr. R. Kessler, FH-Karlsruhe, C:\ro\Si05\RT3\PLLApril06\PLLMotSimu_Matlab.doc, S. 1/1
Homepage: http://www.home.hs-karlsruhe.de/~kero0001/
PLL-Drehzahl-Regelung mit Simulink und mit Matlab
Hinweise:
In diesem Text wird die PLL-Drehzahlregelung sowohl mit Simulink als auch (wahlweise) mit „reinem
Matlab“ durchgeführt. Die Simulink-Schaltung ist die „alte“ Datei , die schon früher behandelt wurde
( s. Link http://www.home.fh-karlsruhe.de/~kero0001/PLLNov05/PLLMo30neu.pdf )
Mit der unten eingefügten Matlab-Datei rplmo30M6.m werden zunächst viele Parameter abgefragt, dann
wird die Simulation in Simulink ausgeführt und die Ergebniskurven werden geplottet (Bilder Nr 1, 2, 3..).
Dann werden weitere Parameter für die Simulation mit „reinem Matlab“ abgefragt und die Simulation mit der
Matlab-Datei Plmo30mat15.m ausgeführt und die Ergebniskurven geplottet. (Bilder Nr 21, 22, 23..)
In den Simulink-Subsystemen sind die entsprechenden Programmierzeilen des Matlab-Algorithmus eingefügt
( „In reinem Matlab klingt das so:“ )
Man beachte, dass bei reiner Matlab-Simulation der „Initialisierung“ der Speicherwerte sinnvoll ist, sonst
ergeben sich „riesige“ Rechenzeiten, quadratisch ansteigend mit der Anzahl der Speicherwerte.
Datei plmo30M.mdl
mit variabl-step,ode45,
rel. tol 1e-1
absol. tol 1e-1
PLL-Drehzahl-Regelung mit IC 4046,
Aufruf mit rplmo30M6, wahlweise auch Matlab
Alle outports inf Punkte groß
Dreh-
winkel
uC
uY
1/s
uC
t
iPLL
f1
S1Z1
Zaehler
Z1
S2 Z2
Zaehler
Z2
15
0
Z2
Z1
u/(2*pi) -floor( u/(2*pi) )
Sägezahn SZ
floor(Z)=Ganzzahlteil von Z,
==> 13.7 - floor(13.7) = 0.7
SZ S2
S1Ref-
Freq
1/Ros
R2
Q2
Q1
Product
PLL-
Motor
Memory
1/s
f2
Dreh-
Frequenz f2
0
0
AND
<
4046
1/C
1/(R1+R2)
1/(2*pi)
0
Das ist die Simulink-Datei Plmo30M.mdl. Sie wird aufgerufen durch
Eintippen rPlmo30M6, gefolgt von Taste Return (Eingabetaste)
Prof.Dr. R. Kessler, FH-Karlsruhe, C:\ro\Si05\RT3\PLLApril06\PLLMotSimu_Matlab.doc, S. 2/2
Subsystem PLL-IC 4046
In Tephys klingt das so:
Q1alt=Q1
Q2alt=Q2
Q1= ja(S1) + Q1* nein(S1) - Q1alt * Q2alt
Q2= ja(S2) + Q2* nein(S2) - Q1alt * Q2alt
Wort-Definition der Funktionsweise
des PLL-IC 4046:
Bei Aufflanke von S1 wird Q1 gesetzt
Bei Aufflanke von S2 wird Q2 gesetzt.
Beide werden rückgesetzt, wenn beide high sind
Weitere Info über den Ausgang des IC 4046:
Wennn Q1 high,dann ist Ausgang mit der positiven Betriebsspannung verbunden.
Wennn Q2 high,dann ist Ausgang mit der negativen Betriebsspannung verbunden.
Wenn Q1 und Q2 beide high, dann Ausgang intern hochohmig geschaltet
In reinem Matlab klingt das so: (s.Datei Plmo30Mat15.m )
Q1alt=Q1; Q2alt=Q2; % alte Werte der Flipflops Q1 und Q2
Q1= (S1>0)+ Q1*(S1<=0) - Q1alt*Q2alt ; % Q1 = FlipFlop 1 im PLL-IC 4046, gesetzt von S1
iPLL= (Q1*Q2 <=0)*((Q1>0)*(Ubp-uC)+ (Q2>0)*(Ubn-uC) )/(R1+R2); % Strom des IC
Q2= (S2>0)+ Q2*(S2<=0) - Q1alt*Q2alt; % FlipFlop 2 im IC 4046, gesetzt von S2
2
Q2
1
Q1
Memory
S
R
Q
!Q
S
R
Q
!Q
AND
2
S2
1
S1
In Tephys klingt das so:
u1alt = u1
u1 = ja(sin(2*pi*f*t-1))
S1 = ja(u1-u1alt)
Z1 = ja(S1) * ( Z1+ 1) + Z1 *nein(S1)
t = t+dt
Subsystem Zaehler Z1
Wort-Definition eines Zählers:
Bei Aufflanke des Eingangs wird
Zählerstand um Zahl 1 erhöht.
Wenn keine Aufflanke kommt,
bleibt alter Zählerstand erhalten.
In reinem Matlab klingt das so: (Datei Plmo30Mat15.m)
u1alt=u1; % Alter Wert von u1, für Bildung Nadelimpuls bei Aufflanke u1
u1=(sin(wink) >0); % u1= Rechteckfunktion als Eingang 1 in PLLIC 4046
S1=(u1>u1alt); % Nadelimpulse bei Aufflanke des Soll-Rechtecks us
Z1=(S1>0)*(Z1+1)+Z1*(S1 <=0); % Z1= Zähler für Impulse u1
1
Z1
(u[1] > 0) * (u[2] + 1) + !u[1] * u[2]
1
S1
uY
Subsystem PLL-Motor
In Tephys klingt das so:
uM = begr ( uY, Umax, - Umax)
i = begr( (uM - kg * w ) / R, imax, - imax )
w = w + ( kg * i - rGL * sign(w) - rv * w - rtu * w * abs(w) ) * dt / J
In reinem Matlab klingt das so: (s. Datei Plmo30Mat15.m)
uM=uC+iPLL*R2; % uM= Motorspannung für DC-Motor
if uM>Umax uM=Umax; end; if uM <-Umax uM=-Umax; end; % Begrenzung von uM
i = (uM- kg*w)/R; % i = Motorstrom;
if i > imax i=imax; end; if i < -imax i=-imax; end; % Strombegrenzung
w = w+(kg*i-rGL*sign(w)-rv*w-rtu*w*abs(w))*dtM/J; % w=Winkelgeschwindigkeit
1
w
uM
kg
kg
rGL * sgn (u) + rv * u+ rtu * u * abs (u)
Rreibung: Gleit-, viskos , turbulent
1/s
1/R
1/J
+-imax
+-Umax
1
uY
Anschließend zwei Ergebnisbilder bei gleichen Paramtern:
Bild 1 mit Simulink berechnet, Bild 21 mit reinem Matlab berechnet.
Prof.Dr. R. Kessler, FH-Karlsruhe, C:\ro\Si05\RT3\PLLApril06\PLLMotSimu_Matlab.doc, S. 3/3
0 0.5 1 1.5 2 2.5 3 3.5
-40
-20
0
20
40
60
f1 , f2
2*S1 +13
3.5*SZ +10
2*uM -20
2*uC -40
Z1= 92, Z2= 92, Nspeich=1730
Bild=1, R1=20000, R2=20000, J=2.32e-006, rGL=0, rv=0, rtu=0, W=23, Ros=1e+010
0 0.5 1 1.5 2 2.5 3 3.5
-40
-20
0
20
40
60
f1 , f2
2*S1 +13
3.5*SZ +10
2*uM -20
2*uC -40
Mit Matlab, Z1= 93, Z2= 93, dtM=0.0002, Nspeich=15001
Bild 21, R1=20000, R2=20000, J=2.32e-006, rGL=0, rv=0, rtu=0, W=23, Ros=1e+010
% Datei rplmo30M6.m zusätzlich Simulation mit reinem Matlab Plmo30Mat15;
% Aufruf gemeinsam mit Simulink. April 2006
% Für Matlab wählbar die Initialisierung der Plotwerte (ini=1)
% Grafik nur im aufrufendem Programm
% Datei rplmo30M6.m für Matlab 5.3 R. Kessler Mai 2003, April 2006
% Zum "Run" der PLL-Motor-Drehzahl-Regelung Simulink-Modell PLmo30M.mdl
%
% In "Parameters": Variable step aber Toleranz grob:0.1(relativ u.absolut)
% Hilft das bei rGL = 0.1 ?? ja!
% Die Parameter sind etwa wie bei Tephys-Datei plmo20.txt
% Mehrfach-Lauf mit Tastaturabfrage einiger Parameter
% Hinweis: bei Eingabe "RETURN" bleibt Wert unverändert
format compact; % verhindert unnötigen Zeilenvorschub
clear; % Löscht alle Variablen. So sollte man jedes Programm beginnen!!
Prof.Dr. R. Kessler, FH-Karlsruhe, C:\ro\Si05\RT3\PLLApril06\PLLMotSimu_Matlab.doc, S. 4/4
% Vorschlagswerte für die Parameter:
R=3; kg=0.0241; rGL=0; rv=0; rtu=0; imax= 5; Umax=15;
% Hinweise: rGL < ?, rtu < 2e-7, rv < 0.0001
C=4.6e-6; R1=20000; R2=20000; J=2.32e-6; % d.h. ohne Klotz
Ros=1e10;% Eingangswiderstand Oszi(wenn am Kondensator gemessen wird)
% Hinweis: durch dies Messen entsteht Phasen-Nacheilung!
% Drum OP-Spannungsfolger verwenden!
t1=1.0; t2=2.0;W=23;,tmax=3;
mark=0; %Wenn mark =1 ist,werden die Rechenpunkte im Sägezahn SZ markiert
farbe=0; % wahlweise Kurven farbig
SIMU=1; % mit Simulink simulieren neu am 17.4.06
nr=0; weiter =1;
% Bei nr = 0 die Schaltung des Modells auf Bildschirm darstellen:
if nr == 0 plmo30M; % Simulink-Schaltung auf Bildschirm
input('');
end;
while weiter == 1,
% Abfrage der Tastatur-Eingaben:
Ax=input(['Trägheitsmoment J=',num2str(J),' neuer Wert ?? ']);
if ~isempty(Ax), J=Ax; end;
Ax=input(['R1=',num2str(R1),' neuer Wert ?? ']);
if ~isempty(Ax) , R1=Ax; end;
Ax=input(['R2=',num2str(R2),' neuer Wert ?? ']);
if ~isempty(Ax) , R2=Ax; end;
Ax=input(['Umax=',num2str(Umax),' neuer Wert ?? ']);
if ~isempty(Ax) , Umax=Ax; end;
Ax=input(['viskose Reibung(<0.0001),rv=',num2str(rv),' neuer Wert?? ']);
if ~isempty(Ax) , rv=Ax; end;
Ax=input(['turbulente Reibung(<2e-7),rtu=',num2str(rtu),' neuer Wert??']);
if ~isempty(Ax) , rtu=Ax; end;
Ax=input(['Gleitreibung (< 0.06),rGL=',num2str(rGL),' neuer Wert ?? ']);
if ~isempty(Ax) , rGL=Ax; end;
% Vorsicht: wenn rGL zu groß ist (> 0.05 ?) rechnet er bei
% variabler Schrittweite "ewig", auch Strg C hilft nicht!!
% Abhilfe: in "Simulation-Parameters" die Toleranzen gröber stellen
Ax=input(['Eing.-Widerst.Oszi (bei Messg. uC),Ros=',num2str(Ros),...
' neuer Wert ?? ']);
if ~isempty(Ax) , Ros=Ax; end;
Ax=input(['Sprunghöhe SollFrequenz W=',num2str(W),' neuer Wert ?? ']);
if ~isempty(Ax) , W=Ax; end;
Ax=input(['Sprungzeit t1=',num2str(t1),' neuer Wert ?? ']);
if ~isempty(Ax) , t1=Ax; end;
Ax=input(['Sprungzeit t2=',num2str(t2),' neuer Wert ?? ']);
if ~isempty(Ax) , t2=Ax; end;
Ax=input(['Maximalzeit tmax=',num2str(tmax),' neuer Wert ?? ']);
if ~isempty(Ax) , tmax=Ax; end;
Ax=input(['Rechenpunkte im Sägezahn markieren? (ja=1),z.Zt. mark= ',....
num2str(mark),' neuer Wert ?? ']);
if ~isempty(Ax) , mark=Ax; end;
Ax=input(['farbige Kurven? (ja=1),z.Zt. farbe= ',....
num2str(farbe),' neuer Wert ?? ']);
if ~isempty(Ax) , farbe=Ax; end;
% neu am 17.4.06:
Ax=input(['mit Simulink simulieren?(ja=1) ',num2str(SIMU),', neuer Wert??']);
if ~isempty(Ax) , SIMU=Ax; end;
nr = nr +1;
SBild=['Bild=',num2str(nr)]; SR1=[', R1=',num2str(R1)];
SR2=[', R2=',num2str(R2)]; SJ=[', J=',num2str(J)];
SrGL=[', rGL=',num2str(rGL)]; Srv=[', rv=',num2str(rv)];
Srtu=[', rtu=',num2str(rtu)]; SW=[', W=',num2str(W)];
SRos=[', Ros=',num2str(Ros,4)];
% ********************************************************************
Prof.Dr. R. Kessler, FH-Karlsruhe, C:\ro\Si05\RT3\PLLApril06\PLLMotSimu_Matlab.doc, S. 5/5
if SIMU > 0 % neu am 17.4.06 falls mit Simulink simuliert werden soll:
sim('plmo30M',[0,tmax]); % Simulation ausführen
figure(nr); clf; % ruft Figur nr auf und löscht Inhalt
if farbe ==1,
if mark ==1,% Rechenpunkte im Sägezahn "SZ" markieren ( mit '.' )
plot(t,f1,t,f2, t,2*S1+13,t,3.5*SZ+10,...
t,3.5*SZ+10,'.',t,2*uM-20,t,2*uC-40);
end;
if mark ~= 1, % ~= heißt in Matlab "nicht gleich"
plot(t,f1, t,f2, t,2*S1+13, t,3.5*SZ+10,...
t,2*uM-20, t,2*uC-40);
end;
end; % if farbe ==1
if farbe ~= 1, k='k'; % 'k' = schwarz
if mark ==1,% Rechenpunkte in Sägezahn "SZ" markieren ( mit '.' )
plot(t,f1,k,t,f2,k, t,2*S1+13,k,t,3.5*SZ+10,k,...
t,3.5*SZ+10,'.k',t,2*uM-20,k,t,2*uC-40,k);
end;
if mark ~=1,
plot(t,f1,k,t,f2,k,t,2*S1+13,k,t,3.5*SZ+10,k,...
t,2*uM-20,k, t,2*uC-40,k);
end;
end; % if farbe ~=1
grid on; axis([0,tmax+0.7,-41,70])
% Kurven-Information auf's Bild schreiben:
text(tmax+0.03, W+3, 'f1 , f2'); text(tmax+0.03,+16,'2*S1 +13');
text(tmax+0.03,+11,'3.5*SZ +10'); text(tmax+0.03,-17,'2*uM -20');
text(tmax+0.03,-37,'2*uC -40');
% Zählerstände aufs Bild schreiben:
SZ1=[' Z1= ',num2str(max(Z1))];SZ2=[', Z2= ',num2str(max(Z2))];
sizuM=size(uM); SsizeuM =[', Nspeich=',num2str( sizuM(1)) ];
text(1.1,65 ,([SZ1, SZ2, SsizeuM]) );
%einige Parameterwerte:
title([SBild,SR1,SR2,SJ,SrGL,Srv,Srtu,SW,SRos ]);
end;% if SIMU >0 neu 17.4.06
% *******************************************************************
% Für Matlab-Simulation: ******************************************
MATL=1; if nr==1 dtM=0.0002; ini=1; end;
input(' Anschließend mit "reinem" Matlab');
Ax=input(['mit Matlab simulieren?(ja=1) ',num2str(MATL),', neuer Wert??']);
if ~isempty(Ax) , MATL=Ax; end;
if MATL >0
Ax=input([' dt für Matlab. dtM= ',num2str(dtM),', neuer Wert?? ']);
if ~isempty(Ax) , dtM= Ax, end;
Ax=input(['Plotwerte Initialisieren (ja =1,nein=-1)?(Wichtig weg.
Rechenzeit)zZt: ini= ',num2str(ini),', neuer Wert?? ']);
if ~isempty(Ax) , ini= Ax, end;
Plmo30Mat15; % Simulieren der PLL-Regelung mit reinem Matlab
bild=nr+20;
figure(bild); clf; % ruft Figur bild auf und löscht Inhalt
if farbe ==1,
if mark ==1,% Rechenpunkte im Sägezahn "SZ" markieren ( mit '.' )
plot(tp,f1p,tp,f2p, tp,2*S1p+13,tp,3.5*SZp+10,...
tp,3.5*SZp+10,'.',tp,2*uMp-20,tp,2*uCp-40);
end;
Prof.Dr. R. Kessler, FH-Karlsruhe, C:\ro\Si05\RT3\PLLApril06\PLLMotSimu_Matlab.doc, S. 6/6
if mark ~= 1, % ~= heißt in Matlab "nicht gleich"
plot(tp,f1p, tp,f2p, tp,2*S1p+13, tp,3.5*SZp+10,...
tp,2*uMp-20, tp,2*uCp-40);
end;
end; % if farbe ==1
if farbe ~= 1, k='k'; % 'k' = schwarz
if mark ==1,% Rechenpunkte in Sägezahn "SZ" markieren ( mit '.' )
plot(tp,f1p,k,tp,f2p,k, tp,2*S1p+13,k,tp,3.5*SZp+10,k,...
tp,3.5*SZp+10,'.k', tp,2*uMp-20,k,tp,2*uCp-40,k);
end;
if mark ~=1,
plot(tp,f1p,k,tp,f2p,k,tp,2*S1p+13,k,tp,3.5*SZp+10,k,...
tp,2*uMp-20,k, tp,2*uCp-40,k);
end;
end; % if farbe ~=1
grid on; axis([0,tmax+0.7,-41,70])
% Kurven-Information auf's Bild schreiben:
text(tmax+0.03, W+3, 'f1 , f2'); text(tmax+0.03,+16,'2*S1 +13');
text(tmax+0.03,+11,'3.5*SZ +10'); text(tmax+0.03,-17,'2*uM -20');
text(tmax+0.03,-37,'2*uC -40');
% Zählerstände aufs Bild schreiben:
SZ1=[' Z1= ',num2str(max(Z1))];SZ2=[', Z2= ',num2str(max(Z2))];
% text(0,57 ,([SZ1, SZ2]) );
% text(0,65,([SBild,SR1,SR2,SJ,SrGL,Srv,Srtu,SW,SRos ]));
%einige Parameterwerte
SdtM=[', dtM=',num2str(dtM)]; SBild=['Bild ',num2str(bild)];
sizuMp=max(size(uMp)); SsizeuMp =[', Nspeich=',num2str(sizuMp) ];
text(0.5,65 ,(['Mit Matlab, ',SZ1, SZ2,SdtM, SsizeuMp]) );
title([SBild,SR1,SR2,SJ,SrGL,Srv,Srtu,SW,SRos ]);
end; % if MATL > 0 **************************************************
input(' '); % wartet auf Return
weiter = input('weiter?? (1/0) ');
if isempty(weiter), weiter = 1;end;
end; % von while und Ende der Matlab-Datei rplmo30M6.m
In der anschließenden Matlab-Datei Plmo30mat15.m wird die PLL-Drehzahl-Regelung mit „reinem
Matlab“ ausgeführt. Die Paramter sind die gleichen wie für die Simulink-Simulation. Die Ergebniskurven
werden innerhalb der aufrufenden Matlab-Datei rplmo30M6.m geplottet.
Man beachte insbesondere die “Programmiertricks“ und den Einfluß der Initialisierung auf die
Rechenzeit
% Datei Plmo30mat15.m R. Kessler, April 2006
% Initialisierung der Plotvektoren wählbar,
% Zur Demo der Wichtigkeit der Initialisierung.
% Aufruf mit rplmo30M6, Auch Plotten vom rplmo30M6 aus
% PLL-Drehzahl-Regelung mit "reinem" Matlab, wie Simulink Plmo30.mdl
%
format compact;
N=floor(tmax/dtM),%Plotwerte initialisieren,wichtig,sonst Riesenrechenzeit:
clear tp f1p f2p S1p SZp uMp uCp % alle Speichervariablen löschen
% wichtig: keine Trennzeichen!!
if ini>0 % Initialisierung der Speicherwerte:
Prof.Dr. R. Kessler, FH-Karlsruhe, C:\ro\Si05\RT3\PLLApril06\PLLMotSimu_Matlab.doc, S. 7/7
tp=zeros(N,1); f1p=tp;f2p=tp;S1p=tp; SZp=tp; uMp=tp; uCp=tp;
end;
% Beispiele Rechenzeiten
% dtM Speicherpunkte N Rechenzeiten mit ohne Initialisierung
% 2e-4 15 000 1.7 sec 11.78 sec
% 1e-4 30 000 1.87 49
% 5e-5 60 000 3.64 216
% Erkenntnis: Ohne Initialisierung der Plotwerte steigt die
% Rechenzeit etwa quadratisch mit der Anzahl der Speicherpunkte
Ubp=15; Ubn=0;
%Startwerte:
t=0; u1=0; u2=0; Q1=0;Q2=0; wink=0;win=0;
Z1=0; Z2=0; SZ=0; uC=0; w=0;
k=0;
tic; % Stoppuhr startet
while t < tmax
Q1alt=Q1; Q2alt=Q2; % alte Werte der Flipflops Q1 und Q2
f1=W+W*(t>t1) -W*(t>t2); % f1 = SollFrequenz
wink=wink+2*pi*f1*dtM; % wink = "Winkel" für den Sinus der Sollfrequenz
u1alt=u1; % Alter Wert von u1, für Bildung Nadelimpuls bei Aufflanke u1
u1=(sin(wink) >0); % u1= Rechteckfunktion als Eingang 1 in PLLIC 4046
S1=(u1>u1alt); % Nadelimpulse bei Aufflanke des Soll-Rechtecks us
Z1=(S1>0)*(Z1+1)+Z1*(S1 <=0); % Z1= Zähler für Impulse u1
Q1= (S1>0)+ Q1*(S1<=0)-Q1alt*Q2alt ; % Q1 = FlipFlop im PLL-IC 4046
iPLL= (Q1*Q2 <=0)*((Q1>0)*(Ubp-uC)+ (Q2>0)*(Ubn-uC) )/(R1+R2);%Strom des IC
uC=uC+iPLL*dtM/C; % uC= Spannung am Kondensator
uM=uC+iPLL*R2; % uM= Motorspannung für DC-Motor
if uM>Umax uM=Umax; end; if uM <-Umax uM=-Umax; end; % Begrenzung von uM
i = (uM- kg*w)/R; % i = Motorstrom;
if i > imax i=imax; end; if i < -imax i=-imax; end; % Strombegrenzung
w= w+(kg*i-rGL*sign(w)-rv*w-rtu*w*abs(w))*dtM/J; % w=Winkelgeschwindigkeit
win=win+w*dtM; % win= Drehwinkel des Motors;
f2=w/(2*pi); % Dreh-Frequenz des Motors
SZalt=SZ; % Alter Wert des Sägenzahns SZ
SZ=win/(2*pi)-floor(win/(2*pi)); % SZ=Sägezahn: Abwärts-Sprung
S2= (SZ< SZalt); %Nadelimpulse bei Abwärts-Sprung Sägenzahn,wie Lichtschranke
Q2= (S2>0)+ Q2*(S2<=0)-Q1alt*Q2alt; % FlipFlop 2 im IC 4046,gesetzt von S2
Z2=(S2>0)*(Z2+1)+Z2*(S2 <=0); % Z2= Zähler für Impulse S2
% Plotwerte sammeln;
% plot(tp,f1p, tp,f2p, tp,2*S1p+13, tp,3.5*SZp+10, tp,2*uMp-20, tp,2*uCp-40);
k=k+1; tp(k)=t;
f1p(k)=f1; f2p(k)=f2;
S1p(k)=S1; SZp(k)=SZ;
uMp(k)=uM; uCp(k)=uC;
t=t+dtM;
end; % while t < tmax
toc; % Ausgabe Rechenzeit
% Das Plotten wird im aufrufenden Programm rplmo30M6.m realisiert
% Welche Programmiertricks in diesem MATLAB-FILE? (Plmo30Mat15.m)
% 1. S1=(u1>u1alt); % Nadelimpulse bei Aufflanke des Soll-Rechtecks u1
% Z1=(S1>0)*(Z1+1)+Z1*(S1 <=0); % Z1= Zähler für Impulse S1
% 2. Q1= (S1>0)+ Q1*(S1<=0)-Q1alt*Q2alt ; % Q1 = FlipFlop im PLL-IC 4046
% 3. iPLL=(Q1*Q2<=0)*((Q1>0)*(Ubp-uC)+(Q2>0)*(Ubn-uC))/(R1+R2);%Strom des IC
% 4. SZ=win/(2*pi)-floor(win/(2*pi));
% SZ=Sägezahn, Periode = 1 Drehperiode
% S2= (SZ< SZalt); % Nadelimpulse bei
% Abwärts-Sprung des Sägezahns, wie Lichtschranke