极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 141178|回复: 49

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

  [复制链接]
发表于 2012-11-20 20:30:49 | 显示全部楼层 |阅读模式
我们通过计算你按下一个按钮多长时间,来介绍一下怎样对脉冲计时。

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


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

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



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

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

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

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

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



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



介绍一下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)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 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
强哥,pulseIn()函数精度精确到多少?这个挺重要的啊

查阅函数,或者语法手册
回复 支持 反对

使用道具 举报

发表于 2013-3-5 10:12:24 | 显示全部楼层
本帖最后由 <一一巛 于 2013-3-5 10:13 编辑

交作业
  1. unsigned long duration;  //定义duration变量为无符号长整数型变量
  2. void setup()
  3. {
  4.   Serial.begin(9600);  //串口波特率为9600
  5.   pinMode(2, INPUT); //设置引脚为输入模式
  6. }
  7. void loop()
  8. {
  9.   duration = pulseIn(2, 1,60000000); //读取引脚上的高电平脉冲,最大脉冲时间间隔为60秒,并且把结果赋值给duration变量
  10.   Serial.print(duration/1000000.0); //通过串口输出duration变量
  11.   Serial.println(" s");
  12. }
复制代码
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
回复 支持 反对

使用道具 举报

发表于 2013-3-12 14:04:38 | 显示全部楼层
我想問下,出現不了數據會是因為什麽原因呢?我迷惘啊!
回复 支持 反对

使用道具 举报

发表于 2013-3-12 14:34:45 | 显示全部楼层
如果要检测两个按钮 那要咋办呀
回复 支持 反对

使用道具 举报

发表于 2013-3-12 19:52:47 | 显示全部楼层
dbo 发表于 2013-3-12 14:34
如果要检测两个按钮 那要咋办呀

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

使用道具 举报

发表于 2013-3-12 19:53:25 | 显示全部楼层
hhjj 发表于 2013-3-12 14:04
我想問下,出現不了數據會是因為什麽原因呢?我迷惘啊!

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

使用道具 举报

发表于 2013-4-15 18:05:34 | 显示全部楼层
学习中、、、
回复 支持 反对

使用道具 举报

发表于 2013-6-15 11:34:05 | 显示全部楼层
你好,可不可以累加高电平的个数,而不是两个脉冲之间的时间??
回复 支持 反对

使用道具 举报

发表于 2013-6-27 09:10:40 | 显示全部楼层
支持弘老师,强啊!
回复 支持 反对

使用道具 举报

发表于 2013-7-24 17:50:31 | 显示全部楼层
想知道如果Arduino接码盘,应该怎么写代码?
回复 支持 反对

使用道具 举报

发表于 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变量
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-25 19:39 , Processed in 0.064762 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表