用STM32测量频率和占空比的几种方法

由于我们当时的题目除了测量频率之外,更麻烦的是测量占空比。而这两个的测量方法联系比较紧密,所以也一并把测量占空比的方法写出来。
使用平台:官方stm32f429discovery开发板,180mhz的主频,定时器频率90mhz。
相关题目:
(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的参考手册,在定时器当中有这样一种模式:
简而言之,理论上,通过这种模式,可以用硬件直接测量出频率和占空比。当时我们发现这一模式时欢欣鼓舞,以为可以一步解决这一问题。
但是,经过测量之后发现这种方法测试数据不稳定也不精确,数据不停跳动,且和实际值相差很大。st的这些功能经常有这种问题,比如定时器的编码器模式,在0点处频繁正负跳变时有可能会卡死。这些方法虽然省事,稳定性却不是很好。
经过线性补偿可以一定程度上减少误差(参数在不同情况下不同):
freq=frequency*2.2118-47.05;
思路三:输入捕获
思路:一般来说,对stm32有一定了解的坛友们在测量频率的问题上往往都会想到利用输入捕获。首先设定为上升沿触发,当进入中断之后(rising)记录与上次中断(rising_last)之间的间隔(周期,其倒数就是频率)。再设定为下降沿,进入中断之后与上升沿时刻之差即为高电平时间(falling-rising_last),高电平时间除周期即为占空比。
该方法尤其是在中低频(<100khz)之下精度不错。
缺点:稍有经验的朋友们应该都能看出来,该方法仍然会带来极高的中断频率。在高频之下,首先是cpu时间被完全占用,此外,更重要的是,中断程序时间过长往往导致会错过一次或多次中断信号,表现就是测量值在实际值、实际值×2、实际值×3等之间跳动。实测中,最高频率可以测到约400khz。
总结:该方法在低频率(10000)则确认为频率数据,同时adc测量占空比确认为占空比数据。否则再使用输入捕获方法测量得到频率、占空比数据。
对于各个方法存在的线性误差,使用了线性补偿来提高精度。一般情况下,使用存储在rom中的数据作为参数,当需要校正时,采用如下校正思路:
波形发生器生成一些预设参数波形(例如10hz,10%;100k,50%;2m,90%……),在不同区间内多次测量得到数据,随后以原始数据为x,真实数据为y,去除异常数据之后,做y=f(x)的线性回归,并取相关系数最高的作为新的参数,同时存储在rom当中。

三星galaxy系列升级android 4.0细节解读
频繁身陷反垄断官司 高通商业模式还能否持续?
PX2嵌入式芯片参数介绍
ST推出最低电流消耗电压比较器TS3011
xMEMS和Bujoen电子宣布立即推出用于2分频扬声器模块
用STM32测量频率和占空比的几种方法
利用AI和边缘计算盒子实现更安全、便捷的居住环境
2018恩智浦未来科技峰会隆重召开
华为D9超高端旗舰真机曝光!碾压荣耀Magic,打脸华为Mate9!
共享充电宝又集体涨价了
led驱动芯片U6205D应用效果
色环电阻如何读数_色环电阻读数方法
什么是隔离见证为什么需要它
两大空调巨头肉搏,或暗示着中国制造业迎来新的瓶颈
利尔达5G产品已成阵列,剑指5G规模化商用持久战
FAST:基于FPGA的SDN交换机开源项目(二)
小容量贴片压敏电阻技术选型和方案与应用
佳能计划上半年发售3D半导体光刻机 格科半导体正式搬入光刻机
智慧城市下水道盐度传感器检测
大疆降价,全球无人机厂商裁员忙转型