以前アナログデバイセズのADF4351を使用したPLLシンセサイザ基板を作成しました。このチップはPLLにVCOとディバイダが内蔵されており、40MHzから4.4GHzまで任意の周波数まで発生することができます。これを活用してみたく、PICを使ってUSBでコントロールすることのできる基板を作成しました。MLFまたはQFNという足が表に出ていないチップを果たして自作で使うことができるのかのチャレンジでしたが、実際には予想していたよりも案外すんなりとハンダ付けできることがわかったことが収穫でした。
せっかく作成した基板ですが、なんと残念なことにPICのパターンに致命的な間違いがありました。苦しいアクロバティックな配線をしてなんとか試作までは動作OKだったのですが、使おうと思っていたPICのピンを使うことができず、そこで頓挫していました。
今回(といっても3ヶ月ほど前)新たに基板を作成し直しました。PICまわりの間違いを修正し、RF信号の出力の回路も前回の試作結果を受けてアップデートしました。先日ようやく基板に部品を実装し、何事も無くあっさりと動作させることができました。ADF4351は気軽に使える部品となりました。
さて、本来この基板で何をしたかったかというと、PICで周波数を制御すると同時に、PICのADCでデータを収集し、周波数特性を計測することができるのではないかということです。
今回作ったADF4351基板です。PICはSSOP20ピンのPIC18F14K50です。右上に拡張ヘッダを付けてあり、PICに接続してあります。PICには各種ペリフェラルが載っており、USBやシリアル、SPI、I2Cの他に10bitのADCが載っていてます。これらを拡張ヘッダから利用できるようにしています。今回はUSBとADCを使いましたが、他にも例えばLCDを付けて周波数を表示したり、スイッチを追加してスタンドアロンで動作させるようにすることも可能だと思います。
それから大事な基準クロックですが、今回は12MHzのTCXOにしました。前回は48MHzの普通のXOでしたが、安定性と精度が物足りなかったので今回はTCXOにしてみました。12MHzなのはUSBとの兼ね合いです。サイズは3225と小さめです。
さて、ADCに入れる信号ですが、ログアンプを使います。今回は秋月で販売されていたDIPのAD8307を基板に乗せて、黄銅の帯金をシールドケースにしてあったものを使います。これは十数年前にアナログのスペアナを試作していた時に作ったものです。本来12Vで使うようレギュレータを入れてあるのですが、今回はUSBのみで電源をADF4351ボードからの5Vで動かしたいので内部に直接配線しました。それから、ログ電圧出力をADCに接続します。GNDと合わせて合計3本です。
USB経由でPLLを設定するのは前回と同じPythonスクリプトで行います。PICはUSB HIDデバイスとなるようファームを書いてあります。Pythonでレジスタ値を生成してHID経由で送りSPIにブリッジします。今回はそれに加えて、ADCを読み取って数値をHID経由で取得できるようにファームを追記しました。今回使うのは1チャネルのみですが、今後に備えて複数のADCチャネルを読み取れるようにしておきます。
ADCのVrefはVdd 3.3Vを使うので、lsb当たり3.3V/2^10すなわち、3.22mV/lsbとなります。一方AD8307のほうは、dBに対してリニアな電圧出力で、下記のグラフのように概ね入力の振幅dBに対して直線になっています。仕様上dB当たり25mVの傾きです。これらを掛け合わせると10dB当たりADC値はおよそ77.6となるはずです。
制御はホストからUSB経由でPythonスクリプトで行います。スクリプトで周波数をスイープさせ、各ポイントでADCを読み取りプロットします。グラフの描画はこれもpythonでは定番のmatplotlibを使います。
とりあえず50MHzから1GHzまでスイープさせてみました(下のグラフの青線)。横軸は周波数で1e9単位すなわちGHzです。縦軸はADCの数値そのままです。グラフがぎざぎざなのは、整合が取れていないためのようです。
カーブを矯正するため、6dB, 20dB, 40dBのATTを挿入して、並べてプロットしてみました。それぞれ上から水色=6dB、緑=20dB、赤=40dBです。20dBを入れるとおおむねなだらかになります。右下がりなのは、AD8307が仕様上、上限500MHzなことと、BNCコネクタの使用など実装方法に制限されているためと思われます。右下がりとはいうものの、なだらかに下がっていますので1GHzくらいまでは十分に使えそうです。下はATTを入れた様子です。
さて、何かDUT(Device Under Test:被測定物)となるものはないかなと、まずは適当にLPFを作ってみました。先日のダイレクトサンプリング基板の一部にチップ部品を乗せて5次π型LPFのフィルタにします。両端にはコネクタを付けておきます。意図したことではあるのですが、この基板はフィルタやアンプ、コネクタなど適当に組み合わせて使えますので意外と便利です。
定数と特性はシミュレーションで以下のような感じです。手持ちの部品でそれっぽいものを作っただけです。カットオフはおよそ280MHzです。
これを先ほどの経路に挟み込む形で挿入します。
さっそく特性を取ってみたのが以下です。
緑が基準のスルーで、青がLPFを通したカーブです。ギザギザで残念な感じですが、一応LPFの形は見えています。縦軸はdB比例の値のはずなので、スルー校正は引き算で良いはずです。引いた結果は下記のようになります。
縦軸をdB単位に変換するのを失念しました。単に7.75で割るだけでdBになります。
残念なギザギザですが、おそらくログアンプの入力部分の整合が良くない、または電源や電圧出力のケーブルから回り込みが発生しているようです。何も対策せずに単に接続しただけなので、当然ながらこのままではいろいろ問題があるようです。
他のDUTということで、FMラジオ用のBPFを試作してみたものを計ってみました。
40MHz-360MHzでスイープして、これもグラフにしてみました。
70MHz-100MHzがパスバンドの想定なので、一応それらしく取れています。
もう一つ、空芯コイルとエアバリを使ったキャビティ型のフィルタがあったので、これもコネクタを付けて計ってみました。インピーダンスが50Ωではなさそうなので、きちんとした結果にはならないとは思いますが、あくまで実験と言うことで。
エアバリを調整した結果、双峰型の特性になりました。2mにちょうど良い感じになりました。130MHz〜160MHzでスイープさせています。パスバンドが2.5MHz程度とそれなりに狭帯域のフィルタのようです。どうやってもフラットトップになりませんでしたが、インピーダンスが合ってないせいでしょう。
以上、なんとなく一応周波数特性は見ることができました。ただ、このままでは実用は厳しそうです。あくまでPLLとログアンプを単に組み合わせた実験ということで。
この実験の限界ですが、ADF4351はハーモニクスがそれなりに出ています。これは分周出力なので仕方のないことなのですが、このまま選択度の全く無いログアンプで受けているので、ハーモニクスの影響がそのまま出てしまいます。信号生成側で純度を高めるか、受信側で選択度を持たせるかをしないと測定器にはなりません。残念ながらスカラーネットワークアナライザとは言えそうにありません。
それから、周波数の下限が厳しいです。35MHz以下が測定できないと、適用範囲が意外と狭いです。まったく本末転倒なことですが、DUTを探すのに苦労します。繰り返しますが、あくまで試みということでご覧ください。
ちなみに今回もいつものようにpythonスクリプトを使いましたが、コマンドラインではなくipython notebookという環境を使用しました。
ipythonというのは、“interactive python"すなわち対話的pythonのことです。コマンドラインの対話型環境なのですが、これに付属するnotebookというツールを使用すると、ブラウザの画面から対話的にpythonスクリプトを利用できるようになります。しかもinline設定をすると、グラフ描画も含めてブラウザ画面内で行えるようになります。pythonには、numpy/scipy/matplotlibという3大ツールがあり、数値データ処理にはとても優れた環境です。これらに合わせて、自作の小さなスクリプトを追加するだけで、ハードウェアの制御も含めて一体的に行うことが可能になるわけです。
しかもnotebookという名前にある通り、ノートを取るように、コマンドとその実行結果やグラフ、それについてのメモ書きを一体的に保存することができます。パラメータを変えたりして測定を繰り返すような場合には、次々と追記され、後から編集することも可能ですので大変便利です。
実物のリアルな計測器を使う場合、読み取ってメモしたり、メモリカードや画面ハードコピーでデータを取り出して来て、エディタで貼付けといった手間が必要だと思いますが、もしpythonで制御できて、ipython notebookから使えばそんな手間はまったく必要無くなります。
以前VNAのインターフェースとしてGUIを作ってみたものの、正直イマイチでした。結果をなんでファイルに保存したり、コピペしたりしなければいけないのか。そんなものを含め、すべてipython notebookで使えるようにすると、これは素晴らしい環境になるのではないかと考えています。しばらくこの路線を追求しようと考えています。
ipythonのセットアップや使い方については、また別途改めて取り上げたいと思います。
今回はAD8307を使いましたが、実は本命は位相が取れるAD8302なのです。AD8307は以前の製作物を引っ張りだしてきただけですが、AD8302は抵抗ブリッジと組み合わせた基板を今回一緒に作りました。近いうちに実験してみたいと思います。
リファレンス
-
AD8307 https://www.analog.com/jp/rfif-components/detectors/ad8307/products/product.html
-
ADF4351 https://www.analog.com/jp/rfif-components/pll-synthesizersvcos/adf4351/products/product.html
-
PIC18F14K50 microchip https://www.microchip.com/wwwproducts/Devices.aspx?product=PIC18F14K50
-
ipython https://ipython.org/
-
(有)電子研のシンセサイザボード「ぴるる」ADF4351ボードを設計している際にその存在を知りました。この道の日本での先達です。https://web.kyoto-inet.or.jp/people/kadoh/denshiken/