前言
之前拿外部中断做过这个实验,但是精度范围都不是很理想。之后尝试过输入捕获的方法,虽然精度提高了不少,但是输入范围依旧不是很理想(精度做到了误差0.5%,范围做到了1.1MHZ)。而且更要命的是,这两种方法对于cpu的占用率特别的大,在测试的时候,我因为多加了一句串口输出函数,就导致了整体频率检测误差(虽然一句串口对于整个系统来讲不需要耗时多久,但是在检测高频率信号时,可能处理串口的时间就大于了频率检测的时间,这就是为什么这两个方法都不适用于检测高频信号的原因了,当然了真的想追求极致的话是可以采用DMA进行输出的,但是这个也只是治标不治本)。
之后在看了使用 STM32 测量频率和占空比的几种方法这篇博客。我知道了还能用定时器的外部计数器模式来检测信号的上升沿个数,所以这次我打算用外部计数器模式来做一个频率计。
外部计数器的相关知识
我现在对于这种方法的理解就相当于是一种用硬件来实现检测信号上升沿的方法。特点在于不消耗CPU资源,所以只需要在规定时间内调用相关函数,就能完成对信号上升沿次数的读取了。
思路
除了串口之外,我配置了两个定时器 TIM1和TIM2.我用TIM1来作为定时器中断,用TIM2来作为外部计数器。
这里用的是0.0005s的定时器(这个是有讲究的,之后会讲)
重点看一下这里的65535这个数,这个是外部计数器的满载