Python 尝试在RPI2b+上使用Cython读取ADC;通过SPI(MCP3304、MCP3204或MCP3008)?
我想从一个(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%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)这看起来正确吗,如果正
# 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]
。