OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5216|回复: 4

输入捕获精度问题,

[复制链接]

38

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2013-12-7
在线时间
15 小时
发表于 2015-4-18 10:31:53 | 显示全部楼层 |阅读模式
5金钱

void TIM1_IRQHandler(void)// 用相应的定时器中断
{
 if (TIM_GetITStatus(TIM1, TIM_IT_CC2) != RESET)//是TIM1CH2
 {
  TIM_ClearITPendingBit(TIM1, TIM_IT_CC2);//清空捕获标志
  //第一次捕获
  if(capture_number==0 )
  {
    Ic1_readvalue1 = TIM_GetCapture2(TIM1);//保留捕获值
    capture_number=1;//设置标志
  }
  //第二次捕获
 else if(capture_number==1)
 {
   Ic1_readvalue2 = TIM_GetCapture2(TIM1);//保留捕获值
 }
 //若脉宽较长时,定时器可能溢出,需对溢出进行处理
 //考虑是否溢出,计算两次的差值
 if(Ic1_readvalue1>Ic1_readvalue2)
 {
   CAPTURE=Ic1_readvalue2-Ic1_readvalue1-1;
 }
 else
 {
   CAPTURE=Ic1_readvalue2-Ic1_readvalue1-1+0xffff;
 }
 TIM1_FREQ =(u32)72000000/ CAPTURE; //计算实际频率值 若是已经分频或者时钟也改变则相应的也对改变
  }
 capture_number=0;
}

这段程序   CAPTURE=Ic1_readvalue2-Ic1_readvalue1-1+0xffff;      CAPTURE=Ic1_readvalue2-Ic1_readvalue1-1;获取值后为什么这样计算,直接 TIM1_FREQ=时钟数/Ic1_readvalue1不就出来了吗, TIM1_FREQ=时钟数/Ic1_readvalue1算出来与实际相差4HZ,前面这种算法精度要高难道说,

最佳答案

查看完整内容[请看2#楼]

回复【3楼】阳光&守望者: --------------------------------- 我可以给你一个思路,代码需要你自己写 使用定时器或状态机,或者是两者结合 定时器定时打开捕获中断(在脉冲频率高于你需要获取数据次数的情况下,按你需要的频率),脉冲来后捕获到发送。 二是主循环中加入状态机制flag,如 flag++; if(flag%100==0){ flag=0; 这里打开你的捕获中断 } 两者的结合就是专门用一个定时器负责任务执行频率(非抢占式调度,需要控 ...
每天都是新开始
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2014-11-24
在线时间
65 小时
发表于 2015-4-18 10:31:54 | 显示全部楼层
回复【3楼】阳光&守望者:
---------------------------------
我可以给你一个思路,代码需要你自己写

使用定时器或状态机,或者是两者结合

定时器定时打开捕获中断(在脉冲频率高于你需要获取数据次数的情况下,按你需要的频率),脉冲来后捕获到发送。

二是主循环中加入状态机制flag,如

flag++;
if(flag%100==0){
flag=0;
这里打开你的捕获中断
}


两者的结合就是专门用一个定时器负责任务执行频率(非抢占式调度,需要控制好每个任务执行一次说需要的时间)。

如果脉冲是连续的且频率很高,最好不要时钟开着捕获中断,因为那样你CPU的时间都让中断进出占用了。
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5782
金钱
5782
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-4-18 20:30:54 | 显示全部楼层
定时器开启,一直在发生捕获,而你需要连续捕获2个边沿信号,通过他们之间的差值来计算2个边沿信号之间的时间(即周期),然后倒数求频率
你那个算法只在某一特殊情况下成了---那就是定时器CNT=0的时候刚好第一次捕获,然后第二次捕获的值为Ic1_readvalue1
回复

使用道具 举报

38

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2013-12-7
在线时间
15 小时
 楼主| 发表于 2015-4-19 11:09:12 | 显示全部楼层

我在做两路输入脉冲频率的测量,只要接到外部方波信号,串口就一直打印刷屏,我应改怎么延时时间呢,自定义软件延时试了效果不好,请指教,STM32库函数不太熟
每天都是新开始
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2014-11-24
在线时间
65 小时
发表于 2015-4-19 14:06:02 | 显示全部楼层
回复【4楼】liuem-mcu:
---------------------------------
在捕获中断中,需要清除标志位并关闭中断
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 11:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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