top of page

STM32 ile DENEYSEL ANEMOMETRE

Sinyallerinizin doğru senkronizasyonu için, MATLAB PLL...

MATLAB ile PLL Tasarımı

PLL Nedir ?

PLL, bir sinyalin frekansını ve fazını ölçerek ve istenen bir referans frekansına veya fazına kilitleyerek bir sinyal üretir. PLL, birçok endüstriyel uygulamada kullanılmaktadır ve özellikle yenilenebilir enerji kaynaklarından gelen enerjinin dönüştürülmesinde yaygın olarak kullanılmaktadır.

Elektrik şebekesine güç veren (fotovoltaik) PV inverterler gibi güç cihazlarının işletimi için şebekenin faz açısı kritik bir bilgidir. PLL yani faz kilitlemeli çevrim, harici bir periyodik sinyalin frekans ve fazını korumak için voltaj kontrollü osilatörü denetleyen geri beslemeli, kapalı döngü bir sistemdir. Özetle PLL, çıkış fazı ile referans fazı arasındaki faz hatasını minumumda tutmaya çalışır.

Elektrik şebekesi ile etkileşim halindeki ekipmanlar; gerilim dengesizlikleri, hat dalgalanmaları, faz kaybı ve frekans değişimleri gibi yaygın koşullara maruz kalabilirler. Bu koşullarda PLL’in bu hataları reddedebilmesi ve şebeke gerilimi ile temiz bir faz kilidini kavrayabilmesi gerekir.

phase-difference.gif

PLL Tasarımı

PLL şekildeki gibi genel hatlarıyla;  faz dedektörü (PD), alçak geçiren filtre (LPF) ve voltaj kontrollü osilatör (VCO) içerir. Faz dedektörü, giriş sinyali ile VCO sinyalinin fazını karşılaştırıp çıkışında bu iki sinyal arasındaki faz farkıyla orantılı bir DC gerilim oluşturur. Voltaj kontrollü osilatör, osilasyon frekansını bir gerilim girişiyle kontrol etmek için tasarlanmış bir osilatördür. Alçak geçiren filtre, seçilen bir kesme frekansından daha düşük frekanslı sinyalleri iletirken daha yüksek frekansa sahip sinyalleri zayıflatan bir filtredir.

Resim1.png

Ölçülen şebeke gerilimi, şebeke frekansı (Vgrid ) cinsinden Denklem 1’deki gibi yazılabilir:

Ekran Alıntısı.PNG

Şimdi, VCO'nun şebeke sinüzoidine yakın sinüs dalgaları ürettiğini varsayarsak, VCO çıktısı Denklem 2’deki yazılır:

Ekran Alıntısı2.PNG

Blok diyagramı biraz indirgersek aşağıdaki blok diyagram elde edilir. Blok diyagramın ilk kısmında geri beslemeden dolayı bir fark işlemi görülmekte fakat bunun yerine  ve  çarpılarak şebekenin iki katı frekans bileşenleri görmezden gelinir ve çıkan sonuç doğrusallaştırılır.

Resim2.png

Faz tespit bloğunun amacı, giriş sinüsü ile VCO'dan kilitlenmiş olan sinüsü karşılaştırmak ve açı hatasına bağlı bir hata sinyali üretmektir. Bunun için, faz tespit bloğu VCO çıkışı ve ölçülen giriş değerini çarparak Denklem 3’ü gerçekleştirir:

Ekran Alıntısı3.PNG

Denklem 3'ten açıkça görüleceği gibi, PD bloğunun çıkışı kilitleme hatasının bilgisini taşır. Ancak PD'den elde edilen kilitleme hatası bilgisi doğrusal değildir ve iki katı şebeke frekansında değişen bir bileşen içerir. PLL açısını kilitlemek için bu kilitleme hatası bilgisinin kullanılabilmesi için, iki katı şebeke frekansı bileşeni çıkarılmalıdır.

Şimdilik, şebeke frekansının iki katı bileşeni göz ardı edilerek, Kd bloğu ile çarpıldıktan sonra kilit hatası:
 

Ekran Alıntısı4.PNG

Daha sonra doğrusallaştırma işlemi gerçekleştrilir ve (Wgird-Wpll)  bileşenleri çıkartılır.

Ekran Alıntısı5.PNG

Bu hata, kilitlenme hatasını sıfıra indirmek için kullanılan bir PI kontrolcü olan döngü filtresine girdi olarak verilir. Küçük sinyal analizi ağ teorisi kullanılarak yapılır, geri besleme döngüsü açılıp açık döngü transfer denklemi elde edilir ve daha sonra kapalı döngü aktarım fonksiyonu bulunur.

Ekran Alıntısı6.PNG

PLL’in indirgenmiş transfer fonksiyonu aşağıdadır  ve Denklem 7- Denklem9 arasında verilmiştir:

Ekran Alıntısı7.PNG
Ekran Alıntısı8.PNG

Burada LF loop filter, LPF ise low past filter’dir.

Ekran Alıntısı9.PNG

Buradan closed loop transfer fonksiyon:

Ekran Alıntısı11.PNG

Closed Loop Error (Hata)Transfer Fonksiyonu:

Ekran Alıntısı12.PNG

Kapalı çevrim faz transfer fonksiyonunu, genel ikinci dereceden sistem transfer fonksiyonuyla karşılaştırarak incelediğimizde Denklem 11 incelenir:

Ekran Alıntısı.13PNG.PNG

Lineerleştirilmiş PLL'in doğal frekansı ve sönüm oranı Denklem 12 ve Denklem 13’te:

Ekran Alıntısı14.PNG

PLL (Phased Locked Loop) içerisinde, PI (Proportional-Integral) kontrolcüsünün iki amaçlı hizmet sunduğu dikkate alınmalıdır:

• Yüksek frekansı filtrelemek için taşıyıcı ve şebeke frekansının iki katı olan bileşenleri filtrelemek.

• Şebekenin olası frekans ve faz değişimlerine uygun tepki vermek.

Loop filter, alçak geçirgen bir filtre özelliği taşır ve bu özelliği sayesinde önceden görmezden gelinen yüksek frekans bileşenleri de filtrelenir. Kilitlenen sinyalin taşıyıcı frekansı yüksekse, PI'nin low pass karakteristiği, taşıyıcı frekans bileşeninin iki katını süzmek için yeterlidir. Ancak, şebeke bağlantılı uygulamalar için şebeke frekansının çok düşük olması nedeniyle (50Hz-60Hz), PI tarafından sağlanan low pass karakteristiği yeterince tatmin edici değildir ve loop filter çıkışına yüksek frekanslı bir eleman eklenir. Bu durum PLL'nin performansını etkileyebilir.

Yani PI kontrolün  low pass karakteristiği, şebeke çıkışındaki şebeke frekansının iki katı bileşenini ortadan kaldırmak için yeterli değildir. Bu nedenle, PD bloğunu doğrusallaştırmak için bir çentik filtre (notch filter) kullanılır.

Böylece başta yapılan şebeke çıkışındaki iki katlı frekans bileşenlerinin gözden gelinmesi şartı, çentik filtre yardımıyla çözülür.

Resim15.png

Çentik Filtrenin Eklenmesi ile Oluşan PLL Blok Diyagramı

Çentik filtresinin (notch filter) eklenmesiyle, PLL'nin dinamik tepkisine dayalı olarak LPF ile PI ayarı yapılabilir.

Loop filtresi veya PI, Denklem 14 ile dijital bir kontrolör olarak uygulanır.

Ekran Alıntısı16.PNG

Z transform uygulanarak Denklem 15 elde edilir.

Ekran Alıntısı17.PNG

PI kontrolün laplace  transformu:

Ekran Alıntısı18.PNG
Ekran Alıntısı19.PNG

Genel ikinci derece denklemlerin birim basamak (step response) yanıtı:

Ekran Alıntısı20.PNG

Olduğuna göre buradan y(t) şu şekilde ifade edilebilir:

Ekran Alıntısı21.PNG

Kararlılık zamanı (settling time), tepkinin bir hata bandı (error band) arasında yerleşmesi için gereken zaman olarak verilir. Diyelim ki bu hata ∂ ise, o zaman:

Ekran Alıntısı22.PNG

Değişkenleri aşağıdaki gibi kabul edersek:

Ekran Alıntısı23.PNG

B0 ve B1 katsayısı Denklem 23’ten bulunabilir:

Ekran Alıntısı26.PNG

PLL'nin 50 Khz çalışma hızı için, B0 = 223.4194 ve B1 = -220.901’dir.

PLL'de kullanılan çentik filtresi, Şekil 24'de gösterildiği gibi, şebeke frekans bileşeninin iki katını bastırmak için gereklidir. Şebeke frekansı stabil olsa da, bazı varyasyonlar gösterebilir ve yenilenebilir enerji içeriği arttıkça daha büyük varyasyonlar mümkündür. Bu nedenle, kesin bir şekilde iki kat şebeke frekansını belirlemek için uyumlu bir çentik filtresi kullanılır. Tipik bir çentik filtresi denklemi, 's' alanında Denklem 24’te gösterilir.

Ekran Alıntısı27.PNG

Denklem 25’e göre çentik filtresinin katsayıları, ölçülen şebeke frekansına dayalı olarak katsayıları tahmin eden arka plan bir rutin çağrılarak uyarlanabilir. Örneğin şebeke frekansının  50 Hz ve 60 Hz olduğu bir çentik filtre sisteminde, sönümleme katsayıları  ve  alınırsa;şebeke frekanslarının iki katı frekans bileşenlerinin geçirilmediği Şekil 25’teki Bode diyagramından incelenebilir. Buradaki sönümleme katsayıları şebeke frekansına göre güncellenir.

Ekran Alıntısı30.PNG

Sin ve Cos Üretimi

PLL, tipik bir mikrodenetleyicide büyük sayıda döngü tüketebilen sinüs ve kosinüs hesaplamaları kullanır. Bu sorunu önlemek için, bu modülde sinüs ve kosinüs değeri, entegrasyon prensibi uygulanarak üretilir.

Ekran Alıntısı31.PNG

Yukarıdaki Denklem 26’dan faydalanarak sinüs ve kosinüs Denklem 27 ve Denklem 28’deki gibi yazılabilir :

Ekran Alıntısı32.PNG

MATLAB ile PLL Tasarımı

PLL için oluşturulan formüller ve kontrol bloklarından yola çıkarak MATLAB ile yazılımsal bir PLL oluşturuldu.

m1.PNG

Yukarıda görüldüğü üzere MATLAB’de fixed point işlemler yapılırken Fimath yöntemi kullanuldı. Numeric type belirtilelek 21 bit ondalık, 10 bit tam sayı ve 1 bit de işaret biti olarak ayrıltıldı. Böylece 32 bitlik bir register’da yazıyormuşuz gibi işlemlerimizi yapmaya başladık. Aritmetik işlemlerde taşma olması durumda uyarı nesneleri oluşturduk.

m2.PNG

Görüldüğü üzere PLL için şebeke frekansı 50 Hz ve örnekleme frekansı 50 kHz olacak şekilde ayarlandı. Daha sonra sırayla şebekede meydana gelebilecek değişken koşullar aşağıda simüle edilmiştir.

MATLAB’de oluşturduğumuz bir sinüs sinyalinin tam simülasyon zamanının yarısında fazın 90 derece kaydırılmasını sağladık. Aşağıda orijinal sinyal ile fazı kaymış sinyal görülmektedir.

m4.PNG
t1.PNG

Harmonikler, bir temel frekansın (fundamental frequency) katları olan harmonik frekansların bileşiminden oluşan dalga formlarıdır. Örneğin, bir sinüsoidal dalga formu, sadece temel frekansının harmoniklerinin toplamıyla oluşabilir. İlk harmonik, temel frekansın kendisiyken, ikinci harmonik iki katı, üçüncü harmonik üç katı ve böyle devam eder.

 MATLAB kodunda, temel frekansı GridFreq olarak tanımlanmış olan bir sinüs sinyali oluşturulmuştur. Ayrıca Şekil 32’de görüleceği üzere, bu temel frekansın beş katı olan ikinci bir frekans bileşeni de (5*GridFreq) sinüs sinyaline eklenmiştir. Bu, 2. harmonik frekans bileşenini oluşturur.

İkinci for döngüsünde ise sadece temel frekansın harmonikleri oluşturulmuştur. Yani sadece birinci harmonik frekans bileşeni (GridFreq) kullanılarak sinüs sinyali oluşturulmuştur.

t2.PNG
t3.PNG

MATLAB’de oluşturduğumuz bir sinüs sinyalinin tam simülasyon zamanının yarısında frekansın 50 Hz’den 55 Hz’e çıkardık. Aşağıda orijinal sinyal ile frekansı kaymış sinyal görülmektedir.

t4.PNG
t5.PNG

MATLAB’de oluşturduğumuz bir sinüs sinyalinin tam simülasyon zamanının yarısında genliğinin tepe değerini 1’den 0.8’e düşürdük. Aşağıda orijinal sinyal ile genliği değişmiş sinyal görülmektedir.

t6.PNG
t7.PNG

Aşağıda Fimath ve Numeric type özelliklerini taşıyan array ve değişkenlerin oluşturulduğu görülmektedir.

t8.PNG

Daha sonra çentik filtre tasarımına geçilmiştir. MATLAB’deki çentik filtre tasarımından öncesi ve sonrasını gösteren özet bir blok diyagram Aşağıda verilmiştir.

t9.PNG

Daha önce yapılan hesaplamaların MATLAB'e uyarlanmış hali:

t10.PNG

Kodları teorik olarak analiz edersek :

t11.PNG

Buradan Denklem 32 ve Denklem 33’teki benzetimleri yapabiliriz :

t12.PNG

Çentik filtrenin uygulanması:

t13.PNG

Çentik filtrenin uygulanması aşamasındaki kodları analiz edersek :

t14.PNG

Daha önce yapılan X, Y ve  Z benzetiminden:

t15.PNG

Buradan denklemi A ve B katsayıları cinsinden yazabiliriz:

t16.PNG

MATLAB sonuçları ile teorik sonuçların tutarlılığı:

t18.PNG

PI Loop Filter'in Uygulanması:

t19.PNG
t20.PNG

PI uygulanmasının teorik hesabı şu şekilde açıklanabilir:

T22.PNG

Wo ve Error'un oluşturulması:

t23.PNG

MATLAB kodları incelendiğinde Wo‘un bulunması blok diyagram ile açıklanmıştır:

t24.PNG
t25.PNG

Daha sonra aşağıdaki kodlar ile integrasyon yöntemi kullanarak sinüs ve kosinüs üretilmiştir.

t26.PNG

Çıkış fazının bulunması:

t27.PNG
t28.PNG

Son olarak farklı değişken şebeke koşullarında PLL sistemi simüle edilmiştir.

t29.PNG

Sonuçlar

t30.PNG
t33.PNG
t32.PNG
t31.PNG

Kodlar

clc; clear all; close all; % Select numeric type, Q21 T= numerictype('WordLength',32,'FractionLength',21); % 32 bit bir reg tanimliyoruz, 21 bit fraction(ondalik), 1 bit isaret biti % 10 bit de tamsayi %demek ki sinirlar 2^10 = 1024 % matematiksel ozellikler icin (aslinda bir register) fimath nesnesi % olusturalim F=fimath('RoundMode','floor','OverflowMode','wrap'); F.ProductMode = 'SpecifyPrecision'; F.ProductWordLength = 32; F.ProductFractionLength = 21; F.SumMode = 'SpecifyPrecision'; F.SumWordLength = 32; F.SumFractionLength = 21; % tasma ve yetersizlik durumlari icin uyari fpref nesnesi olusturalim P=fipref; P.LoggingMode='on'; P.NumericTypeDisplay='none'; P.FimathDisplay='none'; %%%%%%%%%%%%% %%%%%%%%%%%%%%%% %%%%%%%%%%%%% pll modelleme burada basliyor%%%%%%%%%%%%%%%% %%%%%%%%%%%%% %%%%%%%%%%%%%%%% Fs = 50000; %sampling freq 50KHz GridFreq = 50; % nominal grid freq 50Hz Tfinal =0.2; % time the simulation is run for 0.5 sec Ts=1/Fs; % Samp ling time = 1 /Fs -> 1/50KHz = 0.00002 sec t = 0:Ts:Tfinal % 0:00002:0.2 -> 1001 wn =2*pi*GridFreq; % radyan cinsinden nominal sebeke freq %%%%%%%%%%%% Degisken Kosullarin Olsuturulmasi%%%%%%%%%%%%%%%%%%%%%%%%%%% % input sinyali ve input sinyalinin fi nesnesini olusturalim % simulasyonun orta noktasinda olusturulan sin siyalinin fazini 90 derece % kaydiralim %%%% CASE 1: phase jump at the mid point L=length(t); for n=1:floor(L) u(n)=sin(2*pi*GridFreq*Ts*n); end for n=1:floor(L) u1(n)=sin(2*pi*GridFreq*Ts*n); end for n=floor(L/2):L u(n)=sin(2*pi*GridFreq*Ts*n+pi/2); end %%%% CASE 2 : Harmonikler L=length(t); for n=1:floor(L) u(n)=0.9*sin(2*pi*GridFreq*Ts*n)+0.1*sin(2*pi*5*GridFreq*Ts*n); end for n=1:floor(L) u1(n)=sin(2*pi*GridFreq*Ts*n); end subplot(2,1,2) plot(t,u) title('temel frekansın 5 katı sin eklenen sinyal ') subplot(2,1,1) plot(t,u1) title('olusturulan sinyal veya giris sinyali') %%%% CASE 3: Frequency Shift L = length(t); for n=1:floor(L) u(n)=sin(2*pi*GridFreq*Ts*n); end for n=1:floor(L) u1(n)=sin(2*pi*GridFreq*Ts*n); end for n=floor(L/2):L u(n)=sin(2*pi*GridFreq*1.1*Ts*n); end subplot(2,1,2) plot(t,u) title('0.1 aninda 55 Hz olan giris sinyali') subplot(2,1,1) plot(t,u1) title('giris sinyali 50Hz') %%%% CASE 4: Amplitude Variations L=length(t); for n=1:floor(L) u(n)=sin(2*pi*GridFreq*Ts*n); end for n=1:floor(L) u1(n)=sin(2*pi*GridFreq*Ts*n); end for n=floor(L/2):L u(n)=0.8*sin(2*pi*GridFreq*Ts*n); end subplot(2,1,2) plot(t,u) title('0.1 aninda genligi 0.8 olan giris sinyali') subplot(2,1,1) plot(t,u1) title('giris sinyali') %%%%%%%%%%%% su anda case 1 acik %%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% PLL%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % u ve u1 'e tamnımlanan numerictype ve fimath ozelliklerini atiyor u = fi(u,T,F); u1 = fi(u1,T,F); % PLL islemi icin tanimlanan Arrayler Upd = fi([0,0,0],T,F); ynotch = fi([0,0,0],T,F); ynotch_buff = fi([0,0,0],T,F); ylf = fi([0,0],T,F); SinGen = fi([0,0],T,F); Plot_Var = fi([0,0],T,F); Mysin = fi([0,0],T,F); Mycos = fi([fi(1.0,T,F),fi(1.0,T,F)],T,F); theta = fi([0,0],T,F); werror = fi([0,0],T,F); % notch filter (centik filtresi) c1 = 0.1; c2 = 0.00001; X = 2*c2*wn*2*Ts Y = 2*c1*wn*2*Ts Z = wn*2*wn*2*Ts*Ts B_notch = [1 (X-2) (-X+Z+1)] A_notch = [1 (Y-2) (-Y+Z+1)] B_notch = fi(B_notch,T,F) A_notch = fi(A_notch ,T,F) % PLL'in simule edilmesi for n=2:Tfinal/Ts % simulasyon zamaninda PLL isleminin yineleme sayisi %faz dedektoru Upd(1) = u(n) * Mycos(2); % notch filter ynotch(1) = -A_notch(2)*ynotch(2)-A_notch(3)*ynotch(3)+B_notch(1)*Upd(1)+B_notch(2)*Upd(2)+B_notch(3)*Upd(3); %update the upd array for future sample Upd(3) = Upd(2); Upd(2) = Upd(1); %% PI Loop Filter %% % ts =30 ms , sonumleme orani = 0.7 % dogal frekans = 110, Kp = 166.6 ve Ki = 27755.55 ylf(1) = fi(1.0,T,F)*ylf(2)+fi(166.877556,T,F)*ynotch(1)+fi(-166.322444,T,F)*ynotch(2); ynotch(3)= ynotch(2); ynotch(2) = ynotch(1); ynotch_buff(n+1) = ynotch(1); ylf(1) = min([ylf(1) fi(200.0,T,F)]); %saturation ylf(2)=ylf(1); wo = fi(wn,T,F)+ylf(1); werror(n+1) = (wo-wn)*fi(0.00318309886,T,F); %integration process Mysin(1) = Mysin(2)+wo*fi(Ts,T,F)*(Mycos(2)); Mycos(1) = Mycos(2)-wo*fi(Ts,T,F)*(Mysin(2)); %limit the oscillator integrators Mysin(1) = max([Mysin(1) fi(-1.0,T,F)]); Mysin(1) = min([Mysin(1) fi(1.0,T,F)]); Mycos(1) = max([Mycos(1) fi(-1.0,T,F)]); Mycos(1) = min([Mycos(1) fi(1.0,T,F)]); Mysin(2) = Mysin(1); Mycos(2) = Mycos(1);

% cikis fazini guncelle

 theta(1)=theta(2)+wo*Ts;

 % output phase reset condition

 if(Mysin(1)>0 && Mysin(2) <=0)

     theta(1)=-fi(pi,T,F);

 end

 SinGen(n+1)=Mycos(1);

 Plot_Var(n+1)=Mysin(1);

 end

% CASE 1 : Phase jump at the Mid Point %error = Plot_Var-u; % CASE 2 : Harmonikler %error = Plot_Var-u1; % CASE 3 : Frekans kaymalari %error = Plot_Var-u; % CASE 4 : Amplitude Variations error = Plot_Var-u1; figure; subplot(3,1,1),plot(t,Plot_Var,'r',t,u,'b'),title('SPLL(red) & Ideal Grid(blue)') subplot(3,1,2),plot(t,error,'r'),title('Error') subplot(3,1,3),plot(t,u1,'r',t,Plot_Var,'b'),title('SPLL Out(blue) & Ideal Grid(red)')

bottom of page