google-site-verification: google3bd66dd162ef54c7.html
fc2ブログ

ラズピコでFFTアナライザーを作る(実装、完結編)

◆まえがき
Raspberry Pi Pico(ラズピコ) でFFTアナライザーを作る話のたぶん最終回。Picoのボードの電源ノイズ対策が出来たので、いよいよケースに組み込みます。

◆仕様
帯域:100, 200, 500, 1k, 2k, 5k, 10k, 20k, 50k, 100k,180kHz
感度:-80db (1Vpp=0dB)
入力インピーダンス:約120kΩ
FFTの仕様 サンプル数:256、窓関数:ハニング、ライブラリ:ArduinoFFT.h
波形表示:128x16画素(上部)、スペクトル表示:128x48画素(下部)

◆回路図(クリックで別窓に拡大)
ラズピコFFTの回路図
・Picoの基板に内蔵されているDCDCコンバーターのノイズ対策として、シリーズレギュレーター(Q1)を外付けしています。
・配線し易いように前回の記事に対しピンアサインを変更。

◆ソフト
20220808_PiPicoFftAnalyzerV062.ino (BOM付きUTF-8)
内容についてはこのカテゴリの過去記事参照。

◆実装
・外観
ラズピコFFT外観
秋月のポリカケース(117-中)に入れました。
入力端子はBNCなので各種アダプタがそのまま使えて便利です。
表示のOLEDはSH1106(1.3インチ)を使いましたが、ソフト修正でSSD1306(0.96インチ)も使えます。

・内部
内部
モジュール間はコネクタで分離出来るように作りました。

・基板を外した状態
モジュールを抜いた状態
銅箔テープは入力端子への誘導ノイズ対策です。
基板は3mmのプラビスにダイソーのアイロンビーズをナットの代わりに差し込んで固定しています。

・基板
モジュール拡大
Picoは直付けしても良かったのですが、ピンヘッダとソケットを使って取り付けました。
寝かせて取り付けられている黒い電解コンデンサはC1で、誘導ノイズを出来るだけ減らすためにGNDに接続したスズメッキ線で抑えています。

・基板を抜いた状態
Picoを抜いた状態
Picoのソケットの内側のコンデンサはC11とC12です。

・基板裏面
基板裏面
秋月のC基板(の互換品)を少し切って使いました

・使い方
モバイルバッテリーで使用
この写真のようにモバイルバッテリーで使うと便利です。

オシロの10倍のプローブもとりあえず使えます。但しアッテネーションは約1/60(約 -35dB)で周波数補正していないので高域で感度低下があります。

◆まとめ
構想から完成まで1月くらいかかってしまいましたが何とかまとめることが出来ました。FFTアナライザーは持っていれば何かの時に役に立つと思います。

◆エラーやご注意など
アンチエイリアシングフィルターが無いので、折り返しノイズがそのまま見えるので要注意。

Picoの入力ピン(GP26)に手を近付けると誘導ノイズを拾ってバックグラウンドのレベルが少し上がります。金属ケースで作れば良かったです。

ADコンバーターのフルスケールを超えた電圧を入力すると、画面表示がめちゃくちゃになります。たぶん内部的にオーバーフロー割り込みが発生し、その処理を適切に行っていないためだと思います。幸い、この現象は入力レベルを下げると復旧します。

素早くレンジボタンを操作すると反応しないことがあります。ボタン操作を受け付けるとOVERのLEDを点灯させているので、このLEDを見ながら操作すると確実です。

ラズピコでFFTアナライザーを作る (V0.6)

◆まえがき
Raspberry Pi Pico(ラズピコ)で作るFFTアナライザの話の続きです。今回は、前回の記事の状態をベースに、ソフトを修正してDMAを使ってADコンバーターを読むようにします。狙いはもちろん高速化ですが、サンプリングのタイミングジッタが減るので、周波数の高いレンジで発生していたSNの悪化が防止できるはずです。

と言うことで今回のバージョン(V0.6)では、最大周波数を50kHzから180kHzに拡大。また、SNが良くなったので感度の下限をー60dBから-80dBに拡大してみます。

・Raspberry Pi Pico
ラズピコ

◆ADC_DMA
マイコンで高速にADCを行うにはDMAを使うのが定石ですが、Arduino IDE から動かす時の判り易い事例がなかなか見つからなくて苦労しました。ということで、あちこちに書かれている情報を参考にしながらプログラムを書きました。
ポイントは、Arduino IDEのpi picoの標準版(mbed版)に入っている "hardware/adc.h"と "hardware/dma.h" を使うことでした。

◆回路図
ラズピコFFTの回路図
OLEDだけ接続すれば他の部品は無くても 5kHzレンジで動きます。雰囲気を確認したい時にお勧めです。
あちこち測っているとアナログ入力ピン(GP26)を壊しそうなので、保護用にR5を追加しました。(省略してゼロΩでもOK)。

◆ブレッドボード
ブレッドボード
僅かな部品で作ることが出来ます。なお、ガニ股ブレッドボードを使っています。

◆プログラム
20220719_PiPicoFftAnalyzerV06.txt (BOM付きUTF-8)
コンパイルに7分くらいかかります。コンパイルバッファを設定することで2回目以降の処理が早くなります。

1) OLEDはSD1306とSH1106を選択で使用可能(コメントアウトで切り替え)
2) FFTの窓関数はハニングを使用。(前回まではハミング)
3) ラズピコのDMA_ADCは最大周波数 500kHzで動くのですが、レンジの値を切りの良い数字にするため最高は 460.8kHzで使用しました。この時のレンジは180kHz.です。ちなみに200kHzレンジを作るためにはサンプリング周波数512kHzが必要です。
4) 縦軸を-80dBまで表示させるため、画面の解像度を8画素/20dBに変更。従来は10画素/20dB。
上記以外は過去記事も参照

◆画面
・100Hzレンジ
100Hz
スペクトルの下限を-80dBにしました。(文字がかぶっていて見づらいです)

・180kHzレンジ
180kHz
最高速レンジです。従来はバックグラウンドが上昇していたのですがそういう現象が無くなってSNが良くなりました。
訂正:時間軸の表示が461usとなっていますが556usの間違いです。

◆参考
FFTの窓関数をハミングからハニングに変更しました。これに伴い感度が変わるという情報があったのですが、試してみると差は僅か(ハニング:68.849、ハミング:68.889)だったので補正は行っていません。私の調べ方が悪いのかも知れません。
資料:arduinoFFTのテスト - ライブラリの誤りの件

-80dBまで表示するようにしたので残留ノイズが目立ちます。基板の電源コンバーターのノイズが原因の一つのようです。ラムさんが3端子レギュレーターに交換したテストをやられていて大幅にノイズが下がっています。
資料:ラズパイpico FFT最新 ラムさんのツイート(時代遅れのアナログ爺さん)

ローパスフィルタが入っていないのでエイリアシングの影響をもろに受けるので、その点は注意して使う必要があります。

◆まとめ
180kHzの帯域幅があればオーディオ信号やメカの振動解析などに結構使えるのではないかと思います。それに、自分専用のFFTアナライザが手に入るので、波形による高調波の発生の様子やエイリアシング現象の確認などを存分に試すことが出来ます。

画面は-80dBまで表示していますが実用になるのは-60dB以上だと思います。それでも-60dBは 1mV に相当し、周波数が違えば1Vの信号に隠れた1mVのノイズが見えます。こんな芸当はオシロには出来ません。

以上述べたように、大雑把な表示しか出来ませんが、結構使い物になる気がします。ユニバーサル基板に組んでケースに入れて計測器として仕上げるのも悪くないと思います。

◆追記
この記事のツイート(動画があります)

ラズピコでFFTアナライザを作る(V0.4)

◆まえがき
この間からやっているRaspberry Pi Pico(ラズピコ)を使ったFFTアナライザ作りですが、とりあえず今できることはやりつくしたので、内容をまとめておきます。

◆回路図
回路図

◆外観
ラズピコで作るFFTアナライザ

この写真はOLEDにSH1106(1.3inch)を使っていますが、定番のSD1306(0.96inch)もプログラムを修正すれば使えます。

◆プログラム
20220706_PiPicoFftAnalyzerV04.txt (BOM付きUTF-8) 窓関数のコメント修正(ハニング→ハミング)
主な修正点:
1) FFT画面の縦軸を-60dBまで拡大(従来は-50dB)。これに合わせ表示位置を微調整
2) 1Vppが0dBになるように感度係数調整。こちらの記事参照
3) RP2040のADCの誤差の確認と簡単な補正プログラムのテストの記事に書いた、誤差補正プログラムを導入。(GP14をGNDに接続すると無効になるので効果の比較が可能)

◆画面
FFTアナライザの画面

ADCの誤差補正機能は無いよりマシ程度の効果しかありませんでした。もっと下の方まで見えれば違いがはっきりと判るのかも知れません。

◆課題
大振幅でSNが悪い

高い周波数レンジでSNが悪くなるという問題があります。

上の写真は50kHzレンジに設定し30kHz/0dBを入力した状態ですが、ベースラインが上がっています。入力した信号自体の波形歪みが大きい可能性もありますが、サンプリング周期がばらついているのが原因では無いかと推定しています。

◆まとめ
上記のような問題がありますが、数mVの信号でもそのスペクトルが検出出来るので、持っていれば便利だと思います。

SNの問題は、ADCをDMAモードで動かせばタイミングジッタが大幅に少なくなるので改善出来るのではないかと思います。また、これをやるともっと高速なレンジが作れるはずです。ただそのためにはプログラムの変更点が多いので、後日取り組みたいと思います。
カレンダー
03 | 2024/04 | 05
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 - - - -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。
記事の内容のご利用は読者の自己責任でお願いします。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード