Raspberry pi adc:使用python和spidev的MPC3001

时间:2017-05-03 21:11:18

标签: python raspberry-pi adc

我正在尝试使用带有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没有合适的文档?

1 个答案:

答案 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然后事情变得更加顺利。它编写得更好,记录得更好。