7

Click here to load reader

PLL-Drehzahl-Regelung mit Simulink und mit Matlabkero0001/PLLApril06/PLLMotSimu_Matlab… · Prof.Dr. R. Kessler, FH-Karlsruhe, C:\ro\Si05\RT3\PLLApril06\PLLMotSimu_Matlab.doc, S

Embed Size (px)

Citation preview

Page 1: PLL-Drehzahl-Regelung mit Simulink und mit Matlabkero0001/PLLApril06/PLLMotSimu_Matlab… · Prof.Dr. R. Kessler, FH-Karlsruhe, C:\ro\Si05\RT3\PLLApril06\PLLMotSimu_Matlab.doc, S

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)

Page 2: PLL-Drehzahl-Regelung mit Simulink und mit Matlabkero0001/PLLApril06/PLLMotSimu_Matlab… · Prof.Dr. R. Kessler, FH-Karlsruhe, C:\ro\Si05\RT3\PLLApril06\PLLMotSimu_Matlab.doc, S

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.

Page 3: PLL-Drehzahl-Regelung mit Simulink und mit Matlabkero0001/PLLApril06/PLLMotSimu_Matlab… · Prof.Dr. R. Kessler, FH-Karlsruhe, C:\ro\Si05\RT3\PLLApril06\PLLMotSimu_Matlab.doc, S

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!!

Page 4: PLL-Drehzahl-Regelung mit Simulink und mit Matlabkero0001/PLLApril06/PLLMotSimu_Matlab… · Prof.Dr. R. Kessler, FH-Karlsruhe, C:\ro\Si05\RT3\PLLApril06\PLLMotSimu_Matlab.doc, S

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)];

% ********************************************************************

Page 5: PLL-Drehzahl-Regelung mit Simulink und mit Matlabkero0001/PLLApril06/PLLMotSimu_Matlab… · Prof.Dr. R. Kessler, FH-Karlsruhe, C:\ro\Si05\RT3\PLLApril06\PLLMotSimu_Matlab.doc, S

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;

Page 6: PLL-Drehzahl-Regelung mit Simulink und mit Matlabkero0001/PLLApril06/PLLMotSimu_Matlab… · Prof.Dr. R. Kessler, FH-Karlsruhe, C:\ro\Si05\RT3\PLLApril06\PLLMotSimu_Matlab.doc, S

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:

Page 7: PLL-Drehzahl-Regelung mit Simulink und mit Matlabkero0001/PLLApril06/PLLMotSimu_Matlab… · Prof.Dr. R. Kessler, FH-Karlsruhe, C:\ro\Si05\RT3\PLLApril06\PLLMotSimu_Matlab.doc, S

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