PIC32MX單片機外設庫使用(Ⅲ)-- 定時器之輸入捕捉功能
1.如何使用定時器的捕捉功能。簡介:輸入捕捉功能在頻率(或周期)、脈沖寬度測量的應用中非常有用。 #define FOSC 80E6 //定義主系統(tǒng)時鐘為80M #define PB_DIV 8 //定義系統(tǒng)外設分頻器為8 #define PRESCALE 8 // 定義定時器分頻器為256 #define MSEC 10E-3 #define T1_TICK (500 * MSEC * FOSC)/(PB_DIV * PRESCALE)/***********************************************************************************************函數名 字: TIMER3_InputCapture_Config*功能描 述: 定時器3用于輸入捕捉功能*輸 入: 無*輸 出: 無*返 回: 無*全局變量: 無*調用模塊: 使用內部8M時鐘,倍頻到80M, 外設時鐘為主時鐘8分頻,為10M**-------------------------------------------------------------------------***********************************************************************************************/void TIMER3_InputCapture_Config(){unsigned int CaptureTime;//Clear interrupt flagmIC1ClearIntFlag();// 建立定時器3OpenTimer3(T3_ON | T3_PS_1_1, T3_TICK);//配置Capture1的中斷(中斷開啟,中斷優(yōu)先級)ConfigIntCapture1(IC_INT_ON | IC_INT_PRIOR_4 | IC_INT_SUB_PRIOR_3);// 使能輸入捕捉模塊1// 捕捉每個邊沿// 使能捕捉中斷// 使用定時器3作為測量基準//第一次以撲捉下降沿開始OpenCapture1( IC_SP_EVERY_EDGE | IC_INT_1CAPTURE | IC_TIMER3_SRC | IC_FEDGE_FALL | IC_ON ); INTEnableSystemMultiVectoredInt()}inputCapture配置說明: 如圖1所示,筆者需要測試的信號為從第一個下降沿開始之后每一個邊沿的時間,這個設置可以通過寫入“IC_FEDGE_FALL”關鍵字實現(xiàn),問題就出在在,僅僅按照這個字面意思寫入是不夠的,仔細閱讀數據手冊時會發(fā)現(xiàn),要實現(xiàn)這樣的功能必須設置輸入捕捉的工作模式為“ IC_SP_EVERY_EDGE”,如圖2括號內說明,及圖3模式說明。圖 1圖 2
圖 3/***********************************************************************************************函數名 字:_InputCapture1(void)*功能描 述: 輸入捕捉1中斷處理函數*輸 入: 無*輸 出:captime[10]:捕捉到的邊沿時間值*返 回: 無*全局變量: 無*調用模塊:***********************************************************************************************/void __ISR(5, ipl4) _InputCapture1(void){int16u CaptureTime;int8u time;//讀取IC1BUF內的數值captime[captime_number++] = mIC1ReadCapture(); //IC1BUF;//清除中斷標志mIC1ClearIntFlag();}說明:1.中斷函數怎么寫,第一步在中斷向量表(中斷向量表在數據手冊里有詳細列出)里找到輸入捕捉的中斷號為“5”, 第二步定義優(yōu)先級為ipl4(注意是"L"的小寫+4),第三部自定義函數名字_InputCapture1(void),自己好記就行。 void __ISR(5, ipl4) _InputCapture1(void) {//things to do.... }2.中斷內部處理 經過筆者調試,應先讀取IC1BUF內的數據,然后再清中斷標志。如果先清中斷標志再讀ICBUF會產生讀出的ICBUF與實際應該得到的數據對不上的情況,具體原因不知。