您的位置 首页 传感器

飞思卡尔那些事之ECT方法检测速度

资源:1、增量式旋转编码器。旋转编码器是测量速度的一种装置,旋转编码器每旋转一周,就会输出特定数目的脉冲。在单位时间内记录读取到旋

资源:
1、增量式旋转编码器。旋转编码器是丈量速度的一种设备,旋转编码器每旋转一周,就会输出特定数目的脉冲。在单位时刻内记载读取到旋转编码器输出的脉冲数,即可知道旋转编码器滚动的圈数,即轮胎的滚动速度。由于轮胎周长必定,一切能够求得在单位时刻内小车行进的旅程,再经过核算即可得到小车的速度,假如单位时刻满足小,则能够近似以为该速度位瞬时速度。
2、HCS12的ECT模块。在ECT模块中的输入捕捉守时器和脉冲累加器能够完成旋转编码器的脉冲计数。
计划:
1、输入捕捉(Intput Capture)计数办法。经过输入捕捉模块,进行脉冲输入捕捉,在中止程序中经过全局变量进行计数,每捕捉到一个脉冲进行一次计数,在单位时刻内读取输入捕捉中止程序计数变量的计数值。
2、脉冲计数器(Modulus Counter)办法。经过脉冲累加器进行脉冲输入捕捉,模数计数器设定为单位时刻中止,在模数计数器中止程序中读取脉冲累加器的计数数值。脉冲累加器能够选用16位脉冲累加器。也能够用8位的脉冲累加器。
3、模数计数器进行守时,每500MS读取一次脉冲数。读取这500MS中的脉冲数即可算出输出速度。
阐明:
1、旋转编码器选用的是YZ30D-4S-2NA-200;该旋转编码器旋转一周,输出200个脉冲。
2、运用输入捕捉通道0进行脉冲的捕捉。设定位下降沿捕捉办法。敞开输入捕捉中止,在中止程序中对全局变量iPulesNumAll进行计数,每进入一次中止程序,变量iPulesNumAll加1。
3、运用模数计数器进行守时,守时时刻为500ms,当到达500MS后,读取iPulesNumAll中的数值,即可经过公式核算出速度。
守时过程中,既能够直接守时500MS,也能够守时1MS。在守时1MS的计划中,经过设定一个全局变量或静态变量iSpeedNum进行计数,当计数到500后再读取iPulesNumAll中的数值。
速度公式:
V=(车轮周长*总脉冲数)/(旋转编码器脉冲数*守时周期)
=(iWheelGirth*iPulesNumAll)/(iPulesNum*iSpeedTime)
=(iWheelGirth*iPulesNumAll)/(200*0.5)
4、BusClock:16Mhz

CODE:
#include
#include
#pragma LINK_INFO DERIVATIVE “mc9s12xs128”
//===========================================================//
//通道0输入捕捉测速程序,PT0输入旋转编码器输出脉冲
//16位模数递减计数器进行计数
//author: Yangtze
//time:2009/4/18/3:15:45
//===========================================================//
#define iPulesNum200//旋转编码器脉冲数
#define iSpeedNum500//守时时刻次数,一次为1MS
#define iWheelGirth 0.1//车轮周长
#define iSpeedTime0.5//守时周期
intiPulesNumAll=0;//总脉冲数
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;//设定通道0为输入捕捉工作办法
TSCR2=0x87;//敞开守时器中止

TFLG1=0xFF; //铲除中止标志位
TCTL4=0x02; //设置输入捕捉办法的捕捉办法
TIE=0x01;//守时器中止使能
}

void Init_MDC(void)
{
MCCTL=0xDF;//设定模数计数器工作办法,中止使能,计数器使能
//分频系数为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); //核算当时速度

iPulesNumAll=0;
count=0;
}
MCFLG = 0x80;//清中止标志位
}

#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 9 PT4_Capture(void)
{
TFLG1=0x10;//清中止标志位
iPulesNumAll++;//脉冲计数
}

//跋文:
//在编写这个程序傍边,既有自己的思路,也参阅了whut_wj的一些思路。感谢whut_wj。
//在检测速度程序中,我的主意是,经过脉冲累加器进行计数,当计数值到达200个脉冲时,触发中止,在脉冲累加器溢出中止中程序中,指令一个IO口想输入捕捉通道一个脉冲,去触发输入捕捉通道的输入捕捉中止,读取输入捕捉通道中寄存器中的数值,即可知道小车行走一圈的速度了。
//而whut_wj的程序表现的算法是,在单位时刻内,读取捕捉到的一切脉冲数,由于时刻必定,也能够核算出速度。这样的优点是电路和程序简略,并且需求的资源少,并且可选。在程序中,只需求一个全局变量或是静态变量,即能够完成参数的传递算出小车运转傍边的速度。
//经过这两个思路的比照,让我了解了编程的一点点实质,尽管不过很透彻,不过却给我指明晰一点方向:处理问题的算法又许多,程序员需求做到的便是在许多算法中选出最适合处理某一个问题的算法。由于哪怕是同一个问题,在不同的情况下,运用的同一中算法,或许履行成果也有很大的距离。用一个简略的词说便是具体问题具体分析
//一起也找到了联络编程的一些办法,便是多看,多练,多想。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/261100.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部