尝试通过 SPI(MCP3304、MCP3204 或 MCP3008)在 RPi 2 b+ 上读取 Cython 的 A



我想从连接到RPi 2 b+的MCP3304(5v VDD,3.3v Vref,主通道= 7,差分通道= 6)读取差分电压值,尽可能接近MCP3304的最大采样率100ksps。最好是,我每 100μs (> 10 ksps) 得到 1 个样本>。

一位好心的用户最近建议我尝试将我的代码移植到 C 以提高速度。我对 C 非常陌生,所以我想我会给 Cython 一个机会,但似乎无法弄清楚如何利用基于 C 的速度增益。

我的猜测是,我需要编写一个 .pyx 文件,其中包含一种通过 SPI 访问 ADC 位/字节的更原始的方法,而不是我当前使用的 python 包(python 包装的 gpiozero 包)。1)这看起来是否正确,如果是这样,是否有人2)请帮助我了解如何以从Cython获得速度的方式为MCP3304适当地操作位/字节?我已经看过MCP3008的 C 教程,但在调整此代码以适应MCP3304规格表中规定的时间时序时遇到了麻烦;尽管我可能能够调整特定于 Cython 的 MCP3008(或其他 ADC)教程以适应MCP3304。

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

# 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 对象。从浮点数到字符串的转换也可能延迟。

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乘法不是绝对必要的,则可以稍后再做。

最新更新