ตัวอย่างการใช้งาน Capture ร่วมกับ Timer1 เป็นเครื่องนับความถี่

       
     
    วงจรการใช้งาน Capture ร่วมกับ Timer1 เป็นเครื่องนับความถี่ สัญญาณอินพุตจะเข้าทางขา RB3/CCP1  
       
  - ต่อวงจรตามรูป แล้วใช้เครื่องกำเนิดความถี่ หรือใช้ PIC อีกตัวหนึ่งกำเนิดความถี่เพื่อใช้ทดสอบ โดยป้อนสัญญาณเข้าที่ขา RB3/CCP1  
     
  หลักการคำนวน  
  เมื่อหาค่าจากการนับได้แล้ว cycle =time2-time1 สามารถหาคาบเวลา (Td) ได้จากสูตร  
  Td=cycle*(4/fosc)*PR  
       

ตัวอย่างโปรแกรมการใช้ Capture ในการวัดคาบเวลาและความถี่

//Frequency Counter
//Use Timer1 and CCP1
//Input RB3/CCP1 (pin9)
//when condition is true make CCP1 Interrupt 
//Calculate Frequency, period time and send to RS232
//press space bar to read input and display

//#include <16F628.h> #include <16F648A.h> #use delay(clock=4000000) #fuses XT,PUT,BROWNOUT,MCLR,NOWDT,NOPROTECT,NOLVP #define TxD PIN_A0 #define RxD PIN_A1 #use rs232(baud=9600, xmit=TxD,rcv=RxD) float time1,time2; BOOLEAN hook_cpp1, HookRise; #int_ccp1 void capture_isr() { if(HookRise) { time1 = get_timer1(); HookRise = FALSE; printf("X"); } else { time2 = get_timer1(); HookRise = TRUE; hook_cpp1 = FALSE; //done printf("Y\r\n"); } } void InitialChip(void) { setup_comparator(NC_NC_NC_NC); //Input Digital set_tris_a(0B11111110); set_tris_b(0B11111111); }
float T; void main(void) { InitialChip(); printf("Frequency Counter\r\n"); setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); // Setup timer 1 while(1) { if(kbhit()) { HookRise=TRUE; hook_cpp1=TRUE; printf("Frequency Counter\r\n"); setup_ccp1(CCP_CAPTURE_RE); enable_interrupts(INT_CCP1); // Enable interrupt CCP1 enable_interrupts(GLOBAL); // All interrupts ON set_timer1(0); while(hook_cpp1==TRUE); setup_ccp1(CCP_OFF); disable_interrupts (GLOBAL); T = (time2-time1)*8*1000*0.000000001;; // Td=cycle*(4/fosc)*PR printf("Frequency:%f Hz %9.3e ms\r\n",1/T,T); } } }
       
  ผลการทดลอง  
  เมื่อเริ่มจ่ายไฟ  
   Frequency Counter
Input RB3
Press any key to Capture
 
     
  - ป้อนความถี่ 10 Hz ที่ขา RB3/CCP1แล้วกด space bar  
  *** Capture ***
F=10.00 Hz T=9.999E-02 ms
 
     
  - ป้อนความถี่ 100 Hz ที่ขา RB3/CCP1แล้วกด space bar  
  *** Capture ***
F=99.68 Hz T=1.003E-02 ms
 
     
  - ป้อนความถี่ 1KHz ที่ขา RB3/CCP1แล้วกด space bar  
  *** Capture ***
F=992.06 Hz T=1.007E-03 ms
 
     
  จะเห็นค่าที่วัดได้มีค่าใกล้เคียงกับความถี่อินพุต