« LCD SPC-S95417-AAAをPICでドライブ | メイン | PICでオシロスコープ 2 »

2021年8月14日 (土)

PICでオシロスコープ

「デジタルオシロ 自作 TFT LCD」

自作のSSBトランシーバーにバンドスコープを追加する為には、デジタルオシロスコープで、タイムドメインのデータを収集し、このデータをFFTにて、周波数ドメインに変換して、TFT LCD上にそのスペクトラムを表示させる必要がありますが、前回、このTFT LCDをPICマイコンで制御できるところまでできました。 今回は、アナログ信号をADコンバーターで取り込み、デジタルデータとしてメモリーに記憶させる部分の検討を行います。

バンドスコープの構成上は信号波形をLCD上にグラフィックで表示する必要はないのですが、デジタルデータが目標通り取り込めたかどうかを確認する為に、取り込んだデータをLCD上に表示する事で目標達成とします。

使用するPICマイコンはLCDの駆動に使ったPIC24FV32KA302をそのまま使います。 このマイコンのADコンバーター(以下ADC)は12bit対応ですが、最高サンプリング周波数は100KHzとなっています。 バンドスコープの対象周波数範囲は最高で20KHzであり、100KHzのサンプリング周波数でも十分なのですが、内蔵するRAM容量が2Kバイトしかなく、本格的なデータ収集器にはなり得ません。 その為、基本機能を実現する為のテストバージョンとして、デジタルオシロスコープを作る事にします。

Oscv2_schema_2

 

上が、今回のデジタルオシロテストバージョンの回路図です。 PICの品番はPIC24FV32KA302でRAM2Kバイト品です。

デジタルオシロを安いPICとLCDでいかに実現するかは、実際にやりながら、カットアンドトライしていく事にしました。

AD変換は12bit対応のままで、最高速度で変換させるように設定すると、約75nsecで変換完了する事が判りました。ただし、この場合、AD入力に接続される側の出力インピーダンスを極力小さくして、リニアリティの確保をしなければなりません。実際は低出力インピーダンスのOPアンプで駆動必要ですが、実験では、最高レベル付近でのリニアリティが悪化する事を承知で、発振器の出力を直結です。 発振器の出力インピーダンスは、多分120Ωくらいですので、大きく悪化する事は無いと予想しています。

私は、実際のデジタルオシロがどのような構成で動作しているのか知らないので、表面上の動きから推測した以下の工程で、実現する事にしました。

① ADCはタイマー3によるトリガーで、サンプリングを開始するようにし、タイマー3の周期を変えて、サンプリング周期を設定する事にします。

② タイマー3の割り込みで得られたADCのデジタルデータは、320ワードのメモリーへ記録させます。 サンプリング周期が100KHzくらいですから、C言語で書かれたソフトでも十分間に合います。 メモリー一杯データを記録したら、一旦データの取り込みを中止します。

③ メモリーに記録されたデータをLCD上にグラフとして表示させます。 表示は各メモリーごとのデータを線で結ぶ直線補間方式としました。

④ メモリーのデータを表示し終えたら、また、①に戻りこれを繰り返します。

⑤ ただし、このままでは、先に描画したグラフデータが残っていますので、2回目のグラフデータを書く前に1回目のグラフデータを消す必要があります。 消す方法は、③の書き込み処理をバックグラウンド色で再描画する事により消します。 前のデータを消す方法として、グラフ描画エリア全体を、バックグラウンド色で塗りつぶす方法もありますが、これは結構時間がかかり、グラフィックのチラつきの元になりますので、採用しません。

⑥ オシロスコープですから、LCD画面上に格子のメモリが必要になりますが、今回使用するローコストのLCDグラフィックボードのメモリーは1面分しか有りませんので、この格子パターンも③や⑤の描画で消えてしまいます。従い、⑤のグラフ消し完了後、毎回格子模様を再描画する事にします。

⑦ このオシロスコープは、トリガーなしで、繰り返し描画をおこないますが、そのままでは、前回のグラフデータと同期がとれなく、見た目では、波形が左右に流れる現象が発生します。 この為、繰り返し描画を停止させて、その瞬間の波形のみを表示し続けられるスィッチを追加してあります。

⑧ 通常のオシロはいわゆる「シンクロスコープ」であり、例え繰り返し描画でも、そのトリガーレベルを調整する事により、波形が流れずに、静止して見える機能がありますが、このトリガポイントを検出するには、メモリーが不足し、完全に静止した画面が得られません。 記憶させるメモリーの量を増やし、全く同じ位相のデータを、メモリーの中から拾い出し、それを、続けて描画していけば、波形は静止するはずですが、2Kのメモリーでは実現できませんでした。 これは、PIC24FJ64GA002のRAM 8Kバイト品を入手してから、再検討する事にします。

これらの試行錯誤の結果から得られたLCDの画面は以下です。 ①②⑤⑥③⑦①②・・・の順序で繰り返し動作し、⑧は処理していません。

Iosctest1khz

Iosctest10khz_2

左上が1KHzの正弦波、右上が10KHzの正弦波です。 直線補間していますので、16KHzくらいまでは、それらしく描画できますが、実用的には10KHzくらいまでです。 この時の水平方向のsweep時間をグラフの格子メモリの端から端まで2msecとすると、ADCサンプリング周波数は約133KHzで、PICのスペックをオーバーしていますが、なんとか表示出来ています。

実験に使ったソースは以下です。

oscillo_0.cをダウンロード

Font5_6.hをダウンロード

下の写真は蛇の目基板に組んだテストバージョンのオシロで矩形波を表示させているところです。

Iosctestallview

RAMが2Kしかなかったので、8KのPICに変更します。 この中で、直線や斜め線を描画する、アルゴリズムも改善し、LCDのイニシャライズも修正したプログラムを「PICでオシロスコープ2」 で使っています。

PICでオシロスコープ 2  へ続く。

 

INDEXに戻る