我想从连接到RPi 2 b+的MCP3304(5v VDD,3.3v Vref,主通道= 7,差分通道= 6)读取差分电压值,尽可能接近MCP3304的最大采样率100ksps。最好是,我每 100μs (> 10 ksps) 得到 1 个样本>。
一位好心的用户最近建议我尝试将我的代码移植到 C 以提高速度。我对 C 非常陌生,所以我想我会给 Cython 一个机会,但似乎无法弄清楚如何利用基于 C 的速度增益。
我的猜测是,我需要编写一个 .pyx 文件,其中包含一种通过 SPI 访问 ADC 位/字节的更原始的方法,而不是我当前使用的 python 包(python 包装的 gpiozero 包)。1)这看起来是否正确,如果是这样,是否有人2)请帮助我了解如何以从Cython获得速度的方式为MCP3304适当地操作位/字节?我已经看过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)
可能不需要为每次迭代创建 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
乘法不是绝对必要的,则可以稍后再做。