我想从一个MCP3304 (5v VDD,3.3v Vref,主通道= 7,diff通道= 6)中读取差分电压值,它连接到一个尽可能接近max 3304最大采样率100 rate的RPi 2 b+上。最好,我会得到>1个样本每100次(> 10千兆秒)。
一个友好的用户最近我建议我尝试将我的代码移植到C上,以提高速度。。我对C非常陌生,所以我想给Cython一个机会,但我似乎不知道如何利用基于C的速度增益。
,我的猜测是,我需要编写一个.pyx文件,其中包括一种通过SPI访问ADC的位/字节的更原始的方法,而不是我目前使用的包( python包装的gpiozero包)。1)这看起来正确吗?如果是这样的话,请帮助我理解如何正确地为操作MCP3304的位/字节,从而从MCP3304中获得速度增益吗?--我已经看过MCP3008的C教程,但在调整这段代码以适应me 3304规范表中规定的时序方面遇到了困难;尽管我可能能够修改一个特定于MCP3304的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)发布于 2016-07-06 20:07:41
可能不需要为每次迭代创建一个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的乘法在这一点上并不是绝对必要的,那么它可以在以后进行。
https://stackoverflow.com/questions/38231123
复制相似问题