极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18458|回复: 12

请教时间控制问题

[复制链接]
发表于 2015-1-14 14:36:11 | 显示全部楼层 |阅读模式
本帖最后由 A书生 于 2015-1-19 09:25 编辑

for 语句,while 语句都是用 数值控制循环次数的,但是我想 用时间控制循环可以吗???
比如我想获得光电门一分钟内有多少次数值改变这种,
或者,想知道   一秒钟有多少次高压脉冲, 并把数值输出出来。
有方法吗?求教。谢谢各位前辈
回复

使用道具 举报

发表于 2015-1-14 14:51:03 | 显示全部楼层
计数脉冲可以用 pulseIn()

有一种用法是
pulseIn(pin, value, timeout)

设定 timeout 就是给定时间,数这个时间之内的脉冲数量,达到时间之后自动退出
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-15 14:38:00 | 显示全部楼层
zoologist 发表于 2015-1-14 14:51
计数脉冲可以用 pulseIn()

有一种用法是

谢谢你,那第一种情况可以解决吗?就是测出光电槽的变化次数,我用pulseIn测光电门的   高脉冲次数  的时候静止不动的话,是每秒钟显示一次 0 ,但是轻轻推动小车数据就不是按照每秒钟出现一次了,我推动越快出来的数值也越快
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-15 14:42:35 | 显示全部楼层
zoologist 发表于 2015-1-14 14:51
计数脉冲可以用 pulseIn()

有一种用法是

我刚刚入手,现在可以数出来每次高低电平变化的次数了,我是用光电槽,然后手动推动小车,想通过知道每秒或者每两秒车轮转过多少度,现在只能做出来显示电平变化次数,但是不知道怎么去限定每秒或者每两秒,还请前辈多多指教!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-15 15:14:58 | 显示全部楼层
本帖最后由 A书生 于 2015-1-15 15:18 编辑
zoologist 发表于 2015-1-14 14:51
计数脉冲可以用 pulseIn()

有一种用法是


int pin = 3;
int i;
int j;
int n=0;
void setup()
{
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(pin,INPUT);
j=digitalRead(pin);
}

void loop()
{
// put your main code here, to run repeatedly:

    i=digitalRead(pin);
    if(i != j)
    {
     n++;
     j=i;
     Serial.println(n);
      }
}

我现在是这样写的,每次有电平的变化就会显示一次数字,就像数数一样,一个个的出现 ,我现在想每秒显示一次,然后清零,再重新数,就是显示出来每秒有多少次变化,该怎么做?谢谢你。
回复 支持 反对

使用道具 举报

发表于 2015-1-15 15:32:58 | 显示全部楼层
哦 这样的话,建议你写一个中断处理,过来一个中断计数一次,每秒显示一次然后清零

你觉得怎么样
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-15 15:46:14 | 显示全部楼层
zoologist 发表于 2015-1-15 15:32
哦 这样的话,建议你写一个中断处理,过来一个中断计数一次,每秒显示一次然后清零

你觉得怎么样

我还不会写中断,我去看看能不能学会,不会的地方再向您请教,谢谢。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-15 15:56:05 | 显示全部楼层
zoologist 发表于 2015-1-15 15:32
哦 这样的话,建议你写一个中断处理,过来一个中断计数一次,每秒显示一次然后清零

你觉得怎么样

您有时间的话可以帮忙写个例子吗?我比较笨。。。。
回复 支持 反对

使用道具 举报

发表于 2015-1-15 22:57:03 | 显示全部楼层
本帖最后由 A书生 于 2015-1-15 15:18 编辑

zoologist 发表于 2015-1-14 14:51
计数脉冲可以用 pulseIn()

有一种用法是


int pin = 3;
int i;
int j;
int n=0;
void setup()
{
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(pin,INPUT);
j=digitalRead(pin);
}

void loop()
{
// put your main code here, to run repeatedly:

    i=digitalRead(pin);
    if(i != j)
    {
     n++;
     j=i;
     Serial.println(n);
      }
}

我现在是这样写的,每次有电平的变化就会显示一次数字,就像数数一样,一个个的出现 ,我现在想每秒显示一次,然后清零,再重新数,就是显示出来每秒有多少次变化,该怎么做?谢谢你。
/*****检测一分钟内pin脚接收到低电平脉冲个数
****/
int pin = 3;
int n = 0;
double lasttime = 0;
double nowtime;
double time = 0;

void setup()
{
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(pin, INPUT);
  digitalWrite(pin,HIGH);
}

void loop()
{
  // put your main code here, to run repeatedly:
  nowtime = millis();
  if (nowtime - lasttime < 60000)
  {
    if (digitalRead(pin) == LOW & (millis() - time) < 150) //防抖动处理
    {
      n++;
    }
    time = millis();
  }
  else{
  lasttime = millis();
  Serial.println(n);
  n = 0;
  }
}
试试这个程序吧,在Arduino1.5.8编译通过。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-19 08:48:11 | 显示全部楼层
[quote]AP772 发表于 2015-1-15 22:57

谢谢前辈!!!/拱手 这个时间millis的用法可以了,哈哈,不用去学中断了,我把时间改成了每秒,然后还是计算的高低电平转换的次数,再次向你表示感谢!
回复 支持 反对

使用道具 举报

发表于 2015-1-19 09:37:46 | 显示全部楼层
不用客气,我帮人人,人人帮我。我也是在论坛学习成长的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-12 09:04:25 | 显示全部楼层
AP772 发表于 2015-1-19 09:37
不用客气,我帮人人,人人帮我。我也是在论坛学习成长的

又遇到困难了,您有时间可以帮帮我吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-12 09:06:10 | 显示全部楼层
AP772 发表于 2015-1-19 09:37
不用客气,我帮人人,人人帮我。我也是在论坛学习成长的

可不可以把问题发到你的邮箱里?
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-9 02:01 , Processed in 0.057922 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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