新聞中心

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

飛思卡爾那些事之ECT方式檢測速度

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

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


關(guān)鍵詞: 飛思卡爾ECT方式檢測速

評論


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

關(guān)閉