POT ile Servo Motor Kontrolü

Başlatan SK, 01 Mayıs 2014, 19:26:09

SK

beyler, 5 tane servo motor aldım. Bunları pot ile sürmem gerek ancak programını yazamadım.5 ini aynı anda kontrol etmeden önce ilk olarak RB0 pinindekini kontrol etmeyi deniyorum ama olmuyor. Forumda da aradım ancak CCS C dilinde yazılmışını bulamadım, yardımcı olabilecek varmı?



KODLAR;

#include <16f877A.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#device ADC=10  // 10 bitlik ADC kullanılacağı belirtiliyor.
#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
#define fast_io_a
#define fast_io_b
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD,STVREN

int i;
int a,potvalue;
void main ( )
{
   setup_spi(SPI_SS_DISABLED);     
   setup_timer_1(T1_DISABLED);
   setup_ccp1(CCP_PWM);
   setup_timer_2(T2_DIV_BY_16,124,1);  // Timer2 ayarları yapılıyor
   enable_interrupts(GLOBAL);          // Tüm kesmeler aktif
   
   set_pwm1_duty(50);                // PWM1 çıkışı görev saykılı belirleniyor
   set_tris_a(0xFF);
   set_tris_b(0x00);  


   output_b(0x00);
   while(true)  
   {

          set_adc_channel(0);
          delay_us(20);
          potvalue=read_adc();
          a=potvalue*10+600;
          if (a>2600) {
          a=2650; }
          
          for (i=0;i<50;i++)
          {
          output_high(pin_a0);
          delay_us(a);
          output_low(pin_a0);
          delay_us(20000-a);
          }
 
}
}

gökhan_

set_adc_channel(0);
ilk olarak bu kısımda hata var. pin A0 ı adc okumak için kullanıyor burası
setup_adc_ports(AN0_AN1_AN2_AN3_AN4); olarak değiştirmelisin

SK

cevabın için teşekkürler,denedim ama olmadı :/

Salih

Alıntı yapılan: SK - 01 Mayıs 2014, 20:52:21
cevabın için teşekkürler,denedim ama olmadı :/
Osiloskopla istediğin dalga şekli çıkıyormu bakarmısın.

xfrieyt

Aldığınız servolar R/c mi digital mi ? ayrıca ilk defa 2600 ms palsi gördüm. ben pot ile çok defa kullandım.2 ms olarak . analog değeri 5/1024 ile çarparak voltaj değeri oluşturun bunu 400 ile çarpın . yada 200 ile çarpıp 1000 ekleme yapın(TAmamen hassasyet amaçlı. ) Ve R/c servolarda delay_ms değeri low için 20ms dir. değişmez. digital ise yaptığınız gibi. pic ile motoru farklı kaynaklardan besleyin. İyi çalışmalar.

SK

#5
adlığım servo motorlar http://www.hobbyking.com/hobbyking/store/__16269__hk15138_standard_analog_servo_38g_4_3kg_0_17s.html
bugün başka bi program yazıp denedim ama biraz sorun var, sorun da şu şekilde;

Potansiyometre ile PWM üretme (konum sorunu)

programı ve devresi de şu şekilde;
#include <16F877A.h> 
#device adc=8 
#fuses XT,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP 
#use delay(clock=4000000)

//================================ 
void main() 
{ 
int8 value; 

setup_ccp1(CCP_PWM); 

setup_timer_2(T2_DIV_BY_16, 255, 1); 

setup_port_a(AN0); 
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0); 
delay_us(20); 

while(1) 
  { 
   value = read_adc(); 

   set_pwm1_duty(value); 
  } 

}


devresi;
http://i.hizliresim.com/qq5Y0q.jpg

yardımcı olabilecek arkadaşlar varsa 4 gozle bekliyorum.

Salih

ADC ile okuduğun değeri 3 bölüme ayır örnek, 0-75 , 76-150, 151-255 gibi.
BU aralıklardan birincisi için motor sola döndürme görevi ver.
Ve pwm ile gerekli sinyali üret.
ikinci kısma motor orta konumda durma görevi ona göre bir pwm sinyal üret.
üçüncüsü için sağa dönme ile ilgili pwm değeri ürettir.
Böylelikle kararsız çalışma alanı bırakmamış olursun.
Kullandığın servo'nun gerekli pwm değerlerini araştırmanı tavsiye ederim.

SK

takıldığım yer şurası;

Alıntı yapılan: salih - 29 Haziran 2014, 13:27:35
BU aralıklardan birincisi için motor sola döndürme görevi ver.
Ve pwm ile gerekli sinyali üret.

adc ile okunan değeri 3 aralığa ayırmayı ve ona göre pwm üretmeyi şu şekilde yapabiliriz;
while(1) 
  { 
   value = read_adc(); 
   if (0<value<=75){
   set_pwm1_duty(value);} 
   if (76<value<=150) {
   set_pwm1_duty(value); }
   if (150<value<=255) {
   set_pwm1_duty(value); }
  }

kolay ancak sola döndürme emrini nasıl vereceğim?

Salih

eğer senin servo çok farklı değilse sağa, sola dönme ve sabit durma  pwm'nin on olma süresine bağlıdır.
Aşağıda örnek bir sinyal var, senin servoya uyarmı bilmem. Ama bir fikrin olsun diye veriyorum.


SK

gecikmeli cevabım için kusura bakmayın, dediğnizi anladım ama çözünürlüğü programsal olarak nasıl halledebilirim?

Salih


SK

bi başka forumda aynı sorun için çözümün pwm çözünürlüğünden kaynaklandığını, artırılması gerektiğini okumuştum.

Salih

Alıntı yapılan: SK - 03 Temmuz 2014, 00:43:04
bi başka forumda aynı sorun için çözümün pwm çözünürlüğünden kaynaklandığını, artırılması gerektiğini okumuştum.

Kullandığın servo'ların pwm özelliklerini öğrendin mi?
Eğer öğrendi isen ona göre çözüm bulalım.

SK

bulabildiğim tüm özellikleri bunlar;

Spec.
Torque: 3.8kg @ 4.8v, 4.3kg @ 6v
Weight: 38g
Speed: 0.21 / 60deg @4.8v, 0.17 / 60deg @ 6v
Voltage:4.8v~6v
Plug: JR Style

Torque: 3.8kg @ 4.8v, 4.3kg @ 6v
Weight: 38g
Speed: 0.21 / 60deg @4.8v, 0.17 / 60deg @ 6v
Spec.Torque: 3.8kg@ 4.8v, 4.3kg @ 6vWeight
Speed: 0.21/ 60deg @4.8v, 0.17 / 60deg @ 6vVoltage

Salih

Serdar Çiçek Hocanın kitabın da verdiği RC Servo örneğini veriyorum.
Aşağıdaki link den indirebilirsin.

https://dl.dropboxusercontent.com/u/20087162/Pic_Program/R_C%20Servo%20Motor%20Uygulamas%C4%B1.rar