PLL in Matlab simulieren

Gast #3291667
Lesenswert?

Hallo,

ich versuche zur Zeit eine PLL in Matlab (ohne Simulink) zu 
implementieren, doch erhalte ich irgendwie nicht das gewüschte Ergebnis. 
Der Ausgang vom VCO zeigt zwar die richtige Tendenz, aber es ist leider 
kein richtiger Sinus zu sehen. Es wäre echt nett, wenn jemand mal über 
den Code schauen könnte. Der Code ist direkt in Matlab ausführbar.

Danke!

Gruß
Sam

% Signalerzeugung
f1=2000;
T1=1/f1;
N=5000;
fs=N/T1;
T=1/fs;
t=(0:T:2*N*T-T);
signal=sin(2*pi*f1*t);

% Modulierter Träger
fc=40000;
carrier_mod=cos(2*pi*fc*t+10*signal);

% Initalisierung
e=zeros(1,length(t));     %Ausgang Phasendetektor
u=zeros(1,length(t));     %Ausgang Filter
y=zeros(1,length(t));     %Ausgang VCO (nur hase)
y_vco=zeros(1,length(t)); %Ausgang VCO (Signal)

e(1)=0;
u(1)=0;
y(1)=0;
y_vco(1)=0;

% Parameter
T1=180e-6;
T2=1.21e-3;
f_vco=40000;

% Loop
for k=2:length(carrier_mod)

       %Phasendetektor
       e(k)=carrier_mod(k-1)*y_vco(k-1);

       %Schleifenfilter=> F(s)= (1+T1*s)/(1+T2*s)
       u(k)=T/T2*(u(k-1)*(T2/T-t1)+e(k)*(t2+T1/T)-e(k-1)*T1/T);

       %VCO (nur Phase)
       y(k)=y(k-1)+2*pi*1e6*u(k)*T;

       %VCO (Signal)
       y_vco(k)=cos(2*pi*f_vco*T+y(k));

end

figure(99);
subplot(3,1,1);plot(signal);ylabel('Signal');
subplot(3,1,2);plot(carrier_mod);ylabel('Modulierter Träger')
subplot(3,1,3);plot(y_vco);ylabel('VCO Ausgang')
Angehängte Dateien:
Gast #3291741
Lesenswert?

Oh ja, hatte die Variable noch im Workspace, daher bekam ich keine 
Fehlermeldung. t1=t2=1. Hab sie im neuen Code ersetzt.

Danke für den Hinweis

Gruß
Sam



% Signalerzeugung
f1=2000;
T0=1/f1;
N=5000;
fs=N/T0;
T=1/fs;
t=(0:T:2*N*T-T);
signal=sin(2*pi*f1*t);

% Modulierter Träger
fc=40000;
carrier_mod=cos(2*pi*fc*t+10*signal);

% Initalisierung
e=zeros(1,length(t));     %Ausgang Phasendetektor
u=zeros(1,length(t));     %Ausgang Filter
y=zeros(1,length(t));     %Ausgang VCO (nur hase)
y_vco=zeros(1,length(t)); %Ausgang VCO (Signal)

e(1)=0;
u(1)=0;
y(1)=0;
y_vco(1)=0;

% Parameter
T1=180e-6;
T2=1.21e-3;
f_vco=40000;

% Loop
for k=2:length(carrier_mod)

       %Phasendetektor
       e(k)=carrier_mod(k-1)*y_vco(k-1);

       %Schleifenfilter=> F(s)= (1+T1*s)/(1+T2*s)
       u(k)=T/T2*(u(k-1)*(T2/T-1)+e(k)*(1+T1/T)-e(k-1)*T1/T);

       %VCO (nur Phase)
       y(k)=y(k-1)+2*pi*1e6*u(k)*T;

       %VCO (Signal)
       y_vco(k)=cos(2*pi*f_vco*T+y(k));

end

figure(99);
subplot(3,1,1);plot(signal);ylabel('Signal');
subplot(3,1,2);plot(carrier_mod);ylabel('Modulierter Träger')
subplot(3,1,3);plot(y_vco);ylabel('VCO Ausgang')
Gast #3291824
Lesenswert?

klaus schrieb:
> ich hab zwar eigentlich keine Ahnung von PLL, aber hast du diese Zeile
> mal mit e(k)=carrier_mod(k-1)-y_vco(k-1); ersetzt?
>
> dann hast du jedenfalls einen richtigen Sinus

Im Grunde hast du recht, der Regelfehler besteht aus der Differenz von 
Soll- und Istgröße. Bei der PLL sind Soll- bzw. Istgröße die 
Momentanphase der Eingangssignale (carreir_mod bzw. y_vco). Auf diese 
Momentanphase kann ich jedoch ohne Weiteres nicht zugreifen - denn sie 
sind ja im Kosinus der Signale "versteckt". Daher nehme ich den 
multiplzierenden Phasendetektor. Die Multiplikation von 2 
Kosinus-Signalen ergibt einen Sinus mit der Phasendifferenz und einen 
mit der Phasensumme:

cos(x)*cos(y)=0.5*(sin(x-y)+sin(x+y))

sin(x+y) wird im Filter rausgefiltert und wenn x-y klein ist, gilt:

cos(x)*cos(y)=sin(x-y) = x-y (natürlich nur ungefähr, mir fehlt das 
Symbol :)

Und so bekomme ich die Differenz beider Phasen. Ich hoffe, du weißt nun 
warum ich die Multiplikation brauche.
Gast #3292092
Lesenswert?

So, ich bin wieder ein Stück weiter gekommen. Und zwar habe ich hinter 
den Multiplizierer noch mal einen extra Tiefpass gesetzt. Ich bin ja 
davon ausgegangen, dass der Schleifenfilter alles überflüssige 
rausfiltert, doch sah das Ergebnis danach aus, dass da noch immer ein 
paar andere Frequenzanteile drinsteckten. Der extra TP soll da Abhilfe 
schaffen.

Man sieht jetzt gut, wie er einregelt. So sollte es doch aussehen, oder 
was meint ihr?  Es fällt mir aber noch auf, dass der Ausgang immer noch 
konstant 90Grad in der Phase versetzt ist. Ist das normal? Und dass er 
so lange braucht zum einregeln?

Vielen Dank schon mal!

Gruß
Sam
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren