智能车制作

 找回密码
 注册

扫一扫,访问微社区

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

输入捕捉不准

[复制链接]

0

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
威望
181
贡献
22
兑换币
0
注册时间
2009-9-8
在线时间
9 小时
跳转到指定楼层
1#
发表于 2009-9-14 15:56:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,我最近编了一个输入捕捉测脉冲频率的小程序,发现测的脉冲的频率不太准,比如,如果是1hz,我测得是频率是0.965左右,如果是100hz,测得的频率是99.58hz左右,如果是1000hz,测得的频率是995.5左右,大家帮忙分析下,是什么原因呢,程序如下:
#include <hidef.h>      /* common defines and macros */
#include <mc9s12hy64.h>
#pragma LINK_INFO DERIVATIVE "mc9s12hy64"
void timer0_init(void)
{
  TIM0_TIE=0x10; //允许C4I中断
  TIM0_TSCR2_PR=0x02; //时钟=M Clock/4=2MHz
  TIM0_TIOS =0xEF; //ch2设置为输入捕捉
  TIM0_TSCR1_TEN = 1;  //启用定时器
  TIM0_TCTL3=0x02; //捕捉上升沿
  TIM0_TFLG1=0xFF; //写1清除标志,其实是让寄存器中的值变成0
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 12 void timer0overflow(void)
{
if(!flg)
  {
     rising_1=TIM0_TCNT;
     TIM0_TSCR2_TOI=1;
     TIM0_TFLG1_C4F=1; //写1清除C2F标志
     flg=1;
  }
else
  {  
     rising_2=TIM0_TCNT;
     TIM0_TSCR2_TOI=0;
     TIM0_TFLG1_C4F=1; //写1清除C2F标志
    {
        if(rising_2 < rising_1)
       {
          new_rising=rising_2+0xFFFF;
          period=((float)new_rising-(float)rising_1);//单位为微秒
          for(u=1;u<P;u++)
          { period=period+0xFFFF; }
       }
       else
       {
          period=((float)rising_2-(float)rising_1);
          for(u=1;u<P;u++)
          { period=period+0xFFFF; }
       }
           TIM0_TCNT=0;
           frequency=2000000.0/period; //Hz  
           t=frequency*24;
           flg=0;
           P=0;
      }
  }
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 16 void timeroverflow(void)
{
   TIM0_TFLG2_TOF=1;
   P++;
}
#pragma CODE_SEG D EFAULT

0

主题

2

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
威望
184
贡献
30
兑换币
6
注册时间
2009-9-16
在线时间
1 小时
2#
发表于 2009-9-16 13:48:42 | 只看该作者
可以在软件中通过调整时间来抵消误差,以前我做过测频的东西也不准,调整一下就行了。
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
威望
181
贡献
22
兑换币
0
注册时间
2009-9-8
在线时间
9 小时
3#
 楼主| 发表于 2009-9-16 16:38:02 | 只看该作者
你是说要人为的加些延迟进去,是吗
回复 支持 反对

使用道具 举报

80

主题

1045

帖子

0

精华

跨届大侠

北京龙邱智能科技有限公司

Rank: 10Rank: 10Rank: 10

积分
10332

论坛元老奖章

QQ
威望
2905
贡献
6151
兑换币
4515
注册时间
2008-6-7
在线时间
638 小时
4#
发表于 2009-9-17 19:17:05 | 只看该作者
是你的定时不准确吧。
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
威望
181
贡献
22
兑换币
0
注册时间
2009-9-8
在线时间
9 小时
5#
 楼主| 发表于 2009-9-18 09:06:54 | 只看该作者
我没用定时器啊,只是用的计数器捕捉脉冲下降沿嘛
回复 支持 反对

使用道具 举报

80

主题

1045

帖子

0

精华

跨届大侠

北京龙邱智能科技有限公司

Rank: 10Rank: 10Rank: 10

积分
10332

论坛元老奖章

QQ
威望
2905
贡献
6151
兑换币
4515
注册时间
2008-6-7
在线时间
638 小时
6#
发表于 2009-9-19 09:11:05 | 只看该作者
那你的频率从何谈起?频率是“1秒”钟内脉冲发生的次数,这个“1秒”就是你要确定的时间槛。搞定时间槛频率测量就准确了!
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
威望
181
贡献
22
兑换币
0
注册时间
2009-9-8
在线时间
9 小时
7#
 楼主| 发表于 2009-9-19 10:29:37 | 只看该作者
哦,我没有用到定时,我就是采样两个相邻脉冲的下降沿,计算时间差,求得的脉冲频率,不是定时1s采样的脉冲个数,所以时间槛跟我的程序没关系啊
回复 支持 反对

使用道具 举报

80

主题

1045

帖子

0

精华

跨届大侠

北京龙邱智能科技有限公司

Rank: 10Rank: 10Rank: 10

积分
10332

论坛元老奖章

QQ
威望
2905
贡献
6151
兑换币
4515
注册时间
2008-6-7
在线时间
638 小时
8#
发表于 2009-9-19 23:45:12 | 只看该作者
那你的时间差计算的准确吗?如果准确就没问题的。
回复 支持 反对

使用道具 举报

21

主题

1019

帖子

0

精华

常驻嘉宾

我爱雯婕

Rank: 8Rank: 8

积分
4657
威望
2223
贡献
1682
兑换币
4
注册时间
2009-3-4
在线时间
376 小时
9#
发表于 2009-9-20 01:31:55 | 只看该作者
可能是你没有把中断里面的运行语句耗得时间算进去所以有点误差,要不就真的是你的板本身的工艺所决定的精度不可能达到100%,有95%以上就不错了
回复 支持 反对

使用道具 举报

0

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
威望
243
贡献
43
兑换币
0
注册时间
2009-9-13
在线时间
11 小时
10#
发表于 2009-9-20 16:44:17 | 只看该作者
定时不准确吧。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 02:35 , Processed in 0.069026 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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