新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 飛思卡爾那些事之ECT方式檢測(cè)速度

        飛思卡爾那些事之ECT方式檢測(cè)速度

        作者: 時(shí)間:2016-11-23 來(lái)源:網(wǎng)絡(luò) 收藏
        資源:
        1、增量式旋轉(zhuǎn)編碼器。旋轉(zhuǎn)編碼器是測(cè)量速度的一種裝置,旋轉(zhuǎn)編碼器每旋轉(zhuǎn)一周,就會(huì)輸出特定數(shù)目的脈沖。在單位時(shí)間內(nèi)記錄讀取到旋轉(zhuǎn)編碼器輸出的脈沖數(shù),即可知道旋轉(zhuǎn)編碼器轉(zhuǎn)動(dòng)的圈數(shù),即輪胎的轉(zhuǎn)動(dòng)速度。因?yàn)檩喬ブ荛L(zhǎng)一定,所有可以求得在單位時(shí)間內(nèi)小車行駛的路程,再通過(guò)計(jì)算即可得到小車的速度,如果單位時(shí)間足夠小,則可以近似認(rèn)為該速度位瞬時(shí)速度。
        2、HCS12的ECT模塊。在ECT模塊中的輸入捕捉定時(shí)器和脈沖累加器可以實(shí)現(xiàn)旋轉(zhuǎn)編碼器的脈沖計(jì)數(shù)。
        方案:
        1、輸入捕捉(Intput Capture)計(jì)數(shù)方式。通過(guò)輸入捕捉模塊,進(jìn)行脈沖輸入捕捉,在中斷程序中通過(guò)全局變量進(jìn)行計(jì)數(shù),每捕捉到一個(gè)脈沖進(jìn)行一次計(jì)數(shù),在單位時(shí)間內(nèi)讀取輸入捕捉中斷程序計(jì)數(shù)變量的計(jì)數(shù)值。
        2、脈沖計(jì)數(shù)器(Modulus Counter)方式。通過(guò)脈沖累加器進(jìn)行脈沖輸入捕捉,模數(shù)計(jì)數(shù)器設(shè)定為單位時(shí)間中斷,在模數(shù)計(jì)數(shù)器中斷程序中讀取脈沖累加器的計(jì)數(shù)數(shù)值。脈沖累加器可以選用16位脈沖累加器。也可以用8位的脈沖累加器。
        3、模數(shù)計(jì)數(shù)器進(jìn)行定時(shí),每500MS讀取一次脈沖數(shù)。讀取這500MS中的脈沖數(shù)即可算出輸出速度。
        說(shuō)明:
        1、旋轉(zhuǎn)編碼器選用的是YZ30D-4S-2NA-200;該旋轉(zhuǎn)編碼器旋轉(zhuǎn)一周,輸出200個(gè)脈沖。
        2、使用輸入捕捉通道0進(jìn)行脈沖的捕捉。設(shè)定位下降沿捕捉方式。開(kāi)啟輸入捕捉中斷,在中斷程序中對(duì)全局變量iPulesNumAll進(jìn)行計(jì)數(shù),每進(jìn)入一次中斷程序,變量iPulesNumAll加1。
        3、使用模數(shù)計(jì)數(shù)器進(jìn)行定時(shí),定時(shí)時(shí)間為500ms,當(dāng)達(dá)到500MS后,讀取iPulesNumAll中的數(shù)值,即可通過(guò)公式計(jì)算出速度。
        定時(shí)過(guò)程中,既可以直接定時(shí)500MS,也可以定時(shí)1MS。在定時(shí)1MS的方案中,通過(guò)設(shè)定一個(gè)全局變量或靜態(tài)變量iSpeedNum進(jìn)行計(jì)數(shù),當(dāng)計(jì)數(shù)到500后再讀取iPulesNumAll中的數(shù)值。
        速度公式:
        V=(車輪周長(zhǎng)*總脈沖數(shù))/(旋轉(zhuǎn)編碼器脈沖數(shù)*定時(shí)周期)
        =(iWheelGirth*iPulesNumAll)/(iPulesNum*iSpeedTime)
        =(iWheelGirth*iPulesNumAll)/(200*0.5)
        4、BusClock:16Mhz

        CODE:
        #include
        #include
        #pragma LINK_INFO DERIVATIVE "mc9s12xs128"
        //===========================================================//
        //通道0輸入捕捉測(cè)速程序,PT0輸入旋轉(zhuǎn)編碼器輸出脈沖
        //16位模數(shù)遞減計(jì)數(shù)器進(jìn)行計(jì)數(shù)
        //author: Yangtze
        //time:2009/4/18/3:15:45
        //===========================================================//
        #define iPulesNum200//旋轉(zhuǎn)編碼器脈沖數(shù)
        #define iSpeedNum500//定時(shí)時(shí)間次數(shù),一次為1MS
        #define iWheelGirth 0.1//車輪周長(zhǎng)
        #define iSpeedTime0.5//定時(shí)周期
        intiPulesNumAll=0;//總脈沖數(shù)
        int V=0;//速度變量
        void pllclk(void) //16MHz
        {
        SYNR=0x01;//PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)
        REFDV=0x01;
        CLKSEL=0x80;//選定PLL時(shí)鐘
        }
        void Init_PT0_ICapture(void)
        {
        TIOS=0xfe;//設(shè)定通道0為輸入捕捉工作方式
        TSCR2=0x87;//開(kāi)啟定時(shí)器中斷

        TFLG1=0xFF; //清除中斷標(biāo)志位
        TCTL4=0x02; //設(shè)置輸入捕捉方式的捕捉方式
        TIE=0x01;//定時(shí)器中斷使能
        }

        void Init_MDC(void)
        {
        MCCTL=0xDF;//設(shè)定模數(shù)計(jì)數(shù)器工作方式,中斷使能,計(jì)數(shù)器使能
        //分頻系數(shù)為16
        MCCNT=1000;//定時(shí)器賦初值 (1/16M)*16*1000= 1ms
        }

        void main(void)
        {
        pllclk();

        Init_PT0_ICapture();
        Init_MDC();

        EnableInterrupts;
        for(;;) {}
        }

        #pragma CODE_SEG __NEAR_SEG NON_BANKED
        void interrupt 26 MDC_ISR(void)
        {
        static unsigned int count=0;
        count++;
        if(count==iSpeedNum)//400MS讀取一次
        {
        V=(iPulesNumAll*iWheelGirth)/ (iPulesNum*iSpeedTime); //計(jì)算當(dāng)前速度

        iPulesNumAll=0;
        count=0;
        }
        MCFLG = 0x80;//清中斷標(biāo)志位
        }

        #pragma CODE_SEG __NEAR_SEG NON_BANKED
        void interrupt 9 PT4_Capture(void)
        {
        TFLG1=0x10;//清中斷標(biāo)志位
        iPulesNumAll++;//脈沖計(jì)數(shù)
        }

        //后記:
        //在編寫(xiě)這個(gè)程序當(dāng)中,既有自己的思路,也參考了whut_wj的一些思路。感謝whut_wj。
        //在檢測(cè)速度程序中,我的想法是,通過(guò)脈沖累加器進(jìn)行計(jì)數(shù),當(dāng)計(jì)數(shù)值達(dá)到200個(gè)脈沖時(shí),觸發(fā)中斷,在脈沖累加器溢出中斷中程序中,命令一個(gè)IO口想輸入捕捉通道一個(gè)脈沖,去觸發(fā)輸入捕捉通道的輸入捕捉中斷,讀取輸入捕捉通道中寄存器中的數(shù)值,即可知道小車行走一圈的速度了。
        //而whut_wj的程序體現(xiàn)的算法是,在單位時(shí)間內(nèi),讀取捕捉到的所有脈沖數(shù),因?yàn)闀r(shí)間一定,也可以計(jì)算出速度。這樣的好處是電路和程序簡(jiǎn)單,而且需要的資源少,而且可選。在程序中,只需要一個(gè)全局變量或是靜態(tài)變量,即可以實(shí)現(xiàn)參數(shù)的傳遞算出小車運(yùn)行當(dāng)中的速度。
        //通過(guò)這兩個(gè)思路的對(duì)比,讓我了解了編程的一點(diǎn)點(diǎn)本質(zhì),雖然不過(guò)很透徹,不過(guò)卻給我指明了一點(diǎn)方向:處理問(wèn)題的算法又很多,程序員需要做到的就是在很多算法中選出最適合處理某一個(gè)問(wèn)題的算法。因?yàn)槟呐率峭粋€(gè)問(wèn)題,在不同的情況下,使用的同一中算法,可能執(zhí)行結(jié)果也有很大的差距。用一個(gè)簡(jiǎn)單的詞說(shuō)就是具體問(wèn)題具體分析
        //同時(shí)也找到了聯(lián)系編程的一些方法,就是多看,多練,多想。


        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 盐山县| 双柏县| 库伦旗| 兴安县| 庆云县| 增城市| 墨脱县| 金阳县| 册亨县| 曲周县| 苏州市| 南岸区| 清徐县| 武川县| 滦平县| 通榆县| 磴口县| 大城县| 泰来县| 涟水县| 榆社县| 南华县| 田东县| 东山县| 临西县| 吴堡县| 无棣县| 报价| 淅川县| 鄂托克旗| 施秉县| 洪泽县| 凭祥市| 台北市| 讷河市| 繁昌县| 罗山县| 中江县| 黔江区| 高雄市| 西宁市|