标题:
求助:哪位高人能帮忙解答其疑问,不胜感激。
[打印本页]
作者:
唯一笑
时间:
2010-1-7 14:15
标题:
求助:哪位高人能帮忙解答其疑问,不胜感激。
/*这是一段基于编码器确定路程的程序,但是编译时length的值会出现负值,而且得到的脉冲数Get_pulse误差也很大,不知是什么缘故?请帮忙解答一下,多谢多谢*/
#incde <hidef.h> /* common defines and macros */
#include <mc9s12xep100.h>/* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xep100"
//通道0,1入捕捉测速程序,PT0,PT1输入编码器输入脉冲,进行比较判断方向
//16位模数递减计数器进行计数
//**************利用路程定位,误差可能很大,可以考虑利用位移
const int iPulesNum=500//旋转编码器每个周期脉冲数
const int SpeedtimeNum=500//定时时间次数,一次为1mS,减少捕捉时间,减小误差不知是否可行
const int WheelGirth=100//车轮周长,单位mm
#define forwards 1//前进
#define backwards 0//后退
unsigned char direction;
int Get_pulse;
int length;
void CrgInit(void)
{
CLKSEL=0X00; //disengage PLL to system
PLLCTL_PLLON=1; //turn on PLL
SYNR =0xc0 | 0x07;
REFDV=0x80 | 0x01;
POSTDIV=0x00; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=128MHz;
_asm(nop); //BUS CLOCK=64M
_asm(nop);
while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;
CLKSEL_PLLSEL =1; //engage PLL to system;
}
void EctInit(void) //定时器初始化
{
ECT_TIOS=0xfc;//设定通道0,1为输入捕捉工作方式,A脉冲输入0通道,B脉冲输入1通道。
ECT_TSCR2=0x87;//开启定时器中断 ,同时确定预分频为64M/128
ECT_TFLG1=0xFF; //清除中断标志位
ECT_TCTL4=0x01; //设置输入捕捉方式的捕捉方式,上升沿捕捉
ECT_TIE=0x01; //定时器0通道中断使能
ECT_MCCTL=0xDF;//设定模数计数器工作方式,中断使能,计数器使能
//分频系数为16
ECT_MCCNT=4000;//定时器赋初值 (1/64M)*16*4000= 1ms
ECT_PBCTL=0x40;//级联两个八位累加器(PAC0,PAC1)
ECT_ICPAR=0x03;//使能累加器
ECT_PACN10=0x0000;//累加器赋初值
}
void main(void)
{
DisableInterrupts;
CrgInit();
EctInit();
EnableInterrupts;
for(;;);
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 26 MDC_ISR(void)
{
unsigned int count=0;
ECT_MCCTL_MCZI=0;//关闭模数计时器中断
ECT_MCFLG = 0x80; //清中模数计时器中断标志位
ECT_MCCTL_MCZI=1;//开启模数计时器中断
count++;
if(count==SpeedtimeNum) //500ms读取一次
{
Get_pulse=ECT_PACN10;
length=Get_pulse*100/iPulesNum*WheelGirth;//乘一百是为了减小误差,最终处理数据时应注意这里
count=0;
}
}
void interrupt 8 PT0_Capture(void)
{
DisableInterrupt;
ECT_TFLG1=0x01; //清中断标志位
if(TIM_TIOS_IOS1&&1)direction=forwards ;
else direction=backwards ;
EnableInterrupts;
}
作者:
mcu2007
时间:
2010-1-8 12:02
你的计数是怎么保证,加减区分的?比如forward GET_pulse+,backwards get_pulse-,是怎么区别的?如果无法区别是否存在一直处于将GET_pulse减的状态;我对ECT和模数计时器还不是很了解,刚开始学MC的片子,呵呵 小小愚见!
作者:
唯一笑
时间:
2010-1-10 14:00
2#
mcu2007
无论如何,多谢多谢,
作者:
strongchen
时间:
2010-1-11 10:00
你的length和get_pulse定义的都是int,本身就是有符号数,当然有可能是负值。
作者:
唯一笑
时间:
2010-1-16 18:15
4#
strongchen
哦,原来是这样啊,多谢指教
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0