Какова работа pulseIn?

У меня есть код для ультразвукового датчика, который я нашел на сайте. Вот код:

#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()?

Если это второй, когда он останавливается, то как время дает нам расстояние до препятствия, когда я уже задерживаюсь на 1000 микросекунд после отправки пинга в воздухе?

, 👍10

Обсуждение

Задержка в 100 мкс для пускового штифта кажется мне немного длинной. Это зависит от марки вашего сенсора, но типичное значение (я использую его с HC-SR04) составляет около **10us**., @jfpoilpret

http://arduinoprosto.ru/q/19767/what-if-ultrasonic-sensor-doesnt-detect-object/19772#19772, @Paul

«Как я могу сделать этот код на ассемблере» - какое это имеет отношение к этому вопросу?, @Nick Gammon


4 ответа


Лучший ответ:

9

Из документации:

Читает импульс (ВЫСОКИЙ или НИЗКИЙ) на выводе. Например, если значение ВЫСОКИЙ, pulseIn() ожидает, пока контакт перейдет в ВЫСОКИЙ, начинает отсчет времени, затем ждет, пока на выводе не станет НИЗКИМ, и останавливает отсчет времени. Возвращает длину импульс в микросекундах. импульсный

Итак, в этом случае pulseIn(echoPin, HIGH) начинает отсчет количества микросекунд до тех пор, пока echoPin не станет HIGH, и сохраняет это значение в duration.

Она начинается и заканчивается на этой строке, это так называемая блокирующая функция. Он действительно будет сидеть там, пока echoPin не станет высоким и не сообщит вам, сколько времени это заняло (если вы не укажете тайм-аут).

Это также означает, что любые задержки до или после вызова pulseIn никоим образом не влияют на него.

Вы можете получить расстояние от этого времени по следующему уравнению:

distance = (duration/2) / 29.1;

Вы делите на два, потому что он идет туда и обратно, поэтому время будет вдвое больше, чем в пути в один конец. 29,1 — это скорость звука (343,5 м/с => 1/0,03435 = 29,1). Обратите внимание, что результат указан в см, а не в дюймах. Вероятно, вы могли бы понять это, просмотрев лист данных датчика или просто взяв множество выборок, связывающих продолжительность с расстоянием (вы бы измерили расстояние вручную) и получили очень похожее уравнение.

,

Я был Скит! На самом деле 29,1 это скорость звука. Кроме того, просто быстрое дополнение: IIRC, причина того, что есть импульс для чтения, заключается в том, что ультразвуковой модуль производит ВЫСОКИЙ сигнал, пока звук не вернется к модулю., @Anonymous Penguin

Четвёртый абзац не понял. Потому что, если я пошлю звуковой импульс в воздух и подожду 2 секунды, он пройдет большое расстояние. Поэтому, когда я начну считать, я опоздаю на 2 секунды. Итак, почему нет никаких проблем, если я даю задержки перед pulseIn? @ Сачлин. И спасибо Annonomus Penguin и sachlee, @shajib0o

@ shajib0o «pulseIn () ждет, пока контакт станет ВЫСОКОЙ, начинает отсчет времени, затем ждет, пока контакт перейдет в НИЗКИЙ, и останавливает отсчет времени»., @sachleen

когда контакт становится LOW? @сачлин, @shajib0o

@ shajib0o Насколько я могу судить, ультразвуковой датчик заставляет штифт становиться ВЫСОКИМ, когда сигнал отправляется, а затем НИЗКИМ, когда сигнал возвращается., @Anonymous Penguin

На самом деле, это неправильно. pulseIn(echoPin, HIGH) измеряет время до тех пор, пока вывод ECHO не станет НИЗКИМ., @Dmitry Grigoryev

@AnonymousPenguin _"На самом деле 29,1 — это скорость звука"_ Ну, на самом деле скорость звука составляет 343,5 м/с. Тогда 1/0,03435 = 29,1. Обратите внимание, что результат измеряется в см, а не в дюймах. Чтобы рассчитать расстояние, вы также можете сделать «расстояние = продолжительность / 58,2»., @RobIII


0

Важно знать, что вы не измеряете время от запуска триггера, установив высокий уровень триггерного контакта, до эхо-сигнала.

Датчик HC-SR04 начинает измерение, получая ВЫСОКИЙ уровень на триггерном входе, а затем через короткое время отправляет время, закодированное как длина ВЫСОКОГО уровня на выводе Echo.

Если вы используете pulseIn() 2 мс, т.е. 2000 мкс, после запуска, все должно работать нормально.

,

Я не уверен, насколько это добавляет или отличается от принятого ответа., @Greenonline


2

Действительно, было бы проблемой, если бы вы начали измерять длину импульса через 1000 микросекунд после его начала. Однако датчик HC-SR04 работает иначе:

  • датчик срабатывает по заднему фронту сигнала TRIG в точке digitalWrite(trigPin, LOW);

  • импульс ЭХО начинается примерно через 0,3 мс после триггера

Вот почему задержка в 1 мс не влияет на результат измерения. pulseIn(echoPin, HIGH) фактически будет ждать, пока вывод ECHO станет ВЫСОКИМ, а затем начнет измерять длину импульса, пока он снова не станет НИЗКИМ. Таким образом, продолжительность импульса TRIG может быть уменьшена до 10 микросекунд (минимальная продолжительность TRIG для HC-SR04), чтобы ускорить измерения.

,

0

Не запутайтесь, так как ультразвуковой модуль работает по-своему. Сначала вы устанавливаете импульс в триггере. Когда он заканчивается, модуль отправляет 8 пакетов импульсов частотой 40 кГц (и именно это используется для измерения расстояния, а не ваш импульс в триггере, который никуда не уходит). Точно в момент отправки первого пакета вывод эха устанавливается в состояние ВЫСОКИЙ. Когда это происходит, программа находится в строке pulseIn, и, поскольку echopin имеет ВЫСОКИЙ уровень, она начинает синхронизацию (поскольку pulseIN(echopin,HIGH) ожидает, пока эхопин станет ВЫСОКИМ для начала синхронизации). Когда первый импульс на частоте 40 кГц отражается от объекта и возвращается к приемнику, эхопин устанавливает себя в НИЗКИЙ уровень. Затем функция pulseIn останавливает время и возвращает его. Затем программа продолжает работу. Этот модуль немного сложен, чтобы узнать, как работает pulseIn.

,