![](/img/trans.png)
[英]How to read & accumulate sensor values at high frequency, without constantly writing to disk (RPi 2 b+, MCP3304, Python)
[英]Trying to read an ADC with Cython on an RPi 2 b+ via SPI (MCP3304, MCP3204, or MCP3008)?
我想从连接到RPi 2 b +的MCP3304 (5v VDD,3.3v Vref,主通道= 7, 差分通道= 6)读取差分电压值,该电压应尽可能接近MCP3304的最大采样率100ksps。 最好每100µs(> 10 ksps)获得1个以上的样本。
一位友善的用户最近建议我尝试将代码移植到C上以提高速度 。 我是C语言的新手,所以以为我可以给Cython一个机会,但是似乎无法弄清楚如何利用C语言的速度提升。
我的猜测是,我需要编写一个.pyx文件,该文件包含比我当前正在使用的python包 (python封装的gpiozero包)更广泛的通过SPI访问ADC的位/字节的方法 。 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对象。 从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
乘法不是绝对必要的,则可以稍后进行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.