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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.