motor surucu soft start sorunu

Başlatan Mnemonic, 29 Nisan 2013, 15:46:05

Mnemonic

Arkadaşlar merhaba,
yanlış çözdüşüm bir şeyin doğrusunu arıyorum yardımcı olursanız sevinirim.

üç fazlı bir motor sürücü düşünün üretilmek istenilen volt frekans değerine gelene kadar soft start yapılmak isteniyor(değer 220V X3 50Hz diyelim)
IGBTler SPWM ile sürülüyor ve bunun için bir patern oluşturuldu. soft start için okuduğum dökümanlarda V/f oranına sağdık kalınması gerektiği söylenmiş.
bende bu orana sağdık kalarak 10 adet patern oluşturdum ve her 200ms'de bir sırası ile bu paternleri cağırdım en son son paternde sabit kaldım. istediğim şeyi elde ettim ancak motor 200ms'de bir adım adım hızlanma yanı basamaklama yaptı ve çok güzel olmadı.
benim sormak istediğim tek patern ile SPWM metodunu kullanarak gerçek soft start nasıl yapılır bunu bilen biri varmı acaba ?
yardımcı olabilir bir döküman linki gönderebilirseniz çok sevinirim

şimdiden cevaplarınız için çok teşekkür ederim


iyildirim

Tek bir sinus tablosu-pattern kullanıp buradan elde ettiğiniz değeri hesapladığınız bir katsayı ile çarpmak iş görmüyor mu?. 

Mnemonic

bu aklıma geldi ama bu kadar hesabı yapıp yenıden ınterrupt ıle sinus açı değişimine sokmak için 55uS gibi bir zaman gerekiyor bu kadar zamandada kullandığım mcu hızı yeterli olmuyor en az 1000mhz bir mcu kullanmam gerekiyor
benim kullandığım mcu sadece 10MIPS

iyildirim

10 mips 3 faz için yeterli bence. 55us yetmezse de her bir PWM puls'inde olmasada iki darbede bir hesap yapılabilir ki buna bile gerek kalmaz.

Sinüs tablosunu 0 ile 1 değerleri arasında olacak şekilde q7, q15 gibi bir formatta sabit noktalı sayı şeklinde tanımlayın. 
V/f oranınız belli.  Tablodan okunan değeri direkt oranla çarpıp x bit sağa kaydırırsanız hesap tamam olmuş olacak. 
ADC vs. akım kontrolü gibi ekstralar varmı belirtmemişsin ama bahsettiğin kadarına bölme işlemi olmadığında 8 bitlik 10Mips işlemci yeter diye düşünüyorum.


Klein

#4
max frekans ve sinüs tablosunun çözünürlüğü nedir?

mesaj birleştirme:: 30 Nisan 2013, 01:32:32

Kafamde bir teori var. ancak gerçekle ne kadar örtüşür , sizin frekans voltaj oranınıza ne kadar oturur bilmem.

Şöyle:

bir tablomuz var.

1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1,0

Eğer pwm çözünürlüğümüz 10 ise,   bu tabloya göre %0'dan %100'e giden ve tekrar %0'a düşen bir üçgen dalga çıkışımız olur.
%100 pwm oranını 10V kabul dedersek  0V-10V-0V aralığında üçgen dalgamız var demektir.

Eğer PWM çözünürlüğünü 20 yaparsak, Frekansımız yarı yarıya azalacak,  dalga tablosundaki değerimiz 10 iken , çıkışımız %50 olacaktır.  Bu da 0V-5V-0V aralığında çıkışımız olacak demektir. Yani frekansımız iki kat düştüğünde, genliğimiz de aynı oranda iki kat düşmüş olacak.


mesaj birleştirme:: 30 Nisan 2013, 01:33:57

Eğer bir şeyleri atlamamışsem , çalışması gerekir. İşlemcinizde DMA modülü varsa , işlemciden 1 saykıl bile harcamadan işlem gerçekleşebilir.

Mnemonic

merhaba arkadalar
yoğunluk yüzünden anca dönebiliyorum kusura bakmayın sorularınıza cevap vermeye çalışayım
paternim çözünürlüğü 90lık her bir değer 16bit uzunluğundan frekans olarak 200hz kullandığımız için her 55uS'de bir timera sokmak gerekiyor

çözünürlüğü 90dan aşağı indirmek istemiyorum o zaman oluşan sinusde kırılmalar başlıyor 16bit değerde mecburen kullanıyorum kulanmış olduğum picin register yapısı bu şekilde dolayısı. 200 hz frekans üretem gerektiği içinde her 55uSde bir interrupt ile paterni değiştirmem gerekliki gerekli frekensı türetebileyim dolayısı ile boşta fazla zaman kalmıyor.  bunu yapmanın en kolay yolu %100 değere çıkana kadar bölme işlemi ile paterni böldürmek o zaman tam linener değere ulaşırsın ancak o zaman cpu hızı malesef yetmez. bunu böldürmeden yapmanın daha kolay bir yolu varmıdır diye arıyorum. ama lütfen paternin çözünürlüğünün 90 olduğunu ve değer uzunluğunun 16bit olduğunu ve her 55uS'de bir interrupta sokmak zorunda olduğumu unutmayın :)

Alıntı YapSinüs tablosunu 0 ile 1 değerleri arasında olacak şekilde q7, q15 gibi bir formatta sabit noktalı sayı şeklinde tanımlayın. 
V/f oranınız belli.  Tablodan okunan değeri direkt oranla çarpıp x bit sağa kaydırırsanız hesap tamam olmuş olacak. 
ADC vs. akım kontrolü gibi ekstralar varmı belirtmemişsin ama bahsettiğin kadarına bölme işlemi olmadığında 8 bitlik 10Mips işlemci yeter diye düşünüyorum.
iyildirim bunu birazdaha açarmısın tam anlayamadım sanırım bolean işlemleri ile yapmanın kolay bir yolu var ?

iyildirim

#6
Sinus tablosundaki değerler normal hesap yaptığımızda 0 ile 1 arasında. Bu işlemi pic'te yaparken float sayı ile uğraşmamak ve bölme işleminden kaçınmak için çarpma ve kaydırma işlemi uyguluyoruz.
16 bit çalışıyorsak sinüs tablosunda 1 değeri için 32767  kullanıyoruz. Tabloyu hazırlarken 90 adımdaki her bir açının sinus karşılıklarını 32767 ile çarpıyoruz. pic de ise tablodan okuduğumuz değer ile MAXPWMDUTY yi çarpıp 15 bit  sağa kaydırıyoruz. Bu kadar. Bölme işlemi kullanılmadığı için daha hızlı oluyor. Aslında sabit noktalı sayı kullanmaktan başka birşey yapmıyoruz. 
Sinüs tablosunu ve maxduty peridodunu paylaşırsanız örnekleyebilirim.
kullandığım 16 bitlik işlemcide bu işlem 1-2 clock  kadar sürüyor. 8 bitlik işlemcide  16bit çarpma işlemi ne kadar sürüyor bilmiyorum.

Öte yandan @Klein'in dediği sabit on zamanlı, değişken frekanslı pwm metodu da işe yarayabilir. Belki tabloyu hazırlarken sürücü devredeki gecikmeleri kompanze edecek bir şeyler eklemek gerekir o kadar. Anladığım kadarı ile motor farklı hızlarda kullanılmıyor. Sadece hızlanma aşamasında bu işlem gerekiyorsa @Klein' in önerisini yabana atmamak lazım.

Mnemonic

Merhaba,
%100lük Paterni aşağıda bulabilirsiniz
en büyük değer olarakda 1960 kullanıldı. birinci değer için %1 ve %2 örnekleme verirseniz çok sevinirim

1005,1072,1138,1204,1268,1332,1393,1453,1511,1566,1619,1668,1715,1758,1797,1832,1863,1890,1913,1932,1945,1955,1959,1959,1955,1945
,1932,1913,1890,1863,1832,1797,1758,1715,1668,1619,1566,1511,1453,1393,1332,1268,1204,1138,1072,1005,938,872,806,742,678,617,557
,499,444,391,342,295,252,213,178,147,120,97,78,65,55,51,51,55,65,78,97,120,147,178,213,252,295,342,391,444,499,557,617,678,742,806,872,938

iyildirim

20 adımda max hıza ulaşılacağını varsaydım. 
C18 in simülatöründe long değişken kullanınca işlem çok uzuyor. Gerçekten 10 mips 3 faz için çarpıma yetmiyor. C18 hakkında  detaylı bilgim yok. Ama bana işlem aşırı uzun sürüyor geldi. Belki optimizasyonla ilgilidir.

16 bit int sınırları içinde kalınca 3 faz için çarpım işlemi yaklaşık 37-38us gibi sürüyor. Ekstra hesap yoksa 10mips yeter görünüyor. Olmazsa 16 bitlik işlemcilere geçmek de düşünülebilir.
16 bit integer sınırlarında kalınca tablo senin değerlerinle şu şekilde oluyor..
1608, 1715, 1821, 1926, 2029, 2131, 2229, 2325, 2418, 2506, 2590, 2669, 2744, .......
Tablo için 1960 yerine 3136 olacak şekilde değerleri oranlamak gerekli.
hesap ise;
duty = (hiz * sin[tblndx])>>5; şeklinde. Hız 1 ile 20 arasında değer alabilir. 

Bu kadar hesap yapmak yerine @Klein'in önerisini uygulamak daha kolay.
200 hz için hazırlanmış tek bir tablo kullanılacak.
PWM duty tablodan direkt yazılacak.
Başlangıç period değeri ise (diyelim ki 20 hz) 200 Hz de kullandığın periyodun 10 katı olacak. 200 hz'de  kullandığın değere gelene kadar period üçer-beşer azaltılacak o kadar.