尝试通过SPI(MCP3304,MCP3204或MCP3008)在RPi 2 b +上读取带有Cython的ADC?

时间:2016-07-06 18:23:43

标签: python cython sensor raspberry-pi2 adc

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

善意的用户recently suggested I try porting my code to C for some speed gains。我对C很陌生,所以我认为我会给Cython一个机会,但似乎无法弄清楚如何利用基于C的速度增益。

我的猜测是我需要编写一个.pyx文件,其中包含一个更原始的方法,通过SPI访问ADC的位/字节,而不是我正在使用的python包(python - 包装gpiozero包)。 1)这看起来是否正确,如果有的话,可能有人 2)请帮助我理解如何适当地为MCP3304操作位/字节,以便从Cython中获得速度增益我已经看过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)

1 个答案:

答案 0 :(得分:2)

可能不需要为每次迭代创建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,则可以稍后再进行。