Главная chevron_right Функции chevron_right Время chevron_right delayMicroseconds()

delayMicroseconds()

delayMicroseconds() останавливает скетч на заданное число микросекунд — удобно для коротких импульсов и программных протоколов, где delay() слишком груба.

Полная статья

Описание

delayMicroseconds() приостанавливает выполнение скетча на заданное количество микросекунд. Это более точный вариант короткой задержки, чем delay(), потому что delay() работает в миллисекундах.

Функцию используют там, где нужны очень короткие паузы: формирование импульса, ручная работа с простым протоколом, ожидание нескольких микросекунд между переключениями вывода.

Важно помнить: пока выполняется delayMicroseconds(), основной код стоит на месте. Для длинных пауз используйте delay(), а для неблокирующей логики — таймеры на основе micros() или millis().

Синтаксис

delayMicroseconds(us)

Параметры

  • us — длительность паузы в микросекундах. Допустимый тип данных: unsigned int.

Возвращает

Функция ничего не возвращает.

Пример кода

В примере вывод 8 генерирует прямоугольный сигнал: 50 мкс в состоянии HIGH, затем 50 мкс в состоянии LOW.

int outPin = 8;               // цифровой пин 8

void setup() {
  pinMode(outPin, OUTPUT);    // настраивает цифровой пин как выход
}

void loop() {
  digitalWrite(outPin, HIGH); // подаёт сигнал на пин
  delayMicroseconds(50);      // пауза 50 микросекунд
  digitalWrite(outPin, LOW);  // снимает сигнал с пина
  delayMicroseconds(50);      // пауза 50 микросекунд
}

Фактическая длительность полного периода будет немного больше 100 мкс, потому что сами вызовы digitalWrite() и переходы между строками тоже занимают время.

Где применяется

  • Формирование коротких импульсов — например, для простых датчиков, которым нужен trigger-импульс заданной длительности.
  • Программные протоколы — когда между переключениями вывода нужны паузы в несколько микросекунд.
  • Тестовые сигналы — быстро сгенерировать прямоугольный сигнал для проверки осциллографом или логическим анализатором.
  • Точная пауза внутри короткого участка — когда delay(1) слишком грубая, а таймер на micros() избыточен.

Практические замечания

  • На классических платах Arduino функция наиболее предсказуема в диапазоне примерно от 3 до 16383 мкс. Очень маленькие значения могут быть неточными из-за накладных расходов вызова.
  • Для задержек длиннее нескольких тысяч микросекунд обычно лучше использовать delay() или неблокирующий таймер.
  • delayMicroseconds() не отключает прерывания полностью, поэтому обработчики прерываний могут немного растянуть фактическую паузу.
  • digitalWrite() сам по себе относительно медленный. Если нужна точная частота сигнала, учитывайте время выполнения digitalWrite() или используйте прямой доступ к портам, таймеры либо аппаратный PWM.
  • Не передавайте отрицательные значения: параметр беззнаковый, и такое значение превратится в большое положительное число.

Примечания и предупреждения

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

Полезные материалы