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() и не блокировать основной цикл.