私の学校での化学研究プロジェクトでは、次のADS8320データシートを使用しています。ここでは、ポテンショメータからの電圧測定値を非常に高速で取り込みます。私たちはラズベリーPi3を使用して作業しており、PiのGPIOピンとSPIピンを介してデータを取り込もうとしています。私はPythonでこのコードを使用してこれを行うことができました:
import time
import os
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
start = time.time()
PIN_CLK = 11
PIN_DO = 9
PIN_DI = 10
PIN_CS = 8
GPIO.setup(PIN_DI, GPIO.OUT)
GPIO.setup(PIN_DO, GPIO.IN)
GPIO.setup(PIN_CLK, GPIO.OUT)
GPIO.setup(PIN_CS, GPIO.OUT)
def getADC(channel):
GPIO.output(PIN_CS, True) #used to clear last transmission
GPIO.output(PIN_CS, False) #Bringing cs to low
GPIO.output(PIN_CLK, False) #starting the clock
for i in [1,1,channel]: #start of a new bit assignment
if (i==1):
GPIO.output(PIN_DI, True)
else:
GPIO.output(PIN_DI,True)
GPIO.output(PIN_CLK, True)
GPIO.output(PIN_CLK, False)
ad = 0
for i in range (18):
GPIO.output(PIN_CLK, True)
GPIO>output(PIN_CLK, False)
ad <<= 1
if (GPIO.input(PIN_DO)):
ad |= 0x1
GPIO.output(PIN_CS, True) #reset
return ad
if __name__ == "__main__":
while True:
bitReading = getADC(0)
Data = float(bitReading/65535.0*3.3)
getTime = float(time.time() - start)
print ("%.5f" % getTime + "," + "%.5f" % Data)
time.sleep(0)
このコードの主な問題は、データを取り込むことはできますが、予想よりもはるかに遅いということです。データシートからは約100Khzで動作すると書かれていますが、問題は現在ミリ秒単位で取得していることです。このコードをどのように高速化しますか?私はコーディングの完全な初心者であり、私が持っている作業コードのほとんどは、グーグルで見つけたサイトから取得されています。spidevについては見たことがありますが、実装方法がわかりません。私はcompsci専攻ではなく化学専攻なので、これに関するどんな助けも素晴らしいでしょう。私はこの問題の最深部にいます。ご不明な点がある場合、または重要な情報が不足している場合は、お知らせください。
ほとんどの場合、あなたは正しい考えを持っていたようです。getADC
スペックの理解に基づいて機能を変更しましたが、「新しいビット割り当ての開始」セクションで何をしているのかわかりませんでした。
テストするものがないので、これが機能するかどうかはわかりませんが、それを削除し、データを読み取るための関数をさらにクリーンアップすることで、数クロックサイクルを節約できます。
以下に示すもう1つの方法は、生のADC読み取り値をfloatに変換するのを待つことです(float計算には、通常、多くの時間/処理能力が必要です)。したがって、しばらく読んでデータを保存し、後でフォーマットして出力するだけです。それがあなたのアプリケーションでうまくいくかどうかはわかりませんが、それはアイデアです。
うまくいけば、これが少し役立つことを願っています。少なくとも、floatに変換して出力するのを待つ必要があります。
import time
import os
import RPi.GPIO as GPIO
PIN_CLK = 11
PIN_DO = 9
PIN_DI = 10
PIN_CS = 8
def init_gpio():
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(PIN_DI, GPIO.OUT)
GPIO.setup(PIN_DO, GPIO.IN)
GPIO.setup(PIN_CLK, GPIO.OUT)
GPIO.setup(PIN_CS, GPIO.OUT)
def getADC(channel):
# A falling CS signal initiates the conversion and data transfer
GPIO.output(PIN_CS, False)
# After the fifth falling DCLOCK edge
# DOUT is enabled and outputs a LOW value for one clock period
# So after 6 clock periods, we have data
for i in range(0, 6):
GPIO.output(PIN_CLK, True)
GPIO.output(PIN_CLK, False)
# For the next 16 DCLOCK periods,
# DOUT outputs the conversion result, most significant bit first
ad = 0
for i in range(0, 16):
# Get next data bit
ad <<= 1
# Get to next bit by advancing clock
GPIO.output(PIN_CLK, True)
GPIO.output(PIN_CLK, False)
GPIO.output(PIN_CS, True) # reset
return ad
if __name__ == "__main__":
init_gpio()
start = time.time()
results = []
# Run for 60 seconds
while ((time.time() - start) < 60):
results.append(getADC(0))
for result in results:
# This was slowing you down
# You could capture data and then output it like this
Data = float(result / 65535.0 * 3.3)
getTime = float(time.time() - start)
print("%.5f" % getTime + "," + "%.5f" % Data)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加