打印
[STM32F1]

STM32F1测量时间间距最短能测量到多少呢?

[复制链接]
3208|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 magic_yuan 于 2014-5-14 15:22 编辑

大神们,
  这几天在用F1的通用定时器捕获来测量频率的周期,即测量第一次上升沿和第二次上升沿之间的距离。
  无论怎么优化中断程序,最少能测量的约1800NS,即550KHZ的频率。再高些的频率就读不出来了。经过观察发现,600KHZ的周期测试出来为300KHZ的周期,800KHZ的周期测试出来为400KHZ的周期。即中断程序耗时导致高频时漏过了一个上升沿。
  不知各位高手有好的办法能提升测量频率么,谢谢啊!
  

沙发
mmuuss586| | 2014-5-14 15:14 | 只看该作者
优化下程序,读写寄存器看看

使用特权

评论回复
板凳
magic_yuan|  楼主 | 2014-5-14 15:21 | 只看该作者
本帖最后由 magic_yuan 于 2014-5-14 15:22 编辑
mmuuss586 发表于 2014-5-14 15:14
优化下程序,读写寄存器看看

刚把程序传上去了。
  程序里有两次上升沿捕获。主要缩短第一次上升沿捕获后的程序处理时间,共只有4条指令,我已经是尽力使用寄存器操作了。。。。。
  大侠看还有没有改良的地方。
  多谢啊!
if((TIM5CH1_CAPTURE_STA==0x00)&&((TIM5->SR&0X0002)!=0))// first rising edge !
                              {
                                 {
                                           TIM5CH1_CAPTURE_VAL1=TIM5->CCR1;  //get the first value                                                                                         
                                           TIM5CH1_CAPTURE_STA=0X40;                //set the STA
                                          goto sky;
                   }
              }

使用特权

评论回复
地板
zhuyjgh| | 2014-5-14 15:24 | 只看该作者
可以硬件直接判断边沿的吧,不需要软件去判断,你只要捕获就可以啊,读一个寄存器。

使用特权

评论回复
5
magic_yuan|  楼主 | 2014-5-14 15:27 | 只看该作者
zhuyjgh 发表于 2014-5-14 15:24
可以硬件直接判断边沿的吧,不需要软件去判断,你只要捕获就可以啊,读一个寄存器。 ...

初始化好后,硬件自动识别边沿的。因为需要记录两次不同的上升沿的时间点,所以进入了中断。

使用特权

评论回复
6
zhuyjgh| | 2014-5-14 15:40 | 只看该作者
干嘛要分第几次??不可以捕获后直接复位计数器吗??甚至DMA都应该可以的吧,,都不用进中断了,,

使用特权

评论回复
7
magic_yuan|  楼主 | 2014-5-14 15:50 | 只看该作者
zhuyjgh 发表于 2014-5-14 15:40
干嘛要分第几次??不可以捕获后直接复位计数器吗??甚至DMA都应该可以的吧,,都不用进中断了,, ...

多谢大侠,
  复位计数器应该要进中断吧?我没用过DMA。。。但如果复位计数器需要进入中断,那用DMA意义就不大了。
大侠思路能否简单描叙下,多谢啊。
   急得很,昨天晚上这个东西调试到2点多。

使用特权

评论回复
8
zhuyjgh| | 2014-5-14 16:02 | 只看该作者
PWM输入模式   这个就是解决测量信号周期的,,你看下用户手册,,给你截个图

捕获.JPG (50.8 KB )

捕获.JPG

使用特权

评论回复
评论
magic_yuan 2014-5-14 16:46 回复TA
多谢啊,先看看。考虑到只要进入中断便注定要消耗将近1US延时,开始考虑用CPLD方案了。。。 
9
zhuyjgh| | 2014-5-14 16:09 | 只看该作者
本帖最后由 zhuyjgh 于 2014-5-14 16:10 编辑
magic_yuan 发表于 2014-5-14 15:50
多谢大侠,
  复位计数器应该要进中断吧?我没用过DMA。。。但如果复位计数器需要进入中断,那用DMA意义 ...


复位计数器是硬件自动复位的,,不要进中断。这个功能我在STM32上没用过,,但是看用户手册应该是可以的,

使用特权

评论回复
10
Tsiov| | 2014-5-14 16:10 | 只看该作者
Goto Sky:lol

使用特权

评论回复
评论
magic_yuan 2014-5-14 16:17 回复TA
加了这条语句省了点时间。。。。 
11
guangbiao| | 2014-5-14 18:22 | 只看该作者
1.看看你用的定时器有没有DMA通道,要有就直接开个缓冲区,把采集到的数据写到里面。
然后等DMA中断后进行批量数据的分析。
2.中断获取连续几个周期的数据,写到数据缓冲区,等缓冲区满,关掉中断,进行数据分析。
如果你怀疑是中断处理时间长,你可以单独获取一个周期的数据,看看是否正确,如果单独获取一个周期都有问题,只能说,外部频率太高了,用这种中断的方式搞不定了。

优选第一种!
看到你外部测量的频率有点高,如果长期开着中断,CPU一直在打中断,其他功能就没法完了。

使用特权

评论回复
12
magic_yuan|  楼主 | 2014-5-14 19:49 | 只看该作者
guangbiao 发表于 2014-5-14 18:22
1.看看你用的定时器有没有DMA通道,要有就直接开个缓冲区,把采集到的数据写到里面。
然后等DMA中断后进行 ...

多谢大侠!
  1,定时器为通用定时器,有DMA通道。
  2,我这个里面涉及到三种跳转到中断的时间。两次为上升沿捕获,中间还有若干的计数器溢出次数统计的操作。两次上升沿捕获可以采用DMA方式,但定时器溢出中断次数的统计不知道能不能用DMA呢?我对DMA不怎么懂,多谢啊!
   3,低频没问题,就是想把频率尽量做高,目前只能测量500KHZ。。。。。

使用特权

评论回复
13
guangbiao| | 2014-5-15 10:20 | 只看该作者
magic_yuan 发表于 2014-5-14 19:49
多谢大侠!
  1,定时器为通用定时器,有DMA通道。
  2,我这个里面涉及到三种跳转到中断的时间。两次为 ...

先抛开技术,针对这个应用,我个人的分析如下:
由于外部波形周期不确定!若采用楼主的测量方法,那定时器的时钟分频要设置得尽量小,这样才能较准确的测量高频率波形的周期。这样设置导致定时器的溢出周期很短,碰到频率较小/周期长的波形,定时器溢出较频繁。如果使能了定时器溢出中断,那定时器溢出中断会较多的占用CPU,而导致其他应用程序运行变慢或者无法运行(一直在打中断)。所以这种软件设计方法是有一定局限性的。
我个人的想法是,将测量的波形周期尽量控制在一个定时器溢出周期内,即波形两次上升沿都落在定时器溢出周期内。。。(具体描述见下帖,担心字数超限,呵呵)。。。

使用特权

评论回复
14
guangbiao| | 2014-5-15 10:41 | 只看该作者
guangbiao 发表于 2014-5-15 10:20
先抛开技术,针对这个应用,我个人的分析如下:
由于外部波形周期不确定!若采用楼主的测量方法,那定时 ...

先抛开技术,针对这个应用,我个人的分析如下(续1):
既然想把一个波形的两次上升沿,都落在定时器的同一个计数周期内。那定时器的分频值就得能动态设置。
做法如下:
1、将定时器分频值,设置成一个较合理的值,即设置大一些,溢出周期长一些(具体数值与你的软件系统有关,只要不过多占用CPU就好,系统能顺畅运行就可以)。
2、使能上升沿捕获及定时器溢出中断。
3、出现第一个上升沿时,清零定时器溢出累计变量,开始累计溢出次数。
4、若下一上升沿出现时,定时器溢出累计变量为零。判断波形周期占定时器溢出周期的百分比。
5、重新设定定时器的溢出周期,保证在定时器溢出周期内能包含1~3个完整波形。
6、然后多次测量(比如: 3次),取平均值,输出波形周期。
7、若下一个上升沿迟迟没有出现,比如定时器已溢出了10次。
8、重新设定定时器的溢出周期,逐渐增加定时器的溢出周期,重新开始捕获(忽略上一次的上升沿)。
9、返回到步骤2,开始新一轮的检测运行。

使用特权

评论回复
15
icecut| | 2014-5-15 10:48 | 只看该作者
我明白了.
lz是被stm32牛X的捕获模式误导了.
你想想单片机,没有捕获模式的时候怎么测频率?
首先,你要分情况,高频/低频
对于低频,你就直接数量个上升沿内计数器捕获了几个变化,f = 1/t;
对于高频,你就不要用捕获了.换成计数模式.在1ms内,看计数器记录了n个周期..f=nKHz,单片机只能用此种方法.

使用特权

评论回复
评论
magic_yuan 2014-5-15 11:26 回复TA
多谢大侠,测频率通过分频的方式可以得到。但我还需要测脉宽,因此。。。。。估计只能用CPLD了,今天开始看CPLD。。。 
16
guangbiao| | 2014-5-15 10:48 | 只看该作者
guangbiao 发表于 2014-5-15 10:41
先抛开技术,针对这个应用,我个人的分析如下(续1):
既然想把一个波形的两次上升沿,都落在定时器的同 ...

先抛开技术,针对这个应用,我个人的分析如下(续2):
以上两贴为我个人的设计思路,不知对楼主是否有帮助。
软件是个不破不立的玩意,遇到纠结问题时不跳出来想问题,就容易转牛角尖。

关于DMA及定时器的设置及使用,就需要楼主自己多花点时间看看手册。
STM32的定时器相对来说还是比较强悍的,比如它的“联动”功能,还是为我们的设计提供了很不错的支持。
道理就一个,多熟悉你应用的目标器件,越熟悉越有利于你的应用开发。

>>>All over<<<

使用特权

评论回复
17
magic_yuan|  楼主 | 2014-5-15 11:30 | 只看该作者
guangbiao 发表于 2014-5-15 10:48
先抛开技术,针对这个应用,我个人的分析如下(续2):
以上两贴为我个人的设计思路,不知对楼主是否有帮 ...

多谢大侠啊,
  看了大侠的若干帖子,对重复性周期性信号而言,确实是解决的好办法。但我这个设计还有需要在这个帖子里没有说明,那就是需要在非周期的情况下亦能应用。也就是说,在第一次触发前的等待时间是个未知数。如果进入中断清零,那么这时候导致了误差----中断响应时间,还有指令处理时间。也就是还是要将中断的时间压缩,但目前似乎没好办法。。。

使用特权

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

本版积分规则

个人签名:发到3000帖时,生活大概完成了一种转折。

359

主题

2770

帖子

7

粉丝