Ynt: CCS C İLE ROTARY ENCODERİN YÖN TESPİTİ

Başlatan tesla23, 11 Ocak 2014, 16:14:28

tesla23

Arkadaşlar...
Ben 720pulse lik çıkışı A,B,Z olmak üzere kare sinyal üreten bir encoder ile açı ölçümü ve yön tespiti yapmak istiyorum.Açı ölçümünü yaptım kaç tur döndüğünüde hesapladım fakat sağa 90 derece döndürüp sonra aynı noktadan sola dönderdiğimde 89,88,87.... diye eksiltemiyorum 91,92,93... diye tekrardan artıyor. Nasıl yapabilirim bu eksiltmeyi bir örnek ccs c programı gönderebilirseniz sevinirim.

mesaj birleştirme:: 11 Ocak 2014, 16:23:54

PROGRAM KODU BU ŞEKİLDE VE PIC 16F877A KULLANILMIŞTIR.
#define ACHNL PİN_B7
int16 i=0;
void B_kesmesi(){     //RB KESME ALT PROGRAMI
if(input(ACHNL)){    //Pin_b7 yi oku
i++;                  //PİN_B7 LOJİK 1 İSE i değikenini bir artır.
}
}
void main()
{
   set_tris_d(0x00);         
   set_tris_b(0b10000000);      //pin_b7 giriş diğerleri çıkış
   lcd_init();                   //lcd hazırlanıyor 
   enable_interrupts(INT_RB);      //RB kesmesi aktif
   enable_interrupts(GLOBAL);      //bütün kesmeler aktif
   while(1){                         //sonsuz döngü
   m=i*0.5;                          //1 pulse 0.5 katsayısı derece ile 
   printf(lcd_putc,"\n%f",m);        //m(açı değeri) ekrana yaz
   }


eR2

merhabalar alttaki kodu kullanabilirsin, rb0 kesmesi ile kullanıyorum

https://www.picproje.org/index.php/topic,50537.0.html

bu konuda inceleyebilirsin



#include <16f877a.h> 
#use delay(clock=4M) 
#fuses HS, NOWDT,  NOPROTECT, NOBROWNOUT, NOPUT, NOLVP,NODEBUG,NOWRT,NOCPD 
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)
#use fast_io(B) 


long encoder, encoder_eski, yon;

#int_ext
void ext_kesmesi()
{
   if (input(pin_b1)==0)
   {
      yon=1;
      encoder++;
   }
   if (input(pin_b1)==1)
   {
      yon=0;
      encoder--;
   }
   
}


#include <lcd.c>
void main()
{
   lcd_init();



   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

   //TODO: User Code
   
   if (yon==1)
   {
      printf(lcd_putc,"\fSAG:%ld", encoder); 
   }
   if (yon==0)
   {
      printf(lcd_putc,"\fSOL:%ld", encoder);
   }
}