2016-11-09 1 views
1

私は、IRQセンサー(Sharp GP2Y0A21YK0F)からADC MPC3008を介してデータを取得し、PyQtgraphライブラリーを使用してリアルタイムで表示する、Raspberry Pi 3 Bを使用するプロジェクトに取り組んでいます。ADCを使用してRaspbery Piで可能な最高のサンプリングレートを得るには?

ADCのデータシートによれば、5.0Vではサンプリングレートは200kHzです。しかし、私は毎秒約30サンプルしか得ていません。

ラズベリーパイを使用して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

この種類のサンプリングレートは、ラズベリーパイのような汎用コンピュータ、特にMCP3008では達成できません。その理由は、ADCのトップのMCPシリーズが~2.7Mhz SPIクロック5Vにあるからです。

レートを200KHzで読むには、専用のボードが必要です。

ただし、

96kHzのサンプリングを簡単にI2S ADCでachivedされ、最大96 kHzへの可能性evidently achieve sampling ratePCM1803Aを試すことができます。私は96kHz、24bit ステレオ入力は、ブレークアウトボード上の簡単なI2Sコーデックを使って動作します。 より高いサンプリングレートが可能かもしれませんが、 (PCM1803A)を使用しているコーデックは96kHzで最大になります。次のように

は、これはまた、あなただけのSPI ADC(S)とのパイの150kspsを取得するつもりはありません、

hereを議論しています。 1つのチャンネルでも ではありません。私が聞いた最高のものは50kspsであり、 は、 のサンプリング頻度にある程度のジッタがあると思います。

2チャネルは*サンプルあたり約32ビットを想定オーバーヘッドで150ksps =て300ksps

、あなたは生データ

だけPiとADCとNO WAYの 9.6mbpsを見ています。

あなたは

here

USBまたはイーサネット上の基本的な問題があるPiにデータを送信する外部マイクロコントローラ/ ADCが必要になります。

  • ラズベリーPiは高速データ収集用に設計されていません。
  • ADCの5V
  • で〜2.7MHzのSPIクロックで実行トップス
  • SPIの待ち時間のMCPシリーズは、RPI

とパイのSPIインターフェースは、単に正確 正確な間隔でADCから10万サンプルを読み取ることができるではありません。

+0

あなたの答えは啓発です。どうもありがとうございました! –

関連する問題