新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 3个思路教你使用STM32测量频率和占空比

3个思路教你使用STM32测量频率和占空比

作者:时间:2018-09-10来源:网络收藏

  使用平台:官方F429DISCOVERY开发板,180MHz的主频,定时器频率90MHz。

本文引用地址:http://www.amcfsurvey.com/article/201809/391686.htm

  相关题目:

  (1)测量脉冲信号频率f_O,频率范围为10Hz~2MHz,测量误差的绝对值不大于0.1%。(15分)

  (2)测量脉冲信号占空比D,测量范围为10%~90%,测量误差的绝对值不大于2%。(15分)

  思路一:外部中断

  思路:这种方法是很容易想到的,而且对几乎所有MCU都适用(连51都可以)。方法也很简单,声明一个计数变量TIM_cnt,每次一个上升沿/下降沿就进入一次中断,对TIM_cnt++,然后定时统计即可。如果需要占空比,那么就另外用一个定时器统计上升沿、下降沿之间的时间即可。

  缺点:缺陷显而易见,当频率提高,将会频繁进入中断,占用大量时间。而当频率超过100kHz时,中断程序时间甚至将超过脉冲周期,产生巨大误差。同时更重要的是,想要测量的占空比由于受到中断程序影响,误差将越来越大。

  总结:我们当时第一时间就把这个方案PASS了,没有相关代码(这个代码也很简单)。不过,该方法在频率较低(10K以下)时,可以拿来测量频率。在频率更低的情况下,可以拿来测占空比。

  思路二:输入模式

  思路:翻遍ST的参考手册,在定时器当中有这样一种模式:

  简而言之,理论上,通过这种模式,可以用硬件直接测量出频率和占空比。当时我们发现这一模式时欢欣鼓舞,以为可以一步解决这一问题。

  但是,经过测量之后发现这种方法测试数据不稳定也不精确,数据不停跳动,且和实际值相差很大。ST的这些功能经常有这种问题,比如定时器的编码器模式,在0点处频繁正负跳变时有可能会卡死。这些方法虽然省事,稳定性却不是很好。

  经过线性补偿可以一定程度上减少误差(参数在不同情况下不同):

  freq=Frequency*2.2118-47.05;

  这种方法无法实现要求。所以在这里我并不推荐这种方法。如果有谁能够有较好的程序,也欢迎发出来。

  思路三:输入捕获

  思路:一般来说,对有一定了解的坛友们在测量频率的问题上往往都会想到利用输入捕获。

  首先设定为上升沿触发,当进入中断之后(rising)记录与上次中断(rising_last)之间的间隔(周期,其倒数就是频率)。

  再设定为下降沿,进入中断之后与上升沿时刻之差即为高电平时间(falling-rising_last),高电平时间除周期即为占空比。

  该方法尤其是在中低频(<100kHz)之下精度不错。

  缺点:稍有经验的朋友们应该都能看出来,该方法仍然会带来极高的中断频率。在高频之下,首先是CPU时间被完全占用,此外,更重要的是,中断程序时间过长往往导致会错过一次或多次中断信号,表现就是测量值在实际值、实际值×2、实际值×3等之间跳动。实测中,最高频率可以测到约400kHz。

  总结:该方法在低频率(<100kHz)下有着很好的精度,在考虑到其它程序的情况下,建议在10kHz之下使用该方法。同时,可以参考以下的改进程序减少CPU负载。

  改进:前述问题,限制频率提高的主要因素是过长的中断时间(一般应用情景之下,还有其它程序部分的限制)。

  所以进行以下改进:

  1.使用2个通道,一个只测量上升沿,另一个只测量下降沿。这样可以减少切换触发边沿的延迟,缺点是多用了一个IO口。

  2.使用寄存器,简化程序

  之所以改用TIM2是因为TIM5的CH1(PA0)还是按键输入引脚。本来想来这应当也没什么,按键不按下不就是开路嘛。

  所以,当使用别人的程序之前,请一定仔细查看电路图。

  这样,最高频率能够达到约1.1MHz,是一个不小的进步。但是,其根本问题——中断太频繁——仍然存在。

  解决思路也是存在的。本质上,我们实际上只需要读取CCR1和CCR2寄存器。而在内存复制过程中,面对大数据量的转移时,我们会想到什么?

  显然,我们很容易想到——利用DMA。所以,我们使用输入捕获事件触发DMA来搬运寄存器而非触发中断即可,然后将这些数据存放在一个数组当中并循环刷新。

  这样,我们可以随时来查看数据并计算出频率。

  大神在回复中提出了几个改进意见,列出如下:

  1.可以设定仅有通道2进行下降沿捕获并触发中断,而通道1捕获上升沿不触发中断。在中断函数当中,一次读取CCR1和CCR2。这样可以节省大量时间。

  2.可以先进行一次测量,根据测量值改变预分频值PSC,从而提高精度

  3.间隔采样。例如每100ms采样10ms.

  这样的改进应当能够将最高采样频率增加到2M.但是频率的进一步提高仍然不可能。

  因为这时的主要矛盾是中断函数时间过长,导致CPU还在处理中断的时候这一次周期就结束了,使得最终测量到的频率为真实频率的整数倍左右。示意图如下:

  因此,高频时仍然推荐以下方法。

  综上,对这几种方法做一个总结:

  外部中断:编写容易,通用性强。缺点是中断进入频繁,误差大。

  输入:全硬件完成,CPU负载小,编写容易。缺点是不稳定,误差大。

  输入捕获:可达到约400kHz。低频精度高,10Hz可达到0.01%以下,400kHz也有3%。缺点是中断频繁,无法测量高频,幅值必须在3.3~5V之间。



关键词: STM32 PWM

评论


相关推荐

技术专区

关闭