智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 5166|回复: 10
打印 上一主题 下一主题

[编程类] 求助:哪位高人能帮忙解答其疑问,不胜感激。

[复制链接]

3

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
QQ
威望
266
贡献
19
兑换币
0
注册时间
2009-12-22
在线时间
4 小时
跳转到指定楼层
#
发表于 2010-1-7 14:42:08 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
1贡献
/*这是一段基于编码器确定路程的程序,但是编译时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;
}

最佳答案

查看完整内容

I faint! 你中断时间应该是1MS吧,如果没算错的话,SpeedtimeNum=500那就是500MS处理一次PID,又不是用低精度的码盘,500P/R这么高精度的编码器你还500MS才处理一次啊?一般10~15MS处理一次就可以了,你500MS处理一次的话,脉冲累加超过了65535/2=32767就溢出了不出现负值才怪。 试一下SpeedtimeNum=12,不过你判断方向那段程序确实写得很精彩,我要学习一下。

4

主题

215

帖子

0

精华

高级会员

Rank: 4

积分
622
QQ
威望
475
贡献
55
兑换币
20
注册时间
2010-3-8
在线时间
46 小时
10#
发表于 2010-5-10 17:36:13 | 只看该作者
回复

使用道具 举报

3

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
QQ
威望
266
贡献
19
兑换币
0
注册时间
2009-12-22
在线时间
4 小时
9#
 楼主| 发表于 2010-3-8 16:55:32 | 只看该作者
回复 8# 0708140119


    肯定是要测定方向的,要不然这段程序就没有什么意义了
回复

使用道具 举报

3

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
QQ
威望
266
贡献
19
兑换币
0
注册时间
2009-12-22
在线时间
4 小时
8#
 楼主| 发表于 2010-3-8 16:54:11 | 只看该作者
回复 7# chenrunshe_007


    不好意思,很久没来了,你说的很对,确实是溢出了,多谢指教
回复

使用道具 举报

3

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
威望
219
贡献
26
兑换币
4
注册时间
2009-10-25
在线时间
28 小时
7#
发表于 2010-3-2 14:01:00 | 只看该作者
一定要侧方向吗?
回复

使用道具 举报

21

主题

1019

帖子

0

精华

常驻嘉宾

我爱雯婕

Rank: 8Rank: 8

积分
4657
威望
2223
贡献
1682
兑换币
4
注册时间
2009-3-4
在线时间
376 小时
6#
发表于 2010-1-17 00:53:04 | 只看该作者
回复 6# 唯一笑
我说的那套到底行不行?如果不行的话不要设为最佳答案以免误人子弟,我可不想被臭骂。
回复

使用道具 举报

3

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
QQ
威望
266
贡献
19
兑换币
0
注册时间
2009-12-22
在线时间
4 小时
5#
 楼主| 发表于 2010-1-13 16:23:53 | 只看该作者
回复 3# chenrunshe_007


    多谢指教
回复

使用道具 举报

3

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
QQ
威望
266
贡献
19
兑换币
0
注册时间
2009-12-22
在线时间
4 小时
4#
 楼主| 发表于 2010-1-13 16:22:56 | 只看该作者
本帖最后由 唯一笑 于 2010-1-13 16:27 编辑

回复 4# whut_wj


    定时器的1通道,因为我把A相脉冲输入到0口,B相脉冲输入到1口,当A相脉冲处于上升沿时,B相脉冲在不同转动方向会处于不同电平,我想利用这个辨向
回复

使用道具 举报

14

主题

929

帖子

1

精华

功勋会员

WJ

Rank: 10Rank: 10Rank: 10

积分
6304

特殊贡献奖章

威望
1456
贡献
4674
兑换币
17
注册时间
2008-4-6
在线时间
87 小时
3#
发表于 2010-1-7 22:18:52 | 只看该作者
1 编译是指成把你的代码生成目标代码,其中还有代码优化,错误检查等等,
   在cw里是生成s19文件,你那个过程叫run,或者是仿真运行。
2  要不为负数,把length改为UINT (unsigned int),但是为什么会出现负数呢?
  无符号数里,是通过补码表示负数的,如果最高位为1那么就为负数.这说明length>32767了,肯定是溢出了。
3 测方向的方法行不通。TIM_TIOS_IOS1是什么。
回复

使用道具 举报

21

主题

1019

帖子

0

精华

常驻嘉宾

我爱雯婕

Rank: 8Rank: 8

积分
4657
威望
2223
贡献
1682
兑换币
4
注册时间
2009-3-4
在线时间
376 小时
2#
发表于 2010-1-7 16:41:17 | 只看该作者
回复 1# 唯一笑
你问我答板块不涉及代码,你发在代码交流那里可能会有更多人回答
回复

使用道具 举报

21

主题

1019

帖子

0

精华

常驻嘉宾

我爱雯婕

Rank: 8Rank: 8

积分
4657
威望
2223
贡献
1682
兑换币
4
注册时间
2009-3-4
在线时间
376 小时
1#
发表于 2010-1-7 14:42:09 | 只看该作者
本帖最后由 chenrunshe_007 于 2010-1-7 16:54 编辑

I faint!
你中断时间应该是1MS吧,如果没算错的话,SpeedtimeNum=500那就是500MS处理一次PID,又不是用低精度的码盘,500P/R这么高精度的编码器你还500MS才处理一次啊?一般10~15MS处理一次就可以了,你500MS处理一次的话,脉冲累加超过了65535/2=32767就溢出了不出现负值才怪。
试一下SpeedtimeNum=12,不过你判断方向那段程序确实写得很精彩,我要学习一下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-29 02:04 , Processed in 0.204326 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表