● 実験テーマ70
「簡易自動周波数特性測定装置_V2の実験と製作」
(V1のモノクロ液晶を、QVGAカラー液晶に置換えました。)
※ 160213: ソフトを更新しました。(easy_fra_v2.c→ easy_fra_v2a.c)
→ 表示の右側余白部に、スイープ中の、周波数表示と、dB表示及び、
-3dBポイントの周波数(カットオフF)の表示を追加しました。
詳細は、2016.2.6からの記事を参照してください。
※ 160307: ソフトを再更新しました。(easy_fra_v2a.c→ easy_fra_v2b.c)
→ 1画面の描画終了後の、スイープ開始待ちの時に、カーソル移動による
計測(カーソル位置の、周波数と、dB値を別ロケーションに表示)
が出来るようにしました。
尚、以前のバージョンの機能はそのままで、それに追加という形にしてあります。
詳細は、2016.3.1からの記事を参照してください。
※ 160314: ソフトを再々更新しました。(easy_fra_v2b.c→ easy_fra_v2c.c)
→ リニアスケール表示から、ログスケール表示に変更しました。
Fスイ−プ中の表示はもちろん、カーソル移動も、ログスケールで移動
可能です。
これで、見慣れた片対数グラフでの表示が出来るようになりました。
詳細は、2016.3.8からの記事を参照してください。
※ 160817: ソフト(ハードも若干追加)を更新し、_V3としました。(easy_fra_v2c.c→ easy_fra_v3.c)
<修正点>
@ タクトSWを、1個追加する。→ RB1ポート使用
DDS_OSCを、NORMALモードで固定F出力にしてレベル合わせをする(これを、CALモードと呼ぶことにする。)時の、
スタートSWとして使う。
また、このモードの時は、周波数表示と、181ステップ終了時の計測表示は無しとし、dB値の表示のみとする。
A v2b(カーソル計測モード追加版)からの不具合点を改善した。
今迄妥協して使用していたが、以下を改善した。
最初の同期正パルス:1mS幅の、立下りエッジ検知後、1画面描画終了すると、カーソル計測モードになるが、
そこでは、長押しと単発検知を兼用するために、長めの遅延:100mSを、SW読込み前に挿入している。
そしてその後、エッジ検知(同期正パルス:1mS幅)を行っているため、2回目以降のエッジ検知が出来なくなる。
操作上ここで、RESET SWを押せば再び、最初の同期正パルス待ちになり再スタート出来るので、これで良しとしていた。
これを改善する方法として、メインループでのエッジセンスをやめ、CN割込みによる検知に変更した。
途中での中断の時のみ、RESET SWを使うことにした。
詳細は、2017.8.13からの記事を参照してください。
以下が、この実験の顛末記です。
■ 2015.10.6
・実験準備開始
まず、表示の高分解能化のため、モノクロ液晶(128x64dot)から、QVGAカラー液晶(320x240dot)
に変更するが、そのQVGAカラー液晶に、JA1WBYさんのHPでも紹介されている、
aitendoの、「UL024TF」を使ってみる。
今迄使ってきたものよりサイズが、1ランク下がり、2.4inchだが、安価(1480円)だし、コントローラIC
が、今迄のと同じ、ILI9325なのが嬉しい。さらに改造なしに直ぐ使えるのも良い。
これが、今迄のライブラリで動くか、自作オシロ初号機((PIC24HJ12GP202)のハードで確認してみる。
それから、周波数軸の分解能を高めるため、DDS側のソフトを変更しないといけない。
これは、最低周波数ステップ:2Hz、全181ポイントとした。
表示側は1目盛=1dotで、リニアスイープとします。
■ 2015.10.9
・aitendoから、「UL024TF」が届いた。
外観を見てみた。思ったより小さくて、かわいいサイズである。
あと、ピンヘッダが、片側2個ずつの計4個実装されているが、データバスとSD
I/F用の
8pinヘッダどうしのピッチが、インチサイズでなくミリサイズ(4mm)になっていた。
ユニバーサル基板のインチメッシュに実装する時には、小細工が必要である。
とりあえず表示実験は、基板を介さないで、完全バラックでやることにした。
■ 2015.10.10
・いざ表示チェック・プログラムを作成して、コンパイルしたが、Linkエラー発生。
エラーメッセージの概要は以下
「Link Error: Could not allocate progrem memory」
「Could not allocate section const. size= 4068」
どうもメモリ不足のようだ。
QVGAをやるために、フォントデータが必要だが、このサイズが、4608バイト(256x18の配列)
必要になる。
調べてみると、PIC24HJ12GP202の、RAM容量は、1kバイトしかない。
明らかに容量不足である。
最初に気がつくべきだった。(つまらないミスをしてしまった。)
ちなみに、QVGAを動かした実績のある、PIC24HJ64GP206(QFP
64pin)は、8kバイトの
容量がある。
なので、この、PICが実装されている、自作オシロV2のハードに変更することにした。
■ 2015.10.12
・PIC24HJ64GP206(QFP 64pin)が実装されている、自作オシロV2のハードで
「UL024TF」が動いた。
ライブラリもそのままでよい.。ピン割付定義のヘッダファイルのみ変更すればOK。
ただ、+5Vの供給は必要であった。(aitendoの当該製品のページにはこの手の情報はなかった。)
回路図もないので基板を追ってみたら、どうやらこの5Vは、バックライト用レギュレータ(AMS1117:3.3V出力)
の入力電圧のようだ。
・本番のMPUを何にするか、ここ数日、悩んでいた。
候補の条件としては以下。
@ 28pin DIPであること
A 40MIPSで、RAM= 8kバイト以上のこと
つまり、現行、PIC24Hの、RAM拡張版で、28pin DIPタイプの、MPUだが、
私が調べたところでは、この条件を満たす、PICは、PIC24Hシリーズの中には見当たらない。
(WEB検索すると、リスト上にはあるようだが流通性が非常に悪いようである)
どうしても、64pin QFPタイプになってしまう。
なので、PIC24Hシリーズから選ぶのはあきらめた。
PIC24Hと同等で、DSP機能(使わないが)が追加されている、
「dsPIC33FJ64GP802」(秋月で、480円)を使うことにした。
プログラム・メモリ:64kB、RAM:16kB、最大40MIPSなので十分である。
後で気が付いたが、このPIC、ステレオ・オーディオDAC内蔵タイプで、WAVPlayerの時
使ったことがあった。
・本番の画面(座標)デザインを考える。
周波数軸は、181ポイントなので、そのまま、181dotの長さになる。
dB軸は、240dotの内、201dot使って、+10dB, 0, -10, -20, -30,
-40 と5分割することにした。
これで、1dot当たり、0.25dBの変化を表示できるはずである。
尚、座標線と特性線(ドット)の配色は、とりあえず座標線は目立たない茶色にし、特性線は緑色
にし、あとは実際に表示させてからバランスを考えることにした。
また、AD変換値を、Y座標(dB軸のレベル)に変換する式を考えないといけない。
注意すべきは、モノクロライブラリと異なり、ドット表示の場合の原点の指定が、数学的な左下角
でなく、左上角である点である。
最終的な、変換式は、このページ末尾の、「最終ソース」の中身を参照してください。
■ 2015.10.14
・PICを、「dsPIC33FJ64GP802」に決めたので、これがV1のハードそのままで、液晶部分の配線変換
をした状態で、28pin ICソケットに、差し替えるだけで使えるか、UL024TF表示テストプログラムを作成し
確認してみた。
結果、上手く行く。
■ 2015.10.16
・V2の、ソフト作成〜 コンパイル〜 HEX書込みまでOK
・V2デバッグ開始
@ まず電源コンディションチェックより
VCC= 5.21V
AVCC= 2.94V(= Vref)
-AVCC= -3.19V
バックライトREGのVIN= 5.06V
A とりあえず、Vofs(オフセット)を、前回V1の時と同じ、1.84Vに合わせ、GAINトリマは動かさないで
前回位置のままにする。
これで、前回の実測によると、0.45V/10dBになっているはずである。
しかし今回、表示分解能を上げているので、多少GAINは上げ気味にしないと合わないと思われる。
B ここで、Vofsと、GAINを少しずつ変えながら調整する。
結局、Vofs= 1.86Vにして、-40dB(0.10V)入力にて、GAIN調を行い、-40dBラインに合わせたら
全ての、dB目盛(0,-10,-20,-30,-40)で確度が、1dot以内に収まった。
この時の、条件(コンディション)を実測してみた。(Vofs=オフセット電圧/以下測定には自作AC電圧計を使用)
@ Vref(AVCC)= 2.94V
A Vofs= 1.86V
B 0dB(1Vrms)入力時の、ログアンプ出力(4pin)=
2.03V : 後段アンプ出力(IC2A-1pin)= 2.24V
-10dB(0.316Vrms)入力時の、ログアンプ出力(4pin)=
1.79V : 後段アンプ出力(IC2A-1pin)= 1.73V
-20dB(0.100Vrms)入力時の、ログアンプ出力(4pin)=
1.55V : 後段アンプ出力(IC2A-1pin)= 1.21V
-30dB(0.0316Vrms)入力時の、ログアンプ出力(4pin)=1.31V
: 後段アンプ出力(IC2A-1pin)= 0.71V
-40dB(0.010Vrms)入力時の、ログアンプ出力(4pin)=
1.08V : 後段アンプ出力(IC2A-1pin)= 0.22V
・スイープしての動作チェック開始
※ まず、DDS側の、全スイープ時間と、V2側の、全スイープ時間が合わない。
V2側の方が遅くスイープ受信を終える。
→ これは、V1の時(モノクロ)と、今回V2(カラー)の時とで、遅延関数の作りが異なるためだ。
今回も実測するしかない。
実測した結果と、合わせこんだ定数は、このページ末尾の、最終ソースの中身を参照してください。
この遅延調整で上手く行く。
■ 2015.10.19
・ほぼ動作OKだが、1点だけ気になることがある。
それは、スタート1発目が上手く行かないのだ。
<詳細症状>
@ 電源ON 1発目のスタートの、10Hzレベルが明らかに低く表示される。
A その状態で、リセットSWを押して再スタートすると必ず、正常なレベルでスタートする。
この2つの違いは、
@は、電源ON時、DDSリセットを掛けた後、スタート待ちにしているが、その間は周波数値を、DDSに
セットしてないので不定な周波数(500kHz位になっていることが多い)になっている。
この状態でスタートSWが押されると、初めて最初の10Hzをセットするが、この時、DDS出力の変化
が数mSの間、不安定になっていると思われる。
それを、V2側でサンプルするのでレベルが正しく出ないと推定。
一方Aは、スイープ途中で、リセットSWを押すので、その時点の周波数で安定して止まっているので
再スタートしても、スムースにスタート周波数に移行しると考える。
<対策>
※ なので、スイープモードの時も、スタートSWセンス前に(メインループに入る前に)
デフォルトセットを追加した。(DDS
V2a側のソフトを修正)
→ これで上手く行く。
これは、V1でも同じことだが、モノクロだと、10HzのY軸ラインが黒で表示されるため、たとえレベルが
低く出ても見た目には判らない。
なので、DDS V2のソフトは、直さないで、そのままにしておくことにした。
(まあ、モノクロに戻すことはないと思うので・・)
■ 2015.10.20
・最後に、座標線と特性線の配色バランスを詰めた。
ポイントは、座標線に特性線(ドット)が重なった時に、特性線の視覚性が悪くならないかである。
現在は、自作オシロの場合と同じく、座標線を茶色、特性線を緑色にしている。
これだと、目立たない茶色の上に、明るい緑色が重なっても、確かに視覚性は確保されるが、
オシロと違って、特性線の動きが少ないためか、やに特性線と文字だけが目立って気になる。
・結局、このページ・トップの写真の通り、座標線=緑色、特性線=
白色に落ち着きました。
※ 最終サンプル等は、このページトップの写真を参照してください。
---<ここから、追試_1:「周波数及び、dB表示」追加の記事>-------------------------------------
■ 2016.2.6
・ネックは、0.25dB(1dot当たり)のフローティング数値を、"*.**"のアスキー文字列に変換する
関数を何とかすることだ。
幸い、後閑さんの記事「PIC32MX_多機能信号発生器」(実験テーマ48参照のこと)の中に
この関数があったので、これを、16bitMPUの、dsPIC33F用に移植すれば使えそうである。
まずは、簡単に、Step_1として、スイープ中の各周波数に於ける、dB値のみ表示する
プログラムを考えてみることにした。
■ 2016.2.7
・今日はまず、AD変換値を、Y座標に変換しているルーチンで、このY座標から、dB値(フローティング)
を知ることを考えた。
この詳細は、このページ末尾の「最終ソース」を参照してください。
・昨日考えた通り、Step_1としては、dB値のリアル表示のみにしてみる。
つまり、Fスイープの都度、その時のレベルを、dBで液晶に表示して行く。
但し、前の表示は残さないで、上書きで良い。(それでもスイープ間隔が約1秒なので目で追えます。)
よってスイープ終了後は、100kHzに於ける、dB値を表示していることになる。
■ 2016.2.8
・ソース書き上げ〜コンパイル〜 HEX書込みまでOK!!
ゼロ・ブランクの方法が適当でなく表示がおかしくなっていたが、これは直ぐに直した。
Step_1は割と順調に行った。
以下に表示例を示した。
■ 2016.2.9
・Step_2として、スイープ中の周波数表示を追加してみた。
これもうまく行く。
■ 2016.2.10
・Step_3として、-3dBポイント周波数(カットオフF)の表示を追加してみる。
スイープ中に、-3dB点を検知して行く。
検知されたら、別のロケーションに、その周波数を表示する。
スイープ終了後は、LPFであれば高域のカットオフFを示していることになる。
これもうまく行く。
・最小ステップ= 2Hzを基準に、各帯域のステップを決めている為、周波数表示の精度
は余り良いとは言えないが、直読できるので便利にはなったと思う。
---<ここから、追試_2:「カーソル移動による計測モード」追加の記事>-------------------------------------
■ 2016.3.1
・この構想も以前([実験テーマ54の中で、カーソル移動計測の基本的な実験をしている。)
から考えていたが、なかなか応用分野が見付からないでいた。
今迄の自分の資料のみで何とか、プログラムを組めそうなので、このF特自動測定装置に
応用してみることにした。
以下のような仕様にした。
<カーソル移動による計測モード仕様>
@ 1画面の描画終了後の、スイープ開始待ちの時に、カーソル移動による
計測(カーソル位置の、周波数と、dB値を別ロケーションに表示)を可能にする。
A カーソル移動SWを増設する。
右移動SW: RB2に追加
左移動SW: RB3に追加
ステップ送りと長押しによる連続送りが可能
B 1画面の描画終了後の、スイープ開始待ちの時に、まずカーソルを、最上段X座標線
の1ドット空けた上位置に、5ドット長の短いカーソルを表示する。色はシアンとする。
そしてその位置の周波数とdB値を左下余白部に表示する。色はシアンとする。
そこからカーソル移動SWを押すと、カーソルが移動し移動位置の、周波数とdB値を読取り、
随時表示して行く。
X座標線の最右端(X=181)の時に、右移動SWが押された場合は、そこでリミット表示させる。
これは、最左端(X=0)の時に、左移動SWが押された時も同様とする。
■ 2016.3.3
・ソースを何とか書き上げ、コンパイルもOK。HEXも準備出来る。
今回の追加で、Fスイープ中の、フローティングデータをバッファに格納する必要があったので
メモリ容量の心配があったが、未だ十分余裕があった。
■ 2016.3.4〜 2016.3.5
・SW2個の追加改造を行う。
結局、千石電商で購入したアルプス製の背の低いタクトSWを追加した。
これなら、アクリル板を加工しなくても、横の隙間から指で操作でき好都合。
・HEXを書込んでデバッグを開始した。
割とすんなり行った方だが、ミス(いつものボンミスだが)を列記すると以下のようになる。
@ 右移動でも左移動でも、F表示が増えて行く。
→ 通常モードのインクリメントされるだけの条件式を使っていたためで、当然こうなる。
右移動の場合はインクリメント、左移動の場合はディクリメントに修正でOKになる。
A 右移動〜 一番右端(X=181)までのデータ表示は正常だが、ここから左移動で戻し
て行くと、表示が合わなくなる。
→ これは増減条件の座標位置を、戻す場合は、順方向の、-1にしなければならない
ということで、それを修正したらOKになる。
■ 2016.3.6
・カーソル移動による計測例を以下に示しました。
---<ここから、追試_3:「ログスケール表示に変更」追加の記事>-------------------------------------
■ 2016.3.8
・1つ前々から気になっていることがある。
それは、現状のF軸をリニアスケールで描画する方法だと、肩特性の丸みが直線的になり、
またスロープのところが、10倍おきの周波数を境にして、下に湾曲したようなカーブになる点である。
つまりいつもの見慣れた、片対数グラフ(ログスケール)での描画にならないのである。
今迄、ログが絡むので何となく敷居が高そうな気がしていて、これまた着手しないでいたが、
やはりこれを何とかしたいと思い、ログスケールを追及することにした。
なんとなくだが、リニアスケールでのX座標を、ログスケールでのX座標に変換する式を見出せれば
現状の座標線そのままで、ログ表示が出来そうな気がする。
データ数も、181ポイント分で特に変更無しに描画しても問題ないように思う。
F軸を、ログスケールとするには、常用対数(10を底とする対数)の計算が必要になる。
C30コンパイラに、ログ関数が用意されているのかが問題だが調べてみたら、math.h(数学関数のヘッダファイル)
の中に、double型で対数計算結果を返す、log10(x)
という関数があった。
基本この、xを、周波数:fxと置いて計算させればよいことになる。
しかし、浮動小数点型で値を返すので、それをX座標で使っている実数(int型)にキャストする必要がある。
そして、10倍毎のX座標線間隔の、45ドットを掛ければ、ログスケールでのX座標に変換されるはずである。
つまり、ログスケールでのX座標を、X_logとすれば、次式で変換されるはずである。
X_log= (int)(((log(fx) - 1)*45);
・最初は、この考えで現状のドット描画のまま描画させてみた。以下がその例です。
どうも考えた変換式は合っていたようで、見慣れたログスケールでの表示になった。
しかし、写真ではよく判らないかもしれないが、ドット描画で行っているので、ログスケールの場合、
10倍毎の切れ目の最初の数ドットは、ドット間隔が租になるため間が空いて見えてしまう。
■ 2016.3.9〜 2016.3.10
・結局、最初だけドット描画し、その後に、現在の座標データをテンポラリに退避しておき、
次回からは、この退避した座標を始点として、カレントの座標をドットで結びライン描画
することで途切れが無くなった。
またカーソル移動の方も、ログスケールで移動するようにソフトを変更した。
これで何とか形になった。
■ 2016.3.11
・表示例をいくつか取ってみたので以下にアップします。
---<ここから、追試_4:「CAL SW追加・ソフト更新」の記事>-------------------------------------
■ 2017.8.13
・今迄の、CALモードの時の操作は次の通りで、妥協した使い方をしていた。
@ まず、DDS_OSCが、NORMALモードの時は、STEP SWは本来の周波数ステップを選択
する機能であり押しても、同期パルスは出力されないので、同期ケーブルは、外す。(DDS側コネクタのみ)
A DDS_OSCから、F出力しておいて、同期ケーブルを手で軽くゆすると、その時発生するノイズを
FRA側の、入力バッファ(SW入力でないのでPULL
UP無し)が感知し、立下りエッジとして
受取り、固定Fでのスキャン(スイープでは無いのでスキャンと表現した。)が始まる。
これで、0dBレベルを合わせていた。
・これではよくないので、空ポートの、RB1にタクトSWを、1個追加することにして、これを、CALモード時の
スタートSWとして使うことにした。
ソフトを修正して動作確認を行った。この件の動作はOKだが、以下を何とかしたい。
1画面描画後のカーソル計測モードを追加したバージョン(_v2b)からの症状であるが、最初の同期正パルス:1mS幅の、
立下りエッジ検知後、1画面描画終了すると、カーソル計測モードになるが、そこでは、長押しと単発検知を兼用
するために、長めの遅延:100mSを、SW読込み前に挿入している。
そしてその後エッジ検知(同期正パルス:1mS幅)を行っているため、2回目以降のエッジ検知が出来なくなる。
当初は、この事に気付いてはなかったが、カーソル計測モードを中断して再び同期パルス待ちにするには、RESET SWを
押せばよいという簡易的な考えでOKとしていた。
今回追加した、CAL SWでは、この計測モードを無視するし、単純なレベルセンスなので、繰り返し動作は上手く行っている。
せっかくなので、同期パルスによる繰り返し動作も何とかしようと思う。
■ 2017.8.14
・メインループでエッジ検知する方法には無理がありそうなので、CN(状態変化)割込み記述にかえてみた。
これで、同期パルスによる繰り返し動作もOKになった。
・ここで、CAL START SWによる、CAL操作の手順をまとめておく。
@ DDS_OSCの、F出力と、FRA側の、F入力を、直接RCAケーブルで接続します。
DDS_OSCの、同期パルス出力と、FRA側の、同期パルス入力を、ケーブルで接続します。
そして、モード切替ピンを、NORMAL側に設定します。
A DDS_OSCの電源をONします。
NORMALモードで立上ります。
出力周波数を、10000Hz(100k帯域/10)に設定して、CAL
START SWを押すと、スキャンが開始され
181サンプル終了するとスキャンが終了します。(再開は、もう一度、CAL
START SW ONでOK)
その間に、レベル調整VRを回し、0dBに合わせ込みます。
B ここからは、確認操作になります。(出力⇒ 入力直結なので、DDS_OSCの特性そのものになります。)
・一旦、DDS_OSCの、電源をOFFし、モード切替ピンを、SWEEP側に設定して、電源ONし、SWEEPモードで
立上げます。
・ステップSWを押して、SWEEPをスタートさせます。
ほぼ、10Hz〜 100kHzの帯域で、フラットな特性になればOKです。
(10Hzで、0.25dB、100kHz付近で、0.25〜0.5dB位、下がります。)
■ 2017.8.17
・秋月から、タクトSW:TVDT18-050CW-Tが届いたので、仮付けしていたSWと交換し再チェック。
動作OKです。
<最終回路図>
・こちらから、どうぞ→ 「簡易自動周波数特性測定装置_V2」
(カーソル計測モード追加に伴い回路図を置き直しました:160307)
「簡易自動周波数特性測定装置_V3」
(CAL START SW追加版:170817)
<最終ソース及び、ヘッダーファイル>
・こちらから、どうぞ→ easy_fra_v2.c
easy_fra_v2a.c
(周波数・dB表示追加版:160213 追加)
easy_fra_v2b.c
(さらにカーソル計測モード追加版:160306 追加)
easy_fra_v2c.c
(ログスケール表示版:160314 追加)
easy_fra_v3.c
(CAL START SW追加版:170817 追加)
colorlcd_libdsPICVH.c
colorlcd_libdsPICVH.h
ASCII12dot.h
← 実験テーマ1に戻る TOP
PAGEに戻る 実験テーマ71へ →