我想从尽可能接近MCP3304的RPi 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)
答案 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
,则可以稍后再进行。