« PICでオシロスコープ | メイン | PICでFFT (XC16でFFTにトライ) »

2021年8月22日 (日)

PICでオシロスコープ 2

このプロジェクトを始めたのは、自作のトランシーバーにバンドスコープを追加する目的でしたが、その途中のオシロスコープが中途半端に出来上がると、せめてオーディオ信号くらいは、表示できるオシロに仕上げられないかと、開発を継続する事にしました。

前回、PIC24FV32KA302というマイコンで、オシロスコープの基本動作を確認し、LCDに描画された波形を静止する検討を行いましたが、RAMが2Kバイトしかなく、静止する事はできましたが、その頻度が少なく、画面のチラつきが目立つ状態でした。 そこで、RAMが8Kバイトある、PIC24FJ64GA002に変更して、再挑戦です。

Oscv2_schema

 

上が、今回の回路図です。PICは変更してあります。 そして、描画された波形を静止させるためのトリガレベルの調整機能を半固定抵抗で追加してあります。 このレベルはLCD画面の左側に赤色のラインで位置を示し、かつ左下に、ADCの出力レベルをそのまま数値で表示してあります。 この数値はソフトを変更する事により電圧値の表示に変更は可能です。

Osc2_1khzsin

Osc2_10khzsin_2

左上が、Seep時間 500usec/divでの1KHz、右上が100usec/divの10KHzの波形です。

このマイコンのADCは最高500KHzspsのスピードまで可能ですが、右上の時は、457KHzspsくらいでスイープしており、10KHzの波形もなんとか見れる状態になりました。 まだ、スイープタイムの可変機能が有りませんので、プログラムを書き換えて取ったデータです。

この改良型オシロは、デジタルデータを1024ポイント分取り込み、その中で、予め設定したトリガレベルを10番目から712番目までの中から探し、そのメモリー位置から255メモリー分のみLCDへ表示します。 前回のオシロの実験中にも、この機能を入れて検討を行いましたが、検索できるメモリーの範囲が先頭から69番目くらいしか出来ず、たまに、描画できる波形を検出して、LCDに表示しますが、その頻度が1秒間に数回程度でした。 今回は712番目まで検索範囲を拡大しましたので、前回より10倍の頻度で静止波形を描画できるのですが、実際は5倍くらいにしかなりませんでした。 原因を調べるも、良くわからず、不明のまま、完成度を上げていく事にします。(原因が判りました。後述します。) それでも、トリガレベルを起点にきれいに静止した波形を見る事が出来ます。 このソフトは立ち上がりのトリガレベルしか検出していませんが、ソフトをスィッチで選択できるようにし、立ち上がりも、立下りのエッジも検出可能にする事は可能です。

このテストボードには、スイープタイムや入力レベルの設定回路は、付いていませんが、ソフト的には、未使用i/oを使用して取り込み可能です。

また、前回のソフトでは、格子メモリを描画する為に、かなりの時間を必要としていましたので、以前、アンテナアナライザー開発時に得たいくつかの高速描画手法を取り込みました。 斜めのラインは従来のままですが、水平、垂直のラインに限っては、前回のソフトより4倍以上速くなっています。 その上で、波形を3回書き換える毎に格子目盛を再描画して、全体の描画速度を上げてあります。 また、LCDへの書き込みもLCDのWindow機能を最大限に生かすべく、手直ししてあります。

デバッグの為、ADCが出力したデータを数値でLCD上に表示させてみると、同じ数値が二つならんで表示されています。1024ポイントのデータを取得したつもりでしたが、実際は512しか取得していない事が判りました。 原因はADCをスキャンして、入力信号とトリガーレベルを同時に取得した為に発生したようです。 トリガーレベルの取得をやめると、データの取得数は1024になります。 トリガがかかる頻度が予想の半分くらいしかないのはこれが原因でした、

Osc3_1khzsin


そこで、タイマー3による割り込み時は、入力信号のみ取得し、トリガーレベルは、タイマー3による割り込みがかからない時間に、単独で取得する事にしました。 データの更新がほんの少し長くなりますが、LCDに表示される波形が滑らかになりました。 

左の画像は、対策後の波形で、以前の波形より滑らかになっているのが判ります。

 

トリガーレベルの検出頻度が上がって、描画回数は増えたのですが、旧波形をバックグラウンド色で再描画する事により一旦全部消して、新しい波形を再描画するプログラムでは、波形のチラツキは解消されませんでした。 そこで、以前、アンテナアナライザのアナログメーターの指針描画の手法を取り入れ、旧波形のひとつの直線を消したら、同じ列に新たな直線を即書き込むようにプログラム変更しました。 すると、うそのようにチラツキはぴたりと止まり、きれいな静止波形が描画され続けます。 

斜めの線の描画速度を高める為に、線の太さを1ピクセルに限定した高速関数をふたつ作り、従来の関数との描画時間の比較を行いました。

斜め線は開始点がx=20,y=50 終点がx=250,y=150で、左うえから右下へ斜めに走る線です。

① write_Line(m,j0,m+1,j1,0,linecolor);//開始x,y 終了x,y 線幅(0or1) 色
② write_HSLine(m,j0,m+1,j1,linecolor);//開始x,y 終了x,y 色
③ Bresenhamline(m,j0,m+1,j1,linecolor);//開始x,y 終了x,y 色

従来の線幅を変えられる①の関数の場合、描画時間は6.5msec

高速描画の②の関数では、 2.8msec

ブレゼンハムの③の関数では、2.3msec

でした。ただし、③はまだ完成度が低く、線が連続せず、破線としか描画出来ていません。

下の画像は左が①の関数、右が②の関数です。、

 

Normalspeed2khz

Highspeed2khz_2

右側の正弦波はピーク付近で、うまく描写出来ていない波形となっております。 また、チラツキはほとんど無く、差はありません。 結局、オシロスコープの波形表示としては、描画速度より、線の太さを変えられる①の方がメリットがありそうです。 ちなみに、線幅を2ピクセルとした時の先の斜め線の描画時間は8msecで2倍になることはなく、波形がきれいに見えます。

従来の①のみのソース oscillo_64GA_1.cをダウンロード

②と③を選択できるソース oscillo_64GA_hs1.cをダウンロード

Font5_6.hをダウンロード

 

斜め直線では、上記のような描画時間となりましたが、実際の正弦波を描画させた時の時間を検討してみました。

検討に使ったソース oscillo_64GA_hs2.cをダウンロード

この中で、次の6つの関数を計測しました。 いずれも2KHzの正弦波を1画面描画する条件です。

① write_Line(m,j0,m+1,j1,1,linecolor);//開始x,y 終了x,y 線幅(0or1) 色// 
② write_HSLine(m,j0,m+1,j1,linecolor);//開始x,y 終了x,y 色
③   write_HS2Line(m,j0,m+1,j1,linecolor);//開始x,y 終了x,y 色
④   Bresenhamline(m,j0,m+1,j1,linecolor);//開始x,y 終了x,y 色
⑤   write_oscline(m,j0,j1,linecolor);
⑥   write_osc2line(m,j0,j1,linecolor);

①はLCDの全画面に、かつ斜め線の角度の制限なしで線幅を指定できる関数で線幅1ピクセル時の時間は49msec、X及びY方向に各2ピクセル、計4ピクセル描画時63msec。1ピクセルの場合、他の1ピクセル描画の関数と変わりませんが、2ピクセルの場合、X,Y各方向へ2ピクセルなので、水平、垂直いずれの線幅も2ピクセル分となり、特に水平が含まれる矩形波の描画は一番きれいです。

② LCDの全画面に角度の制限なしで描画する線幅1ピクセル専用の関数です。描画時間は22msec。

③ ②の線幅2ピクセル版です。 描画時間は31msec。 2ピクセルはY方向だけで、斜め線や垂直線は2ピクセルで描画しますが、垂直線は1ピクセルの線となります。

④ ブレゼンハムの関数で、線幅1ピクセルのみです。描画時間は10msec。 ただし、破線にしかなりません。 多分、ソースの詰めがまだ甘いのでしょうが、破線を実線に改善すると、当然時間も増えますので、単純見積もりで②と同じくらいにしかならないと思われます。

⑤ オシロスコープの描画ではX方向は常に1ピクセルしか増えないので、その理屈を利用して、掛け算と割り算を無くした関数で、線幅1ピクセル専用です。 時間は12msec。 

⑥ は⑤のアルゴリズムのままで、2ピクセルの線幅にしたものです。描画時間は23msec。2ピクセルはX方向のみで、水平線は1ピクセルにしか描画されません。

Originalline

Original2line

左の画像の内、左側が①の関数による線幅1ピクセルの2KHzです。 右側は、同じく①の関数で線幅2ピクセルです。

この①の2ピクセルが一番きれいに波形を描画出来ています。

Hsline

Hs2line

 この列の左側が②の関数、右側が③の関数になります。③の関数は2ピクセルの線幅なので、斜め線はきれいですが、水平線は1ピクセル時と同じとなります。

 

 

Oscline

Osc2line

この列の左側は⑤の関数による線幅1ピクセルの波形です。1ピクセルの波形では一番きれいに見えます。

右側が⑥の線幅2ピクセルの波形です。③よりラインが滑らかですが、水平線は1ピクセルでの描画です。

 Brezenline

最後の左の1枚が④のブレゼンハムのラインで破線になっています。

結局、実用的オシロスコープの描画関数は波形のきれいさを追求したい場合、①の2ピクセルが最適。 描画の速さを追求したいときは⑤という選択がありそうです。

 

 

Osc2y_2ksq

Osc2_2ksq

気になって、⑥のX方向に2ピクセルした時の矩形波と、Y方向に2ピクセルした時の波形を確認してみました。 左がX方向、右がY方向を2ピクセルにしたものです。 クローズアップすれば、差が判りますが、遠くから見るとどっちもあまり変わりませんでした。

 

これらの検討結果は、本格的なデジタルオシロを自作するときの参考にする事にします。 

 

PICでFFT (XC16でFFTにトライ)へ続く

  

INDEXに戻る