树莓派中用python检测连续脉冲

来源:互联网 发布:程敏政 知乎 编辑:程序博客网 时间:2024/06/05 17:40

​在制作树莓派小车过程中,需要对轮子进行测速,采用的是马达+霍尔传感器的形式,小车运动的同时,霍尔传感器输出连续脉冲,即可通过检测脉冲的数量计算小车的速度,前行的距离等等。

​ 在树莓派中检测脉冲,一般有两种方法:

  • 轮询

  • 边缘检测

    这两者方法和工作原理在这篇文章中讲解的非常清楚:

    使用 RPi.GPIO 模块的输入(Input)功能

在笔者的程序中,需要实时连续的检测脉冲,采用的是边缘检测方式,对应的Python代码为:

 ```python #霍尔脉冲读取函数 GPIO.setup(18, GPIO.IN,pull_up_down=GPIO.PUD_UP)   #通过18号引脚读取左轮脉冲数据 GPIO.setup(35, GPIO.IN,pull_up_down=GPIO.PUD_UP)   #通过35号引脚读取右轮脉冲数据 counter=0      #左轮脉冲初值 counter1=0     #右轮脉冲初值 def my_callback(channel):          #边缘检测回调函数,详情在参见链接中     global counter                 #设置为全局变量     if GPIO.event_detected(18):        #检测到一个脉冲则脉冲数加1         counter=counter+1 def my_callback1(channel1):            #这里的channel和channel1无须赋确定值,但笔者测试过,不能不写     global counter1     if GPIO.event_detected(35):         counter1=counter1+1 GPIO.add_event_detect(18,GPIO.RISING,callback=my_callback) #在引脚上添加上升临界值检测再回调 GPIO.add_event_detect(35,GPIO.RISING,callback=my_callback1) ```

在边缘检测方式中,add_event_detect()函数运行后,会为回调函数另外开启一个线程,与主程序并发运行,因此不容易错过当 CPU 忙于处理其它事物时输入状态的改变。但同一进程内也最好不要有太过耗费CPU时间的部分,否则仍会导致脉冲的丢失,如果不可避免,可以用多进程去处理CPU密集型代码部分。

人生苦短,我用Python~