Servo Motoru CCS kodlari ile nasil kontrol edebilirim?

Başlatan Digimensch, 01 Ekim 2006, 22:36:49

Digimensch

Potansiyemetre ile kastin Servo icindemi?
Devrede Potonsiyemetre yok !!
Devre su yanliz Buttonlari kurmadim.Cünkü Motorun calistigi an kodda'da oldugu gibi  sola ,ortaya,saga seklinde devamli hareket etmesini istiyorum.Devre su:


Bende 4 adet Servo var hepsinde ayni sonuc.ISIS'de similasyon ettigimde cok güzel calisiyor.
Ama gercek anlamda TestBoard'da motor sadece sola dogru dönme egilimi gösteriyor.Taa ki mil son noktaya gelinceye kadar.
Bu sorun neyden kaynaklaniyor olabilir?

kurumahmut

çalışmaları gerek acep servoyu sürecek akım mı yetmiyor...

kıpırdamalar oluyor sadece demişsin...

edit..

pardon sola dönüyormuş...

kurumahmut

problemin yazılımsal..........

mesela 2ms lojik 1 uyguladıktan sonra 18ms lojik sıfır uygulamamışsın. Bu neden le 20ms lik kare dalgalar yollayamıyorsun. kodunda da önce sol koşuluna baktığın için sadece sola dönüyor...

void main() 
{ 

   set_tris_b(0x00); 
   set_tris_a(0xFF); 

   //orta sağ sol butonlarını oku ve basılanı 1 diğerlerini 0 yap...

   //20ms lik kare dalganın 1süresini ayarladığın gibi 0 süresini de ayarlamalısın...
   

   for(;;) 
   { 

   	if (orta == 1)  
   	{
   
         high; 
         delay_us(1500);    // servoya 1,5ms'lik sinyal gönderiliyor  "Ortaya" 
         low; 
         delay_ms(18); 
         delay_us(500);
         continue;
      }   

   	if (sola == 1)  
   	{
         high; 
         delay_ms(1);    // servoya 1ms'lik sinyal gönderiliyor "Sola" 
         low; 
         delay_ms(19); 
         continue;
      }


   	if (saga == 1)  
   	{
         high; 
         delay_ms(2);    // servoya 2ms'lik sinyal gönderiliyor "Saga" 
         low; 
         delay_ms(18); 
         continue;
      }
        
     
   } 
}

mcan

birde 54.7 hz yada 55 hz ile pwm oluşturup 1.5 ms ile 2 ms arasında değişen darbeler kullan bendekinde 1.9ms de tam sola/sağa dönerken 1.5 ms ile zıt tarafa dönüyordu bu şekilde deneyebilirsin osiloskop olmadığndan kesin olarak ölçemedim bulunca kesin değerleride yollarım

Digimensch

Öncelikle cevaplariniz icin tesekkürler.
Ben Servoyu Buttonlara basarak değilde , Devamli ayni 3 hareketi sonsuz döngüye girerek devamli yapsin istiyorum.
Yani Sol-orta-sag tekrar Sola-ortaya-saga yani bu hareketi hep tekrarlasin istiyorum.
Ozaman su sekilde deneyim olacakmi?

void main() 
{ 

   set_tris_b(0x00); 
   set_tris_a(0xFF); 

   for(;;) 
   { 
  
         high; 
         delay_ms(1);    // servoya 1ms'lik sinyal gönderiliyor "Sola" 
         low; 
         delay_ms(19); 
         continue; 
      
         high; 
         delay_us(1500);    // servoya 1,5ms'lik sinyal  "Ortaya" 
         low; 
         delay_ms(18); 
         delay_us(500); 
         continue; 
      
        
         high; 
         delay_ms(2);    // servoya 2ms'lik sinyal gönderiliyor "Saga" 
         low; 
         delay_ms(18); 
         continue; 
      
   } 
}

Digimensch

Sonunda olayi söyle cözdüm ama yinede Motoru  orta'dan sola dogru 90°
ortadan saga dogru 90° dönmesini saglayamadim.
Yani motoru sol 90°+sag 90°=180 ° 'lik sol - sag yaptirmak istiyorum.
Söyle bir Kod yazdim:
#include <16f84a.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)
#byte PORTB = 6

void saga();
void sola();

main(void)
{
SET_TRIS_B(0);
PORTB = 0;
for(;;)
{
sola();
delay_ms(50);
saga();
delay_ms(50);
}
}

void saga()
{
int x;
for(x=0;x<=20;x++)
{
output_high(PIN_B0);
delay_us(1000);      // servoya 1ms'lik sinyal gönderiliyor sola dönmesi icin
output_low(PIN_B0);
delay_us(19000);
}
}

void sola()
{
int x;
for(x=0;x<=20;x++)
{
output_high(PIN_B0);
delay_us(2000);      // servoya 2ms'lik sinyal gönderiliyor saga dönmesi icin
output_low(PIN_B0);
delay_us(18000);
}
}


Bu yukardaki Koda göre Motor su yükledigim FILM'deki gibi hareket ediyor.Yani sola yaklasik 22° + saga yaklasik 22°= 44°.
SERVO MOTOR

Oysa ben sol90+sag90=180° lik sol - sag hareketi istiyorum.Bunu nasil saglayabilirim?Kodda nereyi degistirmem gerek?

kurumahmut

şöle bi şey yapmayı denermisin. Servoyu sadece while döngüsü içinde bi tarafa dönemeye zorla. Yani devamlı sağa donmesi için fonksiyon yaz. belki de 20ms de bir yeni konuma geçemiyordur. Eğer tam 90derece bu şekilde dönerse ki bence olacak. 20ms de bir değilde bir kaç 20ms de bir başka konuma aldırırız. Bölece yeni hareketini tamamlayabilmesi için ona süre tanımış oluruz....

kolay gelsin....

Digimensch

@karamahmut,
Hocam dedigin gibi sadece saga dönme olayini su sekilde yaptim.

#include <16f84a.h> 
#fuses XT,NOWDT,NOPROTECT 
#use delay(clock=4000000) 
#byte PORTB = 6 

void saga(); 

main(void) 
{ 
SET_TRIS_B(0); 
PORTB = 0; 
for(;;) 
{ 
saga(); 
} 
} 

void saga() 
{ 
int x; 
for(x=0;x<=20;x++) 
{ 
output_high(PIN_B0); 
delay_us(2000);      // servoya 2ms'lik sinyal gönderiliyor saga dönmesi icin 
output_low(PIN_B0); 
delay_us(18000); 
} 
}


Motor mili sadece yaklasik 45° kadar sapma yapiyor.
Yani 90° asla olmuyor.Haa el ile Servo milini dönderdigimde 90° saga 90° sola toplam 180° dönme payi var.
Ama ne hikmet ise kodlarla bir türlü yapamadim.

kurumahmut

for gibi döngü sınırı koyma while(1) ile devamlı puls ver. Motor gerçekten kontrol edilebiliyor mu bunu tespit edelim. Yukada bi yerde tam sola dönüyor demiştin. Bi emin olmak için while ile dene... Eğer oluyorsa tam sağ yani 90derece. for döngüsündeki 20değeriini arttırmalısın. 20*20ms = 400ms bile tam sağ yapmak için yetmiyor olabilir... Eğer tam döönebiiyorsa yazılımla Tam dönme için gerekli süreyi bulmalıyız.

  while(1) 
   { 
      output_high(PIN_B0); 
      delay_us(2000);      // servoya 2ms'lik sinyal gönderiliyor saga dönmesi icin 
      output_low(PIN_B0); 
      delay_us(18000); 
   }



edit:

for(;;)
{
saga();
}
}

burayı kaçırmışım. Şu aşamada sorunu başka yerde aramalısın... bi de sol için dene...

Bi de bu servo süreleri standart mı bunu araştır... Artık problemin donanımal gibi duruyor..... Bi de :D servoyu tam sağ ya da sol yapabilmek için gerekli akım nedir bunu araştır...

Digimensch

Peki dostum zaten konuda cok uzadi.
Elimdeki servo minik model servo.

z

Alıntı yapılan: "Digimensch"Sonunda olayi söyle cözdüm ama yinede Motoru  orta'dan sola dogru 90°
ortadan saga dogru 90° dönmesini saglayamadim.
Yani motoru sol 90°+sag 90°=180 ° 'lik sol - sag yaptirmak istiyorum.
Söyle bir Kod yazdim:
#include <16f84a.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)
#byte PORTB = 6

void saga();
void sola();

main(void)
{
SET_TRIS_B(0);
PORTB = 0;
for(;;)
{
sola();
delay_ms(50);
saga();
delay_ms(50);
}
}

void saga()
{
int x;
for(x=0;x<=20;x++)
{
output_high(PIN_B0);
delay_us(1000);      // servoya 1ms'lik sinyal gönderiliyor sola dönmesi icin
output_low(PIN_B0);
delay_us(19000);
}
}

void sola()
{
int x;
for(x=0;x<=20;x++)
{
output_high(PIN_B0);
delay_us(2000);      // servoya 2ms'lik sinyal gönderiliyor saga dönmesi icin
output_low(PIN_B0);
delay_us(18000);
}
}


Bu yukardaki Koda göre Motor su yükledigim FILM'deki gibi hareket ediyor.Yani sola yaklasik 22° + saga yaklasik 22°= 44°.
SERVO MOTOR

Oysa ben sol90+sag90=180° lik sol - sag hareketi istiyorum.Bunu nasil saglayabilirim?Kodda nereyi degistirmem gerek?


Kodlarinda biraz degisiklik yaptim bir de bunu dene

#include <16f84a.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)
#byte PORTB = 6

void saga();
void sola();

main(void)
{
          SET_TRIS_B(0);
          PORTB = 0;
          for(;;)
             {
               sola(10);    // Yuzde 10 saga
               saga(60);  // Yuzde  60 sola
             }
}

void saga(int k)
{
int x;
          for(x=0;x<=200;x++)
             {
               output_high(PIN_B0);
               delay_us(k*100);      
               output_low(PIN_B0);
               delay_us((200-k)*100);
             }
}

void sola(int k)
{
int x;
           for(x=0;x<=200;x++)
              {
                output_high(PIN_B0);
                delay_us((200-k)*100);
                output_low(PIN_B0);
                delay_us(k*100);      
              }
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Digimensch

@bunalmis ustam,
Kod calisti yanliz Motor sadece sola dönme yapiyor.
Yani motorun mili hangi pozisyonda olursa olsun motor tam olarak sola dogru en son konuma kadar dönüyor ve duruyor.
Ve ayrica Funksinlarin tanimlandigi yerde
void saga(); 
void sola();

yazmissin orayi
void saga(int k); 
void sola(int k);

seklinde degistirdim.Herhalde gözünden kacti.
Neyse kod dedigim gibi motor milini en sola ceviriyor tekrar saga dönme olmuyor gibi görünüyor.
Acaba
              sola(10);    // Yuzde 10 saga 
               saga(60);  // Yuzde  60 sola

Kismindaki oranlari degistirsem yari yari yapsam olay düzelirmi?

z

Evet fonksiyon tanimlamalarinda int tanimini yapmak gozumden kacmis.
Asagidaki kirmizi renkli satirlarin sirasinda hata yapmis olmayasin.

void saga(int k)
{
int x;
         for(x=0;x<=200;x++)
            {
              output_high(PIN_B0);
              delay_us(k*100);    
              output_low(PIN_B0);
              delay_us((200-k)*100);
            }
}

void sola(int k)
{
int x;
          for(x=0;x<=200;x++)
             {
               output_high(PIN_B0);
               delay_us((200-k)*100);
               output_low(PIN_B0);
               delay_us(k*100);    
             }
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

void tara()
{
int x,t;

for(t=0;t<=20000;t=t+100)
{
   for(x=0;x<=20;x++)
      {
         output_high(PIN_B0);
         delay_us(t);
         output_low(PIN_B0);
         delay_us(20000-t);
      }
}


Bu rutin yaklasik 80 sn icinde servoyu bir bastan diger basa kadar hareket ettirmeli. Scop ile gercekten 20 ms lik peryod varmi ona bakmak lazim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z



Yalniz picusta burda aciklamis. Ben senin kodlarda oynadigimda bunu gormemistim.

O zaman verdigim kodlar da hatali cunku verdigim kodlar %50 orta konuma
%0 bir uca %100 de diger uca gonderecek sekilde.

Genede bir onceki mesajimda verdigim tara fonksiyonunu denediginde zamanlamalar bir sure icin yukaridaki animasyondaki hareketi yaptiracaktir.

Eger saga ve sola donusleri gozlemlediysen kodda degisiklik yapilir ve senin sorun biter.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com