19 Ocak 2020, 22:59:25

Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME


FOC Algoritmamı nasıl test ederim?

Başlatan Cemre., 11 Ocak 2020, 22: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.


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


Cemre.

Alıntı yapılan: z - 12 Ocak 2020, 00: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 ?
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

Cemre.

12 Ocak 2020, 00:54:46 #6 Son düzenlenme: 12 Ocak 2020, 00:55:49 Cemre.
Alıntı yapılan: quarko - 12 Ocak 2020, 00: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

12 Ocak 2020, 07:01:22 #7 Son düzenlenme: 12 Ocak 2020, 09:23:27 z
Alıntı yapılan: quarko - 12 Ocak 2020, 00: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.
 


quarko

Haklısınız hocam. İfadeler bu şekilde olunca, Ic yi ayrıca ölçüp kullanmak azda olsa bir yük getiriyor.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

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 Vectorfloat Theta)
{
	
// Park Transform
	
SVM_Frame_dq_TypeDef tVector;
	

	
tVector.Vector.Alpha cosf(Theta) + Vector.Beta sinf(Theta);
	
tVector.Vector.Beta cosf(Theta) - Vector.Alpha sinf(Theta);
	

	
return 
tVector;
};

SVM_Frame_AlphaBeta_TypeDef SVM_Transform_Inverse_Park(SVM_Frame_dq_TypeDef Vectorfloat Theta)
{
	
// Inverse-Park Transform
	
SVM_Frame_AlphaBeta_TypeDef tVector;
	

	
tVector.Alpha Vector.cosf(Theta) - Vector.sinf(Theta);
	
tVector.Beta Vector.cosf(Theta) + Vector.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.




Cemre.

13 Ocak 2020, 23:17:52 #11 Son düzenlenme: 14 Ocak 2020, 01:21:22 Cemre.
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

14 Ocak 2020, 03:18:08 #12 Son düzenlenme: 14 Ocak 2020, 03:25:57 z
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.