A书生 发表于 2015-1-14 14:36:11

请教时间控制问题

本帖最后由 A书生 于 2015-1-19 09:25 编辑

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

zoologist 发表于 2015-1-14 14:51:03

计数脉冲可以用 pulseIn()

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

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

A书生 发表于 2015-1-15 14:38:00

zoologist 发表于 2015-1-14 14:51 static/image/common/back.gif
计数脉冲可以用 pulseIn()

有一种用法是


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

A书生 发表于 2015-1-15 14:42:35

zoologist 发表于 2015-1-14 14:51 static/image/common/back.gif
计数脉冲可以用 pulseIn()

有一种用法是


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

A书生 发表于 2015-1-15 15:14:58

本帖最后由 A书生 于 2015-1-15 15:18 编辑

zoologist 发表于 2015-1-14 14:51 static/image/common/back.gif
计数脉冲可以用 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);
      }
}

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

zoologist 发表于 2015-1-15 15:32:58

哦 这样的话,建议你写一个中断处理,过来一个中断计数一次,每秒显示一次然后清零

你觉得怎么样

A书生 发表于 2015-1-15 15:46:14

zoologist 发表于 2015-1-15 15:32 static/image/common/back.gif
哦 这样的话,建议你写一个中断处理,过来一个中断计数一次,每秒显示一次然后清零

你觉得怎么样

我还不会写中断,我去看看能不能学会,不会的地方再向您请教,谢谢。

A书生 发表于 2015-1-15 15:56:05

zoologist 发表于 2015-1-15 15:32 static/image/common/back.gif
哦 这样的话,建议你写一个中断处理,过来一个中断计数一次,每秒显示一次然后清零

你觉得怎么样

您有时间的话可以帮忙写个例子吗?我比较笨。。。。

AP772 发表于 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编译通过。

A书生 发表于 2015-1-19 08:48:11

AP772 发表于 2015-1-15 22:57 static/image/common/back.gif

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

AP772 发表于 2015-1-19 09:37:46

不用客气,我帮人人,人人帮我。我也是在论坛学习成长的:lol

A书生 发表于 2015-5-12 09:04:25

AP772 发表于 2015-1-19 09:37 static/image/common/back.gif
不用客气,我帮人人,人人帮我。我也是在论坛学习成长的

又遇到困难了,您有时间可以帮帮我吗

A书生 发表于 2015-5-12 09:06:10

AP772 发表于 2015-1-19 09:37 static/image/common/back.gif
不用客气,我帮人人,人人帮我。我也是在论坛学习成长的

可不可以把问题发到你的邮箱里?
页: [1]
查看完整版本: 请教时间控制问题