前回までの実験は、NanoVNAをPCのアダプタとして使用して、USB経由でデータを取得していました。NanoVNAはスタンドアロンで動作させるため液晶ディスプレイを付けられる設計にしてあります。液晶表示と測定値のプロット、校正処理とマーカーまで作ってみましたのでポイントのみ紹介します。
NanoVNAの液晶画面は基板の裏に張り付ける形で実装します。コントローラはILI9431で、LPC-Link2のSDRで使ったものと同じです。LPC-Link2 SDRでは、ピンヘッダ付きのモジュールを使用していましたが、同じコントローラで液晶ピンヘッダの無いものが販売されています。接続はフレキシブル基板となっていて、ピンヘッダ付きのモジュールは、これを基板に実装したものです。
この液晶モジュールは先に入手してあったのですが、動作させてみるのは今回が初めてです。基板裏に用意したランドに、フレキシブル基板を直接ハンダ付けします。液晶モジュールの裏側には両面テープが用意されていますので基板に張り付けることができます。試作では仮に固定しておきます。
LPC-Link2 SDRのコードから液晶制御の部分を持ってきて、STM32のペリフェラル用に書き換えていきます。当初はまったく動作せずしばらく悩みました。問題は2点、一つ目は基板にミスがありRESETが未配線でした。とりあえずVddに接続してOK。もう一点はSTMのSPIペリフェラルのデータレジスタへのアクセス幅がバイトでなければならないことでした。SPIの転送ビット数をバイト8ビットに設定していたとしても、データレジスタにワードで書込みをしてしまうと余計なバイトがFIFOに積まれてしまい、うまくデータ転送ができていませんでした。ペリフェラルの動作はMCUの種類によって差があり、NXPとSTMの違いが原因でした。これが判明、修正することでようやくラスタが出せるようになりました。
描画ができるようになったところで、さっそく測定した結果で描画してみます。スキャンしながら縦軸を振幅の対数で描いて行きます。この時点での描画は、周波数をスキャンしながら幅1ピクセル縦長に左から画面を埋めて行きます。このときグリッドも同時に描画します。メモリが足りないのでフレームバッファを使わずに描画できるよう工夫が必要です。LPFをDUTにしてみるとこんなグラフが描けました。
反射と通過を交互に測定しながら二つのトレースを描いてみました。LPFの特性が見えています。ついでにスミスチャートのグリッドも描いてみました。これの描画は円の式x^2+y^2=r^2を使って、ピクセル毎に円弧上にあるどうかを判断して描いています。こうすると円弧だけではなく、円の内外が判断しやすいのです。だんだんとVNAっぽくなってきます。
スミスチャートの描画に際して、グラフ表示の方法を大幅に変更しました。メモリを節約するためもあって、最初はスキャンと同時に左から右に向かってワイプするように全更新していました。こうすると普通のグラフは自然に描けるのですが、スミスチャートのようなグラフをうまく同時に描画できません。スミスチャートを後から描き足すようにしてみたのですが、表示されていない期間が生じるためイマイチです。動画だとこんな感じでした。
しばらく検討と試行錯誤のうえ、スキャンが完了した後、一気に全体を再描画することにしました。その際、画面全体を再描画すると要する時間が長くなるため、画面をタイル状に32x32ピクセルのセルに分割し、更新の必要なセルのみ再描画するようにしました。描画戦略としては画面にドットを描いていくのではなく、ピクセル位置ごとにグリッドやトレースなど何を描画するか判断する関数を作って1セル分のバッファを埋め、まとめてSPIで送り込む感じです。マーカと文字もセルに書き込むようにしています。周波数のスキャンに1.2秒、描画に0.6秒程度(描画量にも依ります)で、およそ2秒弱の更新サイクルで動作できるようになりました。
これでうまくLOGMAGとスミスチャートを同時に表示できるようになりました。この段階で実験的に校正を実装しています。
苦労したのは校正のエラータームを保存しておくためにメモリサイズが不足したことです。101ポイントの周波数、5個のエラータームを複素数=2個の浮動小数で保存する必要があり、4kByte強を消費します。今回使用したMCU STM32F072C8T6は、SRAMが16kByteしかありません。当初は溢れていたのですが、USBのバッファやスタックの量を減らすなど微妙な調整した結果なんとか入れることができました。さらに校正結果は、フラッシュに保存し後で使えるようにしています。SRAMと違ってフラッシュの容量は余裕があるので5組保存できるようにしてみました。
下の写真は先端を開放した同軸ケーブルをつないだ状態です。全反射ですが同軸ケーブルの長さに相当する遅れ時間分の位相が回るので、ぐるっと円を描きます。本来なら外周の円弧に沿うはずですが、なぜか下にずれてしまっています。これの原因究明にかなり時間を要しました(信号源の駆動能力が影響していました)。それから些細なことですが回転方向が反対というミスもしてます。スキャンする周波数範囲を下に書いたのと、マーカ描画を検討するために試験的に左上にマーカのシンボルを描いてみています。
良い感じになってきたので、マーカがトレース上に乗るように実装を加えて、各トレースの測定値を表示するようにしてみました。スミスチャートでは、容量やインダクタンスでの表示にしています。
校正の実際ですが、自作の校正キットをアダプタを挟んで接続してみると、未校正の状態だとこんな感じで観測されます。これはオープンを接続した状態です。少し振幅が小さめで位相が回っていることがわかります。位相回転があるのは、アダプタ分の長さと、ブリッジ回路の付近の長さがゼロではないことが理由です。
ショートだとこうなります。振幅は概ね同様ですが、位相が反対側に変化しています。反射波の符号が逆なのでこうなります。
50Ωのターミネータを接続、すなわちロードだとこうなります。無反射なので、スミスチャートではほぼ中央の原点に来ます。プロットが点となりほとんど見えなくなりますが、マーカがあると視認しやすいです。一方、対数のグラフで見ると周波数の上昇である程度信号が見えてきています。まったくの無反射ではなく、ターミネータとブリッジの不完全性に相当する信号が見えています。
校正の実行は、現時点ではUSB経由でコマンドを送ることにより行います。screenコマンドでシリアルに接続するとプロンプトが表示されます。校正キットを順に一つづつ接続し、それぞれについて
cal open
cal short
cal load
と入力します。そして最後に
cal done
とします。そうするとそれぞれの観測値からエラータームを計算し、校正が適用した状態となります。
この状態で校正キットのオープンをつなぐと、スミスチャートは右側の1点となります。振幅は0dBの直線に正規化されます。これが校正された状態です。 p
同様にショートでは、左側の1点に来ます。
ロードは原点となります。スミスチャートではあまり違いが判りませんが、Edが差し引かれることにより、振幅が下がって、ノイズだけが残っている状態となっています。60dB前後のダイナミックレンジが確保できているようです。
スルーについても同様に校正できます。追加で行うのは2つの操作です。
cal thru
cal isoln
すべての校正を行った状態で、DUTとしてLPFを接続すると以下のような画面となります。最大4トレース出せるようにしてあるのですが、写真では
- ポート1の反射のLOGMAG
- ポート1の反射のスミスチャート
- ポート2への伝送のLOGMAG
- ポート2への伝送の位相
を表示しています。トレースはUSB経由の設定で任意に表示を変更可能です。他にSWRやリニアの振幅を描けます。あとディレイも追加必要ですね。
上部にはマーカの各トレースの値を表示しています。5x7と小さいフォントなのでさすがに字が読みにくいです。工夫が必要かもしれません。
さらにレバースイッチでマーカを動かせるようにしてみました。動画です。
メニューもちょっと試しています。現在は必要な操作はUSB経由で行っていますが、最終的には全ての操作を単独で行えるようにする必要があります。
画面のテイストはネットワークアナライザの名機、HP8753っぽくしているつもりです。操作体系も似たものにしたいのですが、レバー一つしか無いのでさすがに厳しいところです。できるだけお手軽に使えるものにしたいと思っています。作業はかなり先行していたのですが、ようやく報告が追いつきました(信号処理の中身などかなりはしょってますが)。引き続き鋭意実装していきます。
リファレンス