NanoVNA のハード・ソフトをいじってみました

おじさん工房 TOP へ      NanoVNA-V2 へ      NanoVNACapture へ      掲示板へ


■ページ履歴


■ソフト



2020/05/19

数年前(2016?)、ttrftec の高橋さんに NanoVNA を見せてもらいました。 確かその時に「高調波を使って周波数拡張できるかも」という話をし、「でも単純に高調波を使うと mixer での歪と区別できないのでは」という結論になった覚えがあります(今の NanoVNA では RF に3倍波、LO に5倍波 という風に使う高調波次数を変えてこの問題を解決していて凄い!)。 とにかく小さくてすごく多機能なことに驚いたのですが、他のことで忙しくそのままになっていました。

去年(2019/5月頃)、Aliexpress で中国製の NanoVNA が売り出されたのを知り、早速、黒バージョン(シールドあり)を購入、その後白バージョン(シールドなし)を追加購入しました。 この時もちょっと忙しく、電源が入ることを確認しただけでそのまま放置していました。

今回、最近の新型コロナウイルス騒ぎで宴会もなくなり、自宅待機で暇にまかせて NanoVNA をいじってみました。


ちょっといじった感じでは黒バージョンと白バージョンにそれほど差があるように見えなかったのですが、とりあえず性能が悪いと言われている白バージョンを変更してあとで比較してみよう、と企てました。


白バージョンをいじっていて気付いたのは以下の点です。
  1. 高調波次数が切り替わる周波数(300MHz や 900MHz など)で大きな変動がある。
  2. S11(TERM時)や S21(TERM時)で RBW を狭くしていってもノイズが素直に減っていかない。
  3. S11(TERM時)や S21(TERM時)で CF=900MHz,SPAN=50kHz とするとうねるような変動がある。
  4. 高周波(1GHz以上)で信号レベルが小さく方向性が取れない。
  5. IF 周波数が 5kHz というのはどうやって決めたのか?
  6. RBW を狭くしたとき SWEEP に時間がかかるようになるが、いつ測定が終わるかわからない。
  7. メニューのどの階層にいるのかがわかりにくい。
  8. メニューボタンの BACK が他と同じでわかりにくい。

上のソフトのところからダウンロードできる 20200518 バージョンのファームウェア、ソースファイルには、これら問題点のソフト上での修正が入っています。 また後述するハードの修正をすればすべての問題が修正済みになります。 まずはファームウェアだけでも変更してみてください。



■ ソフトウェア変更

上記問題点の中には明らかにソフトだと言えるものもありますが、ノイズや波形変動はハードかソフトか判断がつきません。
外から見ているだけではよくわからないので、いろいろ実験するためにトップメニュー内に DEBUG を追加し、その中でいろいろ設定を変更できるようにしました。

どうして DEBUG メニュー内の各設定項目を追加したのか(追加する必要性にかられたのか)を説明すると NanoVNA のハード・ソフトの説明にもなりますので、まずは DEBUG メニューに入っている項目を順番に説明します。

DEBUG メニューには以下の項目が入っています。

・FETCH SIG
・WINDOW FN
・DSP DELAY
・OFFSET FREQ
・CH0(TX) OUTPUT


・FETCH SIG

NanoVNA は mixer(SA612AD) を S11用(U7)、S21用(U8)、REF用(U6)の 3 つ持っています。
それぞれの mixer で周波数変換して IF(オーディオ帯域)に落とし、AUDIO CODEC(U9 TLV320AIC3204)で AD 変換します。
これらを IF_S11、IF_S21、IF_REF とすると、

S11(CH0) = IF_S11 / IF_REF
S21(CH1) = IF_S21 / IF_REF

という計算をしています。

FETCH SIG メニューではこの計算をする前の生データを見ることができるようになっています。
AMPLI を選択すると、

CH0 = IF_S11
CH1 = IF_S21


REF を選択すると、

CH0 = IF_REF
CH1 = IF_REF


が CH0、CH1 として画面に表示されます。
ハードウェアの特性評価に使います。


・WINDOW FN  default=HANN

NanoVNA は IF周波数=5kHz で、AUDIO CODEC(U9 TLV320AIC3204)は FS=48kHz なので、5kHz の歪成分のうち 10kHz、15kHz、20kHz は ADC 帯域内になります(ナイキスト周波数 24kHz 以上の歪成分は TLV320AIC3204 のデジタルフィルターで除去されます)。
dsp.c での信号処理では -5kHz の周波数変換をしたのち、48 サンプル分のデータを加算してゼロ周波数成分を検出します。 これは矩形窓になります。
-5kHz の周波数変換によって、負の周波数成分や、10kHz、15kHz、20kHz の歪成分も周波数変換され、ゼロをセンターに 5kHz おきに正負の周波数にスプリアスがある状態になります。 48 サンプル分の加算をすると 1kHz おきに null 点がある sinc 関数の周波数特性になりますので IF周波数が正確に 5kHz ならスプリアスはすべて null 点に一致し除去されるので問題ありません。 しかし、GHz オーダーで正確に 5kHz の周波数差をつくれるのか?、PLL の揺れはないのか? といった疑問があり、周波数がずれた場合にスプリアスを軽減するため HANN 窓関数を適用できるようにしました。 他からのかぶり(電源ノイズなど)にも有効です。
なお、HANN窓 の ENBW(等価雑音帯域幅) は 1.5 なので矩形窓(ENBW=1)より S/N は 1.8dB 悪くなります(白色雑音の場合)。
RBW の設定を狭くした場合、加算回数を RBW=300Hz時 48x3回、RBW=100Hz時 48x10回 ... と多くしていて、これで S/N が上がりますので HANN窓での 1.8dB の悪化分は気にすることはないでしょう。

ちなみに HANN窓 のテーブルだけで 9600 バイトも使っています。 FLASH が足りなくなったら三角窓が良いかもしれません。 ENBW=1.333 ですし、簡単に計算できるのでテーブルがいらなくなります。

(2020/05/20追記) mixer での歪ではなく 3 倍高調波ミキシングの方がレベル大きいかもしれません。 たとえば 100MHz では PLL は RF=100MHz、LO=100.005MHz を出力しています。 これが 3 倍高調波の 300MHz では RF=300MHz(100MHz*3)、LO=300.015MHz(100.005MHz*3) と 15kHz の差になりレベルは基本波の -10dB と大きいです。


・DSP DELAY

PLL(U5 SI5351A) の設定を変更したとき、PLL が安定するまで一定期間 AUDIO CODEC(U9 TLV320AIC3204)からきた信号を使わないで読み飛ばすようになっています。 48 サンプル(1ms)を 1 単位として何回読み飛ばすのかを細かく設定しているのですが、それが本当に充分なのか調べるためにこの項目を追加しました。 DELAY を増やしたとき波形のおかしなところが変化するかどうかで DELAY が足りているかどうかわかります。
また、ぎりぎり NG のときは、窓関数を HANN窓にすることで、時間軸上で最初に近い方のデータが使われなくなり、改善することもあります。
この機能を使って、最適な DELAY 値を探しプログラム修正しました。


・OFFSET FREQ  default=12kHz

先に説明した IF 周波数と同じになります。 PLL に周波数設定する際、RF 信号の周波数に +offset した周波数を LO 信号に設定しています。 300MHz 以上では高調波を使いますので、例えば RF=500MHz の時、LO=500MHz+offset となりますが、実際に PLL に設定する周波数は RF=500MHz/3、LO=(500MHz+offset)/5 となります。
先に説明したように IF=5kHz にしている意味がわからないため、いろいろ設定できるようにしました。 12kHz だと高調波がナイキスト周波数内に入らないし、周波数変換しても負の周波数成分はナイキスト周波数になるので良いと思うのですが...


・CH0(TX) OUTPUT

NanoVNA 本体の CH0 から出力される RF 信号を OFF にする設定です。
CH0 を終端して方向性を見る時や CH1 への漏れを見る時、見えているのが RF 信号由来なのか他からのかぶりなのか分からなくなった時や、雑音レベルを見る時に OFF にします。
実際に OFF する信号は PLL の ch0 出力で、これは SWR bridge につながって CH0(TX) 出力になると同時に REF用 mixer(U6) にもつながっています。 OFF にすると REF mixer への信号も OFF になるので、FETCH SIG で生データ( AMPLI または REF )を選びます。
ハードウェアの特性評価に使います。


・その他ソフトウェア変更点

・Progress bar 追加 :  sweep に合わせて 10 測定点ごとに伸びていきます。
・メニューに色付け  :  サブメニューがあるか、CANCEL か、など種類によって色を変えました。
・トップメニュー   :  トップメニューがわかりやすくなるよう項目名にドットを付けました。
・BACK ボタンの間隔 :  BACK のとき 1 pixel ボタン間隔を拡げました。
・FONT 変更     :  読みやすくなるようフォント変更(完全に個人の好みの問題ですね)
・TLV320AIC3204 MCLK を 26MHzにする: 周波数スイープのたびに SI5351 再設定するのを止め、常に 26MHz を出すようにしました。




■ ハードウェア変更

・SWR bridge 変更点

SWR_bridge
なるべく SA612 入力信号レベルを上げるためインピーダンスを上げました。
R20、R21 を大きくすると SA612 の入力容量(3pF) とでできる LPF のカットオフ周波数が低くなりますが、実際に SA612 に入いる信号レベルはどの周波数でも大きくなります。

R11 と R12 の接続点に 10mm ぐらいの UEW 線の片側を付けて、UEW 線のもう片側を R11 や R12 の近くに動かしてみると方向性が良くなるところが見つかるかもしれません。 残念ながら私の白 NanoVNA では、良くなるところがありませんでしたのでつけていませんが。


・RX PORT 変更点

RX port
なるべく広帯域に入力インピーダンスが 50Ω に近くなるよう -6dB π型 ATT にしました。
SA612 IN-B は IN-A と同じインピーダンスになるよう 27Ωでバランスを取りました。 変更したときはこの方が雑音特性が良かったのですが、そのあと下記の電源デカップリング強化したので単純に GND に落とすだけでも良いかもしれません。
 


・mixer(SA612)の電源 変更点

SA612_power1
+5V には SW REG のノイズが盛大にのっています。
RC フィルターの抵抗は SA612 の電源電圧が落ちすぎないギリギリの値にしました。 実測 4.63V です。

SA612_power2
デカップリングに 100pF しか入っていないので 0.1 をパラ付けします。
高周波を扱う回路ではデカップリングに 0.1 と 100pF をパラ付けするのは普通ですが、100pF だけというのは初めてです。 これを回路図で発見したときは目を疑いました。
 


・その他

他にも、GND を強化したり、シールド板を入れたりしてみたり、フェライト板をいれたりしてみたのですが、いまいち効果がはっきりしませんでした。



気になる 白NanoVNA改造 vs. 黒NanoVNAオリジナル 評価結果はこちら





2020/05/24 UI などいろいろ変更

白NanoVNA改造 vs. 黒NanoVNAオリジナル の追加測定で発覚した 900MHz で不連続になる件は、考えても原因が思い当たりません。
頭を抱えているより、気分転換に自分なりに使いやすくなるよういろいろソフトを変更しました。 バージョン 20200524 になります。

  1. RECALL や、SAVE するときにメモリーの内容が分からないので不便 → メニューに LIST( メモリー設定一覧表示 )追加
  2. SWEEP の START/STOP や CENTER/SPAN などがメモリーされない → メモリーする項目に追加
  3. SMITH CHART のクリップ範囲がグラフ範囲より狭い        → グラフ範囲一杯にした
  4. SAVE が CAL の中にあり階層が深い                → トップ階層に移動
  5. RBW 設定値が表示されない                    → 周波数表示の左側に表示
  6. RECALL したメモリー番号の表示が欲しい             → バッテリー表示の下に表示

いずれも細かな変更ですが、使いやすくなったと自画自賛しています。

マイコン(STM32F072CBT6) FLASH 128kB のうち 32kB はデータセーブのために使われていますのでプログラムには 96kB しか使えません。 現在 text=93996、data=536、計94532(92.3kB) なので残 3.7kB ぐらいです。 そろそろ機能追加もできなくなりそうです。

妄想していたスペアナモード追加や SDR 追加は難しそうです。




2020/06/05 残っている問題点

進展がないので、現時点で残っている問題点をまとめておきます。 このページを見た誰かが解決してくれると嬉しいです(他力本願モード)。

  1. 高調波次数の切り替わり点(300MHz,900MHz,1500MHz,2100MHz)で波形が不連続になる。
    たとえば CF=1500MHz, SPAN=1MHz にし、OPEN CAL のみ実行したあと、SMA ケーブルをつなぐとこの不連続が見れます。

     → U7(SA612) の IN-A IN-B の特性差? 入力容量差による周波数特性差?
       このエラーを検出してキャンセルしたいが、検出する方法が分からない。

  2. USB 接続すると 5V の電圧が変化し、SA612 の検波感度が変わる。

     → USB 接続して 5V が供給されると IP5303 がスルーモードになるため。
       3.3V から電圧ダブラーで昇圧するしかなさそう。

  3. CF=300MHz, SPAN=500MHz にすると 450MHz に高調波次数切り替えのような不連続が現れる。

     → 本来は 300MHz で AudioGain を切り替えるはずが 450MHz で切り替わっている。
       バグの根本原因は分からないが、とりあえず config.harmonic_freq_threshold=300000001 にすると回避できる。
       ついでに起動時に SW を押していると config を default に戻すようにした。

  4. CENTER/SPAN のときは周波数軸のスケール線をセンター振り分けにしたい。

     → 未検討

  5. nanovna_saver で screenshot を取るとクラッシュし、NanoVNA 側はハングする。 頻度大。

     → 未検討。 通信エラー時の対応が悪いのかな。 このままでは怖くて使えない。

  6. PAUSE SWEEP 数分してから戻ると信号レベルが低くなる(ノイズのみ?)。 戻るには電源OFF/ON しかない。

     → 未検討

  7. 使っているとハングすることがあった(いままで3回ぐらい)。

     → 未検討

  8. gcc で -Os にすると動作しない。

     → 未検討 -O2 に比べ 6kB ぐらい小さくなるのですが...





2020/08/23 NanoVNA に NanoVNA-V2 で改造した UI を移植しました。(ファームウェアはこちら)

NanoVNA-V2 (以下 V2)をいろいろ改造してきましたが、本家 NanoVNA を使うと UI の差(使い勝手が悪い)にいらいらすることがあり、V2 の UI を移植しました。

NanoVNA は V2 に比べ 500MHz 以下なら遜色ない性能ですし、10MHz 以下ではダイナミックレンジが優れています。
V2 より小さいし、バッテリーの持ちも良いです。

残念ながら V2 より CPU パワー(特に FPU がないこと)やメモリー容量が足りないため、トレースの描画アップデートは滑らかではなくしかもスイープが遅くなり、基準インピーダンス変更やインピーダンスマッチングなど実現できない機能がありますが、できるだけ近づけてみました。


・変更点は以下のとおりです。
  1. トレースの描画アップデートをスイープの途中に常に行う。
      →副作用としてスイープが遅くなったので、CONFIG/SETTING/DRAW CONTINUOUS で ON/OFF できるようにしました。

  2. メニュー構造の変更(V2 に合わせた)
      ・DISPLAY/TRACE の下に TRACE0..4, PORT, FORMAT, SCALE を移動
      ・CONFIG/SETTING の下に TOUCH CAL, TOUCH TEST, DRAW CONTINUOUS, LCD GAMMA, TRACE COLOR, QUICK FUNC, CONFIG SAVE を入れた。
      ・TOP に PAUSE SWEEP 追加。

  3. 新規メニュー項目追加
      ・FUNCTION 機能
      ・トレース色変更
      ・LCD GAMMA 変更

  4. CENTER/SPAN のときスケール線をセンター振り分けにした。
  5. 画面左側を広げて RBW 表示と FUNCTION 機能用領域にした。
  6. 表示を CH0、CH1 から PORT1(P1)、PORT2(P2)に変更
  7. E-DELAY 入力に長さ( mm )を追加。
  8. DELAY 入力に μs を追加。
  9. 数字キーパッド時、数字入力欄の右下に現設定値を表示。
  10. 数字キーパッド時、周りをタッチするとキャンセルにした。


・バグ修正
  1. 300MHz以上で PAUSE 後、2分ぐらいしてから PAUSE 解除すると P1(CH0) が無信号状態になる。
  2. MARKER 個数を3個から2個にすると複数 MARKER モードにならない。
  3. メニューを LEVER で操作時 FOCUS ボタン(緑色)がでないことがある。
  4. 数字入力ルーチンのバグ(16.3MHz が 16.299999MHz になる)のを修正。
  5. 周波数表示ルーチンのバグ(25.003MHz が 25.002999MHz になる)のを修正。


トレースの描画アップデートをスイープの途中に常に行うのは、スイープが若干遅くなりましたがやはり便利です。
特に RBW が小さいときはスイープ状態が目で見えるのは精神衛生上よいです(いままでもプログレスバー表示はありましたが...)。

あと、FUNCTION 機能は必需品ですね、これがないとメニューを辿るのが苦痛です。

ずいぶん変更したのでバグを仕込んでいないか心配です。



2022/11/27 capture のバグ修正しました。(ファームウェアはこちら)

NanoVNA や NanoVNA_V2 のスクリーンキャプチャーするソフト NanoVNAcapture をつくりました。
これを使って NanoVNA のスクリーンキャプチャーのテストをしていたのですが、時々画面途中までデータ転送したあとハングするという症状がでました。

数日、コードを追ってやっと原因がわかりました。
ili9341.c の中の ili9341_read_memory という関数で VRAM の内容を読むのですが、SPI の DMA を開始する際、送信、受信の順になっています。 送信で 8bit 送ると 1バイト受信するので、それまでに受信 DMA が起動していないといけませんが、送信開始のあと割り込みが入ると受信開始が遅れ、そのあとの受信 DMA 完了待ちでハングしているようです。
対策は簡単で、受信 DMA 開始してから送信 DMA を開始するようにするだけです。

これで基本的にキャプチャーは OK になったのですが、使っていると不満も多いのです。

これらは、キャプチャーの実行が sweep の終わったときだけになっているためです。
とりあえず上記のときはキャプチャー実行できるように修正しました。

  

他にもキャプチャーできないときはありますが(たとえば TOUCH CAL や TOUCH TEST など)、特に必要と思わなかったのでそのままにしています。


2022/12/09 トレース描画を上書きに変更対応ファームウェアはこちら

NanoVNAcapture にカラーマップ機能を追加しました。
トレースの重なったところが前のデータと OR(一種の加色混合?)にしていて汚いので上書きに変更しました。
詳細はこちら




inserted by FC2 system