파이썬으로 마이크로초 단위 지연 구현

Python로 마이크로초(μs) 단위 지연/타이밍 구현 방법

서론

최근 라즈베리 파이의 GPIO를 공부하면서 Python을 사용해 DHT11 온습도 센서의 데이터를 읽어보려 했습니다. DHT11은 단일 버스 통신을 사용하며, 마이크로초 단위의 지연이 필요합니다. sleep() 함수는 이 요구 사항을 충족할 수 없어 보였고, 저는 타임스탬프가 소수점 이하 7자리까지 정확하게 측정될 수 있다는 것을 알게 되었습니다. 즉, 0.1 마이크로초 단위까지 가능하다는 뜻입니다. 실제 정확도는 이 정도까지 도달하지 못할 수도 있지만, 충분히 사용 가능할 것입니다.

이 방법은 Linux 시스템에만 적용됩니다. Windows 시스템은 왜 그런지 모르겠지만, 어떤 방식으로도 지연 시간이 항상 1000마이크로초 이상으로 나옵니다.

1초(s) = 1000밀리초(ms) = 1,000,000마이크로초(μs)

타임스탬프란?

타임스탬프는 그린위치 표준시 1970년 1월 1일 00시 00분 00초(베이징 시간 1970년 1월 1일 08시 00분 00초)부터 현재까지의 총 초 수를 의미합니다.

구현 방법

초기 타임스탬프를 기록한 후, 루프를 실행하며 매번 타임스탬프를 기록합니다. 루프 조건은 현재 기록된 타임스탬프에서 초기 타임스탬프를 뺀 값이 설정한 시간보다 작을 때 계속 반복하고, 설정된 시간 이상이 되면 종료합니다.

소스 코드:

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은 시간 보정값입니다. 함수 호출, 루프 실행 등 명령어 실행 자체에도 시간이 소요되기 때문입니다. 본인의 환경에 따라 테스트하여 조정할 수 있습니다. 제가 라즈베리 파이 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)    # 지연 함수 실행에 소요된 시간 출력

결과:


추천 읽기

1개의 좋아요