使用python(SPI)从ADC(MCP3001)读取数据

2024-09-28 21:49:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用python从ADC读取一些数据,但不幸的是,它不起作用。我希望有人能给我一个提示,因为我的脚本只创建混乱数据。但我看不出有什么错误。。。在

我已经更新了下面的脚本,因为我正在阅读16位和前3位和后3位的剪辑。我需要数据的10个中间位-如果我正确理解数据表。。。在

产品介绍MCP3001:(第15页)http://ww1.microchip.com/downloads/en/DeviceDoc/21293C.pdf

import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)

HIGH = True
LOW  = False

def readAnalogData(SCLKPin, MOSIPin, MISOPin, CSPin):
    GPIO.output(CSPin,   HIGH)    
    GPIO.output(CSPin,   LOW)
    GPIO.output(SCLKPin, LOW)

    adcvalue = 0
    for i in range(16):
        GPIO.output(SCLKPin, HIGH)
        GPIO.output(SCLKPin, LOW)
        adcvalue <<= 1
        if(GPIO.input(MISOPin)):
            adcvalue |= 0x01
    adcvalue >>= 3
    adcvalue &= 0x3ff
    time.sleep(0.5)

    return adcvalue

SCLK        = 11 # Serial-Clock
MOSI        = 10 # Master-Out-Slave-In
MISO        = 9 # Master-In-Slave-Out
CS          = 17 # Chip-Select

GPIO.setup(SCLK, GPIO.OUT)
GPIO.setup(MOSI, GPIO.OUT)
GPIO.setup(MISO, GPIO.IN)
GPIO.setup(CS,   GPIO.OUT)

while True:
    print readAnalogData(SCLK, MOSI, MISO, CS) 

Tags: 数据脚本outputgpiosetupoutcslow
1条回答
网友
1楼 · 发布于 2024-09-28 21:49:49

从数据表和代码的粗略阅读来看,您似乎试图通过转换为str并使用str切片来丢弃最初3个时钟周期的数据

adcvalue = str(adcvalue)
adcvalue = adcvalue[3:12]
adcvalue = int(adcvalue)

如果是这样,这就行不通了。adcvalueint,将其转换为str将生成十进制(以10为基数)字符串。相反,要么不在前三个周期中采样数据,要么使用位掩码从整数中剥离数据(即adcvalue &= 0x1ff

此外,您似乎是在负时钟边缘采样数据,但这是在数据处于瞬态状态时。我想你要么需要在这里加一个延迟,要么在数据稳定后在+ve时钟边缘采样。在

编辑

在时钟边缘进行采样。数据表第16页的图6-1显示了这一点。而且它看起来像是以MSB格式输出9位,然后以LSB格式重复数据(参见图6-2),所以我认为您不希望保留10位。你可能只需要打卡总共12位,然后丢弃前3位。在

类似(未经测试):

^{pr2}$

相关问题 更多 >