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.
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.
Ölçülen şebeke gerilimi, şebeke frekansı (Vgrid ) cinsinden Denklem 1’deki gibi yazılabilir:
Şimdi, VCO'nun şebeke sinüzoidine yakın sinüs dalgaları ürettiğini varsayarsak, VCO çıktısı Denklem 2’deki yazılır:
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.
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:
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ı:
Daha sonra doğrusallaştırma işlemi gerçekleştrilir ve (Wgird-Wpll) bileşenleri çıkartılır.
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.
PLL’in indirgenmiş transfer fonksiyonu aşağıdadır ve Denklem 7- Denklem9 arasında verilmiştir:
Burada LF loop filter, LPF ise low past filter’dir.
Buradan closed loop transfer fonksiyon:
Closed Loop Error (Hata)Transfer Fonksiyonu:
Kapalı çevrim faz transfer fonksiyonunu, genel ikinci dereceden sistem transfer fonksiyonuyla karşılaştırarak incelediğimizde Denklem 11 incelenir:
Lineerleştirilmiş PLL'in doğal frekansı ve sönüm oranı Denklem 12 ve Denklem 13’te:
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.
Ç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.
Z transform uygulanarak Denklem 15 elde edilir.
PI kontrolün laplace transformu:
Genel ikinci derece denklemlerin birim basamak (step response) yanıtı:
Olduğuna göre buradan y(t) şu şekilde ifade edilebilir:
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:
Değişkenleri aşağıdaki gibi kabul edersek:
B0 ve B1 katsayısı Denklem 23’ten bulunabilir:
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.
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.
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.
Yukarıdaki Denklem 26’dan faydalanarak sinüs ve kosinüs Denklem 27 ve Denklem 28’deki gibi yazılabilir :
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.
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.
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.
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.
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.
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.
Aşağıda Fimath ve Numeric type özelliklerini taşıyan array ve değişkenlerin oluşturulduğu görülmektedir.
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.
Daha önce yapılan hesaplamaların MATLAB'e uyarlanmış hali:
Kodları teorik olarak analiz edersek :
Buradan Denklem 32 ve Denklem 33’teki benzetimleri yapabiliriz :
Çentik filtrenin uygulanması:
Çentik filtrenin uygulanması aşamasındaki kodları analiz edersek :
Daha önce yapılan X, Y ve Z benzetiminden:
Buradan denklemi A ve B katsayıları cinsinden yazabiliriz:
MATLAB sonuçları ile teorik sonuçların tutarlılığı:
PI Loop Filter'in Uygulanması:
PI uygulanmasının teorik hesabı şu şekilde açıklanabilir:
Wo ve Error'un oluşturulması:
MATLAB kodları incelendiğinde Wo‘un bulunması blok diyagram ile açıklanmıştır:
Daha sonra aşağıdaki kodlar ile integrasyon yöntemi kullanarak sinüs ve kosinüs üretilmiştir.
Çıkış fazının bulunması:
Son olarak farklı değişken şebeke koşullarında PLL sistemi simüle edilmiştir.
Sonuçlar
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)')