[其他产品] 用定时器测频率,比输入捕获好用多了

[复制链接]
16|0
happypcb 发表于 2026-9-16 15:58 | 显示全部楼层 |阅读模式
之前做电机转速检测,轴上有个霍尔传感器,每转一圈输出一个脉冲。需要测量脉冲频率来算转速,一开始用的是定时器输入捕获功能,测两个上升沿之间的时间。低速的时候没问题,转速一高误差就大了,计数器的位宽不够,脉冲间隔太短,测出来的值跳动很厉害。
后来换了一个思路,不用输入捕获,改用定时器的外部时钟计数模式。把霍尔信号直接接到定时器的外部时钟输入引脚,让定时器对脉冲个数进行计数。同时用另一个定时器做一个固定时间窗口,比如每100毫秒读一次计数值,然后清零重新计数。100毫秒内的脉冲个数乘以10就是频率。
这个方法的好处是,低频的时候没有溢出问题,高频的时候精度也够。而且不需要中断处理每个脉冲,CPU开销很小。100毫秒读一次计数值,算一下频率就完事了,代码比输入捕获简单很多。
外部时钟计数模式本来是用来做外部事件计数的,用在测频率上也算是一种“反直觉”的用法。但它确实好用,量程宽、精度够、代码简单。后来做流量计也是类似的思路,用外部时钟计数模式测脉冲频率,比输入捕获省事多了。
还有一个是用DMA做串口接收。以前用中断接收串口数据,一个字节一个中断,波特率高的时候CPU一直在处理中断,别的活干不了。改成DMA之后,DMA自己把串口数据搬到缓冲区里,收完一帧再通知CPU处理。CPU只需要在收完一帧之后处理一下,中间完全不用管。代码量少了很多,CPU占用也降下来了。这个不算反直觉,但用了之后确实回不去了。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

1931

主题

8552

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部
0