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')
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')
Sam schrieb: > %Phasendetektor > e(k)=carrier_mod(k-1)*y_vco(k-1); 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
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.
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
Hallo Sam, kannst du bitte laden die letzte MATLAB-Code für die PLL Viel Gruß Mayank
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.