飛思卡爾那些事之ECT方式檢測速度
資源:
1、增量式旋轉(zhuǎn)編碼器。旋轉(zhuǎn)編碼器是測量速度的一種裝置,旋轉(zhuǎn)編碼器每旋轉(zhuǎn)一周,就會輸出特定數(shù)目的脈沖。在單位時間內(nèi)記錄讀取到旋轉(zhuǎn)編碼器輸出的脈沖數(shù),即可知道旋轉(zhuǎn)編碼器轉(zhuǎn)動的圈數(shù),即輪胎的轉(zhuǎn)動速度。因為輪胎周長一定,所有可以求得在單位時間內(nèi)小車行駛的路程,再通過計算即可得到小車的速度,如果單位時間足夠小,則可以近似認(rèn)為該速度位瞬時速度。
2、HCS12的ECT模塊。在ECT模塊中的輸入捕捉定時器和脈沖累加器可以實現(xiàn)旋轉(zhuǎn)編碼器的脈沖計數(shù)。
方案:
1、輸入捕捉(Intput Capture)計數(shù)方式。通過輸入捕捉模塊,進行脈沖輸入捕捉,在中斷程序中通過全局變量進行計數(shù),每捕捉到一個脈沖進行一次計數(shù),在單位時間內(nèi)讀取輸入捕捉中斷程序計數(shù)變量的計數(shù)值。
2、脈沖計數(shù)器(Modulus Counter)方式。通過脈沖累加器進行脈沖輸入捕捉,模數(shù)計數(shù)器設(shè)定為單位時間中斷,在模數(shù)計數(shù)器中斷程序中讀取脈沖累加器的計數(shù)數(shù)值。脈沖累加器可以選用16位脈沖累加器。也可以用8位的脈沖累加器。
3、模數(shù)計數(shù)器進行定時,每500MS讀取一次脈沖數(shù)。讀取這500MS中的脈沖數(shù)即可算出輸出速度。
說明:
1、旋轉(zhuǎn)編碼器選用的是YZ30D-4S-2NA-200;該旋轉(zhuǎn)編碼器旋轉(zhuǎn)一周,輸出200個脈沖。
2、使用輸入捕捉通道0進行脈沖的捕捉。設(shè)定位下降沿捕捉方式。開啟輸入捕捉中斷,在中斷程序中對全局變量iPulesNumAll進行計數(shù),每進入一次中斷程序,變量iPulesNumAll加1。
3、使用模數(shù)計數(shù)器進行定時,定時時間為500ms,當(dāng)達(dá)到500MS后,讀取iPulesNumAll中的數(shù)值,即可通過公式計算出速度。
定時過程中,既可以直接定時500MS,也可以定時1MS。在定時1MS的方案中,通過設(shè)定一個全局變量或靜態(tài)變量iSpeedNum進行計數(shù),當(dāng)計數(shù)到500后再讀取iPulesNumAll中的數(shù)值。
速度公式:
V=(車輪周長*總脈沖數(shù))/(旋轉(zhuǎn)編碼器脈沖數(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ù)遞減計數(shù)器進行計數(shù)
//author: Yangtze
//time:2009/4/18/3:15:45
//===========================================================//
#define iPulesNum 200//旋轉(zhuǎn)編碼器脈沖數(shù)
#define iSpeedNum 500//定時時間次數(shù),一次為1MS
#define iWheelGirth 0.1//車輪周長
#define iSpeedTime 0.5//定時周期
int iPulesNumAll=0;//總脈沖數(shù)
int V=0;//速度變量
void pllclk(void) //16MHz
{
SYNR=0x01; //PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)
REFDV=0x01;
CLKSEL=0x80; //選定PLL時鐘
}
void Init_PT0_ICapture(void)
{
TIOS=0xfe;//設(shè)定通道0為輸入捕捉工作方式
TSCR2=0x87;//開啟定時器中斷
TFLG1=0xFF; //清除中斷標(biāo)志位
TCTL4=0x02; //設(shè)置輸入捕捉方式的捕捉方式
TIE=0x01; //定時器中斷使能
}
void Init_MDC(void)
{
MCCTL=0xDF;//設(shè)定模數(shù)計數(shù)器工作方式,中斷使能,計數(shù)器使能
//分頻系數(shù)為16
MCCNT=1000;//定時器賦初值 (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); //計算當(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++; //脈沖計數(shù)
}
//后記:
//在編寫這個程序當(dāng)中,既有自己的思路,也參考了whut_wj的一些思路。感謝whut_wj。
//在檢測速度程序中,我的想法是,通過脈沖累加器進行計數(shù),當(dāng)計數(shù)值達(dá)到200個脈沖時,觸發(fā)中斷,在脈沖累加器溢出中斷中程序中,命令一個IO口想輸入捕捉通道一個脈沖,去觸發(fā)輸入捕捉通道的輸入捕捉中斷,讀取輸入捕捉通道中寄存器中的數(shù)值,即可知道小車行走一圈的速度了。
//而whut_wj的程序體現(xiàn)的算法是,在單位時間內(nèi),讀取捕捉到的所有脈沖數(shù),因為時間一定,也可以計算出速度。這樣的好處是電路和程序簡單,而且需要的資源少,而且可選。在程序中,只需要一個全局變量或是靜態(tài)變量,即可以實現(xiàn)參數(shù)的傳遞算出小車運行當(dāng)中的速度。
//通過這兩個思路的對比,讓我了解了編程的一點點本質(zhì),雖然不過很透徹,不過卻給我指明了一點方向:處理問題的算法又很多,程序員需要做到的就是在很多算法中選出最適合處理某一個問題的算法。因為哪怕是同一個問題,在不同的情況下,使用的同一中算法,可能執(zhí)行結(jié)果也有很大的差距。用一個簡單的詞說就是具體問題具體分析 。
//同時也找到了聯(lián)系編程的一些方法,就是多看,多練,多想。
1、增量式旋轉(zhuǎn)編碼器。旋轉(zhuǎn)編碼器是測量速度的一種裝置,旋轉(zhuǎn)編碼器每旋轉(zhuǎn)一周,就會輸出特定數(shù)目的脈沖。在單位時間內(nèi)記錄讀取到旋轉(zhuǎn)編碼器輸出的脈沖數(shù),即可知道旋轉(zhuǎn)編碼器轉(zhuǎn)動的圈數(shù),即輪胎的轉(zhuǎn)動速度。因為輪胎周長一定,所有可以求得在單位時間內(nèi)小車行駛的路程,再通過計算即可得到小車的速度,如果單位時間足夠小,則可以近似認(rèn)為該速度位瞬時速度。
2、HCS12的ECT模塊。在ECT模塊中的輸入捕捉定時器和脈沖累加器可以實現(xiàn)旋轉(zhuǎn)編碼器的脈沖計數(shù)。
方案:
1、輸入捕捉(Intput Capture)計數(shù)方式。通過輸入捕捉模塊,進行脈沖輸入捕捉,在中斷程序中通過全局變量進行計數(shù),每捕捉到一個脈沖進行一次計數(shù),在單位時間內(nèi)讀取輸入捕捉中斷程序計數(shù)變量的計數(shù)值。
2、脈沖計數(shù)器(Modulus Counter)方式。通過脈沖累加器進行脈沖輸入捕捉,模數(shù)計數(shù)器設(shè)定為單位時間中斷,在模數(shù)計數(shù)器中斷程序中讀取脈沖累加器的計數(shù)數(shù)值。脈沖累加器可以選用16位脈沖累加器。也可以用8位的脈沖累加器。
3、模數(shù)計數(shù)器進行定時,每500MS讀取一次脈沖數(shù)。讀取這500MS中的脈沖數(shù)即可算出輸出速度。
說明:
1、旋轉(zhuǎn)編碼器選用的是YZ30D-4S-2NA-200;該旋轉(zhuǎn)編碼器旋轉(zhuǎn)一周,輸出200個脈沖。
2、使用輸入捕捉通道0進行脈沖的捕捉。設(shè)定位下降沿捕捉方式。開啟輸入捕捉中斷,在中斷程序中對全局變量iPulesNumAll進行計數(shù),每進入一次中斷程序,變量iPulesNumAll加1。
3、使用模數(shù)計數(shù)器進行定時,定時時間為500ms,當(dāng)達(dá)到500MS后,讀取iPulesNumAll中的數(shù)值,即可通過公式計算出速度。
定時過程中,既可以直接定時500MS,也可以定時1MS。在定時1MS的方案中,通過設(shè)定一個全局變量或靜態(tài)變量iSpeedNum進行計數(shù),當(dāng)計數(shù)到500后再讀取iPulesNumAll中的數(shù)值。
速度公式:
4、BusClock:16Mhz
CODE:
#include
#include
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
//===========================================================//
//通道0輸入捕捉測速程序,PT0輸入旋轉(zhuǎn)編碼器輸出脈沖
//16位模數(shù)遞減計數(shù)器進行計數(shù)
//author: Yangtze
//time:2009/4/18/3:15:45
//===========================================================//
#define iPulesNum
#define iSpeedNum
#define iWheelGirth 0.1//車輪周長
#define iSpeedTime
int
int V=0;//速度變量
void pllclk(void) //16MHz
{
}
void Init_PT0_ICapture(void)
{
}
void Init_MDC(void)
{
}
void main(void)
{
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 26 MDC_ISR(void)
{
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 9 PT4_Capture(void)
{
}
評論