Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 尝试在RPI2b+上使用Cython读取ADC;通过SPI(MCP3304、MCP3204或MCP3008)?_Python_Cython_Sensors_Raspberry Pi2_Adc - Fatal编程技术网

Python 尝试在RPI2b+上使用Cython读取ADC;通过SPI(MCP3304、MCP3204或MCP3008)?

Python 尝试在RPI2b+上使用Cython读取ADC;通过SPI(MCP3304、MCP3204或MCP3008)?,python,cython,sensors,raspberry-pi2,adc,Python,Cython,Sensors,Raspberry Pi2,Adc,我想从一个(5v VDD,3.3v Vref,主通道=7,差分通道=6)连接到一个尽可能接近MCP3304最大采样率100ksps的传感器上读取差分电压值。最好是每100µs(>10 ksps)获得>1个样本 善良的用户。我对C非常陌生,所以我想给Cython一次机会,但似乎不知道如何利用基于C的速度增益 我的猜测是,我需要编写一个.pyx文件,该文件包含通过SPI访问ADC位/字节的更原始的方法,而不是我当前使用的python包(python包装的gpiozero包)1)这看起来正确吗,如果正

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

善良的用户。我对C非常陌生,所以我想给Cython一次机会,但似乎不知道如何利用基于C的速度增益

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

这里有一个小的.pyx循环,我写它是为了测试我读取电压值的速度。(读取25000个样本所需的时间)。它比直接在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
,可以稍后再进行。

可能不需要为每次迭代创建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
进行乘法不是绝对必要的,那么可以稍后再做。

难以置信!这将性能提高了10倍多一点(从33秒到2秒。谢谢!注意:如果对后代很重要的话,我还将乘法去掉了3.3,并将{.2f}增加到{.17f},以收集尽可能多的信息。谢谢!接下来,我想知道如何(通过“cdef”)声明列表“s”?我想知道这是否会让我获得更多的速度提升。@drewbles最好使用固定大小的c或numpy数组,例如
cdef uint16\u t buffer[25000]…buffer[I]=mcp.value
uint16\u t
在libc.stdint cimport uint16\u t的
之后可用。对于13位ADC
“{.4f}”。格式(v)
是明智的。mpc.value似乎是0和1之间的一个双精度,因此
cdef double buffer[25000]
难以置信!这将性能提高了10倍多一点(从~33秒到2秒。谢谢!注意:如果对后代很重要的话,我还将乘法去掉了3.3,并将{.2f}增加到了{.17f}收集尽可能多的信息。谢谢!接下来,你知道我如何(通过“cdef”)声明列表“s”吗?我想知道这是否会让我获得更多的速度提升。@drewbles最好使用固定大小的c或numpy数组,例如
cdef uint16_t buffer[25000]…buffer[I]=mcp.value
uint16\u t
在libc.stdint cimport uint16\u t
之后可用。对于13位ADC
'{.4f}'。格式(v)
是合理的。mpc.value似乎是0和1之间的双精度,因此
cdef双缓冲区[25000]