STM32 精确频率精确测量几种实现方式。目前在网上了解到几种实现思路,结合项目实际需求,对几种不同测量方法做简单总结。
精度要求:±0.1% 频率范围:0.1HZ~5KHZ
由于测量频率比较低,暂时不需要考虑DMA等需要复杂硬件支持的实现方式,优先考虑通用性比较强的实现方式。
方式一:外部中断方式,由于频率低优先考虑该方式.需要注意中断处理函数尽可能时间短, 非必要操作不在中断处理函数中实现。
优点:通用性强。
缺点:频率高时,频繁进入中断,占用CPU大量时间。
综合比较低于10KHZ频率,比较适合该方式。
注意:如无特殊时序要求,把该中断优先级设置尽可能高,提高测量的精度。
方式二:输入捕获。首先设定为上升沿触发,当进入中断之后(rising)记录与上次中断(rising_last)之间的间隔(周期,其倒数就是频率)。再设定为下降沿,进入中断之后与上升沿时刻之差即为高电平时间(falling-rising_last),高电平时间除周期即为占空比。
缺点与外部中断方式类似,频繁进入中断,占用大量CPU时间,只适合低频率。
方式三:考虑定时器ETR(定时器的外部计数模式或编码器模式)输入计数功能,配合定时器中断测量频率。增加一个ms级定时器,在ms级定时器中断内部读取计数定时器的计数,在特定时间间隔后,对总的累积数做差,这样可以直接计算出特定时间间隔内的频率。理论上来说,ms定时器中断可以实现千分之一的频率测量误差。如果处理器具备外部计数模式,该方案要优于方式一中断模式,处理器占用时间在高频率时有明显优势,且可实现更高频率计数。
注意:只有特定GPIO具有ETR外部时钟计数功能或定时器编码器输入功能引脚,具有一定的限制。
另外还有网上其他方式,还未深入了解:
方式四:ADC采样+FFT快速傅里叶变换,运算量过大不适合STM32F1系列
方式五:PWM输入 暂时未做深入了解。