FOC Algoritmamı nasıl test ederim?

Başlatan Cemre., 11 Ocak 2020, 19:33:25

Cemre.

Merhaba,

STM32F303K8Tx işlemcisi üzerinde çalışacak bir FOC Vektör Kontrol algoritması geliştirdim. Elimdeki PMSM motoru açık çevrim V/f kontrol ile çalıştırabilen bir deney ortamım da mevcut. Motor faz akımlarını direk ACS712 tipi bir sensör ile ölçüyorum. Encoder var, rotor pozisyonunu biliyorum. Hızı biliyorum.

Ancak FOC algoritmamı önce debug ortamında test etmek istiyorum. Basit bir yazılım hatası yüzünden güç katına zarar vermemek adına bunu yapmak istiyorum.. Örneğin, şu sabit girişleri verdiğimde çıkışlar şu olmalı gibi bir test seti geliştirmek mümkün mü? Motorun matematiksel modelini işlemci üzerinde koşturmak bir seçenek ancak bu kadar detaya girmeden basit bir test yapmak mümkün olsaydı süper olurdu...

@z ne diyorsunuz hocam? Var mı bir öneriniz..

Herkese iyi çalışmalar dilerim..

z

STM icin yazdigim fonksiyonlarin benzerlerini Delphi ile de yazdim.

Delphi fonksiyonlari klavyeden girdigim degerlere gore sonuclar uretti, ayni test degerlerini STM rutinlerine de verip ayni sonuclari elde edip etmedigimi denedim.

Bu esnada guc kati bosta oldugu icin tehlikeli durumlar olusmadi.


Fonksiyonlari delphide floating point. STM fix point hesaplama yaptirdigim icin bu karsilastirmali test, hatalarimi yakalamamda cok faydali oldu.

Fonksiyonlarin isleme surelerinin pwm update surelerine gore yeterince kisa oldugu vs testlerini de yaptim.

Test icin tamamen sallama degerler kullandim.

Mesela Ia=1 Ib=-5.3 mil acisi 45 derece gibi.

Yada Vd=12v vq=30v gibi.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Cemre.

Ia, Ib, Ic her üçünü de direk faz akımı olarak ölçüyorum. Fonksiyonlarda Ic'yi ölçülen değer olarak mı kullanmak daha mantıklı, yoksa Ia+Ib+Ic=0'dan hesaplayarak mı? @z

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Cemre.

Alıntı yapılan: z - 11 Ocak 2020, 21:28:20Ic nerde gerekiyor ki?

Clarke Transform, abc to alphaBeta0 dönüşümü yaparken C'yi de hesaba katmak gerekiyor. Tabii formülü Ia+Ib+Ic=0'da Ic'yi çekip yerine yazarak sadeleştirebiliyoruz. Ben aksilik yaşamamak adına deney setimde tüm akımları ölçebiliyor olacak şekilde tasarımımı tamamladım. Ama Ic'yi tabiki kullanmak zorunda değilim :)

https://www.mathworks.com/help/physmod/sps/ref/clarketransform.html

quarko

Deney setinizde faz akımlarının üçünü de ölçüyorsanız, ayrıca hesap yaparak süre kaybetmeye gerek yok hocam. Çalıştığınız donanımda sadece iki faz akım ölçümü olsaydı mecburiyetten hesaplamak gerekecekti. ST nin motor control kütüphanelerini mi kullandınız yoksa FOC algoritmasını tümden kendiniz mi yazdınız ?
"Vicdanın ziyası ulum-u diniyedir. Aklın nuru fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder."

Cemre.

#6
Alıntı yapılan: quarko - 11 Ocak 2020, 21:50:57Deney setinizde faz akımlarının üçünü de ölçüyorsanız, ayrıca hesap yaparak süre kaybetmeye gerek yok hocam. Çalıştığınız donanımda sadece iki faz akım ölçümü olsaydı mecburiyetten hesaplamak gerekecekti. ST nin motor control kütüphanelerini mi kullandınız yoksa FOC algoritmasını tümden kendiniz mi yazdınız ?

Kütüphane kullanmadım. FPU donanımı olan bir işlemci kullandım, her şey floating point. Buna rağmen tüm PID'ler ve FOC vs 38us sürüyor. Ben kontrol döngümü 125uS ile güncellemeyi tercih ettim. Daha önce fixed point arithmetic ile Vf kontrollü bir denemem olmuştu, çok daha performanslı çalıştığı kesin ancak floating point ile çalışmak çok rahat ettiriyor...

z

#7
Alıntı yapılan: quarko - 11 Ocak 2020, 21:50:57Deney setinizde faz akımlarının üçünü de ölçüyorsanız, ayrıca hesap yaparak süre kaybetmeye gerek yok hocam.

Ic akimini kullanmaya kalkarsan daha cok islem yapman gerekiyor. Ic yi daha tasarim asamasinda matemetik ifadelere kattigindan  islemciye ek yuk getirmiyorsun.

Ic=-Ia-Ib den hesaplanirsa

I vektoru = (3/2)Ia + JKok3(2Ib+Ia)/2 iken
Islemcinin gercek zamanli hesaplamasi gereken vector bu oluyor.

Halbuki, Ic yi olculen degerden alarak kullanirsan
gercek zamanli hesaplanmasi gereken baginti I vektoru = Ia - (Ib+Ic)/2 + JKok3(Ib-Ic)/2


Ic yi akim olarak kullanmanin faydasi nerde olur benim aklima hic bir sey gelmiyor.

Ustelik ADC den okunan degerlerle hesaplanacak Ia+Ib+Ic nin sifir etmeyecegi de kesin.
 

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

quarko

Haklısınız hocam. İfadeler bu şekilde olunca, Ic yi ayrıca ölçüp kullanmak azda olsa bir yük getiriyor.
"Vicdanın ziyası ulum-u diniyedir. Aklın nuru fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder."

Cemre.

Her ikisini de denedim, etki anlamında pek bir fark olmuyor görünürde. Yine de genel kullanım bu şekilde olduğundan Ic'yi denklemden çektim..

@z
Yalnız park dönüşümünde malum iki method var. Birincisi A fazı ile hizalı (cosine-based) dönüşüm. İkincisi A fazından 90* faz farklı (sine-based) dönüşüm. Sanırım buradaki farktan kaynaklı bir sorun yaşıyorum.

https://www.mathworks.com/help/physmod/sps/powersys/ref/alphabetazerotodq0dq0toalphabetazero.html?s_tid=doc_ta

Dönüşüm fonksiyonlarım aşağıdaki gibi..
SVM_Frame_dq_TypeDef SVM_Transform_Park(SVM_Frame_AlphaBeta_TypeDef Vector, float Theta)
{
	// Park Transform
	SVM_Frame_dq_TypeDef tVector;
	
	tVector.d = Vector.Alpha * cosf(Theta) + Vector.Beta * sinf(Theta);
	tVector.q = Vector.Beta * cosf(Theta) - Vector.Alpha * sinf(Theta);
	
	return tVector;
};

SVM_Frame_AlphaBeta_TypeDef SVM_Transform_Inverse_Park(SVM_Frame_dq_TypeDef Vector, float Theta)
{
	// Inverse-Park Transform
	SVM_Frame_AlphaBeta_TypeDef tVector;
	
	tVector.Alpha = Vector.d * cosf(Theta) - Vector.q * sinf(Theta);
	tVector.Beta = Vector.q * cosf(Theta) + Vector.d * sinf(Theta);
	
	return tVector;
};



z

Alfa Beta akimlarini bulurken 2 fazli sisteme ait eksen ile 3 fazli sisteme ait eksenler arasina istedigimiz gibi keyfi bir aci verebiliriz.

Yani illaki Alfa ile Ia arasinda 0 yada 90 derece olacak diye bir sart yok.

Cunku ters donusumde yani Vq Vd den tekrar Va, Vb, Vc ye gecerken ilk basta yaptgin aci farkina gore donusum yapacagin icin hic bir sey degismez.

Fakat daha az islem yapmak adina acinin 0 yada 90 derece alinmasi faydalidir cunku sin0 ve cos90 0 oldugu icin birer terim eksilir algortitmalar birazcik adha hizlanmis olur.



Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Cemre.

#11
Dönüşümlerde 0 bileşenlerini de kullanmak gerekiyor mu? @z

Ben ABC->alphaBeta dönüşümünde Zero bileşeni kullanılmadığı için hesaplamıyorum (?)
Yine alphaBeta->dq dönüşümünde Zero bileşenleri yok. olmalı mıydı?

Bir de, ben rotor pozisyonunu encoder Z pulse ile tespit ediyorum. Z pulse geldiği anda rotor pozisyonunu sıfırlıyorum. Şimdilik ilk Z pulse'ini elle geçiyorum. Sonra sisteme start veriyorum. Yani Z pulse noktasını rotorun 0 derece açısı olarak kabul ediyorum. Motorum 4 kutuplu, dolayısıyla bir tam turda rotor pozisyonu 0 ile 4*2pi Radyan arasında değişiyor. Bu şekilde çalışırken rotor pozisyonuna 90 derece offset eklemeli miyim?
---------------------------------------------------------

Galiba hatayı buldum. Olay ne motorda, ne encoder'da ne de başka bir yerde. PID fonksiyonumda lastError (türev hesaplarken kullanılan) ve integral akümülatörü için fonksiyon içerisinde "static" değişkenler tanımlamışım. Arka arkaya üç kez önce Speed için sonra Iq sonra Id için PID fonksiyonunu çağırıyorum. Dolayısıyla  PID'ler birbirine giriyor. C'nin mucidi Dennis Ritchie mezarında ters döndü vallahi :D Neyse, laptop'un şarjı bitmek üzere. Yarın işten sonra deneyeceğim artık...

z

#12
Power on asamasinda rotor ve stator hizalandiginda bu aciya sifir degil 90 derece demek gerekiyor.
(Boyle olmasina karar verdim, aksi halde benim sistemde de hata var demektir.)

Fakat bu aciya ne dersen de motor gene donece, tek degisen verim olacaktir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com