2016-07-06 4 views
0

RPi 2 b+에 가능한 한 가깝게 100ksps의 MCP3304의 최대 샘플 속도에 연결된 MCP3304 (5V VDD, 3.3V Vref, 주 채널 = 7, diff 채널 = 6)의 차동 전압 값을 읽고 싶습니다. 100μs (> 10 ksps) 당> 1 샘플을 얻는 것이 바람직합니다.SPI (MCP3304, MCP3204 또는 MCP3008)를 통해 RPi 2 b +에서 Cython으로 ADC를 읽으려고합니까?

A 종류의 사용자 recently suggested I try porting my code to C for some speed gains. 저는 C에 매우 익숙합니다. 그래서 Cython에 한 발을 내주 겠지만 C 기반의 속도 향상 방법을 알아낼 수는 없습니다.

내 생각은합니다 (gpiozero 파이썬이 싼 내가 현재을 사용하고 파이썬 패키지보다 SPI를 통해 ADC의 비트/바이트를 접근하는 더 - 원시 수단을 포함하는 .pyx 파일을 작성해야한다는 것입니다 패키지). 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) 

답변

2

각 반복마다 MCP3304 개체를 만들 필요는 없습니다. 또한 float에서 string 으로의 변환이 지연 될 수 있습니다. 3.3에 의한 곱셈은 그 시점에서 꼭 필요하지 않은 경우

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' 

, 그것은 나중에 할 수 있습니다.

+0

놀라운! 이 성능이 10 배 이상 향상되었습니다 (~ 33 초에서 2 초까지) 감사합니다. – drewbles

+0

참고 : 후손에게 중요하면 3.3 배를 제거하고 {: .2f}를 {: .17f} 가능한 한 많은 정보를 수집합니다. 감사합니다! – drewbles

+0

후속 조치, 어떻게 "cdef"를 통해 "s"을 선언 할 수 있는지 생각해보십시오. 그게 속도 향상을 가져올 수 있는지 궁금합니다. – drewbles