我正在做嵌入式 c 编程,我没有定时器外设来执行输入捕获和计算输入信号的频率。 信号是 30-70 Hz 的方波。我需要准确测量频率。
我有一个可用的 GPIO 引脚,我在想,如果我在上升沿设置一个外部中断并找到(通过 HAL_Get_Tick())两个连续中断之间的时间差,我可以获得频率,对吧?
这是个好主意吗?如果是,我需要记住什么? 如果这不是一个好主意,谁能帮我出点主意?
谢谢!
您的报价频率可能太低,无法达到任何合理的准确性。考虑一下。您将在 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 部件的数量相对较多,根据我的经验“定时器用完” 通常是设计问题而不是应用程序约束。