通过边缘检测 GPIO 测量方波的频率

问题描述 投票:0回答:1

我正在做嵌入式 c 编程,我没有定时器外设来执行输入捕获和计算输入信号的频率。 信号是 30-70 Hz 的方波。我需要准确测量频率。

我有一个可用的 GPIO 引脚,我在想,如果我在上升沿设置一个外部中断并找到(通过 HAL_Get_Tick())两个连续中断之间的时间差,我可以获得频率,对吧?

这是个好主意吗?如果是,我需要记住什么? 如果这不是一个好主意,谁能帮我出点主意?

谢谢!

timer embedded stm32 interrupt gpio
1个回答
0
投票

您的报价频率可能太低,无法达到任何合理的准确性。考虑一下。您将在 1/70 秒内得到多少个刻度?在 1 毫秒的滴答间隔内只有 14 个,精度低于 7%。

你最好直接读取 SYSCLK 计数器寄存器而不是滴答计数,这是 SYSCLK 重载间隔计数。高分辨率暂时:

tick_count * sysclk_reload + sysclk_count

记住计算是非原子的,可能会被 SYSTICK 修改

tick_count
.

伪代码:

do
{
    tick_count = HAL_Get_Tick() ;
    highres_time = tick_count * sysclk_reload + SYSTICK_COUNT_REGISTER ;
} while( tick_count != HAL_Get_Tick() ) b

highres_time
的分辨率是
SystemCoreClock
频率 - MHz 而不是通常的 1KHz 系统节拍。

您还可以重新设计系统以更好地利用可用计时器。例如,单个硬件定时器可用于实现多个软件定时器(如 RTOS 所提供的那样)。

虽然您的应用程序可能需要所有这些独立的硬件定时器,但大多数 STM32 部件的数量相对较多,根据我的经验“定时器用完” 通常是设计问题而不是应用程序约束。

© www.soinside.com 2019 - 2024. All rights reserved.