迷你强 发表于 2012-11-20 20:30:49

Arduino入门教程--第二十一课--脉冲计时(看你按住开关有多久)

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

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

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

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



然后把下面的代码复制进入IDE进行编译下载。

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变量
}

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



我们看一下这个代码配合按钮后的效果

http://player.youku.com/player.php/sid/XNDgwODMwMzc2/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)

丧心病狂 发表于 2013-2-6 23:04:38

这篇竟然没人回复~既然看了就来消灭个零回复吧~谢谢楼主的教程!

黄岩 发表于 2013-2-11 17:05:12

我也顶上一格!

茕兔 发表于 2013-2-12 21:52:16

强哥,pulseIn()函数精度精确到多少?这个挺重要的啊

迷你强 发表于 2013-2-19 16:32:53

茕兔 发表于 2013-2-12 21:52 static/image/common/back.gif
强哥,pulseIn()函数精度精确到多少?这个挺重要的啊

查阅函数,或者语法手册

<一一巛 发表于 2013-3-5 10:12:24

本帖最后由 <一一巛 于 2013-3-5 10:13 编辑

交作业:loveliness:unsigned long duration;//定义duration变量为无符号长整数型变量
void setup()
{
Serial.begin(9600);//串口波特率为9600
pinMode(2, INPUT); //设置引脚为输入模式
}
void loop()
{
duration = pulseIn(2, 1,60000000); //读取引脚上的高电平脉冲,最大脉冲时间间隔为60秒,并且把结果赋值给duration变量
Serial.print(duration/1000000.0); //通过串口输出duration变量
Serial.println(" s");
}0.71 s
0.68 s
0.00 s
0.65 s
1.64 s
1.15 s
0.00 s
0.83 s
0.81 s

hhjj 发表于 2013-3-12 14:04:38

我想問下,出現不了數據會是因為什麽原因呢?我迷惘啊!

dbo 发表于 2013-3-12 14:34:45

如果要检测两个按钮 那要咋办呀

弘毅 发表于 2013-3-12 19:52:47

dbo 发表于 2013-3-12 14:34 static/image/common/back.gif
如果要检测两个按钮 那要咋办呀

介个。。。。不知道一块板子同时处理两个按键的会不会有问题。。如果一个板子不行=.=那么。。两个板子

弘毅 发表于 2013-3-12 19:53:25

hhjj 发表于 2013-3-12 14:04 static/image/common/back.gif
我想問下,出現不了數據會是因為什麽原因呢?我迷惘啊!

不会出现数据检查下串口输出部分波特率是否匹配,端口号是否正确。

玄冰之神 发表于 2013-4-15 18:05:34

学习中、、、:D

bigas2 发表于 2013-6-15 11:34:05

你好,可不可以累加高电平的个数,而不是两个脉冲之间的时间??

tomlitomli 发表于 2013-6-27 09:10:40

支持弘老师,强啊!

simatic_net 发表于 2013-7-24 17:50:31

想知道如果Arduino接码盘,应该怎么写代码?

cpy 发表于 2013-8-23 22:34:03

楼主你好,我是用一个红外对管做的测试,linepin是红外的引脚,当检测到黑色物体会返回值是1,我想测这段高电平的时间,可以做到吗?但是为什么一直是0呢?{:soso_e154:}
val=digitalRead(linepin);//读出信号接口的值
if(val==HIGH)
{//如果信号为高电平,电机制动
digitalWrite(pin1,HIGH);
digitalWrite(pin2,HIGH);
duration = pulseIn(linepin, HIGH,60000000); //读取引脚上的高电平脉冲,最大脉冲时间间隔为60秒,并且把结果赋值给duration变量
Serial.println(duration); //通过串口输出duration变量
页: [1] 2 3 4
查看完整版本: Arduino入门教程--第二十一课--脉冲计时(看你按住开关有多久)