會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





Re: 測量脈波寬度1us~800ms.用IOC中斷或Input Capture那ㄧ個比較好
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 13936
等級: 72; EXP: 17
HP : 1067 / 1779
MP : 4645 / 67911
在線上
PIC24FJ64GB002 的 Timer 2&3 有支援 Gate Time 功能,用它來完成脈波寬度是最簡單的。

你的困難點是在測量範圍很廣,PIC24 最高工作頻率為 32MHz 經除四轉成 Tcy (8MHz) 後進入 Timer1。所以最高解析度為 1uS 有 8 個計數值,所以是沒有問題的。

Timer 2 & 3 結合後是一 32-bit 的計數器,所以可以完整的抓取 800mS 的脈衝。

2月07日 14:28:00
轉換PDF檔 列印


Re: 測量脈波寬度1us~800ms.用IOC中斷或Input Capture那ㄧ個比較好
初級會員
註冊日期:
2015/05/27 22:04
所屬群組:
註冊會員
文章: 30
等級: 4; EXP: 22
HP : 0 / 80
MP : 10 / 467
離線



PIC24F系列的 Input Capture功能(使用32bit),讀過規格和參考文件之後,終於測試成功。



將IC1, IC2 的clock source設為TMR2,同時將IC32設定為1.

以下是利用MCC v3.25 產生的程式碼.

中斷ISR和main.c 則是我為了利用Input Capture測量波型的High_part脈波寬度,和Low_part脈波寬度,所加入的程式碼.



void TMR2_Initialize (void)

{

    //TMR2 0;

    TMR2 = 0x0000;

    //Period = 0.0041 s; Frequency = 16000000 Hz; PR2 65535;

    PR2 = 0xFFFF;

    //TCKPS 1:1; T32 16 Bit; TON enabled; TSIDL disabled; TCS FOSC/2; TGATE disabled;

    T2CON = 0x8000;

    tmr2_obj.timerElapsed = false;

}



void IC1_Initialize (void)

{

    // ICSIDL disabled; ICM Edge Detect Capture; ICOV disabled; ICTSEL TMR2; ICBNE disabled; ICI Every;

    IC1CON1 = 0x0401;

    // SYNCSEL None; TRIGSTAT disabled; IC32 enabled; ICTRIG Sync;

    IC1CON2 = 0x0100;



    gIC1Mode = IC1CON1bits.ICM;



    IFS0bits.IC1IF = false;

    IEC0bits.IC1IE = true;

}


void IC2_Initialize (void)

{

    // ICSIDL disabled; ICM Edge Detect Capture; ICOV disabled; ICTSEL TMR2; ICBNE disabled; ICI Every;

    IC2CON1 = 0x0401;

    // SYNCSEL None; TRIGSTAT disabled; IC32 enabled; ICTRIG Sync;

    IC2CON2 = 0x0100;



    gIC2Mode = IC2CON1bits.ICM;

}



void __attribute__ ( ( interrupt, no_auto_psv ) ) _ISR _IC1Interrupt( void )

{

    if(IFS0bits.IC1IF)

    {

        IFS0bits.IC1IF = 0;

        if (!disp_flags.IC1_Measure_Done)

        { // only at !disp_flags.IC1_Measure_Done, we need to measure CF input.

            IC1_timer_buffer = (((uint32_t)IC2BUF<<16)| IC1BUF );

            if (IC1_RB9_GetValue())

            { // Low_to_High detected.

                if (disp_flags.IC1_Measure_Started)

                {

                    disp_flags.IC1_Measure_Done = 1;

                    IC1_T3 = IC1_timer_buffer; // save timer at Low_to_High (Set Measure_Done)

                }

                else

                {

                    disp_flags.IC1_Measure_Started = 1;

                    IC1_T1 = CF_timer_buffer; // save timer at Low_to_High (Set Measure_Started)

                }

            } //if (IC1_RB9_RB9_GetValue())

            else

            { // High_to_Low detected.

                if (disp_flags.IC1_Measure_Started)

                {

                    IC1_T2 = IC1_timer_buffer; // save timer at High_to_Low when Measure_Started.

                }

            } //if (IC1_RB9_GetValue()) ... else ...            

        } //if (!disp_flags.IC1_Measure_Done)

    }

}



/*********main.c *****/

    IC1_Stop(); IC2_Stop();

    __delay_ms(1000);

    IC2_Start(); IC1_Start();

    while (1)

    {

        if (disp_flags.IC1_Measure_Done)

        {

            IC1_Stop(); IC2_Stop();

            H_time = (IC1_T2 - IC1_T1)/16; //TMR2每隔(1/16)us遞增一次. 顯示為us,須將數據/16.

            L_time = (IC1_T3 - IC1_T2)/16;

            UARTx_ShowHi(H_time);

            UARTx_ShowLow(L_time);

// 顯示波型的起點(T1),中間點(T2),終點(T3) 的時間。

            UARTx_ShowT1(IC1_T1/16);

            UARTx_ShowT2(IC1_T2/16);

            UARTx_ShowT3(IC1_T3/16);

            IC2_Start(); IC1_Start();

            disp_flags.IC1_pin_last_status = 0;

            disp_flags.IC1_Measure_Done = 0;

            disp_flags.IC1_Measure_Started = 0;

        } //if (disp_flags.IC1_Measure_Done)

2月08日 23:37:32
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
線上教學影片
網頁捷徑
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project