干货 | MCU如何实现对外部脉冲信号的计数功能?
有的传感器会输出脉冲信号,MCU需要统计脉冲输入的个数,通常有如下实现方式:
1.GPIO中断
原理很简单,利用GPIO的上升沿或者下降沿中断,进中断的次数就是脉冲的个数。只需要在中断服务函数里计数即可。
使用GPIO中断需要注意:
脉冲信号的频率不能太高,否则MCU可能处理不过来
GPIO中断处理程序应尽可能短,否则影响处理速度
GPIO中断优先级应高,否则会延迟对脉冲信号的处理
我们先用一个板子产生频率为10Khz的PWM波,时长为100ms 。
下降沿的脉冲数理论为100ms/0.1ms=1000个,实际上因为有少许误差,从上面逻辑分析仪可以看到实际脉冲数为1.009k,即1009个。然后将PWM接到另外一个板子的GPIO引脚上,开启下降沿中断,在中断服务函数中计数,可以看到实际值就是1009。
2.定时器输入捕获
输入捕获常用来测量脉冲宽度和频率,它也可以用来对脉冲计数。它的原理和上述GPIO中断类似,只不过用的是定时器的输入捕获中断。
3.定时器用作计数
定时器和计数器其实很相似,只不过定时器是对内部的时钟脉冲进行计数,计数到一定数值时就可以根据频率,计算出时间。
而计数器是对外部脉冲进行计数,即外部引脚每发生一次变化,计数器就计数一次。
可以将外部脉冲信号接入到MCU的TIMx_ETR引脚,就可以使用MCU的定时器来计数。
它的使用也很简单,主要就是配置TIMx_SMCR寄存器(slave mode control register),具体可以参考芯片参考手册。
可以看到定时器CNT的值就是脉冲的个数。
总结:
1)尽量使用TIMER ETR引脚通过计数器方式来实现脉冲计数,如果条件不允许,外部脉冲输入频率不是很高,也可以使用GPIO中断来实现,不过还是要同时考虑高频中断对整体系统的影响。比如上面MCU主频是48Mhz,将10Khz调整为100Khz,实测GPIO中断还可以准确计数,但是当再继续增大到1Mhz时,就处理不过来了,实测发出约50000个脉冲,GPIO中断只测出了10206个,而使用计数器模式则可以准确的计数。
2)如果使用GPIO中断计数,要特别注意GPIO上不能有接地的电容,否则会改变脉冲波形,导致错误的计数。
- 分享
- 举报
-
浏览量:2477次2020-11-05 09:41:34
-
浏览量:1153次2019-11-12 08:56:06
-
2022-09-29 11:02:19
-
浏览量:13172次2021-01-01 02:53:29
-
浏览量:2362次2022-03-21 13:51:25
-
浏览量:1366次2019-10-11 14:49:42
-
浏览量:4300次2021-08-20 16:38:06
-
浏览量:2962次2020-11-10 14:02:39
-
浏览量:3137次2019-11-21 09:11:36
-
浏览量:1210次2020-12-11 15:56:57
-
浏览量:1943次2020-07-08 13:45:08
-
浏览量:553次2023-09-02 09:45:20
-
浏览量:5370次2020-11-05 10:53:57
-
浏览量:2281次2022-05-30 10:02:28
-
浏览量:4493次2020-10-22 10:55:15
-
浏览量:2287次2019-01-28 17:46:42
-
浏览量:2476次2020-08-21 14:05:19
-
浏览量:4553次2019-09-23 16:58:01
-
浏览量:4373次2021-08-31 13:39:07
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
blakmi
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明