Python实现 微秒(μs) 级 延时/计时 的方法
前言
最近在学习树莓派的GPIO,想用Python来读取DHT11温湿度传感器的数据,DHT11是使用单总线通信的,需要用到微秒级的延时,使用sleep()函数好像没法达到要求,然后我发现时间戳可以精确到小数点后7位,也就是0.1微秒,虽然实际应该达不到这样的精度,但应该还是够用的。
这个方法只适用于Linux系统,Windows系统不知道怎么回事,不管怎么弄延时结果都是1000微秒起步。
1秒(s)=1000毫秒(ms)=1000000微秒(μs)
什么是时间戳
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
实现方法
记录初始时间戳,然后进入循环,每次循环记录一次时间戳,循环判断条件是记录的时间戳减去初始时间戳小于设定的时间就继续循环,直到大于等于设定时间。
源码:
import time # 导入time模块
# https://blog.zeruns.tech/
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.tech/
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.tech/")
print((b-a)*1000000) # 将延时函数执行消耗的时间打印出来
效果:
推荐阅读
- 高性价比和便宜的VPS/云服务器推荐:https://blog.zeruns.tech/archives/383.html
- Python类文章:https://blog.zeruns.tech/category/Python/
- Arduino读取DHT11,DHT22,SHTC3温湿度数据:https://blog.zeruns.tech/archives/527.html
- 学生专属优惠权益大全,教育优惠:https://blog.zeruns.tech/archives/557.html
- 怎样搭建个人博客:https://blog.zeruns.tech/archives/218.html