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