SPIを介してADSチップのサンプルレートを高速化する方法

サムサニット

私の学校での化学研究プロジェクトでは、次の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専攻ではなく化学専攻なので、これに関するどんな助けも素晴らしいでしょう。私はこの問題の最深部にいます。ご不明な点がある場合、または重要な情報が不足している場合は、お知らせください。

Avantol13

ほとんどの場合、あなたは正しい考えを持っていたようです。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]

編集
0

コメントを追加

0

関連記事

分類Dev

マルチスレッドを使用してアプリケーションを高速化する方法

分類Dev

ネストされた行列マッチングとcolSumsのRでforループを高速化する方法

分類Dev

Rcppを使用してforループを高速化する方法は?

分類Dev

非常に大規模なGradleプロジェクトを多数のサブプロジェクトに分割して、Gradleビルドを高速化し、IntelliJGradleリフレッシュを高速化するためのガイドライン

分類Dev

ループを高速化するPythonマルチスレッドとマルチプロセッシング

分類Dev

ggplotly()を使用して光沢のあるアプリでplotlyProxy()を使用して、プロットのレンダリングを高速化する方法

分類Dev

GKEのローリングアップデートを高速化する方法

分類Dev

MS AccessのVBA:レコードセットでループ操作を高速化する方法

分類Dev

MySQLのパフォーマンス-ビルドアップ/バーンダウンチャートのクエリを高速化する方法は?

分類Dev

サムスンのラップトップでWindows8を高速化する方法は?

分類Dev

マルチプロセッシングを効率的に使用して、大量の小さなタスクを高速化する方法は?

分類Dev

Aフレームウェブサイトのモバイル/デスクトップ読み込みを高速化する方法

分類Dev

コードを最適化してセットアップを高速化する方法

分類Dev

Pythonのマルチプロセッシングモジュールは、大きな数値計算を高速化する正しい方法ですか?

分類Dev

Pythonスクリプトのforループを高速化する

分類Dev

numbaを使用してforループを高速化する

分類Dev

グループ化とフィルタリングを使用してSQLServerクエリを高速化する方法

分類Dev

このループコードを高速化する方法は?

分類Dev

Python関数の「for」ループを高速化する方法は?

分類Dev

このPyMongoクエリ/ループを高速化する方法

分類Dev

インデックス検索PYTHONを使用してネストされたforループを高速化する方法

分類Dev

jenkinsを使用してトリガーされるgitプルを高速化する方法は?

分類Dev

Numba、ベクトル化、またはマルチプロセッシングを使用して、この空気力学計算を高速化できますか?

分類Dev

単一のイベントを繰り返し監視する代わりにクエリを使用して、ソーシャルネットワークアプリの投稿のフェッチを高速化する

分類Dev

単純なパンダのfor / ifループを高速化する方法は?

分類Dev

groupbymultiindexのネストされたループを高速化する方法

分類Dev

groupbymultiindexのネストされたループを高速化する方法

分類Dev

forループでのAPI呼び出しを高速化する方法

分類Dev

大きなデータプロット(トレースプロットなど)を使用してPDFページのスクロール速度を高速化する方法

Related 関連記事

  1. 1

    マルチスレッドを使用してアプリケーションを高速化する方法

  2. 2

    ネストされた行列マッチングとcolSumsのRでforループを高速化する方法

  3. 3

    Rcppを使用してforループを高速化する方法は?

  4. 4

    非常に大規模なGradleプロジェクトを多数のサブプロジェクトに分割して、Gradleビルドを高速化し、IntelliJGradleリフレッシュを高速化するためのガイドライン

  5. 5

    ループを高速化するPythonマルチスレッドとマルチプロセッシング

  6. 6

    ggplotly()を使用して光沢のあるアプリでplotlyProxy()を使用して、プロットのレンダリングを高速化する方法

  7. 7

    GKEのローリングアップデートを高速化する方法

  8. 8

    MS AccessのVBA:レコードセットでループ操作を高速化する方法

  9. 9

    MySQLのパフォーマンス-ビルドアップ/バーンダウンチャートのクエリを高速化する方法は?

  10. 10

    サムスンのラップトップでWindows8を高速化する方法は?

  11. 11

    マルチプロセッシングを効率的に使用して、大量の小さなタスクを高速化する方法は?

  12. 12

    Aフレームウェブサイトのモバイル/デスクトップ読み込みを高速化する方法

  13. 13

    コードを最適化してセットアップを高速化する方法

  14. 14

    Pythonのマルチプロセッシングモジュールは、大きな数値計算を高速化する正しい方法ですか?

  15. 15

    Pythonスクリプトのforループを高速化する

  16. 16

    numbaを使用してforループを高速化する

  17. 17

    グループ化とフィルタリングを使用してSQLServerクエリを高速化する方法

  18. 18

    このループコードを高速化する方法は?

  19. 19

    Python関数の「for」ループを高速化する方法は?

  20. 20

    このPyMongoクエリ/ループを高速化する方法

  21. 21

    インデックス検索PYTHONを使用してネストされたforループを高速化する方法

  22. 22

    jenkinsを使用してトリガーされるgitプルを高速化する方法は?

  23. 23

    Numba、ベクトル化、またはマルチプロセッシングを使用して、この空気力学計算を高速化できますか?

  24. 24

    単一のイベントを繰り返し監視する代わりにクエリを使用して、ソーシャルネットワークアプリの投稿のフェッチを高速化する

  25. 25

    単純なパンダのfor / ifループを高速化する方法は?

  26. 26

    groupbymultiindexのネストされたループを高速化する方法

  27. 27

    groupbymultiindexのネストされたループを高速化する方法

  28. 28

    forループでのAPI呼び出しを高速化する方法

  29. 29

    大きなデータプロット(トレースプロットなど)を使用してPDFページのスクロール速度を高速化する方法

ホットタグ

アーカイブ