新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Freescale 9S12 系列單片機應用筆記(ECT 模塊) 5

        Freescale 9S12 系列單片機應用筆記(ECT 模塊) 5

        作者: 時間:2016-11-20 來源:網絡 收藏

        實驗5:初識輸入捕捉功能

        所謂輸入捕捉,簡單的說就是感應輸入引腳PTx上的電平的變化,如果發現電平變化,則:

        本文引用地址:http://www.104case.com/article/201611/318818.htm

        lTCNT計數器的值被保存到到輸入捕捉寄存器TCx中,狀態標志位被置1

        l如果中斷允許,則向CPU發出中斷請求

        ECT模塊可以捕捉到的電平變化包括上升沿、下降沿或任意沿。簡單的說就是可以捕捉任意一種變化,功能還是很強悍的。

        TCx寄存器(TimerInputCapture/OutputCompare0-7)

        在介紹輸出比較功能時已經提到過。在這里,用來記錄外部事件發生時TCNT的值。通過讀取兩次相鄰事件TCx的值就可以計算出兩次事件的間隔時間了。

        TCTL3/TCTL4寄存器(TimerControlRegister3/4)

        定時器控制寄存器TCTL3和TCTL4中的EDGxB和EDGxA位決定通道x有效跳變邊沿是上升沿、下降沿或任意跳變。具體如何設置參見表格2的說明。

        表格2輸入捕捉跳變邊沿類型

        EDGxB

        EDGxA

        類型

        0

        0

        禁止

        0

        1

        上升沿

        1

        0

        下降沿

        1

        1

        任意跳變

        圖14TCTL3/TCTL4寄存器

        TCxH寄存器(TimerInputCaptureHoldingRegisters0-3)

        當開啟輸入捕捉功能時,對應事件發生時TCNT的值會被拷貝到TCx寄存器中。對于輸入捕捉的前4個通道,在這個拷貝發生之前還要完成一件事情,就是將TCx的值拷貝到TCxH中。因此,當輸入捕捉中斷發生時,TCx中存儲的是發生當前事件時的TCNT的值,TCxH中存放的則是上一次事件發生時TCNT的值。這兩個值的差可以計算出兩次事件間隔的時間。

        程序中還要使用到的寄存器包括TIOS寄存器(TimerInputCapture/OutputCompareSelect)、TSCR1寄存器(TimerSystemControlRegister1)、TFLG1寄存器(MainTimerInterruptFlag1)和TIE寄存器(TimerInterruptEnableRegister)。在前面的介紹中已經提到過這些寄存器了,這里就不重復了。

        下面是例子程序的部分代碼,功能很簡單。連續捕捉十次上升沿對應的TCNT,然后計算周期。

        #include /* common defines and macros */
        #include "derivative.h" /* derivative-specific definitions */
        #include "sci.h"

        void ECTInit(void)
        {
        TIOS_IOS0 = 0; // channel 0 as output compare
        TIE_C0I = 1; // 使能 channel 0 中斷

        TCTL4_EDG0A = 1;
        TCTL4_EDG0B = 0; // 檢測上升沿

        TSCR1_TEN = 1; //timer enable
        }

        unsigned short buf[11];
        char flag;
        void main(void)
        {
        long interval = 0;
        char i;
        SCIInit();
        SCISetBaudRate (SCI0, 9600, 8192000L);
        ECTInit();

        EnableInterrupts;

        flag = 0;
        for(;;)
        {
        if(flag == 1)
        {
        for( i = 0; i < 10; i++)
        {
        interval += buf[i+1] - buf[i];
        }
        SCIPutShort(SCI0, interval >> 16);
        SCIPutShort(SCI0, interval & 0xffff);
        }
        _FEED_COP(); /* feeds the dog */
        } /* loop forever */
        }


        interrupt VectorNumber_Vtimch0 void ECT_0_ISR(void)
        {
        static int i = 0;
        TFLG1 = TFLG1_C0F_MASK; //clear channel 0 interrupt flag
        buf[i++] = TC0;
        if (i == 11)
        {
        flag = 1;
        i = 0;
        TIE_C0I = 0; //關閉中斷
        }
        }

        信號源還是采用 USBee AX,利用通道7 輸出的 7.8125KHz 方波。

        串口傳上來的數據為:10486

        簡單計算一下:T = 10486*1/8192.0/10 = 0.128 ms

        f : 1/T = 7.815 KHz

        說明測量的結果還是很準確的。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 磐安县| 滨州市| 靖安县| 温州市| 梅州市| 贡觉县| 当雄县| 江北区| 禄丰县| 灵宝市| 大洼县| 柯坪县| 灵川县| 二连浩特市| 呼伦贝尔市| 清水县| 黄梅县| 柞水县| 公主岭市| 海门市| 扶沟县| 横山县| 永和县| 湖北省| 永胜县| 双江| 乾安县| 鹿邑县| 重庆市| 乌苏市| 石家庄市| 惠安县| 浦东新区| 鹿邑县| 嘉祥县| 大余县| 嘉定区| 双江| 马关县| 惠来县| 涡阳县|