Что такое работа в Pulin?

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()функции?

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

shajib0o
источник
Задержка в 100 мс для триггерного штифта мне кажется немного длинной. Это зависит от марки вашего датчика, но типичное значение (я использую его с HC-SR04) составляет около 10us .
jfpoilpret
Как я могу сделать этот код в сборке языка ???? Пожалуйста помоги.
1
How can i do this code in assembly languaje- какое это имеет отношение к этому вопросу?
Ник Гэммон

Ответы:

8

Из документов:

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

Таким образом, в этом случае pulseIn(echoPin, HIGH)начинается подсчет количества микросекунд, пока он echoPinне станет ВЫСОКИМ и не сохранит его в duration.

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

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

То, как вы получите расстояние от этого времени, по следующему уравнению:

distance = (duration/2) / 29.1;

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

sachleen
источник
1
Я был скинут! На самом деле 29.1 - это скорость звука. Кроме того, просто быстрое добавление: IIRC причина, по которой нужно прочитать импульс, заключается в том, что ультразвуковой модуль выдает сигнал HIGH, пока звук не вернется в модуль.
анонимный пингвин
1
Я не понял четвертый абзац. Потому что, если я отправлю звуковой импульс в воздух и подожду 2 секунды, он пройдет большое расстояние. Поэтому, когда я начну считать, я опоздаю на 2 секунды. Так почему нет проблем, если я даю задержки перед pulseIn? @ sachleen. И спасибо Annonomus Penguin и sachlee
shajib0o
@ shajib0o "pulseIn () ждет, пока штифт станет ВЫСОКИМ, начнет синхронизацию, затем ждет, пока штифт станет НИЗКИМ, и остановит синхронизацию."
сахлин
3
@ shajib0o Насколько я могу судить, ультразвуковой датчик делает вывод ВЫСОКИМ при отправке сигнала, а затем НИЗКИМ, когда сигнал возвращается.
анонимный пингвин
1
На самом деле это неправильно. pulseIn(echoPin, HIGH)измеряет время, пока вывод ECHO не станет НИЗКИМ.
Дмитрий Григорьев
2

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

введите описание изображения здесь

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

  • импульс ECHO начинается примерно через 0,3 мс после запуска

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

Дмитрий Григорьев
источник
0

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

Датчик HC-SR04 начинает измерение, получая HIGH на входе Trigger, а затем через некоторое время отправляет время, закодированное как длину уровня HIGH на выводе Echo.

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

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

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

JoshFMX
источник