Pot ile Servo Motor Kontrolü

Başlatan jozzef, 20 Ağustos 2011, 20:18:13

jozzef

Merhaba arkadaşlar;
Elimdeki servo motor 0.55ms-2.50ms PWM'le 0-180 derece dönüyor. Servoyu potansiyometreyle kontrol etmeye çalıştığımda hiç bir tepki vermiyor!
Hyper terminaldan delay verdiğim süreyi doru şekilde okuyorum. Kodum aşağıda yardımcı olursanız sevinirim.

// Konfigürasyon Ayarları

#include <16f877A.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#device ADC=8
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay(clock=20000000)   // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor
#use fast_io(a)
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)
#org 0x1F00, 0x1FFF void loader16F877A(void) {}

// Değişkenler
unsigned int i;
unsigned int16 pot,angle;

// Ana Fonksiyon
void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(AN0);    
   setup_adc(ADC_CLOCK_DIV_32);             
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı
   
   set_adc_channel(0);	//POT AN0'a bağlı
   delay_ms(20);        // Zorunlu

   while(1)  // Sonsuz döngü
   {
   pot=read_adc();
   // POTu 5-250 arasında tutuyorum
   if(pot>250)
      pot=250;
   if(pot<5)
      pot=5;
      
   angle=550+(7*pot); // 1 derece için gerekli olan delay, 550us =0 derece

   for(i=0;i<50;i++)
   {
   output_high(pin_a1);
   delay_us(angle);
   output_low(pin_a1);
   delay_us((20000-angle));
   }

   printf("\n\rAngle:%lu",angle);//Hyper terminalden değerler doğru geliyor
   }
}


jozzef

Sorunu çözdüm,#use fast_io(a) kullandıktan sonra set_tris_a(0x01) yazmamışım.

ferdem

#2
Alıntı yapılan: jozzef - 20 Ağustos 2011, 20:18:13
#use fast_io(a)


Merhaba, fast_io(a) yazılmış ancak tris register a yazmadığınızdan servoyu sürmek istediğiniz pin_a1 girişe şartlı durumda.

Edit: Sorunu çözdüğünüzü fark etmeden yazmıştım. Kolay gelsin.

ahmetgokce01

merhaba ustam analog girişi set ettikten sonra    delay_ms(20); değil delay_us(20); olmalı birde    set_adc_channel(0);   //POT AN0'a bağlı
   delay_ms(20);        // Zorunlu while döngüsü içerisine sokmalısın
#device ADC=10 yaparsan çeviri çözünürlüğü artar bunları yaptıktan sonra devre büyük ihtimalle çalışacaktır.

isikyasar

proton dilinde 2 servo 2 pot ile yaptığım program var. işinize yararsa verebilirim program kodlarını. hatta 2x16 lcd de verileri gösteriyor alıcıda.

ahmetgokce01

http://www.projekur.com/wp/?p=120

bu adreste 7 adet pot ile 7 adet servo kontrolü sağlayan devre var denendi çalışıyor.

Gust

arkadaşlar ben de Pic 16f877 ile CCS C de 4 adet potla 4 adet servo motor kontrol etmeye çalışıyorum fakat yapamadım yardım ederseniz sevinirim...