PIC16F877A ile servo motor sürme

findecano

Üye
Katılım
7 Tem 2010
Mesajlar
8
Puanları
1
Yaş
38
herkese iyi çalışmalar;
pic16f877A ile bir servo motor sürme devresi kurdum. devrenin çalışması şu şekilde;
potansiyometre ile analog giriş alıyorum bu girişin değişimine göre servo motorun konumu değişiyor. 0V da -90 derecede 5V da +90 derecede duruyor.

proteusta devreyi oluşturdum CCS C de de kodları yazdım gayet istediğim gibi çalışıyor, fakat gerçekte kurdum aynı kodları yükledim istediğim gibi çalışmadı, tek bir pulse değeri görünüyor potansiyometrenin değişimine cevap vermiyor. sorun ne olabilir kodlarda yada donanımda eksik olan ne olabilir. devre ve kodlar aşağıda bulunmaktadır. yardımcı olabilicek arkadaşlara şimdiden teşekkür ederim ...

kodlar;
Kod:
#include <16f877.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use fast_io(a)
#use fast_io(c)
#define use_portb_lcd TRUE
#include <lcd.c>

#byte ADRESH = 0x1E
#byte ADRESL = 0x9E
#byte ADCON0 = 0x1F
#byte ADCON1 = 0x9F

   unsigned long int digdata;
   int pwm=0;
   int duty=0;
  
#int_timer0
   void kesme()
   {
      set_timer0(227);
       
      if (pwm==0) output_high(pin_c3);
     
      if (pwm>=duty) output_low(pin_c3);
     
      pwm++;
      output_high(pin_c2);
      if (pwm>=140) pwm=0;
   }
#int_AD
   void ADC_kesme()
   {
   output_high(pin_c1);
   }
  
   //****MAIN PROGRAM******
  
   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);
     
      set_tris_a(0b11111111);
      set_tris_c(0b00000000);
     
      ADCON0=0b00001101;
      ADCON1=0b00000000;
     
      setup_adc(ADC_CLOCK_INTERNAL);
      setup_adc_ports(ALL_ANALOG);
     
      setup_timer_0(RTCC_INTERNAL | RTCC_DIV_4);
      set_timer0(227);
     
      enable_interrupts(int_timer0);
      enable_interrupts(int_AD);
      enable_interrupts(global);
     
      output_c(0b00000000);
     
      lcd_init();
     
     
      while(1)
      {
         set_adc_channel(1);
         delay_us(20);
         digdata=read_adc();
        
        if ((digdata>=0) && (digdata<=93)) duty=5;
        if ((digdata>=94) && (digdata<=187)) duty=6;
        if ((digdata>=188) && (digdata<=281)) duty=7;
        if ((digdata>=282) && (digdata<=375)) duty=8;
        if ((digdata>=376) && (digdata<=469)) duty=9;
        if ((digdata>=470) && (digdata<=563)) duty=10;
        if ((digdata>=564) && (digdata<=657)) duty=11;
        if ((digdata>=658) && (digdata<=752)) duty=12;
        if ((digdata>=753) && (digdata<=846)) duty=13;
        if ((digdata>=847) && (digdata<=940)) duty=14;
        if ((digdata>=941) && (digdata<=1023)) duty=15;
        
         printf(lcd_putc,"\fDigData=%lu",digdata);
         delay_ms(50);
       
      
        
      }
   }
 
Int ad kesme hikayesini iptal et. Zaten kullanmıyorsun. Delay_ms hikayesi de hoş değil. Sadece değerde bir değişim olursa ekrana yazsın aksi halde yazmasın. Delay_ms ve interrupt birlikte karışıklığa sebep olabilir.
 

Forum istatistikleri

Konular
128,169
Mesajlar
915,617
Kullanıcılar
449,932
Son üye
yyasar

Yeni konular

Geri
Üst