Bipolar Step Motor Sürücü Ayrıntıları

Başlatan Erol YILMAZ, 29 Eylül 2005, 16:59:50

Erol YILMAZ

Gordugunuz gibi 25 Ohm/Faz ve 73 mH/Faz  lik bir step motor performans motoru olmaktan cok uzak.

Onun yerine Oriental Marka NEMA23, 3.6 Ohm/Faz, 43 mH/Faz lik baska bir motor denedim. 5.4 Volt 1.5 Amper. Motorumuzun boyu 77 mm.

Surucunun Besleme gerilimini 50 Volt olacak sekilde ayarladim ve akim grafigini inceledim. Motorlari tanimak acisindan iyi bir inceleme oldu.
Bobinin ilk gerilimlendigi anda 1.5 A'e yukselme egimi var. O egim, surucunun besleme gerilimi ile orantili. 50 Voltta 900 tur civarinda hizla dondu. Tork dustu tabii ki. Yalniz bizim kablo kesmede kullandigimiz cok hizli step motorlar var. Onlari inceleyecegim.

Bu motorun bobin akimi 1250 tam-adim/sn de doymamaya basladi. Yani akim kontrol devresi hic CHOPPING yapmadan gerilimi full acti. 1250 adim dan sonra zaten akim azalmaya basliyor.

Bu gerilimle bu motorla hangi surucu olursa olsun 1250 adimdan sonra motor akimi yeterince alamayacak.

Bunun yolu ya dusuk enduktansli motor kullanmak ya da mevcut motor icin gerilimi  cok daha yuksek seviyelere tasimak olacaktir.

CNC tarzi bir uygulamada gezme islemi fazla olacagi icin daha cok performans aramak gerekir. Ama motor hakkiyle surulmu$tur.

LMD18245 in max gerilimi 55 Volt ve besleme kondansatorlerinin gerilimi de 50 V oldugu icin daha yuksek gerilimlere cikilmamistir.

Daha iyi motor ile mevcut surucuyle daha iyi performans elde edilebilir.
Devami gelecek...

mahoaga

Sin - Cos fonksiyonu kolay olarak Look up table ile yapılabilir. Ancak software açısından bazı sorunları göz önünde bulundurmak şart. Motoru ivemelendirme ve yavaşlatma işleminden bahsediyoruz. Bu konuda sanırım herkes hemfikir. Bir kütleyi ataletinden dolayı aniden hızlandırmaya kalkmak otomobilinizi 0 dan 1 saniye içinde 200km hıza çıkartmaya benzer. O yüzden elbetteki kademeli bir artış kullanmak şart. Bir matematiksel fonksiyona göre ilerlemeliyiz. Lineer rampa kullanacaksak (Açısal hızın liner olması başka bir deyişle lineer olarak artması-azalması) Yerdeğiştirmenin parabolik olarak değişeceğini gösterir. Motou 0 dan kaldırmakta çok doğru olmayabilir. Pratikte motorlar bir Vo hızı ile start edilir. Başlangıçtaki pozisyonu Xo olarak düşünecek olursak.

A ivme olup sabit ivemelenme modeli kuracak olursak
t herhangi bir andaki zaman (değişken)
V değeri set ettiğimiz hız değerimiz lineer olarak artıyor Vhedef e kadar

X = 1/2 A t2 + V t XoVo = A t + V

formülasyonu bize t anındaki X yerdeğiştirme değerini verecektir.

tstep = ( -V + ( V2 + 2 A S )0.5 ) / A
V' = ( V2 + 2 A S )0.5

Tstep bize hızlanma zaman aralıklarımızı verecektir. Pdf de de belirtildiği gibi alttaki basit program, Hızlanma-Max hızda ilerleme ve yavaşlama algoritmasını tam olarak formüle etmektedir.

if V = Vhedef then o the following:
S/Vtarget saniye kadar bekle ve sonra
Q = Q+ S
else if V < Vhedef hızlanma formülasyonu
bekle ( -V + (V2 + 2 AaccelS)0.5 ) / Aaccel  saniye kadar
Q= Q+ S        
V = (V2 + 2 AaccelS)0.5

else if  V > Vtarget yavaşlama formülü
bekle ( -V + (V2 + 2 AdecelS)0.5 ) / Adecel saniye sonra
Q=Q + S
V = (V2 + 2 AdecelS)0.5
end if

üstteki çok kod  formülasyonu sürücünün en kritik olan hızlanma ve yavaşlama kısmını tamamen çözüyor. 2. Aşamada elde edilen V hız değerlerini kullanarak motoru istenilen hızda ilerletmeye kalıyor. Interrupt değerleri belirtilen bekleme zamanlarına set edilmeli. Ayrıca Ram de her eğri için gerekli olan PWM duty değerlerinin bir kısmını sürekli stoklamakta fayda var. Yoksa işlemci hata yapabilir. Yani 10-15 adım sonra verilecek PWM değerini hafızaya almaktan bahsediyorum. Bir taraftan çıkarken bir taraftan doldurmak gerkli gibime geliyor. Burada önemli bir ayrıntı öne çıkıyor

Look up table mı? Matematiksel işlemle hesaplama mı yapmak?

Evet gerçektende güzel bir soru. Basitçe lookup table diyebilirssiniz. Ama işin arka kısmını kurcalamak bizi doğruya götürecek. Belliki tabloda belli bir miktarda mikrostep adımı için oluşturulmuş değerler var. Mesela 180 derece için 256 adet değerimiz olsun. 128 microstep edecektir. (PWM taşıyıcı frq ise 20Khz civarı olsun.) Çünkü motor 90 derece fazı kaydığı anda 1 adımını tamamlamış olacak ve 180 derece içinde ancak 1 tam adım atabiliriz. diğer adıma geçebilmek için 180 derece beklemek zorundayız. Şimdi tıkanma burada ortaya çıkmakta eğerki motoru çok düşük devirlerde çevireceğim derseniz, o zaman her 180 derecede sadece 1 adım atabilme şansınız var. 1 peryot için en yavaş döndüğümüzü varsaysak 250*20Khz = 500 Hz gibi bir yarım peryot frekansı ortaya çıkacaktırki biz bu hızda hareket ettiğimiz zaman motorumuz 500 Hz boyunca BUSY olacak demektir. Yani 500Hz boyunca motor hep aynı hızda kalmak zorunda kaldı. Peki hızlanmadaki zaman adımları bu 500 Hz lik zamanlamaya denk mi gelecek. Elbetteki hayır. Öyle ise motorun en fazla 8-10 sample gibi bir PWM değeri ile bu hızı elde edebilmesi gerekiyor. Bu nasıl olabilir? Elimizde yaklaşık olarak 5000-1000 adet tablo değeri tutmamız gerekirki durumun sıkıntısını sanırım anlamışsınızdır. Ancak burada formülasyon kullandığımız takdirde motoru daha fazla (10000>) adıma bölebilecek ve hızlı bir zaman diliminde motoru anlık bir hızla ilerletme olanağına sahip olacağız. Ayrıca sin-Cos genlikleri ile oynamamız bize Resonans frekansında birşeyler sağlayabilir. Peki sin - Cos fonksiyonu nasıl elde edebiliriz.

Look up table üzerinde interpolasyon yaparak ara değerleri alabiliriz ama bu pek mantıklı olmaz zira sinüsün üstünde line lar çizmek olur. Yani sin eğrisini kirişlere ayırmak olur.

sin(x) = x * num(x) / den(x)
num(x) = 1 + n1*x^2 + n2*x^4 + n3*x^6
den(x) = 1 + d1*x^2 + d2*x^6 + d3*x^6
bu formülasyon bize sin değerlerini verebilir ancak oldukça yavaş kalacağı ortada. Yüksek hıza sahip işlemci ister ve işlemciyi biraz hantallaştırız.

Daha basit bir yöntem Taylor serisi kullanmak olabilir.
sin(x) ~ x*(1 - (x^2)*(1/3! - (x^2)(1/5! - (x^2)/7! )))

bu formülasyonu elde edebilmek sanırım fazla zor olmasa gerek. 2-3 adet çarpma ve 2-3 adet bölme işlemi yapmak gerekliki iyi bir optimizasyonla bu işlem kolayca olabilir. Burada 32 bit işlem yapmak gerekebilir. Ancak bir komutla 16bit çarpma yapan bir DSP bunu rahatla yüklenir. Aynı anda 6 sinüs olsa dahi. (3 motor)

Fonksiyondan elde edilecek olan değer ile oluşturulacak 1 PWM frekansının peryotu bu değer ile çarpılarak Duty değeri bulunur. Ancak PWM frekansı 20Khz ile 16Khz arasında oynatmak gerekiyor. Daha basitçesi hızı arttırdıkça sample miktarı düşecek PWM frekansı hep 20Khz civarlarında gezinecek. Bu sayede sin ve Cos eğrilerinin genlikleri  ile oynayabileceğiz aynı anda kısa zamanlı düşük bir hızı çıkış verebileceğiz.
Bunları Lookup table ile yapabilemek oldukça zor görünüyor. Yapılacak olan birkaç matematiksel işlem ve interruptlardan ibaret.

Olayları irdelekten kastım bu. Sorulan sorulara basitçe evt hayır demek elbette kolay olacak ama, bir şeyi planlarken 5-10 adım sonrasını göze almak zorundasınız. Yoksa 10 adım gider ve 10 adım tekrar geriye gelirsiniz.  Aynı yerde boşa vakit kaybedersiniz. Olaya girişmeden önce yapacak olacağını 10-15 dklık kritik sizi belki haftalarca uğraşmaktan kurtarabilir. Motoru en iyi şekilde sürmeyi hedefliyorsak ayrıntıları dikkate almalıyız.

Erol YILMAZ

@Magoaga, yazilarini ilgiyle okuyorum ve bu basligin altinda sadece BIPOLAR STEP MOTOR SURUCULERI hakkinda yorumlar-tartisma-hesap-kitap-tecrube istiyorum. Indexer olarak herkesin farkli cozumleri olabilir.
Ben mesela TURBOCNC kullanacagim. Rampalamayi kendi yapiyor.
Baski devre kazimak icin.  Baska isler icin bir PIC cik yazarsin. O da kendi kafasina gore birseyler yapar. Step motor surucu olmadan bunlari yapamazsin.

@Bunalmis Hocam,
Senin 1500 devir/dk yaptirdigin surucu - motor sistemini ic gecirerek, pur dikkatle izliyoruz  :D   "Prime Time" in krali senin video goruntulerin.
Ses te duymak isterdik ama simdilik bu da iyi.
Neyse asil konumuza gelelim. O motorun gerilim, akim, enduktans degerlerini rica etsem bizimle paylasirmisin? Cok makbule gecer.

z

Bir ara benim sitede verdim diye hatirliyorum, bir bakayim eger bulamazsam tekrar olcmem gerekecek. Bu arada iyi gidiyorsunuz. :D
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

1.88V,  2.5A, 1.6mH, 0.6Ohm, Nema 23
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Erol YILMAZ

Alıntı yapılan: "bunalmis"1.88V,  2.5A, 1.6mH, 0.6Ohm, Nema 23

Hocam bu ultra-süper bir motormus.
Motor Microchip'in Performans li motor tanimlamalarina neredeyse tamamen uyuyor. Ilgine, teşekküru borc bilirim.

Erol YILMAZ

Simdi surucu besleme geriliminin onemini ve belki de Surucu-Motor sistem dengesinde en onemli konulardan birinden bahsedecegiz.

Normalde motor icin verilen gerilimler 12 Volta kadar olan dusuk gerilimlerdir. Akim seviyeleri de yaklasik 10 A. e kadar verilir.
Peki ama neden suruculer 30-100 VDC arasinda bir gerilimle beslenirler.
Isterseniz bunu full-step modunda calisan bir motorun akim-zaman grafiginde gorelim.

Bu fotografta gordugunuz siyah iz motorun akimini temsil ediyor.
Yaklasik 800 uS lik bir tirmanistan sonra akim kontrolu devreye giriyor ve "chopper" teknigi ile akimi sabit tutmaya calisiyor. Fakat kontrole girmeden once akimin belli bir degeri asmasini beklemesi gerekiyor.
Simdi asil can alici konuya donelim,

Bu motoru suren palslerin 800 uS oldugu durumu goz onune alalim. Bu durumda, chopper hicbir zaman devreye giremeyecek ve bobinlerdeki ortalama akim normalde ayarlanan akimin sadece yarisi kadar olacaktir. Bu da buyuk olcude tork dusumune sebep olur.
Eger giris frekansi daha da artarsa (palslerin suresi kisalirsa) durum daha da vahim hale gelecektir. Motor akim cekememeye baslar.

Bunu engellemenin 2 yolu var.
1. yol:
Besleme gerilimini artirmak. Bu durumda egim daha da diklesecektir.

2. yol:
Motorun enduktansini daha dusuk baska bir modelle degistirmek.

Bir de enduktanslarin basina eklenecek direnc ile alakali birsey var ama onu saymiyorum.

Besleme gerilimi surucunun izin verdigi yere kadar arttirilabilir.
Entegre yapilar genelde max. 30-55 VDC arasindadir.
Ayrik elemanli dusunuldugunde ise tasarim ve devreye alma maliyetleri dusundurucudur. Onun yerine daha dusuk enduktansli bir motor cozum olabilir.

AYRICA:
Mesela 1.8 VDC 3 A. motor kullaniyorsunuz. Surucu Besleme geriliminiz 40 Volt. Bu durumda 40 Voltluk kaynaktan 3 A cekmeyeceksiniz. 0.6 Amper gibi birsey cikacak karsiniza. Cunku sistem SMPS teknigi ile calisiyor. Lineer sistemlere gore kayiplari cok az olan bir sistem yani.
Yani 3 motor icin 3x0.6 = 1.8 A.      40x1.8=72 W. Hadi toleranslari da ekle 100W olsun. 100 W lik bir SMPS kaynagin fiyati hemen hemen TRAFO+yuksek degerli kondansator ile aynidir.

Erol YILMAZ

"SMIK stands for Stepping Motor Instability Killer."

Denen bir yontem var. Patentliymis...
Ne oldugu konusunda nette neredeyse hic bilgi yok.

mahoaga

LMD18245, Nasyonel full bridge Step driver IC'sini nereden bulabilirim. Türkiyede bulunuyor mu? Yardımcı olursanız sevinirim.

mahoaga

Konu üzerinde biraz daha kafa yorunca, yeni bazı noktalara vardım. Açıkçası mikrostep/İvmelenme/Dairesel Inter/Lineer Interpolasyon olaylarını teorik olarak tamamen çözümlediğimi düşünmekteyim.

Ilk olarak Sinüs üretimi hakkında vardığım sonuç;

1) PWM frekansı daima 20Khz olacak. Bu 20Khz lik peryodu hiç bir zaman oynatmayacaksınız. Peryot registeri her zaman 20Khz ye ayarlı olmalı. İster 1 motor sürün isterse 3 motor sürün bütün Duty değerleri aynı anda Update edilecek.

2) 3000 d/dk için 4Sample, 1500d/dk için 5 sample/ 750d/dk için 6sample..... gibi hızı düştükçe sinüsü oluşturan sample sayısını arttıracaksınız. 20Khz sabit.

3) PWM için kullandığınız duty registeri ister 16 bit olsun isterse sonsuz bit olsun farketmez CPU nun hızından dolayı belli bir çözünürlükle sınırlandırılmışsınız. Mesela 10Mips lik bir MCU kullansanız 1:1 prescalar ile 20Khz deki peryot registeriniz en fazla 500 olacaktır. CPU nuz 30 MIPS ise bu register 1500 olacaktır. Buda kullanacağınız sinüs değerlerinde çok yüksek hassaslık aramanıza gerek olmadığını gösteriyor.

4) Sinüs üretiminde 256 sample lık bir Lookup table oluşturabilirsiniz. (90 derece için). Ara değerleri enterpolasyton ile okumanız gerekecek. Buradaki max hata payı Cos(Pi/2/256) olacaktırki buda sizin PWM registerinin çözünürlüğünden çok daha yüksek.

5) 256 adet sample değeriniz varken eğer 1 adımı 256 mikrostepe bölmek isterseniz her adımda tablo değerinizi (yöne bağlı olarak) 1 adım ileri veya geri çekmelisiniz. Ancak yavaş hızlarda daha fazla sample çıkıp sinüsü daha az ripılsız ve temiz oluşturmalısınız. Hızınız düştüğünde 256 dan daha fazla micro adıma ihtiyacınız olcağı için enterpolasyon yaparak ara değerleri almalısınız. Mesela açı değerinizi 16 bitlik bir registerde tutabilirsiniz. üst 8 bit Tablodaki tam adımları alt 8 bit ise tablodan enterpolasyonla alacağınız adımları gösterir.

6) Sın,Cos fonksiyonlerı [0,1] arasında değerler alır. En büyük alabilinecek değer 1 dir. Daha öncede belirtildiği gibi açılar için 16 bitlik bir register kullanmalısınız. 180 derecenin karşılığını 2^16 = olarak belirtmelisiniz. Bu durumda 90 derece 2^16/2 yani 15 bite karşılık gelecektir. Tabloda tuttuğunuz Sın değerleri ise 0,1 arasında olmayacak elbetteki. En büyük sin değeri 90 derece için, sizin bobine uyguladığınız Sin acı Pozisyonu ile tablodan okuduğunuz değerin çarpımı PWM peryot registerine eşit olabilecek şekilde ayarlamalısınız. Noktalı sayılarla işiniz yok.

7) Bobine uyguladığınız Açı değeri=A ise, Tablo değer sayınız = 256 ve enterpolasyonuda katarsak 256*256 ise=T=65536, ve çıktığınız PWM sample miktarı Smik=4 ise (Yüksek bir hız) bu değişendir hıza göre arttırılabilir., PWM base frekansı PWMPeryot=20Khz, ve atmanız gereken adım = X ise,

Sonraki Açısal tablo değrinizi
 A=(A+X) And ((2^16)-1) ileri
 A=(A-X) if A<0 then A=A+(2^16)
diyerek Sonraki tablo değrinizi okumalısınız. A 16 bitlik bir register olduğundak üst sekiz bit tablodaki 256 değri ifade ederken, alt sekiz bit ise enterpolasyonla alacağınız değeri ifade edecektir.

PWM değerlerini 180 derece sonunda update edecek ve
Sinus 180 derece frekansı=Smik*PWMPeryot olacaktır.
Burada mikro adım miktarınızda,Hız değerinize bağlı olarak ilerlemeniz gereken X değerlerini bulacaksınız. Daha ayrıntılı olarak belirtmeğe gerek duymadım.

5) 1 motoru sürebilmek için en az 2 adet PWM kanalına ihtiyacınız olacak. 1.PWM A bobinine, 2.PWM B bobinine gidecek. İnternette hazı hesapları yapılmış 20Khz lik snubber filtreler Public. H bridge sürücülere snubber ile filtreleyebilirsiniz.

6) Bir dac ile motorlara uyguladığınız voltaj değerini açıp kapatmalısınız. Bu sizin Standby modunda motorlarınızı hem az ısıtacak hemde Resonans frekansında Torku arttırmanızı sağlayarak yüksek hızlara çıkmanıza yardımcı olacaktır.

Motora microstep arttırmanın Software olarak kolayca yolu bu. Şu an eksik hiçbir nokta görünmüyor.  Program sanılabileceği kadar uzun kodlar içermiyecek. Sadece biraz formülasyonlar olmalı.

Örneğin PWM değerlerinin interrupt içinde update edebilirisniz. Hızlanma yavaşlama interpolasyon işlemlerini ise interrupt dışında ayarlayıp dönel bir mem içinde tutabilirsiniz. Örneğin siz PWM değerini updat ederken içeride her sinüs için 16... veya daha fazla miktarda sonraki duty değerlerini tutabilirsiniz.

Akım kontrolü yapmak isteyecek arkadaşlar ADC den geri besleme almaları gerekebilir. (Hazır Full bridge kullanmazlar ise)

Terorik olarak şu an vardığım  son nokta bu. Sanırım bu nokta pratiğe geçmedikçe kolay kolay değişmez. Çünkü tüm taşların yerine oturduğu görünüyor.

:D  :D  :D

Macera

mahoaga

İki adet PWM modülü ile açık devre kontrol yapmayımı düşünüyorsunuz?
"Art without engineering is dreaming; engineering without art is calculating." -- Steven K. Roberts

mahoaga

@Macera

2 adet PWM modülü standart PIC serisi entegrelerde bulunuyor. Örneğin 18F252,18F452 ..... ancak ben aynı anda 3 veya 4 motoru bir arada sürmeyi düşünüyorum. Indexer diyebiliriz. 2 PWM kanalı ile yapılabileceğini, basit microstep sürücü yapmak isteyen arkadaşlar için belirttim. Ancak bu CPU larda bölme işlemi yok. Sinüs üretimi sırasında yoğun matematiksel işlemler gerekebilir. 32 bit Çarpma/Bölme..... Ayrıca bu normal MCU lar oldukça yavaş. PWM peryodu başına 500 cycle komut hakkı olmakta. Benim kullanacağım işlemci ise hem 30MIPS hemde 8 PWM kanalı bulunduruyor. O nedenle aynı anda 4 motoru sürebilirim. Ayrıca matematiksel işlemleri 16 bit olup çarpma/bölme .. gibi işlemleri tek cycle de işleyebiliyor.

Macera

mahoaga
Anladığım kadarı ile chopper kullanmıyacaksınız.
Tork sağlamak için yüksek voltaj ilemi süreceksiniz motorları?
Yüksek voltaj ile sürecekseniz akımı nasıl kontrol altına almayı düşünüyorsunuz?
"Art without engineering is dreaming; engineering without art is calculating." -- Steven K. Roberts

mahoaga

@Macera

Chooper ile sürmeyeceğim doğru. Özel bir kontrol entegresi kullanmayı düşünmüyorum. (L297 gibi). Olayı çözümleyen tamamen Software. Mikroişlemci dediğim gibi 8 kanal PWM çıkışına sahip. Motorlara DAC ile ayarlanacak olan bir DC voltaj girecek. Bu motorun tipine göre değişebilir. 40-50VDC gibi.

PWM darbeleri ile Sinüsodial bir Akım eğrisi ile vermeyi düşünüyorum. Sin/Cos eğrileri üstte belirttiğim mantıkla CPU tarafından PWM darbeleri ile çizilecek. Böylece bobinlerin karakterleri gereği en uygun çalışabildikleri Sinüsel akım verilmiş olacak. Motor hem verimli sürülecek hemde hassas Microstep adımlar atılabilmiş olacak.

Macera

mahoaga
Sorumu şöyle soracam.
Motorunuz voltajı ile besleme geriliminiz eşitmi yoksa
motorunuz voltajı besleme geriliminin 5 yada 10 da birimimi ?
Eğer LMD18245 kullanacaksanız IC nin içindeki chopper tekniğini zaten kullanıyorsunuz.
"Art without engineering is dreaming; engineering without art is calculating." -- Steven K. Roberts