pulseIn的工作是什么?


9

我有一个从现场找到的超声波传感器的代码。这是代码:

#define trigPin 12
#define echoPin 13

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  int duration, distance;
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(1000);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance >= 200 || distance <= 0){
    Serial.println("Out of range");
  }
  else {
    Serial.print(distance);
    Serial.println(" cm");
  }
  delay(500);
}

但是,我不了解pulseIn()功能的工作。我的意思是,我想知道时间开始和结束的时间。例如,在此代码中,digitalWrite(trigPin, HIGH);时间从pulseIn()函数开始还是时间从函数开始?

如果是第二个,它停止了,那么当我在空中发送ping之后已经延迟了1000微秒时,时间如何给我们提供障碍物的距离?


对于我来说,触发引脚的100us延迟似乎有点长。这取决于传感器的品牌,但典型值(我将它与HC-SR04配合使用)约为10us
jfpoilpret 2014年

我如何在汇编语言中执行此代码????请帮忙。


1
How can i do this code in assembly languaje-与这个问题有什么关系?
尼克·加蒙

Answers:


8

从文档:

读取引脚上的脉冲(高电平或低电平)。例如,如果值是HIGH,则pulseIn()等待引脚变为HIGH,开始计时,然后等待引脚变为LOW,然后停止计时。返回脉冲的长度(以微秒为单位)。脉冲蛋白

因此,在这种情况下,pulseIn(echoPin, HIGH)开始计数微秒数直到echoPin变高,并将其存储在中duration

它在那条线上开始和结束,这就是所谓的阻塞函数。它会一直坐在那里直到echoPin变高,然后告诉您花费了多长时间(除非您指定超时)。

这也意味着pulseIn通话之前或之后的任何延迟都不会以任何方式影响它。

您从该时间获得距离的方式由以下方程式表示:

distance = (duration/2) / 29.1;

您将其除以2,因为它会往返,因此时间将是单程旅行的两倍。29.1是声音的速度(即343.5 m / s => 1 / 0.03435 = 29.1)。因此请注意结果以厘米为单位,而不是英寸。您可以通过查看传感器的数据表来弄清楚它,或者只是获取许多与持续时间有关的样本(您可以手动测量距离),并且得到一个非常相似的方程。


1
我已经溜走了!实际上,29.1是声音的速度。另外,快速补充一下:IIRC读取脉冲的原因是超声模块会产生HIGH信号,直到声音传回模块。
匿名企鹅2014年

1
我不明白第四段。因为如果我在空中发送声音脉冲并等待2秒钟,它将传播很多距离。因此,当我开始计数时,我将延迟2秒。那么,如果在pulseIn之前给出延迟,为什么没有问题呢?@萨克林 还要感谢Annonomus Penguin和sachlee
shajib0o 2014年

@ shajib0o“ pulseIn()等待引脚变为高电平,开始计时,然后等待引脚变为低电平并停止计时。”
sachleen 2014年

3
@ shajib0o据我所知,是超声波传感器在发送信号时使引脚变为高电平,然后在信号返回时使引脚变为低电平。
匿名企鹅2014年

1
实际上,这是错误的。pulseIn(echoPin, HIGH)测量直到ECHO引脚变为低电平的时间。
德米特里·格里戈里耶夫

2

的确,如果您在脉冲开始后1000微秒开始测量脉冲长度,那将是一个问题。但是,这不是HC-SR04传感器的工作方式:

在此处输入图片说明

  • 传感器由TRIG 的下降沿触发digitalWrite(trigPin, LOW);

  • ECHO脉冲在触发后约0.3 ms开始

因此,延迟1 ms不会影响测量结果。pulseIn(echoPin, HIGH)实际上将等待ECHO引脚变为高电平,然后开始测量脉冲长度,直到再次变为低电平为止。这样,TRIG脉冲的持续时间可以减少到10微秒(HC-SR04的最小TRIG持续时间),以加快测量速度。


0

重要的是要知道,不要通过设置触发引脚为高电平直到触发信号来测量从触发开始起的时间。

传感器HC-SR04通过在触发输入上接收到高电平开始测量,然后在很短的时间后发送在Echo引脚上编码为高电平长度的时间。

如果pulseIn()在触发后使用2 ms(即2000μs),则它应该工作正常。


1
我不确定这会增加或不同于已接受的答案。
Greenonline '16

0

不要感到困惑,因为超声波模块具有特定的工作方式。首先,您在trigpin中设置一个脉冲。结束时,模块将发送8个40 kHz脉冲的脉冲串(这实际上就是用来测量距离的信号,而不是Trigpin中的脉冲,该脉冲没有任何作用)。在发送第一个脉冲串的确切时刻,回波引脚将自身设置为高电平。发生这种情况时,程序位于pulseIn行中,并且由于echopin处于高电平,因此它开始计时(因为pulseIN(echopin,HIGH)等待echopin处于高电平以开始计时)。当40 kHz的第一个脉冲在物体中反弹并返回接收器时,回波针会将其自身设置为LOW。然后pulseIn函数停止时间并返回时间。然后程序继续运行。为了学习pulseIn的工作方式,该模块有些棘手。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.