Space Vector Modulation(SVM) Konusu

Başlatan Mucit23, 16 Mart 2018, 11:48:28

Mucit23

Selamlar

Daha Önce BLDC sürücü çalışmalarımda Trapez sürüş tekniği ile motoru çalıştırmıştım. Şimdi Bir sonraki aşama Space Vector Modulasyonu işine girmek istiyorum. Eğer ileride FOC konularında çalışma yaparsam bu konuda onun bir parçası niteliğinde olacak.

Komutasyonu yine hall effect sensörlerle yapıyorum. Hal çıkışılarım 001 011 010 110 100 101 şeklinde sürekli değişiyor.

Bu şekilde bir vektöre düzlemden bahsediliyor.


Anladığım kadarıyla her konum için ayrı bir vektör hesaplanıyor. Rotora ait Vektör Statoru belirli bir alfa açısıyla takip ediyor. Motorun hızını ise Vektörün genliği yani Vref Belirliyor.

Anlamadığım nokta ise şudur. Benim Hall effect sensörlerime göre doğrudan bir tablo oluşturup bu tabloya göremi PWM değerlerini hesaplayacağım. Yukarıdaki Vektörel Eksen ile PWM üretme işini bağdaştıramadım.

Temel düzeyde anlatabilecek olan var mı?

devrecii

#1
Ben de tam olarak bilmiyorum ama tahminimi yazayım. En azından bi fikir olur
 

Daha öncesinden v1 ile v2 arasında mı ?  v5 ile v6 arasında mı ?
hangi arada oldğunu bulmalısın bu basit, hall sensör durumuna göre
hall sensör değiştiği an  açı 0 derece.

Hall sensör tekrar değiştiği an ise açıya  90 dersek geçiş süresi ise
dönüş hızımızı verir (sayılara takılmayalım 90 yada 10 anlaşılsın diye).

Hall sensör değiştiği an  açı 0 derece hız baz alınarak topluyorsn. 


derece += (90/hız) .....


Bu lineer

vsonuç(u,v,w) =(((90-derece)* v1(u,v,w)) + ((derece)*v2(u,v,w)))/90;



Bu circular iyisi

vsonuç(u,v,w) =(cos(derece)* v1(u,v,w)) + (sin(derece)*v2(u,v,w));


sonucu pwm ye gönderebilirz.

RaMu

Bu konuları anlatan güzel videolar buldum,
bende onları izliyorum, bir ara konu açıp bu videolardan bahsetmeyi düşünüyordum.


Texas Ins ın eğitim seminerimi ne.
Bu videonun 1. dakikasından itibaren anlaıyor space vector olayını:
https://www.youtube.com/watch?v=VI7pdKrchM0&feature=youtu.be
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Zoroaster

#3
Alıntı yapılan: Mucit23 - 16 Mart 2018, 11:48:28
.....Anlamadığım nokta ise şudur. Benim Hall effect sensörlerime göre doğrudan bir tablo oluşturup bu tabloya göremi PWM değerlerini hesaplayacağım. Yukarıdaki Vektörel Eksen ile PWM üretme işini bağdaştıramadım.

Temel düzeyde anlatabilecek olan var mı?

SPWM de 60 dereceye yerlestirilmis sensorler degil encoder kullanacaksin. Cunku sin sinyalleri encoderdan gelen aci bilgisinden uretilecek.

Sin sinyallerin genligi, torku ve hizi belirleyecek.

60 derecelik dilimler gene encoderdan gelen bilgiyle olusturulacak.

Eger encoder kullanmayip 60 dereceye yerlestirilmis 3 sensorle bu isi yapmaya kalkarsan grafikte verdigin sadece v1,v2,,,v6 vektorlerini olusturabilirsin ki bu da trapezoidal surusun cok otesine gecmez.

V1 ve V2 vektorleri arasindaki aciyi supurebilmek icin cok daha detayli aci bilgisine ihtiyacin olacak. Bu da encoder ile mumkun.

SPWM olayinda her bir segmentte  oyle bir UV, UW, VW pwm gerilimleri ureteceksin ki bu voltajlar aralasindaki fark sana sin(Teta), Sin(Teta+120) ve Sin(Teta+240) voltajlarini verecek.

http://www.cncdesigner.com/wordpress/?p=6675
http://www.cncdesigner.com/wordpress/?p=6925

Seytan deliginden kacti.

Mucit23

Abi Elimde birkaç çeşit ESC var onların çıkışını motor bağlı iken inceledim. Trapez Sürüş Tekniği yok Gerilimin Harmonikli bir sinüs olduğunu gördüm. Düşünüce ESC Sensörsüz komutasyon yapıyor. Enkoder vs birşey yok. Çıkış gerilimini nasıl bu kadar sinüse benzetmiş olabilir? 

Burada da bir arkadaş hall Sensör ile yapmış.
https://www.youtube.com/watch?v=nHKQ4dAHFxg

Şimdilik Elimde enkoder yok ama satın alacağım. Enkoder Gelene kadarda SVM nin alt yapısını oturtup hall sensörlerle çalıştırmam gerekiyor. SVM Alt yapısını oturtturduktan sonra Enkoder bağlayıp FOC konusuna bakacağım.

Zoroaster

Sinus voltaj vermek sorun degil. Önemli olan açısal hızın sabit kalacak mi?

Yoksa sinüssel voltajı 0..60 aralığında ver sensörden komutasyon bilgisi gelirse sektör atla. Bu mantıkla kurulmus duzenekte sinyale bakarsan harmonikli bir sinüs görürsün. Fakat amac bu degil.

Bu arada SPWM de voltaj hiç bir zaman saf sinüs olmaz. Çünkü pwm voltajlar arasındaki farklar sinüs üretecek. Dolayısı ile scopla faz voltajlarına baktığında acaip bozuk bir gerilim şekli görürsün. Fakat scopu faz faz arasına takarsan o zaman temiz sinyal görürsün.

Önemli olan sinus teta da teta acısı 0'dan 60'a geldiğinde tam o anda sensor sektor atla diyebilecekmi? Bu önemli. Bu da ancak encoder ile ile olur kullanılacak teta doğrudan mil açısından okunur. 60 dereceye gelindiğinde tam o anda 60 derece sensörün de sinyal verir.

FOC ile Step motor döndürürken encoder falan kullanmıyorum. Çünkü biliyorum ki step motor sargısına uygulanan voltajla adım atar. Eğer motoru aşırı yüklemezsem düzgün sinüse karşılık düzgün mil dönüşü elde ederim.
Fakat brushless motorda olay bu kadar basit değil. Yük ile rotor açısı kayar ve bu kaymayla eş zamanlı sin sinyallerini de kaydırmalısın.

Eğer motor yüksüz ise hiç sensör kullanma ve düşük frekansda FOC ile döndür.
Seytan deliginden kacti.

Mucit23

Anladım abi birkaç deneme yapacağım artık. Şimdi senin yazını okuyordum. Birşey aklıma takıldı.
Böyle bir Tablo oluşturduk diyelim.


Burada uygulanması gereken işaretin -V/3 veya -2V/3 olduğu durumlarda Sadece Low Side Moslara PWM uygulanacak anladığım kadarıyla Bu doğrumudur? Üst kanalı kapatıyoruz. Peki Sinyalin V/3 veya 2V/3 olduğu durumlarda aynı kola ait High Side ve Low Side Moslara Birbirinni Tersi PWM uygulamamın bir sakıncası varmı? Timerim Önlem almazsam eğer bu şekilde çalışıyor çünkü

Vektörün Modülü ile PWM arasındaki ilişki ise doğrudan şu şekilde sanırım.  PWM %100 açık iken Motora V uygulanıyorsa %33 açık iken V/3 olur diyeceğim. 2V/3 için %66. Peki Motorun dönüş hızını hangi parametre ayarlıyor.

Genel bir PWM değeri olması lazım ama bu vektörlerin modülleri ile nasıl bağdaştıracam onu anlayamadım

Zoroaster

#7
Amacımız SVPWM ile 3 fazlı gerilim üretmek olsaydı hiç sorun yoktu. Encoderdan tespit edilmesini istediğim açıyı sanki encoderdan okumuşuz gibi matematiksel olarak 0,1,2,3...60 diye artırıp 60 derece ulaştığımızda sektör atlatmamız yeterli olurdu. Gene aynı şekilde 60,61,62,....120 yapıp diğer sektöre sıçrardık ve 3 fazlı gerilimler üretilmiş olurdu. Üretilen gerilimin frekansı açıyı belirlemede kullandığımız gecikme parametresine bağlı olurdu. Fakat işin içine motor girince açıyı bu şekilde artırıp milin de bu açıyı takip etmesini bekleyemeyiz. (Step motor istisna) Dolayısı ile verdiğin videodaki aktör motor milini eliyle gelişigüzel değerde frenlemeye kalksaydı o motor saçmalardı. (60 derecelik bölge içinde açısal hız sabit kalmazdı)

SVPWM 6 çıkışımız var ve merkeze göre simetrik pwm tekniği kullanılıyor. Her bir kolun H ve L çıkışı birbirinin inverti.

Sinus sinyalleri doğrudan pwm registerlerine yazmıyoruz. Arada bir hesap daha var. Mesela, bir segmentte 3 PWM den sadece ikisi ile oynuyoruz. Diğer segmentte bir başka ikili ile. Oynamadığımız üçüncü PWM ise diğer 2 pwm den hesaplanıyor.

T pwm peryodu, T1 ve T2, 1. ve 2. pwm on süreleri ise T3 hep T-T1-T2 oluyor.

Yazımın devamında zaten bu konuyu detaylı anlatacağım.

FOC yazımda motor devrinin frekansla değil voltajla ayarlandığından bahsetmiştim. Voltajı artırınca mil daha çabuk konum değiştiriyor....

Olaylar mil açısına bağlı olarak gelişiyor.

AC motorun devir sayısı frekansla değişir ama biz FOC tekniğinde AC frekansı harici kaynaktan değil mil pozisyonundan elde ettiğimiz için pwm sinyaller mil açındaki değişim hızını değiştiriyor dolayısı ile frekans değişiyor.

Alıntı YapVektörün Modülü ile PWM arasındaki ilişki ise doğrudan şu şekilde sanırım.  PWM %100 açık iken Motora V uygulanıyorsa %33 açık iken V/3 olur diyeceğim. 2V/3 için %66. Peki Motorun dönüş hızını hangi parametre ayarlıyor.

V1=0, V2=0, V3=V iken -V/3 -V/2 2V/3 voltajları oluşuyor. V1 ve V2 için duty %0 iken V3 için duty %100

H bridge ile yüke en fazla V voltajı verebilirken 3 half bridge ile yıldız baglı yükün her birine en fazla 2V/3 voltajı uygulayabiliyoruz.
Seytan deliginden kacti.

Mucit23

#8
Abi Adım Adım gitsem iyi olacak. Şuanda Döküman karmaşası içerisindeyim. Kafam allak pullak oldu.

Yapı hala kafamda tam olarak oturmuş değil. Bu yüzden olayı koda dökemedim henüz. Hafta sonuda uğraşamadım pek.

Abi senin söylediklerine göre T1 ve T2'yi nasıl hesaplayacağım? Bunu tam olarak anlayabilmiş değilim.  İncelediğim bir döküman da şu şekilde yapmış. Anladıklarımı anlatayım yanlışım var ise sen düzelt

İlk Başta ta, tb ve t0 olmak üzere 3 ayrı süre hesaplamış. Bunlar Her sektör için hesaplanıyor.


Burada Tch PWM Periyodu. 13 ve 14. denklemlerde verilen K, sektör numarası. 1-6 arası değişebilir.

Teta (θ) ve Vref buradaki denklemde şu şekilde verilmiş.


Teta Zaten Sin(2pi/3) olmak üzere sabit. Yaklaşık 0.866 gibi bir değer. Vref ise Bu denklemden anladığım kadarıyla Max 2V/3 olarak oluyor. Bi önceki mesajın sonunda söylemiştin abi. Daha Fazla arttırırsak Over Modulation denen olay gerçekleşiyor. Fakat normal olarak hız ile oynamak için Vref Değeri 0<Vref<2Vdc/3 arasında değişmesi gerekiyor. Motor hızını bu parametre değiştiriyor.

Şimdi ta, tb ve t0 sürelerini Hesapladık. Bundan sonra Sektör numarasına göre 3 adet pwm sinyali üreteceğiz.

Buda aşağıdaki tabloya göre üretiliyor.


Örneğin 1. Sektördeysek ve STM32 için konuşursak Timer Capture Compare Registerleri aşağıdaki gibi güncellenecek.

TIM1->CCR1=ta+tb+t0
TIM1->CCR2=tb+t0
TIM1->CCR3=t0

Referans aldığım döküman budur.
https://waset.org/publications/5205/space-vector-pwm-simulation-for-three-phase-dc-ac-inverter

@Zoroaster Abi keşke buradaki yazının devamı gelse.






devrecii

Bügün ben elimdeki bldc motoru söküp bi inceledim;

Motorun çevresinde yekpare bir mıknatıs olmasına rağmen mıknatıs üzerinde 12 tane N-S kutpu var.

Yani motora 360 derecelik akım verdiğinde motorun rotoru  sadece 30 derece dönüyor ,  bir proje için kullanacaktım büyük hayal kırıklığına uğradım

Senin motor da büyük ihtimalle böyledir öğrenmen çok kolay tellerin herhangi iki tanesine 5v akım verip motoru elinle çevirmeye çalış tık tık diye
atlayarak gidiyor sayabilirsin.

Bu durumda sinus modulasyonu yapmamnın hiçbir anlamı yok , zaten kısacık bi yol var bunun içi sins kasmaya gerek yok bence,

Yukarıda verdiğin resim tropozid resim doğru değil. Rotor o şekilde hareket etmiyor ne yazkki.   

Bu motorlar her durumda çalışıp seni yanıltabilir , çok şey yanlış da olsa çalışıyor Hall sensörlerin yerlerin,i motor mıknatısında kaç tane NS var
yerlerini bulup sensörleri uygun bir şekilde konumlandırmaya dikkat etmen gerekir.





Mucit23

Elimde birkaç çeşit motor var. Amaç motoru döndürmek değil konuyu anlamaya çalışıyorum. Yoksa motoru döndürmek döner alan oluşturmak çok. zor değil.

Mucit23

Benim bu uygulamada 0-360 derecelik bir sinüs üretecek olsam açıyı 0-360 derece arasında mı değiştireceğim?

Yukarıdaki kurduğum mantıkta bir hata varmı? 13,14 ve 15 nolu denklemlerle ta,tb ve t0 sürelerini hesapladım. Bir açı değişkeni belirleyip açıyı 0-360 derece arasında sürekli arttırdım. Daha sonra bu açıya göre sektör numarasını hesaplayıp (açı/60) o sektöre ait tabloya göre PWMU,PWMV ve PWMW değerlerini hesapladım

Hesapladığım değerler bazı noktalarda aniden işaret değiştiriyor. Yanlış olduğunu düşündüm. PWM donanımına vermeden önce hesapların doğruluğunu nasıl test ederim. Motordan bağımsız olarak 3 fazlı sinüs üretmeye çalışıyorum.

@Zoroaster Abi vaktin varsa eğer bakarmısın?

Cemre.

#12
Merhaba @Mucit23 hocam,

Aşağıdaki bir MATLAB kodu ama konuyu anlamanıza yardımcı olacaktır eminim ki,

clear 
clc
Ang = 0.0;

Mod_Index = 2/sqrt(3);
i = 1;
RAD2DEG = pi/180;

for k = 1:1:2
    for Ang = 0:1:359
        Mag = 0.5;
        Ang_R = mod(Ang, 60) * RAD2DEG;
        Ta = ((Mag * cos(Ang_R)) / Mod_Index) - (((Mag * sin(Ang_R)) / Mod_Index) * (1 / sqrt(3)));
        Tb = ((Mag * sin(Ang_R)) / Mod_Index) * (2 / sqrt(3));
        Tz = 1 - (Ta + Tb);
        if Ang>=0 && Ang<60
            Pa(i) = Tz/2 + Ta + Tb;
            Pb(i) = Tz/2 + Tb;
            Pc(i) = Tz/2;
        elseif Ang >= 60 && Ang < 120
            Pa(i) = Tz/2 + Ta;
            Pb(i) = Tz/2 + Ta + Tb;
            Pc(i) = Tz/2;
        elseif Ang >= 120 && Ang < 180 
            Pa(i) = Tz/2;
            Pb(i) = Tz/2 + Ta + Tb;
            Pc(i) = Tz/2 + Tb;
        elseif Ang >= 180 && Ang < 240 
            Pa(i) = Tz/2;
            Pb(i) = Tz/2 + Ta;
            Pc(i) = Tz/2 + Ta + Tb;
        elseif Ang >= 240 && Ang < 300 
            Pa(i) = Tz/2 + Tb;
            Pb(i) = Tz/2;
            Pc(i) = Tz/2 + Ta + Tb;
        elseif Ang >= 300 && Ang < 360 
            Pa(i) = Tz/2 + Ta + Tb;
            Pb(i) = Tz/2;
            Pc(i) = Tz/2 + Ta;
        end
        i=i+1;
    end
end
subplot(3,1,1)
plot(Pa)
ylim([0 1])
grid on
grid minor
subplot(3,1,2)
plot(Pb)
ylim([0 1])
grid on
grid minor
subplot(3,1,3)
plot(Pc)
ylim([0 1])
grid on
grid minor

Mucit23

Hocam valla çok iyi olur. Bende bugün biraz matlabda deneyeyim dedim. ST de denediğim kodu matlaba yarıbuçuk geçirdim ama akşam derse gidince yarı kaldı. Bana işin mantığını anlayabileceğim bir kod parçası lazım.

Cemre.

Alıntı yapılan: Mucit23 - 20 Mart 2018, 22:15:21
Hocam valla çok iyi olur. Bende bugün biraz matlabda deneyeyim dedim. ST de denediğim kodu matlaba yarıbuçuk geçirdim ama akşam derse gidince yarı kaldı. Bana işin mantığını anlayabileceğim bir kod parçası lazım.

Yukarıda paylaştım. Sorunuz olursa yardımcı olmaya çalışayım.