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