尝试通过 SPI(MCP3304、MCP3204 或 MCP3008)在 RPi 2 b+ 上使用 Cython 读取 ADC?

Trying to read an ADC with Cython on an RPi 2 b+ via SPI (MCP3304, MCP3204, or MCP3008)?

我想从 MCP3304 (5v VDD, 3.3v Vref, main channel = 7, diff channel = 6) connected to an RPi 2 b+ 读取尽可能接近 MCP3304 最大采样率 100ksps 的差分电压值。我最好每 100µs (> 10 ksps) 获得 > 1 个样本。

好心的用户。我是 C 的新手,所以我想试试 Cython,但似乎无法弄清楚如何利用基于 C 的速度增益。

我的猜测是我需要编写一个 .pyx 文件,其中包含比 python 包更原始的方式通过 SPI 访问 ADC 的 bits/bytes 我' m 当前使用(python-wrapped gpiozero 包)。 1) 这看起来正确吗,如果是这样,可能有人 2) 请帮助我了解如何以某种方式为 MCP3304 适当地操作 bits/bytes这会提高 Cython 的速度? 我看过 MCP3008 的 C 教程,但我无法调整此代码以适应 MCP3304 规范中规定的时序 sheet;尽管我可能能够改编特定于 Cython 的 MCP3008(或其他 ADC)教程以适应 MCP3304。

这是我编写的一个小 .pyx 循环,用于测试我读取电压值的速度。 (计算读取 25,000 个样本所需的时间)。它比 运行 快约 9%,直接进入 Python。

# Load packages
import time
from gpiozero import MCP3304


# create a class to ping PD every ms for 1 minute
def pd_ping():
    cdef char *FILENAME = "testfile.txt"
    cdef double v
    # cdef int adc_channel_pd = 7
    cdef size_t i

    # send message to user re: expected timing
    print "Runing for ", 25000 , "iterations. Fingers crossed!"

    print time.clock()

    s = []
    for i in range(25000):
        v = MCP3304(channel = 7, diff = True).value *  3.3
        # concatenate
        s.append( str(v) )

    print "donezo" , time.clock()

    # write to file
    out = '\n'.join(s)
    f = open(FILENAME, "w")
    f.write(out)

可能不需要为每次迭代创建 MCP3304 对象。也可以延迟从 float 到 string 的转换。

s = []
mcp = MCP3304(channel = 7, diff = True)
for i in range(25000):
    v = mcp.value *  3.3
    s.append(v)

out = '\n'.join('{:.2f}'.format(v) for v in s) + '\n'

如果此时乘以 3.3 不是绝对必要的,可以稍后再做。