PIC32MX單片機(jī)外設(shè)庫使用(Ⅲ)-- 定時(shí)器之輸入捕捉功能
1.如何使用定時(shí)器的捕捉功能。簡(jiǎn)介:輸入捕捉功能在頻率(或周期)、脈沖寬度測(cè)量的應(yīng)用中非常有用。 #define FOSC 80E6 //定義主系統(tǒng)時(shí)鐘為80M #define PB_DIV 8 //定義系統(tǒng)外設(shè)分頻器為8 #define PRESCALE 8 // 定義定時(shí)器分頻器為256 #define MSEC 10E-3 #define T1_TICK (500 * MSEC * FOSC)/(PB_DIV * PRESCALE)/***********************************************************************************************函數(shù)名 字: TIMER3_InputCapture_Config*功能描 述: 定時(shí)器3用于輸入捕捉功能*輸 入: 無*輸 出: 無*返 回: 無*全局變量: 無*調(diào)用模塊: 使用內(nèi)部8M時(shí)鐘,倍頻到80M, 外設(shè)時(shí)鐘為主時(shí)鐘8分頻,為10M**-------------------------------------------------------------------------***********************************************************************************************/void TIMER3_InputCapture_Config(){unsigned int CaptureTime;//Clear interrupt flagmIC1ClearIntFlag();// 建立定時(shí)器3OpenTimer3(T3_ON | T3_PS_1_1, T3_TICK);//配置Capture1的中斷(中斷開啟,中斷優(yōu)先級(jí))ConfigIntCapture1(IC_INT_ON | IC_INT_PRIOR_4 | IC_INT_SUB_PRIOR_3);// 使能輸入捕捉模塊1// 捕捉每個(gè)邊沿// 使能捕捉中斷// 使用定時(shí)器3作為測(cè)量基準(zhǔn)//第一次以撲捉下降沿開始OpenCapture1( IC_SP_EVERY_EDGE | IC_INT_1CAPTURE | IC_TIMER3_SRC | IC_FEDGE_FALL | IC_ON ); INTEnableSystemMultiVectoredInt()}inputCapture配置說明: 如圖1所示,筆者需要測(cè)試的信號(hào)為從第一個(gè)下降沿開始之后每一個(gè)邊沿的時(shí)間,這個(gè)設(shè)置可以通過寫入“IC_FEDGE_FALL”關(guān)鍵字實(shí)現(xiàn),問題就出在在,僅僅按照這個(gè)字面意思寫入是不夠的,仔細(xì)閱讀數(shù)據(jù)手冊(cè)時(shí)會(huì)發(fā)現(xiàn),要實(shí)現(xiàn)這樣的功能必須設(shè)置輸入捕捉的工作模式為“ IC_SP_EVERY_EDGE”,如圖2括號(hào)內(nèi)說明,及圖3模式說明。圖 1圖 2
圖 3/***********************************************************************************************函數(shù)名 字:_InputCapture1(void)*功能描 述: 輸入捕捉1中斷處理函數(shù)*輸 入: 無*輸 出:captime[10]:捕捉到的邊沿時(shí)間值*返 回: 無*全局變量: 無*調(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ù)手冊(cè)里有詳細(xì)列出)里找到輸入捕捉的中斷號(hào)為“5”, 第二步定義優(yōu)先級(jí)為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會(huì)產(chǎn)生讀出的ICBUF與實(shí)際應(yīng)該得到的數(shù)據(jù)對(duì)不上的情況,具體原因不知。