2016-11-09 66 views
1

我在使用Raspberry Pi 3 B的項目中工作,其中我通過ADC MPC3008從IR傳感器(Sharp GP2Y0A21YK0F)獲取數據,並使用PyQtgraph庫實時顯示它。如何使用ADC獲取Raspbery Pi中可能的最高採樣率?

ADC的數據表表示,在5.0V時,採樣率爲200khz。不過,我每秒只能獲得約30個樣本。

使用Raspberry Pi可以達到200khz嗎?

如果是,我應該學習或實施什麼才能獲得它?

如果不是,我該怎麼做才能獲得最高採樣率,以及如何找出最高採樣率?

這裏是我的代碼:

# -*- coding: utf-8 -*- 

import time 
import Adafruit_GPIO.SPI as SPI 
import Adafruit_MCP3008 
from collections import deque 
import serial 
import pyqtgraph as pg 
from pyqtgraph.Qt import QtCore, QtGui 
import numpy as np 

SPI_PORT = 0 
SPI_DEVICE = 0 
mcp = Adafruit_MCP3008.MCP3008(spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE)) 

win = pg.GraphicsWindow() 
win.setWindowTitle('pyqtgraph example: Scrolling Plots') 

nsamples=600 #tamanho das matrizes para os dados 
tx_aq = 0 #velocidade da aquisição 
intervalo_sp = 0.5 #intervalo para secao de poincare 

# 1) Simplest approach -- update data in the array such that plot appears to scroll 
# In these examples, the array size is fixed. 
p1 = win.addPlot() 
p1.setRange(yRange=[0,35]) 

p2 = win.addPlot() 
p2.setRange(yRange=[-100,100]) 

p3 = win.addPlot() 
p3.setRange(yRange=[-100,100]) 
p3.setRange(xRange=[-0,35]) 

#p3.plot(np.random.normal(size=100), pen=(200,200,200), symbolBrush=(255,0,0), symbolPen='w') 
''' 
p3.setDownsampling(mode='peak') 
p3.setClipToView(True) 
p3.setRange(xRange=[-100, 0]) 
p3.setLimits(xMax=0) 
''' 

data1= np.zeros((nsamples,2),float) #ARMAZENAR POSICAO 
vec_0=deque() 
vec_1=deque() 
vec_2=deque() 
ptr1 = 0 

data2= np.zeros((nsamples,2),float) #ARMAZENAR VELOCIDADE 
diff=np.zeros((2,2),float) 
diff_v=deque() 

data3= np.zeros((nsamples,2),float) 
data3_sp=np.zeros((1,2),float) 

ptr3=0 

curve1 = p1.plot(data1) 
curve2 = p2.plot(data2) 
curve3 = p3.plot(data3) 

#Coeficientes da calibração do IR 
c1=-7.246 
c2=44.17 
c3=-95.88 
c4=85.28 

tlast=time.clock() 
tlast_sp=time.clock() 
#print tlast 

def getdata(): 
    global vec_0, vec_1, vec_2, tlast 
    timenow=time.clock() 

    if timenow-tlast>=tx_aq: 
     #name=input("HUGO") 

     tlast=timenow 

     t0=float(time.clock()) 
     str_0 =mcp.read_adc(0) 
     t1=float(time.clock()) 
     str_1 =mcp.read_adc(0) 
     t2=float(time.clock()) 
     str_2 =mcp.read_adc(0) 

     d0x=(float(str_0))*(3.3/1023) 
     d0= c1*d0x**3+c2*d0x**2+c3*d0x+c4 
     vec_0=(t0, d0) 

     d1x=(float(str_1))*(3.3/1023) 
     d1= c1*d1x**3+c2*d1x**2+c3*d1x+c4 
     vec_1=(t1, d1) 

     d2x=(float(str_2))*(3.3/1023) 
     d2= c1*d2x**3+c2*d2x**2+c3*d2x+c4 
     vec_2=(t2, d2) 

     functions() 

def diferenciar(): 
    global data2 


    diff=(data1[-1,1]-data1[-3,1])/(data1[-1,0]-data1[-3,0]) 

    data2[:-1] = data2[1:] 
    data2[-1,1] = diff 
    data2[-1,0] = data1[-2,0] 


def organizar(): 
    global data1, data3 

    data1[:-1] = data1[1:] 
    vec_x1=np.array(vec_1) 
    data1[-1]=vec_x1 

def EF(): #ESPACO DE FASE 
    global data3, ptr3 

    data3[:-1] = data3[1:] 
    data3[-1,0]=data1[-1,1] 
    data3[-1,1]=data2[-1,1] 

def SP(): 
    global timenow_sp, tlast_sp 

    timenow_sp=time.clock() 

    if timenow_sp-tlast_sp>=intervalo_sp: 

     tlast_sp=timenow_sp 

     data3_sp[0,0]=data3[-2,0] 
     data3_sp[0,1]=data3[-2,1] 
     p3.plot(data3_sp, pen=None, symbol='o', symbolPen=None, symbolSize=4, symbolBrush=('r')) 
     #print data3_sp 

def plotar(): 
    global ptr1 
    curve1.setData(data1)  
    ptr1 += 1 
    curve2.setData(data2) 
    #curve2.setPos(ptr1, 0) 

    #p3.plot(data3) 

def functions(): 

    diferenciar() 
    organizar() 
    EF() 
    SP() 
    plotar() 

def update1(): 
    global data1, curve1, ptr1 

    getdata() 


# update all plots 
def update(): 
    update1() 

timer = pg.QtCore.QTimer() 
timer.timeout.connect(update) 
timer.start(50) 



## Start Qt event loop unless running in interactive mode or using pyside. 
if __name__ == '__main__': 
    import sys 
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): 
     QtGui.QApplication.instance().exec_() 

我試圖找到一種方法來解決這個問題,但到目前爲止,我已經失敗了。

你們能幫我解決嗎,或者至少指出我在哪裏可以找到關於這方面的信息?

回答

0

這種採樣率不能用像Raspberry Pi這樣的通用計算機實現,尤其是MCP3008。原因在於MCP系列的ADC在~2.7Mhz SPI時鐘的頂端出現在5V

爲了讀取200KHz費率,您需要一個專用板。

但是,你可以嘗試PCM1803A可能高達96 kHzevidently achieve sampling rate

96kHz的採樣很容易與I2S ADC achived。我有一個96kHz,24bit的 立體聲輸入,它使用一個簡單的I2S編解碼器在中斷板上工作。 更高的採樣率可能是可能的,但我使用的編解碼器 (PCM1803A)最大值爲96kHz。

這還討論here,如下,

你不會去下150ksps上丕只有SPI ADC(S)。即使只有一個頻道,也不是 。我認爲我聽說的最好的是50ksps,而 在 採樣頻率上會有一定的抖動。

2頻道*下150ksps =高達300ksps

與開銷,假設每樣品約32位,你正在尋找在原始數據

NO WAY只需Pi和ADC的 9.6mbps。

你需要一個外部微控制器/ ADC通過USB或以太網

here數據發送給PI ,

的基本問題是:

  • 樹莓Pi不適用於高速數據採集
  • MCP系列ADC的在〜2.7Mhz SPI時鐘頂出在5V
  • 與RPI

的SPI上裨接口SPI延遲是根本不能夠從在精確的時間間隔將ADC準確 讀取100000個樣品。

+0

您的回答是有啓發性的。非常感謝你! –