● 実験テーマ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へ →