如何通过SPI加快ADS芯片的采样率

时间:2017-11-03 18:35:14

标签: python raspberry-pi3 spi adc

对于我学校的化学研究项目,我们正在使用ADS8320数据表here,以非常快的速度从电位计中获取电压读数。我们正在使用覆盆子Pi 3,并试图通过Pi上的GPIO和SPI引脚获取数据。我能够在python中使用这段代码来做到这一点:

import time
import os
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

start = time.time()

PIN_CLK = 11
PIN_DO = 9
PIN_DI = 10
PIN_CS = 8

GPIO.setup(PIN_DI, GPIO.OUT)
GPIO.setup(PIN_DO, GPIO.IN)
GPIO.setup(PIN_CLK, GPIO.OUT)
GPIO.setup(PIN_CS, GPIO.OUT)

def getADC(channel):
    GPIO.output(PIN_CS, True) #used to clear last transmission
    GPIO.output(PIN_CS, False) #Bringing cs to low

    GPIO.output(PIN_CLK, False) #starting the clock

    for i in [1,1,channel]: #start of a new bit assignment
        if (i==1):
            GPIO.output(PIN_DI, True)
        else:
            GPIO.output(PIN_DI,True)

        GPIO.output(PIN_CLK, True)
        GPIO.output(PIN_CLK, False)

    ad = 0
    for i in range (18):
        GPIO.output(PIN_CLK, True)
        GPIO>output(PIN_CLK, False)
        ad <<= 1
        if (GPIO.input(PIN_DO)):
            ad |= 0x1

    GPIO.output(PIN_CS, True) #reset

    return ad

if __name__ == "__main__":
    while True:
        bitReading = getADC(0)
        Data = float(bitReading/65535.0*3.3)
        getTime = float(time.time() - start)
        print ("%.5f" % getTime + "," + "%.5f" % Data)
        time.sleep(0)

此代码的主要问题是,虽然我能够接收数据,但它比我预期的要慢得多。从数据表中可以看出它的运行速度大约为100Khz,但问题是它目前正在以毫秒为单位。我该如何加快这段代码?我是一个完整的编码初学者,我所拥有的大部分工作代码都来自于我从google搜索中找到的网站。我见过有关spidev的事情,但我不确定如何实现它们。任何有关这方面的帮助都会很棒,因为我是一名化学专业,而不是综合科学专业,所以我对这个问题深入了解。如果您有任何疑问或者我遗漏了任何重要信息,请告诉我们!

1 个答案:

答案 0 :(得分:1)

在大多数情况下,看起来你有正确的想法。我根据对规范的理解更改了您的getADC功能,我不确定您正在使用&#34;开始新的位分配&#34;部分。

我没有任何要测试的东西,所以我不确定这是否有效但是它可以节省几个时钟周期来删除它并清理更多的功能来读取数据。

您可以做的另一件事(如下所示)是等待将原始ADC读数转换为浮点数(浮点数学通常需要大量时间/处理能力)。因此,只需阅读一段时间,关闭数据,然后格式化并稍后输出。我不确定这是否适用于您的应用程序,但这是一个想法。

希望这有点帮助,至少你应该尝试等待转换为浮动和输出。

import time
import os
import RPi.GPIO as GPIO

PIN_CLK = 11
PIN_DO = 9
PIN_DI = 10
PIN_CS = 8


def init_gpio():
    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)

    GPIO.setup(PIN_DI, GPIO.OUT)
    GPIO.setup(PIN_DO, GPIO.IN)
    GPIO.setup(PIN_CLK, GPIO.OUT)
    GPIO.setup(PIN_CS, GPIO.OUT)


def getADC(channel):
    # A falling CS signal initiates the conversion and data transfer
    GPIO.output(PIN_CS, False)

    # After the fifth falling DCLOCK edge
    # DOUT is enabled and outputs a LOW value for one clock period
    # So after 6 clock periods, we have data
    for i in range(0, 6):
        GPIO.output(PIN_CLK, True)
        GPIO.output(PIN_CLK, False)

    # For the next 16 DCLOCK periods,
    # DOUT outputs the conversion result, most significant bit first
    ad = 0
    for i in range(0, 16):
        # Get next data bit
        ad <<= 1

        # Get to next bit by advancing clock
        GPIO.output(PIN_CLK, True)
        GPIO.output(PIN_CLK, False)

    GPIO.output(PIN_CS, True)  # reset

    return ad

if __name__ == "__main__":
    init_gpio()
    start = time.time()

    results = []
    # Run for 60 seconds
    while ((time.time() - start) < 60):
        results.append(getADC(0))

    for result in results:
        # This was slowing you down
        # You could capture data and then output it like this
        Data = float(result / 65535.0 * 3.3)
        getTime = float(time.time() - start)
        print("%.5f" % getTime + "," + "%.5f" % Data)
相关问题