CCS ve enkoder ile frekans okuma

Başlatan makdeniz, 14 Eylül 2014, 14:51:05

makdeniz

Merhabalar

Pic ve Enkoder ile CCS örnekleri arasında olan EX_Freq.c dosyası ile frekans metre yapmaya çalışıyorum.
Enkoder 12v besledim çünkü 5v ile beslediğimde frekans okuyamıyorum.
Enkoder dönmeye başladığında hıza bağlı olarak ölçü aletinde okuyabildiğim değerde 2-3 voltlara düşüyor.
12V ile beslediğimde sorunsuz frekans okuyorum

12v Enkoder'a şu ana kadar zarar vermedi. Böyle kullanmak mantıksız geliyor ama başka yol bulamadım.
Bir ustamın verdiği ipucu ile gerilim bölücü direnc'ten puls'ları geçirdim
Fakat voltaj düşütüğü için yine frekansı okuyamadım.

Enkoder: 360 puls  / 5--30v besleme voltajı aralığında

Sorularım :


  • 5v enkoder beslemeli devremde ve 12v gelirim bölücü dirençli devremde Frekansları okuyamamamın asıl nedeni nedir ?
  • 12v beslemeli devremde pic zarar görürmü ?
  • Pic işlemcinin zarar görmemesi ve frekansları doğru okumam için ne yapmam lazım ?

Kullandığım kod :



#include <16F877.h>
#fuses HS,NOWDT,NOLVP
#use delay(clock=20000000)    //one instruction=0.2us
#use rs232(baud=9600, xmit=PIN_c6, rcv=PIN_c7)
#bit t1_overflow=0x0C.0

// #bit t1_overflow=0xF9E.0  (PIC18, Reminder)

void main() {
   int cycles8, cycles;
   int32 freq;
   long freqc_high;
   long freqc_low;

   while (TRUE) {
      cycles8=0;
      cycles=0;
      freqc_high=0;
      t1_overflow=0;
      set_timer1(0);
      setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
/* ___ wait one second ___  */
      while (cycles!=0xFF) { //true=3, false=4
       cycles8=0; //1 cycle
       //start inner loop
       while (cycles8!=0xFF) { //true=3, false=4
         if (t1_overflow)//true=2,false=3             //----|
            {t1_overflow=0;freqc_high++;}//6 cycles   //    |
         else                                         //    |-- 8 cycles
            {delay_cycles(5);}                        //----|
         delay_cycles(62); //x
         cycles8++; //1
 ///2 cycles to jump to top
 //math: end inner loop
 //math: total inner loop=((3+8+x+1+2)*255 + 4)*255
 //math: if x=62.87781 then inner loops takes 5mil instructions
 //math: if x=62 then inner loop takes 4942920, have to fill 57080 cycles
  }
 delay_cycles(216);      //y
 cycles++;          ///1 cycle
 ///2 cylces to jump to top
 //math: outer=(3+1+y+1+2)*255+4=57080
 //math: y=(57080-4)/255)-(3+1+0+0+1+2)
 //math: if y=216.827450980392156862745098039216 then outer loop cylces is 57080
 //math: if y=216 then outer loop cycles is off by 211 cycles.  z=211
}
      delay_cycles(211);   //z
/* ___ end waiting 1 second ___ */
      setup_timer_1(T1_DISABLED);   //turn of counter to prevent corruption while grabbing value
      if (t1_overflow)            //check one last time for overflow
          freqc_high++;
      freqc_low=get_timer1();      //get timer1 value as the least sign. 16bits of freq counter
      freq=make32(freqc_high,freqc_low);   //use new make32 function to join lsb and msb
      printf("%LU Hz\r\n",freq);      //and print frequency

   }
}
Karanlık olmadan aydınlık, Ölüm olmadan yaşam mantıksız.

Kabil ATICI

Bu konuda hangi ölçü aleti kullanıyorsun bilmiyorum, ama normalde osilaskop gibi bir cihaz ile encoder çıkışına bakmanız gerekir.
Bu arada 12V doğrudan pic'e uygularsanız pic yanar. Ya gerilim bölücü direnç (+zener diyot) kullanacaksınız yada optokuplör türü bir sistem kullanmanız gerekir. (optokuplörün çalışma frekansının sizin frekansa uygun olması gerekir)
Gerilim bölücü devrende işlemcinin çekeceği akımı hesaba koymalısın.
Encoder olmadan 5V sinyal uygulayarak  sinyal frekansını görebiliyor musun? Eğer görüyorsan ozaman gerilim bölücü devreni kontrol et. Görmüyorsan programını,
ambar7

makdeniz

Ambar hocam cevap için teşekkürler sanırım sorun benim devremde değil kullandığım power veya enkoder'da sorun var gibi 12v çıkış çöküyor  bilgiler için teşekkürler
Karanlık olmadan aydınlık, Ölüm olmadan yaşam mantıksız.