Servo Motor Kontrolu Puls Sureleri

Başlatan fdapp, 09 Mayıs 2011, 20:24:46

fdapp

Merhaba 16f877a pic ve 20 Mhz osilator kullaniyorum. Servo kontrolu icin PULSOUT komutunun gerektirdigi puls sureleri hesaplarima gore soyle oluyor.

20 Mhz kristal ile pulsout komutunun genislik birimi 2 us.
1ms [-90 derece]:
1ms = 1000 us
1000/2 = 500

1.5ms [0 derece]:
1.5ms = 1500us
1500/2 = 750

2ms [+90 derece]:
2ms = 2000us
2000/2 = 1000

Hesaplara gore PULS araliginin 500 - 1000 olmasi gerekirken, devrede bu aralik 250 - 1250.
Bunun sebebi nedir? Hesaplarda bir yanlislik mi var?

Tesekkurler.

muat

Merhaba

Bu 250-1250 aralığını osiloskopa bakarak mı, yoksa servonun konumuna bakarak mı buldunuz?
Bazı servolar farklı aralıklarda çalışır, mesela sizin servonuz 500 us'de -90da, 2500 us'de +90da olabilir.
Bulabilirseniz servonun teknik verilerinde yazıyor olabilir bu durum.

fdapp

Kullandigim servonun detayli teknik verileri yok elimde malesef ama servo asagidaki linkteki
http://www.hobbyking.com/hobbyking/store/uh_viewItem.asp?idProduct=16266

250-1250 araligini servoyu gozlemleyerek kesfettim. 250us tam -90derece ama 1250 de servo +90 dan daha fazla gitmeye calisiyor kitleniyor.

Ayrica 750 de servo 0 derecede duruyor, dolayisiyla servom 500 - 2500 araliginda olsa idi 750us de -22.5 derecede durmasi gerekmez miydi?

muat

250-1250 aralığını programa girdiğiniz (pulsout) değer olduğunu düşünmüştüm. Eğer pulsout komutuna girdiğiniz değer 750 olursa, birim genişliğin 2 us olduğunu düşünürsek bu 1500us eder, bu da 500-2500us pulslar ile çalışan bir servo için de 0 derece olur.

fdapp

Evet. PULSOUT komutuna 250 - 1250 arası deger verıyorum, o halde benım servom sizinde dediginiz gibi 500-2500 arasında calısmakta. Buraya kadar sorun yok ancak yeni bir sorunla karşılaştım. Amacım devrede bır led yakıp sondurdukten sonra servoya tek bir puls vermek. Bunu için yazdığım program soyle:

@ DEVICE pic16F877a                 
@ DEVICE pic16F877a, WDT_OFF             '
@ DEVICE pic16F877a, PWRT_ON           
@ DEVICE pic16F877a, PROTECT_OFF
@ DEVICE pic16F877a, HS_OSC

define OSC 20
ADCON1=7 ' VEYA ADCON0 idi tam hatırlamıyorum kafamdan yazıyorum kodu. Ancak analog dijitale donusuyor.
CMCON=7
PORTA=0
TRISA=0
PORTC=0
TRISC=0

main:
HIGH PORTC.0
PAUSE 500
LOW PORTC.0
PAUSE 20
PULSOUT PORTA.0,250
END


Ben bu programı proteus ta çalistırdğımda istediğim sonucu alıyorum, ancak devrede çalistırdıgımda servo belirtilen konuma duraksayarak gidiyor (bu arada ledlerde yanıp sonuyor surekli). Yani PULSOUT komutu kendinden onceki satırlarla beraber bir donguye giriyor.

Bunun sebebi ne olabilir?
Kafamda bir kac fikir var, Mesela
devremin surekli kendine reset atması gibi, ama bu olay sadece PULSOUT kullandığımda oluyor. Sadece led yakıp söndursem bir kez yanıp sondukten sonra islem bitiyor.

İlgilendiğiniz için teşekkur ederim.

fdapp

Arkadaşlar, yok mu bir fikri olan
Güç kaynağımda bir sorun yok, amper sınırlaması düşük değil, bi msj önce attığım kodda puls aralıklarını 20ms olacak şekilde dongu de yaptım.
Sonuc aynı pıc kendini resetliyor. Son çarem motorları devrenin dışından beslemek, bunu yapmadan önce, en azından bir fikriniz varsa paylaşın lütfen, zamanım tükeniyor. Teşekkür ederim

ete

Pulsout komutunun çalışma şeklini açıklamak gerek sanırım.
PULSOUT PIN,100  şeklinde bir komut verdiğiniz zaman Port pininden 100x10us=1000 us=1ms lik HIGH puls'ı çıkartıyor.
Sizin yukarıdkai hesaplarınızda sanki 1000/2= 500 us HIGH ve 500 us LOW sinyali çıkartılıyor gibi bir anlayış hissediyorum.
Genelde ne kadarlık bir puls verecekseniz o süreyi us cinsinden 10 a bölerek komuta vermeniz gerekir.(4 Mhz kristal için geçerlidir)

İsis servoları 0,5 - 2 ms yani 500 us - 2000 us puls aralığında çalışır. Piyasadakiler 200us 2500 us aralığında çalışabiliyor. Üstelik bunlar benim gördüklerim.  Bu nedenle sizin elinizdeki servoya değişik puls aralıklarını vererek gerçek hareket sürelerini bulabilirsiniz.

Ancak süreleri dedğim mantık ile verin.
İki pulsout süresi arasında 20 ms lik bir pause olsun yeterlidir.
Yazdığınız program sonuna END koyar ve tek bir pulsout verirseniz wdt pici restleyerek baştan yeniden başlatır.
Bu nedenle bana kalırsa aşağıdaki gibi bir program denemenizde yarar var.
X=50
BASLA:
   PULSOUT PORTA.0, X
   pause 20
   IF PORTB.0=0 then
       X=X+10
      IF X=250 then x=50
   ENDIF
   GOTO BASLA

Burada PORTB.0 da bir buton olduğunu varsaydım. Butona her basışta PULS süresini 100us artırmış oluyoruz.
Böylece uygun değeri yakalayabilirsin.

Unutma sürekli aynı süreyi puls olarak verdiğin müddetçe motor tek seferde konum değiştirir bir daha değiştirmez bu nedenle programı END ile sonlandırmak yerine GOTO BASLA demende yarar vardır.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

jackal183

ayrıca aklında bulunsun isisteki servoları kendi servon şeklinde yapabilirsin, isiste servo motorun üstüne çift tıkladığında +90 ve -90 derece için pulse sürelerini yazabileceğin bir yer vardır, bu yerdeki değerleri kendi servon şeklinde düzenlersen artık isis üzerinde simülasyonunu yapabilirsin, ancak şöyle birşey var, isis üzerindeki simülasyon tek bir kez darbe gönderdiğinde istediğin açıya gider, ama gerçekte tek bir darbeyle gitmez, bunun için döngü içerisinde o konuma gitmesi için gereken darbeyi ete hocamın gösterdiği şekilde göndermelisin

fdapp

Hocam,
20 mHz kristal kullaniyorum dolayisi ile pulsout PIN,500 1ms ye tekabul ediyor bende. Bu konuda sorun yok servom 0.5 - 2.5 ms arasinda  calisiyor, dolayisiyla 250 - 1250 arasi pulsout a girdigim degerler.
Sorunum servoya tahrik verildigi an pic reset oluyor ve WDT kapali programda. Kodu degistirip anlatmaya calisiyim hemen.
@ DEVICE pic16F877a                     
@ DEVICE pic16F877a, WDT_OFF             
@ DEVICE pic16F877a, PWRT_ON           
@ DEVICE pic16F877a, PROTECT_OFF
@ DEVICE pic16F877a, LVP_OFF
@ DEVICE pic16F877a, HS_OSC
DEFINE OSC 20
PORTC=0
TRISC=0
ADCON1=7
CMCON=7
PORTA=0   
TRISA=0
n var word


FOR n = 1 to 42
PULSOUT PORTA.0, 550
PAUSE 20
next

high PORTC.0 ' LED 1 YAK
pause 200
LOW PORTC.0 ' LED 1 SONDUR

PAUSE 5000

FOR n = 1 to 42
PULSOUT PORTA.0, 950
PAUSE 20
next

high PORTC.3 ' LED 2 YAK
pause 200
LOW PORTC.3 ' LED 2 SONDUR

END


Servolarim continous rotation icin modlandi 550 ve 950 degerleri tamtur sola ve saga donduruyor [Normal servo ile de PIC reset oluyor bu arada].
Dongulerin 42 olmasi yaklasik 180 derece donup durmasi icin.

Programin normal sartlarda 180 derece bi tarafa donup, led1 i yakip sondurup, 5sn bekleyip diger tarafa 180 derece donup led 2 yi yakip sondurup, islemi bitirmesi lazim.
Ancak program 180 derece saga donuyor, led1 yanip sonuyor, 5sn bekliyor, 2-3 derece sola donup tekrar 180 derece saga donmeye basliyor.
Anlicaginiz servoya puls verildiginde pic resetleniyor belli bir sure sonra (akim kararli hale geliyor), program devam ediyor. Taki 950 lik puls verilene kadar, orada tekrar resetlenip [bu arada cok az puls aldigindan 2-3 derece sola dondu], program basa sariyor.

Durum boyle, benim dusuncem bir sekilde servolarin sisteme gelen akimi ilk puls aninda cok dusurdugu bununda pic e yetmedigi yonunde. Yardimlarinizi bekliyorum.

iyildirim

Servolar sona dayanıp, motor zorlanıp, çok akım çekmesinden de kaynaklanıyor olabilir.
Servoların max ve min lerini orta noktaya yaklaştırmayı deneyin.. Servoyu 1000-2000 us aralığında çalıştırın..

Ayrıca normal servo (normali, anormali nedir anlamadım ama) ile de pic reset oluyor' dan besleme ile ilgili bir sorun olduğu sonucu çıkıyor ..




ete

Yukarıda verdiğin örnek programda, END satırından önce aşağıdakileri ekleyip yeniden çalıştırırmısın?

BEKLE:
            GOTO BEKLE
END

Bu şekilde programı END ile sonlandırmayıp pulsları yolladıktan sonra sonsuz döngüye sokacağız. Bakalım yine reset olacakmı.

Birde Brown_out reset sistemini iptal etmek gerekebilir. Servolar pic beslemesindenmi voltaj alıyor acaba?
Şayet öyle ise anlık akım çekilmesi besleme voltajını 4,5 altına düşürüyor olabilir. Bu nedenle ,
Programın başında yer alan sigortalara aşağıdaki satırıda ilave edermisin
@ DEVICE pic16F877A, BOD_ON

Bu şekilde bir dene bakalım. Sonuç ne olacak.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

fdapp

#11
Hocam
@ DEVICE pic16F877A, BOD_OFF
sigorta ayari problemimi cozdu, size cok tesekkur ederim. Ancak ben bu devrede 6 servo kullanmaktayim ve bunlarin 3 u ayni anda hareket edecek. Elektrik isinden cok anlamadigim icin bi konuyu danismak istiyorum. Sayet sistem bu ayarlarla devre uzerinden beslenirse ve guc kaynagimda amper kisitlamsi yoksa herhangi bir sorun yasar miyim?

Buna ilave olarak, devrede iki adet buton var PORTB.1 ve PORTB.2 ye bagli.
PORTB=0
TRISB=%00000110
komutlariyla giris olarak ayarladiktan sonra PORTB.1 = 1 kontroluyle butonu kullanamiyorum. Ancak butona bagli direnclere elimi yaklastirinca butonlara basilmis gibi etki ediyor. [Bu arada sanirim butonlar LOW da tutuluyor,Cunku PORTB.1=0 ile kontrol ettigimde surekli basilmis oluyor. ] Buton kontrolu icin kesme kullanmak zorunda miyim?
Biraz acemice sorular sormaktaysam beni mazur gorun. Tesekkur ederim.