flex sensör adc sorunu

Başlatan maeshlmaent, 22 Mayıs 2016, 18:34:34

maeshlmaent

16f877a ile robot el projesi yapıyorum. yazılımsal pwm üreterek pot ile beraber servo motorları sorunsuz bir şekilde çalıştırabiliyordum.Sonra flex sensör yaptım onu devreye bağladım fakat servolar tepki vermedi sebebini yazılımda formülize edemeyişime bağlıyorum.
ete hocanın http://etepic.com/index.php/topic,63.msg18224.html#msg18224 konusunda yazısınıda okudum fakat bir türlü beceremedim.
tavsiyelerinizi bekliyorum buda kodum : 
#include <16f877a.h>
#device ADC=10
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOWRT,NODEBUG,NOCPD
#use delay (clock=20000000)

long int giris1,giris2,giris3,giris4,giris5, bekle1,bekle2,bekle3,bekle4,bekle5, cikis1,cikis2,cikis3,cikis4,cikis5;

void main ()
{
   setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);

  setup_adc(adc_clock_div_32);
setup_adc_ports(ALL_ANALOG);

 
   while(1)
   {
      set_adc_channel(0);
     delay_us(20);
      giris1=read_adc();
      cikis1=((giris1*1.76)+600);
      bekle1=(2500-cikis1);
      output_high(pin_b0);
      delay_us(cikis1);
      output_low(pin_b0);
      delay_us(bekle1);
     
     set_adc_channel(1);
      delay_us(20);
     giris2=read_adc();
      cikis2=((giris2*1.76)+600);
      bekle2=(2500-cikis2);
      output_high(pin_b1);
      delay_us(cikis2);
      output_low(pin_b1);
      delay_us(bekle2);
     
      set_adc_channel(2);
       delay_us(20);
      giris3=read_adc();
      cikis3=((giris3*1.76)+600);
      bekle3=(2500-cikis3);
      output_high(pin_b2);
      delay_us(cikis3);
      output_low(pin_b2);
      delay_us(bekle3);
     
      set_adc_channel(3);
     delay_us(20);
      giris4=read_adc();
      cikis4=((giris4*1.76)+600);
      bekle4=(2500-cikis4);
      output_high(pin_b3);
      delay_us(cikis4);
      output_low(pin_b3);
      delay_us(bekle4);
     
      set_adc_channel(4);
     delay_us(20);
      giris5=read_adc();
      cikis5=((giris5*1.76)+600);
      bekle5=(2500-cikis5);
      output_high(pin_b4);
      delay_us(cikis5);
      output_low(pin_b4);
      delay_us(bekle5);
   }
}

ete

Kod dan anladığım kadarı ile her servoya adc sinden okunan değer kadar high pulsi veriyorsun ama bir o kadar da low palsi vermen yersiz. Bütün servolara pals lerini verdikten sonra hepsinin sürelerini toplayıp 20 den çıkart ve kalan kadar  beklet programı. Bu 20 ms lik peryodun tamamlamasını sağlayacak ve her 20 ms de bir servolara palslerini vermiş olursun.

Ete

maeshlmaent

cevabınız için teşekkür ederim. Dediğiniz gibi yaptım fakat pals sürelerini nasıl hesaplayacağımı bilmediğim için direk 15 yazdım bekleme süresi olarak ve pot ile sorunsuz çalıştı fakat flex sensörle yine çalışmadı.
set_adc_channel(0);
     delay_us(20);
      giris1=read_adc();
      cikis1=((giris1*1.76)+600);
     
      output_high(pin_b0);
      delay_us(cikis1);
      output_low(pin_b0);
      delay_us(15);
     

yukarıdaki gibi yaptım .eger yanlış yaptıysam rica etsem kod üzerinde gösterebilir misiniz?

Hattuşa

peki usta flex sensörden doğru bilgi geliyor mu? ekran vs kullanıyorsanız sensörden gelen bilgiyi bir kontrol etmenizi tavsiye ederim.

maeshlmaent

gelen bilgiyi göremiyorum fakat flex sensörü dc motora bağladığımda çalışıyor. büyük ihtimalle benim ***cikis1=((giris1*1.76)+600);***
bu satırımda sıkıntı var ve rc servolara hakim değilim sağdan soldan bakarak yazdım bu kodu.

ete

Dediklerimi uygulamamışsın.
Elinde 5 adet servo var gözüküyor. Bunu ilk yazdıın kod örneğinden çıkartıyorum.
Bu 5 adet servoya puls uygulayıp durduracaksın . Hepsinin palslerini toplayıp 20 den çıkartacaksın. kalan senin ikinci palsleri uygulama için bekleme süren olacak. Örnekle açıklayayım.
1. Nolu servoya vereceğin puls miltarını ADC0 dan okuduğun pot değeri ile belirledin ve diyelimki 1,5 ms lik bir süre verdin. Hesap daha anlaşılır olsun diye bu değeri us cinsinden kullanalaım 1500 us. 1 nolu çıkışı HIGH yaptın ve 1500us bekleyip çıkışı LOW yaptın. Toplam=1500 oldu

2. Nolu servoyada 1200us lik bir puls verileceğini hesapladın. Böylece 2 nolu çıkışı high yaptın. 1200us bekledin LOW yaptın. Toplam=Toplam+1200=2700us oldu.

3. Nolu çıkış için 2000 us lik bir puls hesapladın ve çıkışı high yapıp 2000us bekledin . Sonra low yaptın. Toplam=toplam+2000=4700 oldu.

4. Nolu çıkış için 1000us lik bir pul süresi hesapladın. Çıkışı High yaptın 1000us bekledin ve çıkışı low yaptın. Toplam=Toplam+1000=5700us oldu.

5. Nolu çıkış için 600us lik bir puls süresi hesapladın. Çıkışı High yaptın 600us bekledin ve çıkışı LOW yaptın. Toplam=Toplam+600=6300us oldu.
Şimdi sıra bekleme süresini hesaplamada. 20000 (Yani 20 ms)- 6300=13700us lik bir fark oluştu.
Delayus 13700 diyerek bu kadar  bir bekleme yaptın. Yeniden en başa dönüp 1 nolu çıkıştan itibaren aynı işlemleri yeniden yapacaksın.
Bu şekilde pulsleri verip toplamda 20 ms beklemiş olup yeniden aynı işleri yapmış olacaksın. İşin temeli budur.
Kendi yaptığına bir bak hiç ilk verdiğin kodla bir alakası varmı?. İlk kodda 5 çıkış sözkonusu bu son yazdığında 2 çıkış var.

Ete

Powered by EzPortal