Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Timer 如何在Arduino中测量pin2上两个输入之间的时间间隔?_Timer_Arduino_Interrupt_Arduino Uno - Fatal编程技术网

Timer 如何在Arduino中测量pin2上两个输入之间的时间间隔?

Timer 如何在Arduino中测量pin2上两个输入之间的时间间隔?,timer,arduino,interrupt,arduino-uno,Timer,Arduino,Interrupt,Arduino Uno,我想用定时器中断法测量Arduino UNO引脚2上两个输入脉冲之间的时间间隔,我已经编写了这段代码,但它不能正常工作 这段代码只显示了一个瞬间,所以我无法测量时间间隔。我是Arduino的新手,尝试制作呼吸机。如有任何建议,将不胜感激。谢谢大家! //三次定时器中断 //定时器0、定时器1和定时器2的定时器设置 //此代码将启用所有三个arduino uno定时器中断 //定时器0将以2 KHz的频率中断 //定时器1将以1 Hz的频率中断 //定时器R2将在8 KHz时中断 //存储变量 布

我想用定时器中断法测量Arduino UNO引脚2上两个输入脉冲之间的时间间隔,我已经编写了这段代码,但它不能正常工作

这段代码只显示了一个瞬间,所以我无法测量时间间隔。我是Arduino的新手,尝试制作呼吸机。如有任何建议,将不胜感激。谢谢大家!

//三次定时器中断
//定时器0、定时器1和定时器2的定时器设置
//此代码将启用所有三个arduino uno定时器中断
//定时器0将以2 KHz的频率中断
//定时器1将以1 Hz的频率中断
//定时器R2将在8 KHz时中断
//存储变量
布尔切换0=0;
布尔切换1=0;
布尔开关2=0;
长计数0=0;
长计数1=0;
长计数2=0;
浮动t=0;
浮动它=0;
浮动fT=0;
浮动温度=0;
int开关管脚=2;
int switchState=0;
无效设置(){
cli();//停止中断
//将定时器0中断设置为2 KHz
TCCR0A=0;//将整个TCCR0A寄存器设置为0
TCCR0B=0;
TCNT0=0;//将计数器值初始化为0
//为2KHz增量设置比较匹配寄存器

OCR0A=124;//=(16x10^6)/(2000x64)-1(必须是首先,您不应该弄乱timer0。Arduino使用timer0进行计时。您不应该更改它(因此您发现它会使millis()停止工作)。您可以使用TIMER1和TIMER2做任何您想做的事情。(尽管有些库使用它们)。 为什么不使用attachInterrupt()?

很抱歉没有深入研究您的长代码。

首先,您不应该弄乱timer0。Arduino使用timer0进行计时。您不应该更改它(因此您发现它会阻止millis()工作)。您可以使用TIMER1和TIMER2做任何您想做的事情。(尽管有些库使用它们)。 为什么不使用attachInterrupt()?

很抱歉没有深入研究您的长代码。

我将以一种更简单的方式处理此问题。请始终尝试将问题划分为较小的问题(不要太多!)。在这种情况下,我们希望:

  • 当SATU改变时,开始花时间
  • 花点时间
  • 当我们收到另一个输入时,停止花费时间
让我们开始:

当状态改变时,开始花时间。

如果我们认为PIN的默认状态是“代码>低”,则代码应该考虑到输入是“代码>高”,因此这将是我们的“代码>环())/代码>节中的第一个语句。

。您将我们感兴趣的pin值作为一个值,我们将收到状态
HIGH
LOW

if (digitalRead(pin) == HIGH){
}
花点时间。 现在我们知道什么时候开始计时了,所以是时候考虑如何使用它了。我们可以在这个if语句中编写它,或者通过创建一个新函数,这取决于您对代码的使用。让我们直接在if语句中实现它。我们可以在循环中的一个变量中添加1,例如:

elapsedTime = 0;
for (int i = 0; i <= 255; i++){
    elapsedTime = elapsedTime + 1;
}
一种更常见的添加方法如下:
variable++
。另一个次要编辑是在添加一个变量之前等待一秒钟,因为当您开始存储0时,没有1。让我们重新编写这些行:

elapsedTime = 0;
for (int i = 0; i <= 255; i++){
    delay(1000);
    elapsedTime = elapsedTime++;
}
现在,我们在函数中编写的内容将一直执行,直到得到一个错误的语句。使用之前编写的内容:

elapsedTime = 0;
while (digitalRead(pin) == LOW){
    delay(1000);
    elapsedTime = elapsedTime++;
}
最后,我们希望在收到第一个
HIGH
输入时开始计数,因此我们将其包装在第一行代码中:

elapsedTime = 0;
if (digitalRead(pin) == HIGH){
    while (digitalRead(pin) == LOW){
        delay(1000);
        elapsedTime = elapsedTime++;
    }
}
全部完成!要获得结果,您可以打印结果,或执行任何您想要的操作。
你可以测量任何单位的时间,而不是以秒为单位的时间,只需将
delay()
中的值更改为你想要的任何单位。例如,如果我们要测量毫秒,它将是
delay(1)

我会用一种更简单的方法来处理这个问题。始终尝试将问题划分为更小的单位(不要太多!).在这种情况下,我们希望:

  • 当SATU改变时,开始花时间
  • 花点时间
  • 当我们收到另一个输入时,停止花费时间
让我们开始:

当状态改变时,开始花时间。

如果我们认为PIN的默认状态是“代码>低”,则代码应该考虑到输入是“代码>高”,因此这将是我们的“代码>环())/代码>节中的第一个语句。。您将我们感兴趣的pin值作为一个值,我们将收到状态

HIGH
LOW

if (digitalRead(pin) == HIGH){
}
花点时间。 现在我们知道什么时候开始计时了,所以是时候考虑如何使用它了。我们可以在这个if语句中编写它,或者通过创建一个新函数,这取决于您对代码的使用。让我们直接在if语句中实现它。我们可以在循环中的一个变量中添加1,例如:

elapsedTime = 0;
for (int i = 0; i <= 255; i++){
    elapsedTime = elapsedTime + 1;
}
一种更常见的添加方法如下:
variable++
。另一个次要编辑是在添加一个变量之前等待一秒钟,因为当您开始存储0时,没有1。让我们重新编写这些行:

elapsedTime = 0;
for (int i = 0; i <= 255; i++){
    delay(1000);
    elapsedTime = elapsedTime++;
}
现在,我们在函数中编写的内容将一直执行,直到得到一个错误的语句。使用之前编写的内容:

elapsedTime = 0;
while (digitalRead(pin) == LOW){
    delay(1000);
    elapsedTime = elapsedTime++;
}
最后,我们希望在收到第一个
HIGH
输入时开始计数,因此我们将其包装在第一行代码中:

elapsedTime = 0;
if (digitalRead(pin) == HIGH){
    while (digitalRead(pin) == LOW){
        delay(1000);
        elapsedTime = elapsedTime++;
    }
}
全部完成!要获得结果,您可以打印结果,或执行任何您想要的操作。
您可以测量任何单位,而不是以秒为单位的时间,只需将
delay()
中的值更改为您想要的任何值。例如,如果我们要测量毫秒,它将是
delay(1)

对不起!我没有太多时间学习。您能告诉我如何修改上述代码以获得所需结果吗?对不起!我没有太多时间学习。您能告诉我如何修改上述代码以获得所需结果吗。