Методы реализации задержки/тайминга в микросекундах (мкс) на Python
Введение
В последнее время я изучаю GPIO Raspberry Pi и хочу использовать Python для чтения данных с датчика температуры и влажности DHT11. DHT11 использует однопроводную шину, для чего требуется задержка в микросекундах. Функция sleep(), похоже, не может достичь требуемой точности. Затем я обнаружил, что временные метки могут быть точными до семи знаков после запятой, то есть до 0,1 микросекунды. Хотя на практике такая точность, вероятно, недостижима, она всё же должна быть достаточной.
Этот метод применим только в системах Linux. В Windows, по неизвестным причинам, задержка всегда начинается от 1000 микросекунд.
1 секунда (с) = 1000 миллисекунд (мс) = 1 000 000 микросекунд (мкс)
Что такое временная метка
Временная метка — это общее количество секунд, прошедших с 00:00:00 1 января 1970 года по Гринвичу (08:00:00 1 января 1970 года по китайскому стандартному времени) до настоящего момента.
Реализация
Записываем начальную временную метку, затем входим в цикл, где на каждой итерации записываем новую временную метку. Условие цикла: разница между текущей и начальной метками меньше заданного значения — продолжаем цикл, пока разница не станет больше или равна заданному значению.
Исходный код:
import time # Импорт модуля time
# https://blog.zeruns.com/
def delayMicrosecond(t): # Функция задержки в микросекундах
start, end = 0, 0 # Объявление переменных
start = time.time() # Запись начального времени
t = (t - 3) / 1000000 # Преобразование входного значения t в секунды, -3 — компенсация задержки
while end - start < t: # Цикл до тех пор, пока разница не станет больше или равна заданной
end = time.time() # Запись конечного времени
Способ использования: скопируйте приведённый выше код в вашу программу и вызовите функцию delayMicrosecond(t), где t — время задержки в микросекундах.
В приведённом выше коде t-3 — это компенсация задержки, поскольку вызов функции и выполнение цикла также требуют времени. Вы можете настроить это значение по результатам собственных тестов. При тестировании на Raspberry Pi 4 я обнаружил, что дополнительно тратится 3 микросекунды, поэтому вычитаем 3.
Пример
import time # Импорт модуля time
# https://blog.zeruns.com/
def delayMicrosecond(t): # Функция задержки в микросекундах
start, end = 0, 0 # Объявление переменных
start = time.time() # Запись начального времени
t = (t - 3) / 1000000 # Преобразование входного значения t в секунды, -3 — компенсация задержки
while end - start < t: # Цикл до тех пор, пока разница не станет больше или равна заданной
end = time.time() # Запись конечного времени
a = time.time() # Запись времени начала выполнения функции задержки
delayMicrosecond(35) # Задержка 35 микросекунд
b = time.time() # Запись времени окончания выполнения функции задержки
print("https://blog.zeruns.com/")
print((b - a) * 1000000) # Вывод времени, затраченного на выполнение функции задержки
Результат:
Рекомендуем к прочтению
- Рекомендации по недорогим и выгодным VPS/облачным серверам: https://blog.zeruns.com/archives/383.html
- Статьи по Python: https://blog.zeruns.com/category/Python/
- Чтение данных датчиков температуры и влажности DHT11, DHT22, SHTC3 с помощью Arduino: https://blog.zeruns.com/archives/527.html
- Полный список специальных предложений для студентов: https://blog.zeruns.com/archives/557.html
- Как создать личный блог: https://blog.zeruns.com/archives/218.html


