pwm ile step motor kontrolü

isoment01

Üye
Katılım
26 Haz 2016
Mesajlar
197
Puanları
1
Yaş
32
arkadaşlar merhaba sizlere bir sorum olacak. ben ilk etapta küçük redüktörlü bir step motoru pals saydırarak ve adımlar arası delay time'ı azaltarak step motorda sınırlı da olsa hız kontrolü yaptım. Şimdi elimde 3nm lik 2 fazlı faz bası 2.7a akım gecen 1.8 step angle a sahip bir motorum ve driverim var. Bunu pwm ile sürmek istiyorum bu motorun pwm ile sürerken adım hesabını nasıl yapacagım. belirli bir tur donmesını ıstıyorsam bunu nasıl kontrol edebilirim ?
 
fıkır verebılecek bır arkadasımız yok mu ?
 
Driver, step-dir sinyalleri ile çalışan hazır aldığın birşey ise;

Motor 1 turunu 200 adımda tamamlıyor.
5.5 tur dönmesini istiyorsan 5.5 * 200 = 1100 puls göndermen gerek. Eğer half step veya mikrostep kullanıyorsan bir de onun çarpanı var. 8 mikrostep için 5.5*200*8 puls göndereceksin.

Pul üretme işini ya bir döngüde delay lerle yaparsın yada bir timer kurup timer kesmesinde step sinyallerini üretirsin.
Bir üst aşaması mikrodenetleyicin destekliyorsa donanımsal PWM modülü ile sabit on zamanlı, değişken frekanslı pwm üretip, yine pwm veya timer kesmesinde puls sayabilirsin.
İstediğin kadar puls olunca da timer'ı-pwm'i kapatırsın.

Bu işin birde hız konusu var. Biraz daha karışık sayılır.
Direkt yüksek hızlarda motor çalışmaya başlamaz. Minimum bir hızdan başlayıp, hızı arttırman gerekir.
Sonra puls saydığın timer kesmesinde veya belirli bir hız profiline uyabilmek için ikinci bir timer kesmesinde vs. hızı hesaplayıp pwm ürettiğin timer'ın periyot değerini sürekli güncellemen gerekir.
Motor yüksek hızdan bir anda sıfır hıza inemeyeceğinden birde yavaşlama algoritması gerekir.
Ayrıca gideceğin yol istenen hıza ulaşmak için yeterli olmayabilir durumu da var.


Hızı hesaplamak için;
rpm * (200 * mikrostep) /60 sana saniyede üretmen puls adedini verir.
6 rpm hız ve 8 mikrostep durumu için saniyede 160 puls üretmen gerekir.
Bu da 1/160 = 6.25 milisaniyede bir puls üretmen gerektiğini söyler.
600 rpm için 62.5mikrosec de bir.


Eğer hazır sürücü kullanmayıp, kendin driver yapmaya çalışıyorsan öncelikle bir step sürücü chip'in datasheet'ine bi bak. Bipolar sürücü için tb6560, unipolar sürücü için sla7026-sla7062 chiplere bakabilirsin.

Faz akımları nasıl sıralanıyor, akım kontrolü nasıl yapılıyor vs. gibi şeyler hakkında ön bilgin olduktan sonra devam ederiz.
 
hocam cok guzel cevaplamıssınız benım cok ısıme yarayacak şimdi sistemimin linkini burada verıyorum.
link: Sıstemı boyle calıstırmayı planlıyorum fakat ılk etapta buyuk cerceveyı panelın enı kadar yaklasık 1 metre goturup getırmeye calısacagım.
Rotora baglı tekerlek yarıcapı:20 mm ise
2xpixr=0.125m
1m/0.125m=7.95 tur yanı 8 tur atması gerek tekerın motor saftı ıle es merkezlı olduklarından saftında 8 tur atması gerek oluyor.
1 tam tur 200 adım ıse kı sıstemımın mıkrostep gerektırcek kadar hasssas oldugunu dusunmuyorum. Halfstepte gotururum gıbı gelıyor buda 400 adım eder.
8 tam tur yaptırırsam buda 2400 yapar. Bunu halfsteptekı 8 pals ile for dongusune sokarsam 0-600 arası for dongusu gıbı ıcınde 8 palsı donderırsem araya delay koyarsam bu mantık dogru olur mu ?
aklıma yatmayan kısım motorun rpmıne hıc gerek duymamıs olmam.
Ve en onemlısı driverda bır tane pulse bır tanede yon gırısı var puls dızısını mesela b portundan 4 bacaktan verırsem nasıl tek puls gırıslı olan bır drivera verecegım ? sanırım ılla frekansla olması gerek.
Sistemım belirli bir hız cok hızda gerektırmıyor stabıl orta mesafe bır hızda gıdıp gelıcek smdılık zaten vıdeoda gordugunuz uzere dura dura gıdecek ama ben motorumun torkunu denemek ıstedıgım ıcın tum sısteme once bır hareket vererrek gıdıp gelmesını ıstıyorum. Bu noktada sızce sıstemım soft start-stop gerektırck bır sıstem mı ? bence degıl gıbı.
Son olarak hocam pwm ile ya da timer ile hesabım dogru ıse 2400 pulsu benım nasıl gonderecegımı bıraz daha detaylı anlatabılr mısınız ? daha once pwm ıle tımerları dc motor surerken kullandım fakat burda baglantı kuramadım kafamda.
dip not :driverim tb6600
motor ozellıklerı:
Bipolar Tutma Torku: 3 Nm

Tel Sayısı: 8

Step/Tur: 200

Step Açısı: 1.8°
Flanj: 60 x 60 mm

Uzunluk: 86 mm

Ağırlık: 1.4 kg
Akım/Faz: 2.8 A

Direnç/Faz: 1.5 ohm

İnduktans/Faz: 6.8 mH
Rotor Ataleti: 840 gcm2
Çalışma Sıcaklığı: -20°C ÷ +50°C
Maksimum Isınma: 80°

bıraz uzun oldu fakat bana yardımcı olursanız cıdden projemde hayat vermıs olursunuz.
 
Son düzenleme:
20 mmlik tekerlek ile 8sn de bir uçtan diğerine gitmen yeterli olacaksa;
hızın 60 rpm buda full step için saniyede 200 puls eder.

Sisteminin ağırlığı nedir belli değil ama sanırım hızlanma vs.ye gerek olmadan direkt bu hızda kullanabilirsin.

Timer kurup 5 ms ye de bir kesme urettir. Kesme içinde kaç puls olduğunu say.
Kesmeden çıkmadan puls pinini high yap.
5-10 mikrosaniye bekleyip puls pinini tekrar low yap
Sayacın istediğin değere gelince timeri kapat.

Veya bunları bir döngü içinde pin-high, 10usec bekle pin low, 5ms bekle başa dön şeklinde de yapabilirsin.
Hız az gelirse 5ms lik beklemeyi düşür. çok gelirse bekleme süresinin arttır.

Mikrostep, half step vs. kullanırsan sa 5ms lik beklemeyi mikrostep sayısına bölersin. puls sayısını da çarparsın.

TB6600 sürücülerde genellikle akım ayarı bir pot ile yapılıyor. Önce sürücüde 2.8-3 amper gibi akımını ayarlarsın.
Enable girişini aktif etmezsen çalışmaz. Ya direkt bağla yada denetleyicinin bir pinini buna ayırabilirsin.

Port değil sadece tek bir pini high-low yapacaksın. Donanımsal pwm vs. kullanmayacaksan hangi pin olduğu çok önemli değil.

Mikrodenetleyici olarak ne kullanıyorsun.?
3.3V luk veya pin çıkış akımı düşük bir modelse tb6600 girişindeki optoları yeterince hızlı kullanamayabilirsin. Gerekirse araya uygun bir 74 HC(T)245 gibi buffer eklenebilir.
 
hocam 5v 18f4680 kullanıcam bır sorun olcagını dusunmuyorum. birde enable pinine picten bir pin baglayıp sureklı 5v mu vermem gerek ?

hocam bırde benım hesabım ıle sızın hesabınız cok farklı nasıl yaptıgınızı bana bıraz daha acık anlatır mısnız ?
ben smdı 20mm yarıcaplı bır teker ıcın 1 metreyı tekerın 8 turda atması gerektıgı hesabını yaptım 8sn degıl. motorla teker ortak eksenlı oldugu ıcın motorumda 8 tur donecek ve 1 tur yarım adımda 400 pulse ise 8 tur ıcın 3200 pulse eder. bu hesaba gore evet motorumun rpmi 60 rpm cıkıyor.

şöyle bir hesabım var :
3200 pulse (8 tam tur için): 1/400(1snde) --->2.5 ms yapıyor
tiimer0=10e6x(256)x(256-x)=2.5ms
x burdan 246 cıkıyor
timer0(246)
void timer0_kesme()
{
set_timer0(246);
output_high(pin_b1); // direction belirtttigim pin direk surucunun dırectıon bagacagına baglıcagım
i++;
if(i=3200)
output_high(pin_b0);
if(i=6400)
{
output_low(pin_b0);// yön bacagı
output_low(pin_bo);
i=0;
}
hocam dogru mudur ?
 
Son düzenleme:
Hesap aynı.
Farklı olarak 8snde 8 tur atacağı, saniyede 1 tur yani 60 rpm döneceği kabulü yaptım.
Birde, 60 rpm için eğer yükün çok ağır değilse hızlanma , yavaşlama fonksiyonlarına ihtiyacın olmayacağı kabulü.

Half step kullanacaksan, bir turun 400 adım. 1 saniyede 1 tur atacaksan dediğin gibi step puls frekansın 400 olacak. periyodun 2.5 ms .

timer peryodu hesabında yöntemin doğru ama sonuç hatalı. timer0 16 bitlik register. 246 sadece büyük değerli byte.
timer0 ı 1usec de bir sayacak şekilde ayarladı isen, (kullandığın kristal, PLL vs ye göre prescaler'i ayarlaman gerekir. ) 2500 tick de bir kesme üretmeli.
65536-2500 = 63036 , buradan high byte TMR0H =246 low byte TMR0L = 60 çıkar.

Kod:
uint16_t sayac = 0, hedef = 0;

void timer0_interrupt()
{
TMR0H = 246;
TMR0L = 60;
output_high(pin_b0);
delayu(20); // 20 usec bekle
output_low(pin_b0);
Sayac++;
if (sayac >= hedef)
   T0CON &= 127; //TIMER0 STOP
}

int main()
{
//kesmeleri aktif et.

INTCON |= 0b10100000; //global int ve TMR0 int aktif

output_high(pin_motor_enable);
delayms(100);

output_high(pin_b1);  // direction belirtttigim pin direk surucunun dırectıon bagacagına baglıcagım
//delayu(50);
// yön değiştirirsen kısa bir süre beklemen gerekir.
//Ama burda bir sonraki puls için zaten 2500 usec bekleniyor.

hedef  = 3200; //400*8
sayac = 0;
TMR0H = 246;
TMR0L = 60;
T0CON = 0b00100001; //timer0 16 bit + prescaler 4, 4mhz clock için ayarlı.
T0CON |= 128; //TIMER0 START
while (T0CON >127); // Hareket bitene kadar bekle

//başka hareket varsa aynı şekilde kodlarsın mesela başladığı yere döndürmek için
output_low(pin_b1);  // direction pin low, yön değiştirdik.
hedef  = 3200; //400*8
sayac = 0;
TMR0H = 246;
TMR0L = 60;
T0CON |= 128; //TIMER0 START
while (T0CON >127);// Hareket bitene kadar bekle

output_low(pin_motor_enable);//MOTOR DISABLE
while (1);
}
 
hocam Allah razı olsun bu armut piş azıma düş oldu, sizden hazır ıstemıs gıbı oldum ama ben meseleyı anladım hocam. eger anlamadan bu kodları dırek verseydınız kullanmazdım cunku bır yararı olmazdı fakat sımdı anladım asm olmasına ragmen tesekkur ederım hocam
 
Zaten sen hiç birşey yazmamış olsaydın bende yazmazdım.

Kodlar asm değil C.
MPLAB C18 veya XC8 de derlenebilir.

CCS den ise hiç anlamıyorum.
Ama CCS ye çevirmen gereken kısım sadece global ve timer0 kesmesini enable yapman.
Artı TMR0H TMR0L registerlerine yapılan atama.
Bununda karşılığı setup_timer0(peryot, prescaler) gibi birşeydir sanırım. Bi goggle la. Forumda CCS bilen arkadaşlarda konuya bi el atabilirler.
 
Evet aslında karıstırdım c ama ccs versiyonu değil dediklerinizi anladım. Allah razı olsun işiniz rast gitsin.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…