RC servo motor hız ve çözünürlük ayarı hakkında

Başlatan nadiraybek, 29 Temmuz 2007, 18:46:35

nadiraybek

Herkese merhabalar,
forumda servo motor kontrolü hakkında bir çok döküman bulabildim fakat ya gözümden kaçtı yada pek üzerine değinilmemiş olsa gerek servo açısal hız ve açısal çözünürlük hakkında bilgiye ulaşamadım .
benim yaz okulundaki bitirme projem RC servo motorun hızı ve açısal çzöünürlüğünün ayarlanması üzerine bir proje. Şu ana kadar kullanmakta olduğum delay ler ile motoru sadece sağa yada sola döndürebiliyorum ( -90 , +90 arasında herhangi bir açıya ) .
İlk sorunum şu
1- servo yu 0-90 derece arasında kullanacağım durumda servo nun açısal çözünürlüğünün 5 derece ( yani 5 derece 5 derece hareketlendirme ) yapamıyorum . bunu yapmaya kalktığımda servo çalıştığı anda direk 5 derecede sabit kalmakta 90 dereceye kadar ileryememekte.

2- servo nun açısal hızını nasıl ayarlayabilirim ?

şimdiden yardımlarınız için teşekkürler

picusta

Hocam yardim etmek isterdim ama ortada kod yok, islemci ismi belirtilmemis, islemci ile mi yapmaya çalisiyosunuz 555 ile mi bilmiyorum (delay dediginiz herhalde derleyicini bir islevi ).
Size tavsiyem, yapabiliyorsaniz, dalga uzunlugunu islemcinin PWM çevrebirimi ile üretin.

Yazilimsal olarak yapmak için delay(x) islevinin tam olarak ne kadar sürecegini bilmelisiniz(araya kesme girmemesi lazim).
0.7ms ile 2.4 ms arasi dalga uzunlugu üretin (en uç degerler 270°) sonra en az 15ms bekleyin ve sinyali bu sekilde tekrar edin. (servo markasina göre degerler biraz degisebilir).
Açisal hizi tam olarak ögrenmek için servoyu sökün ve potansyometrenin orta ucunu çikarin. size açiyi verecektir. bu degerin türevini alirsaniz açisal hizi bulursunuz.
Açisal hizi kontrol etmek için ise gerekn komutu üretin.

nadiraybek

İlginiz için teşekkür ederim şu  anda yapabildiğim sadece buton kontrolü ile sağa yada sola motoru döndürebilmek .
boşta bir adet pic16f877 'im olduğu için bu pic i kullanıyorum. Henüz bir servo motor almadım öncelikle proteus da istediğim sonuçları alıp buna göre servo almak niyetindeyim . taib aldığım servoya göre mutlaka bir çok şey değişecek tir ama işin ana mantığı anlayabilirsem üstesinden gelebileceğimi düşünüyorum .

basit olarak servoyu sağa 90 derece ile döndüren kodun kısmı
for(i = 0 ; i < 5 ;++i)      
{  
bit_set(portb,7);  
delay_us(2400);  
bit_clear(portb,7);  
}  
burda 2.4ms ile motoru tam sağ 90 derece döndürebiliyorum. benzer şekilde delay i 600 us olarak verdiğimde sol 90 derece 1500 yaptığım dada motor ortalanmakta.

işin gerçeği ilk bakışta iç içe 2 adet for döngüsü ile bu işin içinden çıkabileceğimi düşünmüştüm. burda her delaydeki 10us lik artış yaklaşık 2 dereceye tekabul ettiği için ortalanmış motora içerideki döngüde 10 us lik artışlarla 2 şer derece atlayarak +90 derece açıya kadar gidebileceğini umuyordum fakat aşağıdaki gibi bir kod kullandığımda motor proteus da maalesef ters yöne gidiyor :S ve 2 derecelik artışlarda gözlenemiyor.
for(i = 0 ; i < 5 ;i++)      
{  
for ( j=1500 ; j<2400 ; j=j+10 )
bit_set(portb,7);  
delay_us(j);  
bit_clear(portb,7);  
}  
burda acaba for döngüsünün kullanımındamı hatalıyım diye düşünüp birde while kullandım fakat sonuç yine aynı .


for(i = 0 ; i < 5 ;i++)  
{
j=1500;
while( j<2400)
{
bit_set(portb,7);  
delay_us(j);  
bit_clear(portb,7);
j=j+10;
}
}

bu kodların çalışmaması nedeniye servo motorların genel çalışma prensiplerinde bilgi noksanlığım olduğunu iyice anlamış durumdayım . ilgin için tekrardan teşekkür ederim

picusta

üretigin sinyali osciloscope'da gözlemleyebiliyormusun ?
Bana kalirsa üretigin dalga 2400usn sürüyor sonra 1usn low kaliyor.
For döngünün içine 2. bir delay koy. 15 ms'lik.

volkii

sen for içinde çıkışı 1 yapıyosun sonra geciktiriyosun, sonra pini sıfır yapıp sonra hiç beklemeden gene bir yapıyosun ve bu böle devam ediyor:)

nadiraybek

selamlar
evet bahsettiğiniz gibi 15ms lik delayli halinide denedim fakat bir çözüme ulaşamadım. zaten yanlış anlamadıysam servo her 20ms lik çalışma periodundan sonra 15ms lik bir bekleme süresine ihtiyacı var.
for(i = 0 ; i < 5 ;i++)
{
for ( j=1500 ; j<2400 ; j=j+10 )
bit_set(portb,7);
delay_us(j);
bit_clear(portb,7);
delay_ms(15);
}

yukarıdaki 15 ms li halinden de bir sonuca ulaşamadım maalesef

teknikelektronikci

eger imkaniniz varsa proton diline gecin derim oarada servo lar icin özel bir komut var komutda "servo" komutu bununla belki daha cabuk sonuca ulasabilirsin kolay gelsin
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

picusta

yukarıdaki 15 ms li halinden de bir sonuca ulaşamadım maalesef
Ulasamadigin sonuç nedir?
gönderdigin kodda for'un {'sini unutmussun.
Devreyi breadboard'a kur derim.