我正在尝试使用带有Raspberry pi的MPC3001 ADC而不是SPI。 在这样做的同时,我得到了一些奇怪的结果:
我正在使用的代码:
import sys
import spidev
spi = spidev.SpiDev()
spi.open(0,0)
def readAdc(channel):
r = spi.xfer2([1, 8 + channel << 4, 0])
return ((r[1]&3) << 8) + r[2]
while True:
print readAdc(0)
time.sleep(0.5)
运行上面的脚本,同时测量分压器的中心点,产生2个值之间的随机切换:504和1016.
因为504是我期望的正确值,结合两个结果的二进制表示;
504 - &gt; 00111111000
1016 - &gt; 01111111000
我认为我不小心在某处'创造'了1。
有人能指出我正确的方向吗? 提前致谢
顺便说一句:是我,还是spidev lib没有合适的文档?
答案 0 :(得分:1)
在data sheet图5-2中,它显示了问题所在。从设备一点一点地返回的数据看起来像这样(其中X =不关心,Bx是数据的位号x; B0是LSB和B9 MSB):
BYTE0: X X 0 B9 B8 B7 B6 B5
BYTE1: B4 B3 B2 B1 B0 B1 B2 B3
BYTE2: B4 B5 B6 B7 B8 B9 X X
如果将return语句更改为:
return ((r[0] & 0x1F) << 5) | ((r[1] >> 3) & 0x1F)
它可能有用。
但如果我是你,我不会相信我(我不再有硬件设置,我可以测试任何东西)。我认为最好在r中打印字节的各个值并思考结果直到它开始有意义。请注意,某些SPI实现允许您在上升沿或下降沿读取数据。如果你有这个错误,你的数据将永远不会有意义。
这里的另一个线索是A / D转换器读数的三个LSB不应始终为000,以便在读取后读取。在最低有效位中几乎总是存在噪声,至少,如果不是两位或三位。
BTW我同意你的看法spidev。我切换到quick2wire然后事情变得更加顺利。它编写得更好,记录得更好。