Güneş takip sistemi

Başlatan duwolfy, 01 Şubat 2016, 13:20:53

duwolfy

Merhaba arkadaşlar ben konuda belirttiğim gibi güneş takip sistemi ile uğraşıyorum bu sistemi ldr ve dc motoru aç kapa ile yönlendirmeye çalıştım şöyle bi sorunum oldu derlemede sıkıntı yok isis te sorun oluyor ve board üzerinde de çalışmıyor acaba nerede yanlış yaptım acemi olunca bu işte sorunu göremedim diye buraya koyuyorum şimdi den teşekkür ederim.


#include <16f877A.h>
#device ADC=10
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD,NOLVP // Denetleyici konfigürasyon ayarları

#use delay(clock=20000000)  

#use fast_io(a) // Port yönlendirme komutları A portu için geçerli
#use fast_io(b) // Port yönlendirme komutları B portu için geçerli
#use fast_io(e)

int sag;
int sol;
int alt;
int ust;

void main ()
{
   setup_adc(adc_clock_div_32);   
   setup_adc_ports(ALL_ANALOG);
   set_tris_a(0b11111111);
   set_tris_b(0b00000000);
   set_tris_c(0b00000000);
   
   
   output_b(0b00000000);
   output_high(pin_b3);
   output_high(pin_c1);
   output_high(pin_c2);


   while(true){

   //BIRINCI KISIM  sag sol konum//      
   set_adc_channel(0);
   delay_us(50);    //sag
   sag=read_adc();
   //////////////////////////////
   set_adc_channel(1);
   delay_us(50);    //sol
   sol=read_adc();

      if (sag==sol  ){
      output_low(pin_b7);
      output_low(pin_b6);
      ///////////Sag Sol Esitlendiyse Alt Üst//////////////////
            //IKINCI KISIM alt ust//
      set_adc_channel(2);
      delay_us(50);    //ust
      ust=read_adc();
      //////////////////////////////
      set_adc_channel(3);
      delay_us(50);    //alt
      alt=read_adc();
      //////////////////////////////
         if (alt==ust){
         output_low(pin_b5);
         output_low(pin_b4);
         output_high(pin_b3);
         }
         else if (alt<ust){
         output_high(pin_b5);
         output_low(pin_b4);
         output_low(pin_b3);
         }
         else if (alt>ust){
         output_high(pin_b4);
         output_low(pin_b5);
         output_low(pin_b3);
         }
      ////////////////////////////////////////////////////////
      }
      else if (sag<sol){
      output_high(pin_b7);
      output_low(pin_b6);
      output_low(pin_b3);
      }
      else if (sag>sol){
      output_high(pin_b6);
      output_low(pin_b7);
      output_low(pin_b3);
      }
   

  }
   
}

Salih

Öncelikle denetleyici devresinin düzgün çalıştığını anlamak için,
sadece bir led i 500ms aralıklarla yakıp söndürmeye yarayan bir program
yükleyip deneyin.

vitruvius

Sorunun ne olduğunu da söyleseydiniz de ona göre arasaydık. Bu arada adc okuyup da if(alt==ust) diye kontrol etmek çok mükemmelliyetçi bir yaklaşım olur. Onun yerine biraz hata payı ekleyip karşılaştırmanızı öneririm.

duwolfy

Hocam cevaplarınız için teşekkür ederim, sorun şu ben bunu yüklüyorum isiste belli bi zaman sonra (10 sn gibi bi süre) hata veriyor burda Program çalışıyor tabi sağ Sol yada alt üstte sorun yok ama bunu board üzerine aktarınca olmuyor bende çözemedim yazılımda sorun mu diye.

Alt=üst te hata payı şöyle mi olucak peki.        abs(alt-üst)<=5 gibi

vitruvius

Alıntı yapılan: duwolfy - 01 Şubat 2016, 22:33:47
sorun şu ben bunu yüklüyorum isiste belli bi zaman sonra (10 sn gibi bi süre) hata veriyor

Ne hatası veriyor? Devre şeması da verirseniz bakalım.

duwolfy

hata böyle oluyor zaten dediğim gibi board üzerinde ldr ye flash ile ışık tuttuğum zaman birine algılamadığı gözüküyor.


aliveli

adc 10 bit çözünürlükte ayarladığın için sag,sol vs adc den atadığın degiskenler int16 olmali

duwolfy

Dediğiniz gibi int16 da denedim yine aynı hatayı aldım.Bu arada salih hocam denetleyici denedim çalışıyor ldr leride denedim l293 hepsini denedim teker teker sorun gözükmedi

vitruvius

Dosyaları bir siteye yükleyip link verebilir misiniz?

duwolfy

Mail olarak atabilirim sorun olmazsa, bir kaç farklı kod denedim onlarıda atabilirim

vitruvius

Olmaz. Sistemde kayıtlı olan mail adresime yollayabilirsiniz.

duwolfy

Gönderdim hocam iki tane kod var her türlü şeyi denediğim için böyle gönderdim.

duwolfy

Programda tekrar bir derleme yapıp motor değilde led ler ile denedim led lerde sorun yok ama şu var motorun durması lazım iken yani iki ldr de eşit ışık alır iken led ler sönmüyor birisi sürekli yanıyor buda motorun daima bir yöne dönmesi anlamına geliyor

duwolfy

Merhaba , kod olarak değişiklik yapıp hassaslığı ayarladım fakat simülasyonda çalışıyor ama gerçekte çalışmıyor 1. motor çalışıyor az deneme yapıyorum 5-6 kere feneri ldr de gezdirince çalışan motor çalışmıyor ayrıca diğer motor hiç çalışmıyor ışık tuttuğum zaman acaba nerede hatam var ?
[code]#include <16f877A.h>

#device ADC=10
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD,NOLVP // Denetleyici konfigürasyon ayarları

#use delay(clock=20000000)  

#use fast_io(a) // Port yönlendirme komutları A portu için geçerli
#use fast_io(b) // Port yönlendirme komutları B portu için geçerli
#use fast_io(c)


unsigned long int sag,sol,alt,ust;
float sol1,sag1,alt1,ust1;

void main ()
{
   setup_adc(adc_clock_div_32); 
   setup_adc_ports(ALL_ANALOG);
   set_tris_a(0b11111111);
   set_tris_b(0b00000000);
   set_tris_c(0b00000000); 
    output_b(0x00);
      
   output_low(pin_b3);
   output_low(pin_b2);
   output_high(pin_c1);
   output_high(pin_c2);
   while(true){
   basla:
   set_adc_channel(0);
   
   
   delay_us(100);    //sag
   alt=read_adc();
  alt1=alt*0.004883;
alt1=alt1*200;


set_adc_channel(1);
   
   
   delay_us(100);    //sag
   ust=read_adc();
  ust1=ust*0.004883;
ust1=ust1*200;

set_adc_channel(2);
   
   
   delay_us(100);    //sag
   sag=read_adc();
  sag1=sag*0.004883;
sag1=sag1*200;
 
   set_adc_channel(3);
     
   delay_us(100);    //sol
   sol=read_adc();
    sol1=sol*0.004883;
sol1=sol1*200;

    if(40+alt1==ust1+40){
      output_low(pin_b4);
      output_low(pin_b5);
      output_high(pin_b2);
    
    }
     
      else if(alt1>ust1+80){
      output_high(pin_b4);
      output_low(pin_b5);
      output_low(pin_b2);
     
    
       
      }
              
      else if(ust1>alt1+80){
      output_low(pin_b4);
      output_high(pin_b5);
      output_low(pin_b2);
   
     
      }
       if(40+sag1==sol1+40){
      output_low(pin_b6);
      output_low(pin_b7);
      output_high(pin_b3);
      output_low(pin_c2);
      
      }
      else if(sol1>sag1+80){
      output_high(pin_b6);
      output_low(pin_b7);
      output_low(pin_b3);
    output_high(pin_c2);
       
      }
              
      else if(sag1>sol1+80){
      output_low(pin_b6);
      output_high(pin_b7);
      output_low(pin_b3);
      output_high(pin_c2);
       
      }
     
    
   }
}


   
[/code]

eeburakdemir

Güneş takip etmek de püf noktalardan biride kodun dışında sensörü nasıl yerleştirdiğindir. Güneş dünyaya milyonlarca km uzakta olduğu için ve dünyada güneş'e göre çok küçk bir gezegen olduğu için güneşten çıkan ışıklar dünyaya geldiğinde , diferansiyel olarak düşünülürse çok küçük aralıklarla yeryüzüne ulaşır. Bundan dolayı sensörünün en verimli şekilde çalışması için , sensör yerleşimini en iyi şekle getirebilmelisin ki yazdığın kod verimli şekilde çalışsın. Küçük ince borular içerisine sensörleri yerleştirip borunun boyunuda uzun tutup, doğu - batı, kuzey - güney eksenlerine uaztmalısın. Bu şekilde daha verimli sonuçlar edeceksin. İyi çalışmalar dilerim. 
Asla pes etme...