弘毅 发表于 2014-4-25 16:16:15

OCROBOT入门教程015--脉冲计时

本帖最后由 董董soul 于 2016-10-27 11:05 编辑

我们通过计算你按下一个按钮多长时间,来介绍一下怎样对脉冲计时。

什么是脉冲?
可以怎么理解,脉冲是一个物理量在短时间或者是持续时间内突变后迅速回到其初始状态的过程。在OCROBOT中所说的脉冲其实就是引脚上的高低电平变化。

脉冲计时常常用在光电码盘、霍尔元件等测速上。

首先我们看一下电路连接图,只需要一个按键与一个10K电阻做上拉。



int pin = 2;//定义引脚为D2
unsigned long duration;//定义duration变量为无符号长整数型变量

void setup()
{
Serial.begin(9600);//串口波特率为9600
pinMode(pin, INPUT); //设置引脚为输入模式
}

void loop()
{
duration = pulseIn(pin, HIGH,60000000); //读取引脚上的高电平脉冲,最大脉冲时间间隔为60秒,并且把结果赋值给duration变量
Serial.println(duration); //通过串口输出duration变量
}

打开串口监视器后,按下按钮,就会返回每次按下松开这段时间有多长。比如第一条是177109,第二条是126049。他们对应的单位是微秒,单位换位秒以后分别是0.177秒与0.126秒。



http://player.youku.com/player.php/sid/XNzEzMTc1NTQw/v.swf
pulseIn()
pulseIn()函数用来读取一个引脚的脉冲(HIGH或LOW)。例如,如果value是HIGH,pulseIn()会等待引脚变为HIGH,开始计时,再等待引脚变为LOW并停止计时。返回脉冲的长度,单位微秒。如果在指定的时间内无脉冲函数返回。

计时范围从10微秒至3分钟。(1秒=1000毫秒=1000000微秒)

语法:
pulseIn(pin, value)
pulseIn(pin, value, timeout)

参数:
pin:你要进行脉冲计时的引脚号(int)。
value:要读取的脉冲类型,HIGH或LOW(int)。
timeout (可选):指定脉冲计数的等待时间,单位为微秒,默认值是1秒(unsigned long)

pandada 发表于 2014-7-29 16:58:39

还是没看懂timeout的意思。

弘毅 发表于 2014-7-30 21:51:10

pandada 发表于 2014-7-29 16:58 static/image/common/back.gif
还是没看懂timeout的意思。

就是你脉冲的时间间隔。。。你不调用timeout参数呢,就是1秒,这样一秒以内的脉冲检测都没问题,但是如果你脉冲时间超过1秒,你就需要这里增加等待的最大时间,以检测到超过1秒的脉冲。否则。。你不设置这个参数,就算你脉冲是10秒20秒,也会被当成1秒处理。

pandada 发表于 2014-7-31 10:12:39

弘毅 发表于 2014-7-30 21:51 static/image/common/back.gif
就是你脉冲的时间间隔。。。你不调用timeout参数呢,就是1秒,这样一秒以内的脉冲检测都没问题,但是如果 ...

谢谢,这下明白意思了。。

hnnaheziqiang 发表于 2014-12-23 21:06:47

电路连接图与实物连接不一样,如果按照电路连接图连接,那么检测到的应该是开关断开的时间吧

弘毅 发表于 2014-12-23 21:57:38

hnnaheziqiang 发表于 2014-12-23 21:06 static/image/common/back.gif
电路连接图与实物连接不一样,如果按照电路连接图连接,那么检测到的应该是开关断开的时间吧

确实不一样,我去改一下原理图。检测的只是HIGH或者LOW电平的时间~按照电路连接图检测的是LOW的时间。
页: [1]
查看完整版本: OCROBOT入门教程015--脉冲计时