以前在本科时写的教程文章,主要是把自己当时参赛的方法拿出来做了个总结。
想当年天天水论坛好为人师,现在已经全面转向计算机视觉方向了,颇为感慨。不过,自己的理性选择,个中得失早就意料之中。塞翁失马,焉知非福?
原文链接:http://www.openedv.com/forum.php?mod=viewthread&tid=82594&extra=
【教程】使用STM32测量频率和占空比的几种方法(申请置酷!)
这几天在论坛上面解答了好几个询问
STM32
测量频率的贴子,觉得这种需求还是存在的(示波器、电机控制等等)。而简单搜索了一下论坛,这方面的贴子有但是不全。正好今年参加比赛做过这方面的题目(最后是一等奖嘿嘿),所以把我们当时尝试过的各种方案都列出来,方便以后大家使用,也是作为一个长期在论坛的潜水党对论坛的回报。
PS:
由于我们当时的题目除了测量频率之外,更麻烦的是测量占空比。而这两个的测量方法联系比较紧密,所以也一并把测量占空比的方法写出来。因为时间有限,所以并不能把所有思路都一一测试,只是写在下面作为参考,敬请谅解。
相关题目:
(
1
)测量脉冲信号频率
f_O
,频率范围为
10Hz
~
2MHz
,测量误差的绝对值不大于
0.1%
。(
15
分)
(
2
)测量脉冲信号占空比
D
,测量范围为
10
%~
90
%,测量误差的绝对值不大于
2%
。(
15
分)
思路一:外部中断
思路:这种方法是很容易想到的,而且对几乎所有
MCU
都适用(连
51
都可以)。方法也很简单,声明一个计数变量
TIM_cnt
,每次一个上升沿
/
下降沿就进入一次中断,对
TIM_cnt++
,然后定时统计即可。如果需要占空比,那么就另外用一个定时器统计上升沿、下降沿之间的时间即可。
缺点:缺陷显而易见,当频率提高,将会频繁进入中断,占用大量时间。而当频率超过
100kHz
时,中断程序时间甚至将超过脉冲周期,产生巨大误差。同时更重要的是,想要测量的占空比由于受到中断程序影响,误差将越来越大。
总结
:
我们当时第一时间就把这个方案
PASS
了,没有相关代码(这个代码也很简单)。不过,该方法在频率较低(
10K
以下)时,可以拿来测量频率。在频率更低的情况下,可以拿来测占空比。
思路二:
PWM
输入模式
思路:翻遍
ST
的参考手册,在定时器当中有这样一种模式:
总结
:
我们当时第一时间就把这个方案
PASS
了,没有相关代码(这个代码也很简单)。不过,该方法在频率较低(
10K
以下)时,可以拿来测量频率。在频率更低的情况下,可以拿来测占空比。
思路二:
PWM
输入模式
思路:翻遍
ST
的参考手册,在定时器当中有这样一种模式:
简而言之,理论上,通过这种模式,可以用硬件直接测量出频率和占空比。当时我们发现这一模式时欢欣鼓舞,以为可以一步解决这一问题,代码如下:
void Tim2_PWMIC_Init(void)
{