Pic ile çift eksenli güneş takip sistemi

Başlatan TheMega, 13 Haziran 2022, 18:16:36

TheMega

Pic mikrodenetleyici kullanarak çift eksenli güneş takip sistemi projem var. Yardımcı olur musunuz?


TheMega

Onlara da baktım ama tam olarak benim istediğim proje değil, ben iki adet servo motor kullandım ve platformu hazırladım. Kodu da aşağıdaki gibi yazdım. Fakat hatalı çalışıyor. Bazen hiç dönmüyor bazen tam tersi yönde dönüyor.





#include <16f877.h>
#device ADC = 10
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPUT,NOLVP,NOCPD,NOPROTECT,NODEBUG,NOBROWNOUT,NOWRT

#use fast_io(b)


int servoh = 180;
int servohLimitHigh = 180;
int servohLimitLow = 65;

int servov = 45;
int servovLimitHigh = 80;
int servovLimitLow = 15;




void motor_h(int aci){

unsigned int i;
int16 del=0;
del=1000+aci*5.55555;

output_high(pin_b0);   
delay_us(del);   
output_low(pin_b0);   
delay_us(20000-del);


}

void motor_v(int aci){

unsigned int i;
int16 del=0;
del=1000+aci*5.55555;

output_high(pin_b1);     
delay_us(del);   
output_low(pin_b1);     
delay_us(20000-del);



}


void main()
{
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
    setup_adc(ADC_CLOCK_DIV_32);
   setup_adc_ports(AN0_AN1_AN2_AN3_AN4);
   
   set_tris_b(0x00);
   set_tris_a(0b11111111);
   output_b(0x00);
   
   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_4);
   set_timer0(231);

   motor_v(45);
   motor_h(180);
   delay_ms(3000);

   
   while(true)
   {
      set_adc_channel(0);
      int16  lt  = read_adc();
      delay_ms(500);
     
      set_adc_channel(1);
      int16  rt  = read_adc();
      delay_ms(500);
     
      set_adc_channel(2);
      int16  ld  = read_adc();
      delay_ms(500);
     
      set_adc_channel(3);
      int16  rd  = read_adc();
      delay_ms(500);
     
      int dtime = 1000;
      int tol = 50;
     
      int16 avt = (lt + rt) / 2;
      int16 avd = (ld + rd) / 2;
      int16 avl = (lt + ld) / 2;
      int16 avr = (rt + rd) / 2;
     
      int16 dvert = avt - avd;
      int16 dhoriz = avl - avr;
     
     
     
if (-1*tol > dvert || dvert > tol)
{
if (avt > avd)
{
servov = ++servov;
if (servov > 180)
{
servov = 180;
}
}
else if (avt < avd)
{
servov= --servov;
if (servov < 0)
{
servov = 0;
}
}
motor_v(servov);
}
if (-1*tol > dhoriz || dhoriz > tol)
{
if (avl > avr)
{
servoh = --servoh;
if (servoh < 0)
{
servoh = 0;
}
}
else if (avl < avr)
{
servoh = ++servoh;
if (servoh > 180)
{
servoh = 180;
}
}
else if (avl == avr)
{
// nothing
}
 motor_h(servoh);
}
delay_ms(dtime);
 
}



}







Hızlı Yanıt

Not: Bu konu bir moderatör tarafından onaylanmadan görüntülenmeyecektir.

Adı:
E-Posta:
Doğrulama:
Lütfen bu kutuyu boş bırakın:
IRFP250 Nedir:
kısayollar: göndermek için alt+s veya önizleme yapmak için alt+p'ye basın