色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          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)小車(chē)行駛的路程,再通過(guò)計(jì)算即可得到小車(chē)的速度,如果單位時(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=(車(chē)輪周長(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//車(chē)輪周長(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ù)值,即可知道小車(chē)行走一圈的速度了。
          //而whut_wj的程序體現(xiàn)的算法是,在單位時(shí)間內(nèi),讀取捕捉到的所有脈沖數(shù),因?yàn)闀r(shí)間一定,也可以計(jì)算出速度。這樣的好處是電路和程序簡(jiǎn)單,而且需要的資源少,而且可選。在程序中,只需要一個(gè)全局變量或是靜態(tài)變量,即可以實(shí)現(xiàn)參數(shù)的傳遞算出小車(chē)運(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ù)專(zhuān)區(qū)

          關(guān)閉