🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

9248閲覧

サンプリング周波数を上げるには?(Raspberry Pi)

masotail

総合スコア6

Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/11/13 04:11

Raspberry Pi3B+を用いて以下のプログラムにより電圧測定をしているのですがサンプリング周波数を25000Hz以上にすることができません。(sampling_rate = )の部分がサンプリング周波数を表していますが数字を例えば100000としても25000Hzになってしまいます。(SPI_SPEED = )の値を変えても駄目でした。回路は以下の写真のように組んでいてSPI通信をしています。使用しているADコンバータはmcp3208です。最低でも100kHz,できれば1MHzで計測したいと思っていますがどうすればよいでしょうか?

Python

1import wiringpi as pi 2import time 3import mcp_adc3208 4import numpy as np 5import openpyxl as excel 6 7SPI_CE = 0 8SPI_SPEED = 5000000 9READ_CH = 0 10VREF = 5.0 11Vi = [] 12i = 0 13adc = mcp_adc3208.mcp3208( SPI_CE, SPI_SPEED, VREF ) 14 15def do_sampling(i): 16 y[i] = time.perf_counter() - time_start 17 18 19sampling_num = 100000 20sampling_rate = 25000 21sampling_interval = 1 / sampling_rate 22 23x = np.arange(0, sampling_num / sampling_rate, sampling_interval) 24y = np.zeros(sampling_num) 25 26count=0 27time_start = time.perf_counter() 28time_next = time_start 29while count < sampling_num : 30 do_sampling(count) 31 time_next += sampling_interval 32 value = adc.get_value( READ_CH ) 33 volt = adc.get_volt( value ) 34 Vi.append(volt) 35 while (time.perf_counter() < time_next): # 次の時間まで待つ。 36 pass 37 count = count + 1 38 39wb=excel.Workbook() 40ws=wb.active 41 42for i in range(1,sampling_num): 43 44 s=y[i] 45 T=Vi[i-1] 46 47 ws.cell(row=i,column=1,value=s) 48 ws.cell(row=i,column=2,value=T) 49 50wb.save("denatsu.xlsx")

モジュールmcp_adc3208は以下の通りです。

Python

1import wiringpi as pi 2import struct 3 4class mcp3208: 5 def __init__( self, ss, speed, vref ): 6 self.ss = ss 7 self.speed = speed 8 self.vref = vref 9 10 pi.wiringPiSPISetup( self.ss, self.speed ) 11 12 def get_value( self, ch ): 13 cmd = 0xc0 | ( ch << 3 ) 14 buffer = cmd << 24 15 buffer = buffer.to_bytes( 4, byteorder='big' ) 16 pi.wiringPiSPIDataRW( self.ss, buffer ) 17 value = ( buffer[0] << 24 | buffer[1] << 16 | buffer[2] << 8 | buffer[2] ) >> 13 18 return value 19 20 def get_volt( self, value ): 21 return value * self.vref / float( 4095 )

イメージ説明
イメージ説明
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ADコンバータ mcp3208 のデータシートは読みましたか?

mcp3208 の最大サンプリングレートは、100k sps です。

そんなADコンバータなので、「最低でも100kHz」というのは不可能です。
A/D変換を1秒間に10万回繰り返すことは可能だとしても、そのデータを取り出している時間がありません。

まずは、使おうとしている素子の仕様をデータシートなどで確認しましょう。

投稿2019/11/13 05:33

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

その電圧計測のモジュールは、SPI通信を用いて電圧値をラズパイに転送しています
SPIという通信方式がどういうもんかを調べて見ればわかりますが、一種のシリアル通信だと思ってもらえばいいです。

さて、1回の計測ごとに、シリアル通信を介してデータをラズパイに転送しますが、そのシリアル通信のスピードには限界があり、どこまでも上げるというわけには行きません。
今回の場合は、25000Hzというのがそのスピードの限界ということなんでしょう。

これ以上の変換速度が必要であるなら、SPIではなく、他のデータ転送方式のモジュールを使う必要があるということですね

投稿2019/11/13 04:26

y_waiwai

総合スコア88040

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問