良许Linux教程网 干货合集 MCU如何实现对外部脉冲信号的计数功能?

MCU如何实现对外部脉冲信号的计数功能?

一些传感器会输出脉冲信号,而MCU需要统计脉冲输入的个数。通常有几种常见的实现方式:

1. GPIO中断

这种实现方式非常简单,利用GPIO引脚的上升沿或下降沿中断来触发脉冲的检测,并在中断服务函数中进行计数。

使用GPIO中断时需要注意以下几点:

  • 脉冲信号的频率不宜过高,否则MCU可能无法及时处理所有的中断请求。
  • GPIO中断处理函数应保持尽可能短的执行时间,以避免影响其他关键任务的执行速度。
  • 应将GPIO中断的优先级设置较高,以确保能够及时响应脉冲信号的中断请求。

为了演示这种实现方式,我们可以通过使用一个开发板产生频率为10KHz,时长为100ms的PWM波形来模拟脉冲信号。

image-20231012204921967
image-20231012204921967

下降沿的脉冲数理论为100ms/0.1ms=1000个,实际上因为有少许误差,从上面逻辑分析仪可以看到实际脉冲数为1.009k,即1009个。然后将PWM接到另外一个板子的GPIO引脚上,开启下降沿中断,在中断服务函数中计数,可以看到实际值就是1009。

a
a

2.定时器输入捕获

输入捕获常用来测量脉冲宽度和频率,它也可以用来对脉冲计数。它的原理和上述GPIO中断类似,只不过用的是定时器的输入捕获中断。

image-20231012204935759
image-20231012204935759

3.定时器用作计数

定时器和计数器其实很相似,只不过定时器是对内部的时钟脉冲进行计数,计数到一定数值时就可以根据频率,计算出时间。

而计数器是对外部脉冲进行计数,即外部引脚每发生一次变化,计数器就计数一次。

可以将外部脉冲信号接入到MCU的TIMx_ETR引脚,就可以使用MCU的定时器来计数。

image-20231012204939911
image-20231012204939911
image-20231012204943751
image-20231012204943751

它的使用也很简单,主要就是配置TIMx_SMCR寄存器(slave mode control register),具体可以参考芯片参考手册。

image-20231012204947843
image-20231012204947843

可以看到定时器CNT的值就是脉冲的个数。

image-20231012204955013
image-20231012204955013

总结:

1)尽量使用TIMER ETR引脚通过计数器方式来实现脉冲计数,如果条件不允许,外部脉冲输入频率不是很高,也可以使用GPIO中断来实现,不过还是要同时考虑高频中断对整体系统的影响。比如上面MCU主频是48Mhz,将10Khz调整为100Khz,实测GPIO中断还可以准确计数,但是当再继续增大到1Mhz时,就处理不过来了,实测发出约50000个脉冲,GPIO中断只测出了10206个,而使用计数器模式则可以准确的计数。

2)如果使用GPIO中断计数,要特别注意GPIO上不能有接地的电容,否则会改变脉冲波形,导致错误的计数。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部