打印

输入捕获测量频率有误差怎么办

[复制链接]
7316|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shangelaila|  楼主 | 2010-6-24 16:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
:(试着用输入捕获模式来测量输入信号的频率。。结果算出来和实际值相差很大,请大家帮忙分析一下原因吧,谢谢啊

程序:
EXTI_InitStructure.EXTI_Line = EXTI_Line3;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
  
  TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP;                 //配置为输入捕获模式         
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;                     //选择通道2
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;       //输入上升沿捕获  
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;   // 通道方向选择   
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;               //每次检测到捕获输入就触发一次捕获
  TIM_ICInitStructure.TIM_ICFilter = 0x0;                            //
  
  TIM_ICInit(TIM2, &TIM_ICInitStructure);
  
    /* Select the TIM2 Input Trigger: TI2FP2 【输入触发源选择】*/
  TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);                      

  /* Select the slave Mode: Reset Mode */
  TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);

  /* Enable the Master/Slave Mode */
  TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);        


  TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
  /* Enable the CC2 Interrupt Request */
  TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);

            /* TIM2 enable counter */
          TIM_Cmd(TIM2, ENABLE);  


最后在程序中通过TIM_GetCapture1(TIM2);读取值。。。结果误差很大。。。
请问这样做的问题出在哪?
沙发
香水城| | 2010-6-24 16:17 | 只看该作者
1)看看STM32固件库中的例程
2)看看旧帖,比如这个:TIM捕获频率不正确

使用特权

评论回复
板凳
shangelaila|  楼主 | 2010-6-24 16:27 | 只看该作者
2# 香水城

请问固件库是官网里面的那些程序吗?貌似没有找到定时器的啊。。。
能帮忙给个链接吗?谢谢

使用特权

评论回复
地板
香水城| | 2010-6-24 16:36 | 只看该作者
STM32F10x_StdPeriph_Lib - ARM-based 32-bit MCU STM32F10x Standard Peripheral Library

使用特权

评论回复
5
shangelaila|  楼主 | 2010-6-24 19:13 | 只看该作者
4# 香水城
请问通过捕获测量到频率需要多长时间?还有结果是实时更新的吗?

使用特权

评论回复
6
sinadz| | 2010-6-24 21:04 | 只看该作者
你确定你算频率的方式是对的吗,包括对定时器的配置

使用特权

评论回复
7
tiger84| | 2010-6-24 21:41 | 只看该作者
你输入信号的频率是多少?
定时器又是怎么配置的?
中断怎么写的?
都贴出来,呵呵。
我刚弄过这一块,还算熟悉

使用特权

评论回复
8
shangelaila|  楼主 | 2010-6-25 08:09 | 只看该作者
7# tiger84
我信号的频率是在一定范围内变化的,程序是拿官网的DEMO改的
是不是只能测量固定频率的信号啊?

使用特权

评论回复
9
香水城| | 2010-6-25 08:29 | 只看该作者
4# 香水城
请问通过捕获测量到频率需要多长时间?还有结果是实时更新的吗?
shangelaila 发表于 2010-6-24 19:13


只需一个周期即可测量到频率,结果是实时更新的。

使用特权

评论回复
10
shangelaila|  楼主 | 2010-6-25 08:56 | 只看该作者
9# 香水城
请问一个周期是指每一次定时器中断吗?还是指输入信号的一个周期?

使用特权

评论回复
11
香水城| | 2010-6-25 09:23 | 只看该作者
当然是指输入信号的一个周期,不然怎么能结果是实时更新的呢。

使用特权

评论回复
12
shangelaila|  楼主 | 2010-6-25 09:30 | 只看该作者
11# 香水城
哦。。那如果我在程序中不是每时每刻都需要测量频率,就是在需要的时候打开定时器测量频率,然后就关闭它。这个方法可行吗?或者有其他更好的方法吗?

使用特权

评论回复
13
香水城| | 2010-6-25 09:33 | 只看该作者
11# 香水城
哦。。那如果我在程序中不是每时每刻都需要测量频率,就是在需要的时候打开定时器测量频率,然后就关闭它。这个方法可行吗?或者有其他更好的方法吗? ...
shangelaila 发表于 2010-6-25 09:30


请问“实时更新”是什么意思?“只需一个周期即可测量到频率”是什么意思?

使用特权

评论回复
14
shangelaila|  楼主 | 2010-6-25 09:49 | 只看该作者
13# 香水城
意思是我需要的时候直接去读寄存器里的值就可以了是吗?

使用特权

评论回复
15
txcy| | 2010-6-25 10:27 | 只看该作者
你不用中断,没必要关定时器,只需读取它的值就可以了,不影响其他程序

使用特权

评论回复
16
shangelaila|  楼主 | 2010-6-25 10:31 | 只看该作者
15# txcy
可以不使用中断就测出频率吗?

使用特权

评论回复
17
eleven2008| | 2010-6-25 12:27 | 只看该作者
学习了 :$

使用特权

评论回复
18
nongfuxu| | 2010-6-25 15:39 | 只看该作者
从LZ的话语中,感觉LZ应该先看一下什么叫频率稳定度? 频率测量的几种方法.测量信号周期有几种方** 不要告诉我测量频率和测量周期是一样的,只是倒数关系.

然后根据实现情况设置一个测频率时间----测频闸门

倒过来讲:
STM32在信号频率不太高时一个周期就能测量频率了.
-----------但那是不准的. --->不是STM32性能不好,是测量方法不好!

再用STM32测量100个--->10000个信号周期的时间差,再除于100--->10000后,那测量结果应该比较准了.  

呵呵!

使用特权

评论回复
19
shangelaila|  楼主 | 2010-6-25 19:13 | 只看该作者
19# nongfuxu
呵呵,十分感谢您的帮忙和建议。小弟最近才开始接触硬件,所以有些迷糊呵呵。
我要求测的信号频率大概在150KHZ左右,测量结果误差小于0.1KHZ就行,通过捕获的方式误差应该不会超过这个吧?

使用特权

评论回复
20
nongfuxu| | 2010-6-25 19:20 | 只看该作者
你确定下来最短可接收测频闸门时间是多少啊?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

120

帖子

1

粉丝