新聞中心

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ù)
}

//后記:
//在編寫這個(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)閉