用python创建时钟脉冲

Posted

技术标签:

【中文标题】用python创建时钟脉冲【英文标题】:Create clock pulse with python 【发布时间】:2021-11-18 06:31:08 【问题描述】:

我想使用 20 毫秒的睡眠时间。当我使用 time.sleep(0.02) 时,我遇到了很多问题。它不符合我的要求。如果我不得不举个例子;

import time
i = 0
end = time.time() + 10
while time.time() < end:
    i += 1
    time.sleep(0.02)
    print(i)

我们等待在控制台中看到“500”。但它就像“320”。这是一个巨大的差异。因为睡眠时间不正确,并且每次睡眠时间都会出现小偏差。它在累积增加,我们看到了错误的结果。

然后,我想为时钟脉冲创建新项目。 time.time() 有可能吗?

import time
first_time = time.time() * 100 #convert seconds to 10 * miliseconds
first_time = int(first_time) #convert integer

first_if = first_time
second_if = first_time + 2 #for sleep 20ms
third_if = first_time + 4 #for sleep 40ms
fourth_if = first_time + 6 #for sleep 60ms
fifth_if = first_time + 8 #for sleep 80ms

end = time.time() + 8
i = 0
while time.time() < end:
    now = time.time() * 100 #convert seconds to 10 * miliseconds
    now = int(now) #convert integer

    if i == 0 and (now == first_if or now > first_if):
        print('1_' + str(now))
        i = 1
    if i == 1 and (now == second_if or now > second_if):
        print('2_' + str(now))
        i = 2
    if  i == 2 and (now == third_if or now > third_if):
        print('3_' + str(now))
        i = 3
    if i == 3 and (now == fourth_if or now > fourth_if):
        print('4_' + str(now))
        i = 4
    if i == 4 and (now == fifth_if or now > fifth_if):
        print('5_' + str(now))
        break

Out >> 1_163255259009
       2_163255259011
       3_163255259013
       4_163255259015
       5_163255259017

这个项目是真的逻辑吗?如果是真正的逻辑,如何才能用真正的循环完成这个项目? 因为我希望这些睡眠一直发生。谢谢你的建议。

【问题讨论】:

考虑一下,不是一个人睡觉,而是搞砸了。您正在同一个循环中运行一些其他慢速代码,例如打印语句。 【参考方案1】:

假设您想以 20 毫秒为增量进行计数。您需要为不是比较、增量和打印的循环部分休眠。这些操作需要时间,根据您的发现可能大约需要 10 毫秒。

如果您想在循环中执行此操作,则无法对所有可能的结束时间进行硬编码。你需要做一些更一般的事情,比如取余数。

从循环前的时间开始:

t0 = time.time()
while time.time() < end:
    i += 1

现在您需要计算睡眠时间,以便t0 和睡眠结束之间的时间是 20 毫秒的倍数。

(time.time() - t0) % 0.02 告诉你距离 20 毫秒增量有多远,因为 python 方便地支持浮点取模。那么等待的时间是

    time.sleep(0.02 - (time.time() - t0) % 0.02)
    print(i)

使用%的符号规则,可以将计算减少到

    time.sleep(-(time.time() - t0) % 0.02)

【讨论】:

感谢您的建议。它似乎工作正常,但与我想要的不完全相同。我们正在使用模数,它每次都小于我们的睡眠时间。这是非常混乱的。例如; reel_sleep_time = 0.5 - (time.time() - t0) % 0.5 time.sleep(reel_sleep_time) print(str(i) + '_' + str(reel_sleep_time)) 输出 >> 1_0.5 2_0.4918181896209717 3_0.4845738410949707 4_0 .4933152198791504 5_0.4907896518704141408504754 7_0.49075212618074140874707 414074707 10_0.496349811407107 10_0.4963498115539551我们不能说500ms时钟脉冲。 span> @GökhanArman。当然不是。您在运行解释语言的多进程、多用户机器上。这不是您可以拥有的控制级别。我也习惯了嵌入式系统,在那里你可以做得更好,但不是用 python。

以上是关于用python创建时钟脉冲的主要内容,如果未能解决你的问题,请参考以下文章

什么是时钟?什么是CPU时钟?什么是时钟脉冲?

什么器件可以产生时钟信号

为啥用示波器观察ARM的SPI 的时钟始终维持高电平啊。怎么才能有时钟信号输出???

时钟频率

28.时钟初始化

单片机指令周期机器周期状态周期时钟周期