你好,谢谢你的阅读。作为一个业余项目,我认为尝试创建自己的通信协议会很有趣。我正在尝试使用GPIO引脚在我的覆盆子Pi 4发送数字信号。使用Raspberry Pi的原因是因为我想将它连接到我想在Pi上运行的网页。我使用Python和RPi.GPIO库来控制引脚。我非常在这个项目的开始,但我已经遇到了一个问题。
当我的信号发送脉冲,我得到一个奇怪的偏移时,去更高的速度。见下面的代码:
import RPi.GPIO as GPIO
import time
pin = 18 # select pin
pulse_time = 1/100 # set lenght of pulse
GPIO.setmode(GPIO.BOARD)
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.HIGH) # set pin high
time.sleep(pulse_time) # wait
GPIO.output(pin, GPIO.LOW) # set pin low
time.sleep(pulse_time)
GPIO.output(pin, GPIO.HIGH)
time.sleep(pulse_time)
GPIO.cleanup()在变量"pulse_time“中,我设置了脉冲的等待时间。在这种情况下,我试图以每秒100位的速度发送比特。每10毫秒就有1位。关于数据信号,请看下面的图片(很抱歉,我的示波器没有USB接口来截图)。

在上面的图像中,您可以看到我用Python代码发送的2个脉冲。第一个脉冲正好有10毫秒长,和我想的一样,但是第二个脉冲已经有了轻微的偏移。当将bps改为1000而不是100时,偏移量会变得更糟。对于我的项目,我打算使用2400 bps的比特率。
我还尝试使用C++而不是Python来做同样的事情,因为C++在控制硬件方面通常更快/更好。遗憾的是,C++的GPIO库‘C++’被删除了,我找不到其他方法来使用C++来控制GPIO引脚。
现在我已经解释了情况,我有以下几个问题:
如有任何建议,将不胜感激。提前感谢您抽出时间回答我的任何问题。
发布于 2022-11-17 10:35:03
我认为这种抵消可能来自运行GPIO.output(pin, GPIO.HIGH)所需的时间。
您可以通过测量这个执行时间并在time.sleep(...)中对其进行调整来改进这一点。(例如time.sleep(pulse_time - some_gpio_time) )
看看时差,用实验测量时间,或者你可以试著去测量它,然后在连续的睡眠中考虑它。
但是请记住,像这样的应用程序并不是为了满足硬实时需求,您总是会遇到一些错误。为了获得更好的计时,您需要将其实现为linux内核模块,但对于业余项目来说,这可能有点过头了。
https://stackoverflow.com/questions/74473437
复制相似问题