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

How to speed up the sample rate of my ADS chip over SPI

对于我学校的一个化学研究项目,我们正在使用 ADS8320 数据 sheet 发现:here,以非常快的速度从电位器读取电压读数。我们正在处理 raspberry 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)

此代码的主要问题是虽然我能够接收数据,但它比我预期的要慢得多。从数据 sheet 来看,它表示它以大约 100Khz 的速度运行,但问题是目前它正在以毫秒为单位。我将如何加速这段代码?我是一个完全的编码初学者,我拥有的大部分工作代码都来自我通过谷歌搜索找到的网站。我看过关于 spidev 的东西,但我不确定如何实现它们。对此的任何帮助都会很棒,因为我是化学专业而不是 comp sci 专业,所以我对这个问题深有感触。如果您有任何疑问或者我遗漏了任何重要信息,请告诉我!

在大多数情况下,看起来您的想法是正确的。我根据对规范的理解更改了您的 getADC 函数,我不确定您对 "start of a new bit assignment" 部分做了什么。

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

您可以做的另一件事,如下所示,是等待将原始 ADC 读数转换为浮点数(浮点数通常需要很多 time/processing 功率)。因此,只需阅读一些时间,将数据存储起来,然后格式化并稍后输出。我不确定这是否适用于您的应用程序,但这是一个想法。

希望这对您有所帮助,至少您应该尝试等待转换为浮点数并输出。

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)