2015年11月 8日 (日)

アンテナアナライザーの製作(ケース入れ)

<カテゴリ:アンテナアナライザー>

手作り、バラック状態のアンテナアナライザーがなんとか完成しました。 しかし、アンテナアナライザーは基本的に屋外で使うものであり、これを実際に使用する為には、持ち運び可能なケース入りでなければなりません。 

Aa59_jw_case JW-CADで組み立て図を書いて、これを基に部品図面をお越し、雨の降る中、屋外で作業する事2日間。

Aa59_casein

アルミ板を切断したり穴を明ける加工は、ほぼ設計図面通り出来るのですが、曲げ加工は折り曲げ器がありませんので、当て木とハンマーで仕上げる事になります。 結局、曲げ部分は直角にならず、エッジも凸凹となってしまいました。  

左の写真は、塗装前の状態で、LCDやタクトSWの位置確認を行ったものですが、JW-CADによる実寸組み立て図が功をはくし、センターずれは有りません。 ただし、LCDのコネクター部分に何も配置できない為、デザイン的に、やや間延びした縦長の箱になってしまいました。

裏板も作ったのですが、電池ケースを入れるスペースにSDカードのコネクターが張出し、電池ケースを収納できませんでした。

他にも、不具合があるようですので、再度分解して、SDカードのピンヘッダーの位置を含め対策する事にしました。

Aa50blk

フロントパネル面のレタリングをデザインし、これをJW-CAD上で作成します。 このとき、邪魔にならない所に寸法を記入しておきます。 作成した原稿は、白地に黒の文字ですが、 ケースの塗装は黒色を予定していますので、 これをスクリーンショットでJPGに変換し、インターネット上のフリーソフトで白黒反転を行い、一度、windows標準付属の「ペイント」で読み込みます。 JW-CADの文字の種類が少なく、また色も限りがありますので、ペイント上で、文字のフォントの入れ替えや、必要に応じて、文字色や線の幅、色を修正します。 このJPGをエクセルに貼り付けます。 これを実際の寸法になるよう、印刷の縮小比を決めて、光沢フォト紙に印刷し、両面テープでケースの面に貼り付けます。 この縮小比を決めるとき、JW-CADで記入しておいた寸法が大いに役立ちます。

このようにして出来上がったアンテナアナライザーが左の写真です。 アンテナを接続するMコネクターの右側に飛び出ているビスは、アナライザーを接続する為に、取り外したトランシーバーへ接続されている同軸ケーブルのGND側とアナライザーを仮接続するGND端子です。 アナライザーが宙に浮いてしまうと、実際にトランシーバーから送信した時の浮遊容量の条件が異なってしまい、正しいSWRの計測が出来なくなりますので、これを防止する為、アナライザーのGNDを同軸ケーブルのGNDへ接続する為に使います。 CAA-500のように、アンテナ端子が2個ある場合、送信機に接続される同軸は、使用していないコネクターに仮接続しておけば良いのですが、このアナライザーのアンテナ端子は1個しか有りませんので、GNDだけは接続できるように端子を設けたものです。 実使用状態では、ここにミノムシクリップの付いたリード線を接続し、常にアナライザのGNDはトランシーバーのGNDと接続されているようにします。

実際にアンテナに接続して測定する場合の電源は電池で行い、決して外部DC電源を使わないようにします。アナライザーで調整したSWR最少周波数と送信機内臓のSWRメーターが示すSWR最少周波数が一致しない原因は、決まってこのトランシーバーのGNDと外部DC電源の性です。

間延びした縦長のケースはレタリングでごまかしました。 光沢フォトシートをパネル全面に貼ったことで、凸凹したアルミケースの、ぼろ隠しが出来ました。

LCD表面に保護シートが付いていますので、多少ボケていますが、ベランダや移動に持って行けるアナライザーが完成しました。

さっそく、ベランダに持ち込み、私のプリセットMTUの調整に使ってみました。 アナログメーターの応答が、やはり遅く、SWR最少にMTUを調整するとき、手持ちのCAA-500より慎重にやらないと、最少ポイントを通り過ぎてしまいます。 この辺は最初から判っていた事でしたが、気になります。 Microchipの有償版コンパイラーの説明によると、プロバージョンを使うと、少なくとも4倍以上の速さにオプチマイズできるとの事ですが、10万円以上もしますので、諦めました。

アンテナアナライザは屋外でつかいますので、直射日光の下に置かれる事が多々発生します。 この為、最初黒色でしたパネル面は現在赤色に変色してしまいました。

SWRカーブを取り、それをセーブ出来る機能は、例えば、このブログに結果を張り付ける為には便利です。 

Aa50_7mhz

左のSWRカーブはベランダで、MTUを再調整したとき、データをセーブして置いたものを、後から、再表示させデジカメで撮ったものです。

PCに保存するほどではないけど、データが残るというのはいいですね。

ところで、左のグラフはアンテナチューナー直下で測定したSWR特性で最少SWR1.05くらいですが、これを22m長の8D2Vを経由したトランシーバー出力部分で再度測定すると、100KHzくらいの幅でSWR1.0となってしまいます。 これは同軸ケーブルによるロスによるSWR差として出てくるものですが、得られたカーブは不自然です。いくら同軸で減衰があるにせよ、100KHzの範囲でSWR1.0はなかろうと、ソフトの中での四捨五入や切り捨て処理に問題がないかチェックしました。 色々検討した結果、ソフトではなく、ハードの問題である事が判りました。 

通常、OP-AMPには入力オフセットという誤差が有り、入力がゼロボルトでもこのオフセットの分だけ、出力がゼロになりません。 逆に、入力がオフセット電圧以下なら、出力は常にゼロとなります。 このICのバラツキによる入力オフセットの為、SWR用のDC電圧が少し出ているのに、出力がゼロになっていたものです。 これを補正する為、OP-AMPの入力にオフセット補正用のDC電圧を加え、これをキャンセルさせますが、今回使ったOP-AMPのオフセットの方向が+/-入力に対して逆になっていました。 

Offsetadj

今まで、マイナス入力端子にDCオフセットを印加していましたが、プラス入力端子にDCオフセットをかけて, 50Ωダミー抵抗の時、OP-AMPの出力をADが読んだ値を0010くらいにしておき、ソフトでADの出力が0010のとき、SWR1.0と定義する事により、自然なカーブが得られるようになりました。

また、目安にしかならないSWRのデジタル表示ですが、せっかく内部で小数点以下第2位まで計算していますので、これを表示させる事にしました。 実際のアンテナを接続した場合、SWR1.00の表示は出なくなりましたが、こちらの方が本物のような気がします。

LWの発振回路に使われているコンデンサC33は間違っていました。103Kではなく正しくは104Kでした。これを修正した結果、LWのカバー範囲は95KHzから530KHzとなりました。

最終的な各周波数の波形は以下のようになりました。

58mhz

7mhz

500khz

100khz

電池マークのバッテリーインジケーターは4.5Vでフル表示し、3Vまで電池の電圧に比例した残量が緑色で表示され、3Vから2.7Vまでは黄色で表示、2.7V以下では赤色になるよう設定しました。 この電源回路に使われている昇圧型のDC/DCは1.8Vでも動作しますが、さすがに2.7Vより下がると、電池の内部インピーダンスが急激に増大し、たちまち動作不能になります。 また、過去の記述には有りませんでしたが、CENTERキーを長押しするとオートパワーOFF機能を1分から20分まで1分刻みで設定できるようにしました。 もちろん、この機能をOFFする事もできます。

2016年8月11日

LWバンドをカバーする周波数帯域は、従来のアナライザーより便利に使える事が判りましたが、SWRグラフ表示のバンド幅が有限というのは、使い勝ってが悪い事が判りました。ここは、せめてセンター周波数の+/-30%くらいはカバーした方がいいようです。 これは、ソフトの変更のみで行えますので、スィープ時のバンド幅は 「1,2,4,6,10,20,40,60,100,200,400」のプリセット値としました。 

そして最大の欠点は、LCDで描画したアナログメーターである事が理解できました。 このアナログメーターはすでに、LCDの1ピクセルの分解能で動作していますので、これより細かい動きは出来ません。 アンテナアナライザーでSWRを計ったり、LCの共振周波数を計る場合、指針が最小値を表示する周波数を知りたい事が多々発生します。 このような時、1ピクセルの分解能では、最小値の周波数を知る事は出来ませんでした。 この感覚はメカニカル方式アナログメーターにはとても及びません。 どんなに精度の悪いメカニカルメーターでも、最小値や最大値を探すのは、簡単にできます。

Aa50_z_change

このアナライザーを製作するに当たり、SWRグラフィック表示とアナログメーター表示を兼用可能な液晶表示で、コメットやMFJのアナライザーより使いやすいアナライザーを目指してきました。 この手作り品は基板がユニバーサル基板なので、ケースサイズを小さくできませんでしたが、両面高密度基板を使えば、単3乾電池3本という電源を含めて、かなり小型のアナログ式アンテナアナライザーが出来ると考えました。 しかし、メカニカルメーターのフィーリングには勝てませんでした。  

今更、アナログメーターに戻す気はありませんので、現在は、SWRを小数点以下2桁まで、Z(インピーダンス)を小数点以下1桁まで表示した数値を見ながら、LCDによるアナログメーターの欠点をカバーしています。 直感的には判りませんが、そこそこの探索は可能です。 

LCD表示のアナログメーターは、Sメーターかタコメーターが一番合いそうです。 最近の車のスピードメーターやタコメーターはタイヤの回転数やエンジンの回転数をデジタルで検出して、そのデジタル値をベースにステッピングモーターを回して、指針を動かしているのだそうですが、これらは、今後インパネ内の表示量増大に伴い、LCDタイプが増加することでしょうね。 

 

2018年11月

マイコンのソースコードを公開しようとしましたが、どれが最終で、どのようにコンパイルしたかも忘れてしまいました。 以下のふたつのソースファイルは多分まともにコンパイルできないと思います。

AA50-LCD-SD.cをダウンロード

AA50SD_data.cをダウンロード

2022年5月

負荷オープン時の校正作業が行われなくなってしまいました。 原因を調査したところ、インピーダンス検出用のダイオードHSC285の逆方向抵抗が200Ωくらいしかなく、正常にDC電圧を得る事が出来ないのが原因でした。 このダイオードは劣化しやく、このアナライザーが完成してから、すでに6年以上経過していますので、しょうが無いという状態です。 補修用に手持ちしていた正常品に交換したら、インピーダンス表示は正常になりました。 バリキャップ電圧として14Vの電圧を一度リップルフィルターを通し、発振周波数がFM変調されるのを軽減しておりましたが、このリップルフィルターの劣化により、電圧降下が大きくなり、最大14Vくらいで有った、バリキャップ電圧が9Vくらいしか有りません。 その為、最高周波数が52MHzくらいしかなく、50MHz全帯域を測れない状態になっていました。 対策として、リップルフィルターを100Ωの抵抗に置き換えました。 結果、電圧は13.7Vくらいまで上昇し、最高周波数は64MHzくらいになりました。 リップルによるFM変調音は、リップルフィルターの時より大きいですが、我慢出来るレベルです。  また時々、AD変換データが間違う事がありました。 詳細を調べると、ADCのプログラム記述に間違いがありました。 今まで、どうしてまともに動いていたのが不思議です。 DATA処理マイコンのプログラムを修正しました。 

ダイソーの単3アルカリ電池3本では、電池の消耗が早く、トータルON時間が30分くらいになると、数分間くらいしかONしないのに、急激に電圧が下がり、インジケーターが黄色になります。 しばらく放置して再度ONすると、バッテリーインジケーターは元の緑に変わりますが、次に黄色になるまでのON時間が短くなって行きます。 そこで、この電池をリチウムポリマー電池(LiPo Batt)に変更する事にしました。 電池はアマゾンで3.7V900mAh品を999円で見つけましたので、これをゲット。 また、LiPo電池の充電ICは7~8年前に買ってあったMCP73832Tです。 

Liion_batt_2

Liion_chagar

Chargeindicator

 

左上が、単3乾電池をLiPo電池に変更して実装したところ。 真ん中は、米粒大のICを基板に実装したところ。(黄色の円の中)。 右端が充電中を表示するインジケーターです。 充電時の定電流は300mAに設定しました。 充電満了になると、LEDが消灯しますので、そこで、外部DC電源のプラグを抜く事にします。 LCD上のバッテリーインジケーターが黄色になるのが3V以下で、2.7Vで赤に変わりますので、再充電は黄色のマークが出たら行う事にします。 LiPo電池の取り扱い説明によると、推奨される使い方は、フル充電した後、終止電圧になるまで使い続け、終止電圧になったら、再度フル充電を行い、充電回数をなるべく多くしない事のようですので、充電しながらの使用は出来るだけ避けるようにする事にします。 この電池の終止電圧は、2.5Vですが、安全を見て3Vを切ったら再充電する事にしました。 (使用中でも充電できますが、その場合の充電電流は最大でも50mAしかありません)

このアナライザーにはPICKIT3を接続する為のコネクターが2個ついており、どちらがDATA用でどちらがLCD用か、毎回迷いますので、コネクタの位置にマーキングを入れました。

修正済みプログラム AA50SD_data_1100.cをダウンロード

修正済み配線図 AA50DATA220527.pdfをダウンロード

Aa50_pic_conector

ついでに変色したパネルも張り替えました。張り替え前と後を記録に残します。

Aa50old

Aa50new

INDEXに戻る

2015年10月18日 (日)

PICマイコンでSDカードのファイルを読み込む

<カテゴリー:PICマイコン

マイクロチップのMLAの中にあるデモソフトは簡易データロガーともいえるもので、何らかの手段で定期的に入手したデータをデモファイルにAPPENDしながら書き込んでいくものです。 従い、MS-DOSのDIRコマンドに相当したファイル検索や、特定のファイル名をオープンして、中身を読みだすという動作は行いません。 ただし、これらの機能の、コマンドの使い方は例で示してあります。 

今回、SDカードにセーブしたCSVファイルを検索して、LCD上にファイル名を表示させる機能、及び、表示したファイル名を指定して、そのCSVファイルを読み込み、LCD上にSWRカーブを再表示させる事にトライしました。 FILEIOのHELPドキュメントを読んだだけでは理解できず、構造体の勉強を3週間くらいやって、やっと、思ったようにソフトが動くようになりました。

Aa50_find

Aa_50_40m

ソースコードを下記しますが、そのままコピペしても動作しません。 これをデモ用として提供されているソースコードの中に埋め込んでやると期待したような動作が得られます。

MS-DOSのDIRに相当する関数は「FILEIO_Find」という関数を使います。

searchnameは16bitの文字で "*.CSV" と初期設定し、FILEIO_Findの関数を実行させるとsearchRecordの中にファイル名がひとつだけストアされます。 これをset_dir_fname()の関数に送り、そこで2次元の文字列にストアします。この動作を20回繰り返します。 ファイルの数が20以下の場合、i=20で強制的にループを抜けます。

unsigned int  find_SD_card(void) {

     DEMO_STATE demoState = DEMO_STATE_NO_MEDIA;

   FILEIO_OBJECT file;

    FILEIO_SEARCH_RECORD searchRecord;

    init_SDcard();

    unsigned char i;

   uint16_t SD_ER = 0;

      while(SD_ER == 0) {

        switch (demoState) {

            case DEMO_STATE_NO_MEDIA:

                 if (FILEIO_MediaDetect(&gSdDrive, &sdCardMediaParameters) == true) {

                    demoState = DEMO_STATE_MEDIA_DETECTED;  

                    }

                 break;

            case DEMO_STATE_MEDIA_DETECTED:

                  SD_ER=(FILEIO_DriveMount(drive_A, &gSdDrive, &sdCardMediaParameters));

                if (SD_ER ==0){

                    demoState = DEMO_STATE_DRIVE_MOUNTED;

                     } else {

                    demoState = DEMO_STATE_NO_MEDIA;

                    }

                     break;

            case DEMO_STATE_DRIVE_MOUNTED:

                if (FILEIO_Find (searchname, FILEIO_ATTRIBUTE_MASK, &searchRecord, true) == FILEIO_RESULT_SUCCESS) {

                    i=0;

                    set_dir_fname(&searchRecord,i);

                    i++;

                    } //サーチの最初はこのようにtrueを指定して検索

                    while (i < 20) {

                        if (FILEIO_Find (searchname, FILEIO_ATTRIBUTE_MASK, &searchRecord, false) == FILEIO_RESULT_SUCCESS) {

                           set_dir_fname(&searchRecord,i);

                            i++;

                            } else {i=20;} //whileループから抜ける為

                        }  //2回目以降はfalseを指定して検索

・・・・・・

・・・・・・

このfind_SD_cardの関数は、ファイル名を検索して最大で20個表示したら一旦ドライブをアンマウントさせます。

.

.

ファイルの読み出しは「FILEIO_GetChar」という関数を使います。

void get_SDdata(unsigned int *sptr) { //テキストデータを1行(LFまで)読み込む
     uint8_t C=0;
     uint8_t i=0;
     while (C != 0x0A) {
        C=FILEIO_GetChar(sptr);
        if (C == 0x1A) {break;} //EOFでもループを抜ける
        SWR_SDdata[i]=C;
        i++;

     if (i>40) {break;} //1行の文字数が40を超えたら抜ける
        }
     SWR_SDdata[i-2]=0;
  }

セーブされたテキストデータは必ず「CR+LF」で1行完了としていますので、上の関数で、CR+LFが削除された文字列として、SWR_SDdata[]の中にストアされます。

正規のSWRカーブファイル以外の場合、暴走しないように、EOFを見つけたり、1行の文字数が40を超えたら、ループから抜けます。 

.

以下はASCIIからUTF-16への変換関数です。

void Uint8toUint16(uint8_t *fname8) { //ASCIIをUTF-16に変換します。
        unsigned char i ;
        for (i=0;i<13;i++) {
            fname16[i]=fname8[i];
        }
    }   

以下が特定の16bitファイル名「fname16[]」をオープンして読みだす処理になります。

unsigned int  open_SD_card(unsigned char *fptr) {
   DEMO_STATE demoState = DEMO_STATE_NO_MEDIA;
   FILEIO_OBJECT file;
   unsigned char i;
    uint16_t SD_ER = 0;
    Uint8toUint16(fptr);

・・・・・

・・・・・

 if (FILEIO_Open (&file, (uint16_t *)fname16, FILEIO_OPEN_READ) == FILEIO_RESULT_FAILURE) {
 
                    demoState = DEMO_STATE_FAILED;
 
                    SD_ER=2;
                    break;
                    }
                    SD_ER=50;
 
        get_SDdata(&file);
        set_FREQ_data(&SWR_SDdata,1);

読み込みは全部で225行に渡りくりかえされますが、それが終わるとファイルクローズします。 

 if (FILEIO_Close (&file) != FILEIO_RESULT_SUCCESS) { //ファイルクローズ                     demoState = DEMO_STATE_FAILED;

                  SD_ER=3;

                    return SD_ER;

                  }          

クローズが失敗したらメインルーチン側で強制的にドライブアンマウントを実行させます。

クローズが成功してもドライブをアンマウントします。

FILEIO_DriveUnmount ('A'); //ドライブアンマウント

SD_ER=20;

return SD_ER;

・・・・・・・

・・・・・・・

ファイルを削除する時は以下のコマンドとなります。

 if (FILEIO_Remove ((uint16_t *)fname16) != FILEIO_RESULT_SUCCESS) {
                        SD_ER=10;
                        }
                    break;

エディター上ではTABを使い、行の整列がきれいに出来ているのですが、このブログに貼り付けるとメチャクチャになって、大変読みにくくなってしまいました。

このデモプログラムのなかでは、かなり詳しいエラーメッセージが定義され、それが番号で返されますが、そのままでは、かえって混乱しますので、新たにSD_ERという変数で、勝手にエラー番号を定義し、ループからの抜けや、メインルーチン側でのエラー処理に使っています。

出来てしまえば、簡単な記述で完成するのですが、ここまでやるのに優に1か月かかりました。

実際にアンテナアナライザーに組み込んだ状態はここで紹介しています。

INDEXに戻る

2015年10月17日 (土)

過去のデータを再表示

<カテゴリ:アンテナアナライザー>

周波数対SWRの変化特性をグラフにし、このデータをSDカードに保存し、PCでエクセルデータとして取り込む状態まで完了していましたが、せっかくSDカードにセーブできましたので、このデータを、再度アナライザーのLCD画面に表示する事にトライしました。

この機能を追加するのは、純然たるソフトウェアだけの世界となりますので、ハードの変更は一切なく、ただひたすらにC言語に苦しみながらPCと向き合う事になってしまいました。

 

Aa50_faile_select

Aa50_re_display

左上の画像がSDカード内のSWRカーブファイル名を表示させた状態で、画像ではSWR00044.CSVを選択している状態です。 この状態でワイドキーを押すと右上の画像のように、グラフデータをLCD上に表示します。 表示したデータは、前回セーブした14MHzのスカイドアアンテナの特性です。

Aa50_21m_mtu

左の画像は私の21MHz用アンテナを3つのMTUでそれぞれチューニングした時のSWR特性をグラフで表示させたものです。 SDカードにセーブして有りましたので、それを呼び出してLCD上に再表示させました。 この画像では、3本のSWRカーブが3色で描画されていますが、マイコンの仕様としては最大で7本のカーブを7色で描画できます。 また、読み込んだファイル名も表示させる事にしました。

ここまでの機能を入れ込んだ状態で、ROMエリアは91%、RAMエリアは85%となりました。まだ、バグや使い勝手の悪いところもありますので、それらの対策をして、ギリギリの容量かも知れません。

このアナライザーの場合、SDカードにセーブ出来るファイル数はSDカードの容量が上限を決めます。 しかし、検索出来るファイル数は、現在は20個までです。デバッグの進行状況を見ながら、RAMエリアに余裕があれば増やす事はできますが、それでもLCDの画面サイズの関係から最大50個くらいと思われます。 また、読み込み順序もFAT32のファイルシステムで記録された物理的なアドレス順になります。 通常は古いファイルから先に検索されますので、仮に50個以上のファイルをセーブしていても、新しいファイルは表示できなくなります。

Aa50_delete

このような条件から、SDカードのファイルをオープンしてLCDに表示した後、そのファイルを手動で削除する機能を追加しました。 グラフが表示された状態で左の画像のごとく、確認メッセージを出した上で、DOWNキーで削除できます。 この機能を追加した事により、削除する為にSDカードをいちいち抜いてPCに接続する必要も無くなります。

ファイル名が連番ですので、古い番号のファイルの中身が、どのアンテナのどのような条件でのSWRカーブであったかは、多分覚えていないでしょうから、必要なファイルはせっせとPCにコピーして置けば良く、その必要がないなら、古いファイルはせっせと削除すれば良い事になります。 RAM容量が限られているマイコンではやむを得ない処理でしょう。

10月31日追記

Aa50_max50

その後、2週間くらいデバッグを繰り返して、バグも収束してきましたので、表示可能なファイル名数を最大50まで増やす事にしました。 左の画像のごとく、LCD上でのディスプレーの都合でファイル名は連番の部分のみとしましたが、不便はないでしょう。  ファイル数が50を超えている場合、この画面上でなんらかの警告を出す事にしています。 常に50個以下にしておかないと、最新のファイルが検索できなくなります。  この状態で、ROMエリアは91%、RAMエリアは88%の使用となりました。

マイクロチップのMLAを使ったFILEIOアプリでファイル表示や、特定のファイルの読み込み方法は PICマイコンでSDカードのファイルを読み込む で紹介しています。

ここまでの基板の状況は以下のようになりました。 一番左の基板表側はスルーホールの部品だけが目立ちますが、真ん中のこの基板の裏側はチップ部品よりジャンパーワイヤーだけが目立ちます。 一応、高周波回路は最短で構成し、単純なDC電源やDC信号ラインはジャンパー線でまかなったので、発振回路としての動作は安定しております。 RF回路を横断しているいくつものジャンパ-線は、RF的にはすべてGNDレベルの線なので、写真では無造作に結線されているように見えますが、一応、元プロフェッショナルな作業は行っています。

Aa50_osc_f

Aa50_main_f

Aa50_mic_f

ソフトのバグも収束ぎみですので、これからケースに収納する為の検討をする事にします。

アンテナアナライザーの製作(ケース入れ) へ続く。

INDEXに戻る

2015年9月19日 (土)

SWRグラフをSDカードへセーブ

 

<カテゴリ:アンテナアナライザー>

PICマイコンでSDカードにテキストファイルを保存する事が出来るようになりましたので、この機能を使い、周波数対SWRのデータをCSV形式でSDカードに記録し、これをPCでエクセルファイルに取り込んだ後、自由にグラフデータをPC上に表示する事ができるようになります。  

SDカードとPICの通信はSPI1モジュールで行いますので、今までSPI1を使用していた、コントロールマイコンとの通信ラインをSPI2に引っ越しさせ、FAT32用モジュルールやドライバーなどを従来のアナライザー用ソースファイルと合成し、なんとかコンパイラーがエラーを出さなくなりました。 この状態で、128KあるROMエリアの約84%のが占有されました。 RAMは58%くらいの使用です。

Sd_ready

とりあえずコンパイル成功したプログラムは、アナライザーの機能とSDカードの機能は正常に動作しますが、両者の間でのやりとりはやっていません。 やっとSDカードの検出結果をLCDに表示する事だけ出来るようになりました。 ちなみにSDカードをソケットに差し込むとすぐにMEDIA READYになりますが、ライトプロテクトがONになっている場合、カードをロックするまで押し込んだ時点でNO MEDIAになります。 ちゃんとライトプロテクトは動作しますが、読み込みも出来ないという事ですから、ライトプロテクト機能は無効と考えるべきです。

カード有り無しの判定が出来るようになったので、アナライザーから引数を渡す方法でSDカードソフトと連結してみました。 

Sd_save1

しかし、そう簡単にはいきません。 コンパイルエラー続出で始まり、無限ループにはまったりで、何度も後退しながら、やっとアナライザーのキー操作で仮のテキストをセーブできるところまで出来ました。 下記の通りファイル名が連番でセーブされています。タイムスタンプは、リアルタイムではなく、PICKIT3でプログラムを書き込んだ時のPC側の時刻のようです。 

Sd_save0_2 

テキストファイルが連番でセーブ出来るようになりましたので、次は、いよいよ周波数対SWRデータのセーブにトライです。  しかし、これも私の非力の性で、コンパイルエラーの連続でした。 ここで、複数のソースファイルとヘッダーファイルの場合のコンパイラ動作をにわか勉強して、かろうじて、データのセーブが出来るようになりました。

セーブしたデータをエクセル上に展開し、これからグラフを作るのは手作業です。

まずは、7MHzの垂直ダイポールの例

Swr00040_2

Swr00040xls_2

 

左上がアナライザーのLCD上に表示されたSWRカーブ、右上はこのデータをSDカードに転送セーブし、PC上でそのデータをエクセルデータとして開き、そのデータから作成したSWRカーブです。 周波数は100Hzの位まで取得された値、SWRは実際値を100倍した値となっています。 Y軸(縦方向)の目盛間隔がLCDより拡大されていますので、急激に変化しているようですが、数値を見比べると同じである事がわかります。

次は、14MHzのCWバンドに合わせたスカイドアの特性です。

Swr00042_2

Swr00042xls_2

LCDのY軸目盛は良く見慣れたSWR計の目盛と同様にSWRが高くなると、目盛間隔が詰まっていきますが、エクセルのグラフは等間隔ですので、カーブの様子が異なります。 縦軸を対数目盛にすればLCD表示に近づくでしょう。 このへんはエクセル表現のワザの話になります。 SWR目盛も100で割った小数点値にし、周波数も10で割った小数点値にすれば見栄えも良くなるでしょうが、そこはPC上で処理する事に、このアナライザーはこのままです。

このアナライザーのSWRカーブの最大取り込み数は7本として作ってあります。従い、エクセルデータもSWR0からSWR6までの7本分のデータがセーブ出来るようにしました。

Swr00043

左の画像は、14MHzバンドでCWバンドにチューニングした青色のデータとSSBバンドにチューニングしたときの赤色のデータを重ねて表示したものですが、この状態でもエクセルデータとして取り込めるようにしてあります。

このデータを実際にエクセルで取り込み、グラフ加工したエクセルデータを添付しておきます。

SWR00044.xlsをダウンロード

ここまでの対応でLCDマイコンのROM使用量は88%、RAM使用量は81%になりました。 まだ、デバッグや操作性の改善も残っていますので、多少は増えると思われます。 XC16の無償版コンパイラはオプチマイズ機能が無いと聞いていますので、最悪有償版かROM容量を256Kまでアップする覚悟をしていましたが、その必要はなさそうです。

SWRカーブをPCに取り込むという目標は達成できました。 試に私のマルチバンドアンテナのSWRデータを取り、エクセルデータにしてセーブし、グラフをPC上に表示してみましたが、 苦労してプログラム開発したのに、私の場合、その利用価値は有りませんでした。 アンテナの解析などを行いたい場合、取り込んだデータが役立つかもしれませんが、アンテナを調整して、最適使用状態に設定するのが目的なら、このような機能は不要みたいです。 ただし、一度セーブした過去のデータを呼び出して、アナライザーのLCD上に再表示させる事ができれば、それはそれで、役立つかも知れません。 機会がありましたらその機能追加にトライしたいと思います。

ところで、時々マイコンが暴走します。 以前の検討でPICKIT3に接続するMCLR端子に、パスコンが必要となっていましたので、0.01μFを追加しました。 その後、異常が発生しなくなりました。

SDカード対応の配線図をダウンロード

過去のデータを再表示 へ続く

INDEXに戻る

2015年9月17日 (木)

PICマイコンからSDカードへのファイル書き込み

<カテゴリー:PICマイコン

LCD表示のアンテナアナライザーの自作の中で、周波数対SWRのグラフを描かせるところまで成功しました。 そこで、このグラフをPCに取り込めないか、試行錯誤しておりました。 そして、やっと、PICマイコンでSDカードにファイルを書き込む事が出来るようになりました。 まだ、数行のテキストデータしかないファイルを書き込んだだけで、グラフデータは未完成ですが、ここまで、出来ると、後は時間の問題となります。

今回は、PICマイコンからFAT32のファイルシステムでフォーマットされたSDカードにテキストファイルを書き込む方法を紹介します。

ハードの構成です。 アンテナアナライザーのハードに秋月で売っているSDカードソケットを接続した、単純な回路となっております。

Pic_sd_schema

 検討するソフトもこのSDカードの部分のみで、LCD表示は実装していません。

秋月から「SDカードスロットDIP化モジュール」という名前のソケットを買ってきて、これを配線図のごとく、マイコンの空きピンに接続します。PIC24FJ128GB106はi/o設定が自由にできますので、このような場合、非常に便利です。

Sd_card0そして、左の画像のごとく実装しました。

この状態でSDカードをドライブするソフトはMicrochipが無償で提供しているfileioというアプリケーションを使います。

このアプリの説明を読んでいると、私のようにC言語のポインターもまともに扱えない者でもなんとかPCで読めるファイルを書き込めるかも知れないと思うようになりました。

しかし、これが間違いの始まりで、検討を開始してからすでに1か月。 やっとのことで、FAT32のファイルシステム上に自作のファイルを書き込む事に成功しました。

Pic_fat32file0 上はエクスプロラーでSDカード内のファイルを表示させたものです。

Sample long file name.txtはデモプログラムが見本として作成したファイルです。

SWR12345.txtは私が作ったファイルです。 いずれも2行、20文字くらいのファイルですが、ファイルの中身は、これから好きに変更できます。

ここまで出来るまでの工程を以下説明します。

MicrochipのサイトからMLAと言われるアプリケーションファイルをダウンロードし、デフォルトの設定のままインストールします。 私がインストールしたファイル名は以下の名前でした。

mla_v2015_08_10_windows_installer.exe

デフォルトでインストールした後、MPLAB Xから以下のプロジェクトを探し

C:\microchip\mla\v2015_08_10\apps\fileio\sd_card_demo_lfn\firmware\MPLABX

fileio_sd_card_demo_lfn を読み込むと、同名のプロジェクトがオープンします。

このプロジェクトができましたら、マイコンの品種設定とi/oの設定を書き換える事により簡単にデモプログラムが動作します。・・・・とはなりませんでした。

Mplabx_sd

上のダイアログはMPLABXにてプロジュクトをオープンした時の画面ですが、上の方にICの品種を指定するランがありますので、実際に使用しているICファミリーを選択します。 

私の場合、実際に使用しているICはPIC24FJ128GB106ですので、ファミリー名はpic24fj256gb110となります。 使用可能なICのファミリー名が左側の「exp16」フォルダーの下に表示されていますので、確認できます。ここにリストされた以外のICで、このデモソフトが動作するかは不明です。

リンクされたファイルには同じ名前で中身の違うものがいくつかあります。main.c やsystem.c が該当しますので、他のホルダーでプロジェクトを構築する場合は、一度デモプロジェクトをオープンし、そのとき表示されるファイルをコピーして他のホルダー移すことで間違いを防ぐ事ができます。 事実、最初、リンクを頼りにファイルをコピーしてきて、独自のホルダーに集めてbuildをかけたところ、エラー続出で困り果てた事がありました。 この為、main.c とsystem.c はそれぞれ、SD_main.c とSD_system.c いう名前にし、のちのち間違わないようにした上で、独自のフォルダーへ移動させ、オリジナルのファイルは元の場所にそのまま残しました。 

まず、lfn(ロングファイル名)を選んだのに、リンクされたヘッダーファイルはlfnなしの普通のfileio.h。 これをハンドでfileio_lfn.hに入れ換えました。 ソースファイルもlfnではなかったような記憶ですが確かでありません。もし、違ってましたらソースファイルもfileio_lfn.c に入れ換えて下さい。

また、system.c の中の一部を以下のように書き換えました。

#pragma config FNOSC = FRCPLL//OSCを32MHzのCR発振に変更

#pragma config FWDTEN=OFF

ただし、このままでは16MHzにしかなりませんでしたので、main()の中で、以下を

追加し32MHzにしました。

OSCCON = 0b0001000110100001; //Fosc FRCPLL 32MHz
 CLKDIV = 0x0000;

また、青色の設定は後日、追加したものです。 このPICマイコンはデフォルトでウォッチドッグタイマーがONになっており、約2分20秒でリセットがかかる原因になっていました。 これが時々暴走する原因と解るまで3週間くらいかかりました。

また、i/oの設定も変更しました。

void USER_SdSpiConfigurePins_1 (void) {     //Initialize the SPI    

RPINR20bits.SDI1R = 25;    //修正

RPOR10bits.RP20R = 7;    //修正

RPOR11bits.RP22R = 8;    //修正

    //enable a pull-up for the card detect, just in case the SD-Card isn't attached    

//  then lets have a pull-up to make sure we don't think it is there.    

//CNPU5bits.CN68PUE = 1;//プルアップはハードで行っていますので、この行は不要です。   

// Deassert the chip select pin    

LATDbits.LATD2 = 1;    //CS端子1に設定

// Configure CS pin as an output    

TRISDbits.TRISD2 = 0;    //CS端子出力に設定

// Configure CD pin as an input    

TRISDbits.TRISD1 = 1;    //CD端子入力に設定

// Configure WP pin as an input   

// TRISDbits.TRISD1 = 1; //この行はコメントアウト

}

・・・・・

・・・・

inline void USER_SdSpiSetCs_1(uint8_t a) {

    LATDbits.LATD2 = a;   //CS端子修正

}

inline bool USER_SdSpiGetCd_1(void) {

    return (!PORTDbits.RD1) ? true : false;//CD端子修正

}

inline bool USER_SdSpiGetWp_1(void) {

    //return (PORTFbits.RF1) ? true : false;//コメントアウトして0を返す

    return 0;

}

ここまで修正してBuildをかけてエラーが出なかったら、成功です。

しかし、PCでFAT32にフォーマットしたSDカードを用意し、マイコンにプログラムを書き込んでもファイルは出来ません。

今度はmain.c の定義の部分を変更します。

typedef enum
{
    DEMO_STATE_MEDIA_DETECTED = 0,
    DEMO_STATE_NO_MEDIA,
    DEMO_STATE_DRIVE_MOUNTED,
    DEMO_STATE_DONE,
    DEMO_STATE_FAILED
} DEMO_STATE;

DEMO_STATE_NO_MEDIA=0という記述が最初の行にありますので、これを上記のごとく2行目に移し、"=0"の文字を削除します。 DEMO_STATE_MEDIA_DETECTEDを一番上にして、"=0"を追記しておきます。これは、Maicrochipのデモ機はCDが0の時ノーメディアなのに対して、秋月のソケットはCDが1のときノーメディアになっている為です。

以上の手直しでデモ用のファイルがSDカード内に出来るようになりました。

次に自作のファイル名でファイル作成にトライです。 ところが、出来たファイル名は文字化けして読めない上、ファイルの中身も空です。 ファイル名は「SWR00001.csv」で始まる連番とする予定ですので、この数値の部分はunsigned int で1から始まる整数です。これをファイルに書き込めるようにASCII変換してファイル名としたのですが、うまく行きません。

色々調べて、判った事は、FAT32のファイル名はASCIIコードではないということでした。ファイル名はutf-16という16bitの文字でエンコードされていました。 XC16の中にあるストリング系の関数は使えませんので、自分でASCII to utf-16の変換ルーチンを作る必要がありました。 

幸い、ASCIIコードの文字だけに限れば、8bitのASCIIコードの上部に0x00のコードを加えて、16bitにするだけなので、変換ルーチンは私でも作れましたが、日本語のファイル名は使えません。

このようにして、「SWR12345」のようなファイル名を付けたテキストファイルを作る事が出来るようになりました。このファイル名の数字の部分を連番のファイル名にし、拡張子をcsvにするとOKとなります。

SDカードは、128Mと8Gの物をテストしましたが、いずれもFAT32でフォーマットしてあれば問題なく使う事ができました。 exFATでフォーマットしたSDカードの場合、エラーがでます。

この小さなデモファイルを作る為に必要なROM容量は約44.9Kバイトです。これから実験しようと考えているなら、ROM容量64Kでは心細く、最低でも128K品が必要でしょう。

ところで、出来たファイルにちゃんとタイムスタンプが付いています。どうやって時間を計っているのでしょうかね。マイコンボードは使わないとき電源OFFなのですが。

このSDカードドライブ機能をアンテナアナライザーに実装する事にします。

SWRグラフをSDカードへセーブ へ続く。

INDEXに戻る

2015年8月16日 (日)

細々と改善は続く

カテゴリ:オートアンテナチューナー(ATU)の製作

8月の初めに誘導雷を受けて、自作のATUが動かなくなりました。 チューニングスタートをさせても、すぐにエラーで止まってしまいます。 一応、誘導雷くらいなら、マイコン本体のi/oが壊れる前に、その周辺のパーツが壊れるという設計をしていました。 調べてみると、周波数カウンターが動作せず、RF信号はOKなのに、周波数が範囲外となり、エラーを出しているものでした。 故障個所はカウンター回路の入力にあるチップコンデンサの電極が高電圧の為割れており、コンデンサの役目をしていないのが原因です。 この50V耐圧のチップコンデンサを交換したら直ってしまいました。

Atuk1_2

せっかく、ベランダのBOXから取り外したので、かねてより温めておいた改善事項を盛り込む事にしました。

ひとつは、バリコンの可変範囲が広すぎますので、これを若干狭くする為、以前手配しておいた6000V 390PFというコンデンサをバリコンに直列に挿入する変更です。 3.5MHzでのコイルインダクターを増やすのが面倒なので、入力側のみ追加し、様子を見る事にします。

二つ目は、マイコンのソフトです。 SWR最少位置を探す途中で、次の動作に行くために、数10ミリ秒から数100ミリ秒の待ち時間がありました。 また、プリセット位置にバリコンを移動させるには数秒かかる事もありましたが、これらの待ち時間中は、単純に動作が終わるのを待っているだけで、この待ち時間中にSWRが1.5以下になる事があっても、無視されていました。 今回、この全ての待ち時間中でもSWRを常にチェックし、SWRが3以下ならただちにSWR収束動作へ移るよう変更する事にしました。

ここで、問題が発生です。

LCD表示のアンテナアナライザーを開発する為、PICの開発環境をMPLAB X IDEに変更しましたが、ATUの開発環境は旧MPLABとHi-TECH Cでしたので、この旧MPLABを呼び出しPICKIT3を経由して、プログラムの書き換える事にしました。 ところが、IDが違うとエラーがでます。 困りはてて、色々試しましたが、うまくいきません。  さんざん悩んだ末、MPLAB X IDEでプロジェクトを作り直し、なおかつ、HI-TECH Cで書かれていたソースファイルをXC8用に書き換えると、ちゃんと16F1939を認識して、プログラムの書き換えが出来ました。

さらにプルダウンメニューなどを調べていると、MPLAB XでもHI-TECH Cコンパイラも使えるようです。 結局判った事は、MPLAB Xをインストールした後は旧MPLABは使えないという事でした。

やっと、プログラムの改善ができましたので、21MHzだけですが、オートチューニングを試す事にしました。 以前はバリコンがいったりきたりして、なかなかSWR収束モードにならず、その内、VC maxの位置に収まってしまいSWRが3以下になりませんでした。 やむなく、ハンドでSWRが1.5以下になるようにバリコン角度やコイルのタップ番号を選択した後、収束動作をさせていました。  ところが、今回は1発でSWR1.4くらいまで収束し、再度チューニングさせるとSWR1.05まで収束します。

後日、3.5から28まで全バンド、チューニング出来る事を確認しました。 ただし、28MHzのみですが、SWR1.4以下になるまで、かなり時間がかかるようになりました。 このバンドでチューニング動作を見ていると、1回で送るVCの角度が小さすぎるようです。 ソフトの変更で改善出来そうですが、すでにコンテナBOXに収めてしまいましたので、 次回のチャンスの時、変更する事にします。 この時間のかかる問題は最初のチューニング動作のみで、一度プリセットされてしまうと、次回からは、短時間で整合状態になりますので、実用上の不都合は有りません。

2016年11月3日

LDGのATUのマイコンを改造する為に、このATUのソースコードを調べていましたら、ソフトにバグがある事が判りました。 バグの内容は、ある条件の基ではモーターが反転しないというものです。 これが為に、なかなか整合しないバンドが発生しているようです。 このバグ対策を行った結果、全バンドがかなり早く収束するようになりました。ただし、24MHz以上のバンドでなかなか収束しないのは変わりません。そこで、前回追加しました、バリコンに直列の390PFを廃止しました。

バグ対策を行った後、外付けのSWR計ではSWR1.1以下になるのに、TUNE OKにならない場面が増えてきました。 この原因を調べてみると、モーターにブレーキをかけた後、まだ、バリコンが動いている最中に、SWRをチェックしているというバグが見つかりました。 ここは、50msecのディレー時間を設けて対策しました。 さらに、SWR3以下の時のモーター駆動時間をSWR3以上のときの1/2にし、さらにSWR1.5以下の場合さらに1/2にしていたのですが、SWR1.5から3の期間のモーターON時間が長すぎて、SWRディップポイントを通り過ぎてしまうのが原因でした。 そこで、SWRによりモーターON時間をさらに細分化し、以下のように設定しました。

SWR10以上     200msec

SWR10-5       100msec

SWR5-3        67msec

SWR3-1.5       40msec

SWR1.5以下      33msec

これで、ディップ点を飛び越える確率が大幅に減少した上、収束時間も短くなりました。

最新回路図 ATU-VC11.pdfをダウンロード

バリコン式ではなく、コイルとコンデンサをリレーで切り替えるタイプのATUの例はこちらでPICのソースを含めて公開しています。

2018年1月

プリセットMTUも継時変化が激しく、3.5MHz帯はMTUの調整範囲を超えてしまい、最近はこのATUだけで運用しています。 ただし、他のバンドではATUは使いません。 いくらチューニングを早くしてもプリセットMTUにはかないません。

2024年6月

新マルチバンドアンテナを構築する為に、2023年1月このATUを含めて撤去し、LDGのKT-100をベースとしたリレー式のATUを自作しました。 そして、2023年4月末より運用を始めたのですが、KT-100の中にあるリレーのひとつが時々接触不良を起こしており、ATUをプリセットしても、SWRが許容値にならない事がしばしば発生し、電源ON/OFFの繰り返しでなんとか接触させ使ってきましたが、2024年の6月になり、この接触不良が起こるリレーの数が拡大し、7MHzも18MHzも使用できなくなっていました。 そこで、一旦廃棄処分を決めたバリコン式のATUを再度使用できないか検討を始めました。 

  

INDEXに戻る

2015年8月14日 (金)

PIC24FJ128GB106 データメモリー不足

<カテゴリー:PICマイコン

TFT LCDにグラフィックや文字を表示させていますが、メモリー容量を64Kから128Kに替えた為、新たにフォントを追加する事にしました。 フォント作成アプリで大文字、小文字、数字、記号などを作り終え、これをincludeファイルにして、コンパイルすると、エラーになります。  出てくるコメントはリンカーエラーとの事で、メモリーが不足しているような内容です。

これらのエラーコメントを頼りにインターネット内で検索すると、Microchip(USA)のFAQページにメモリーを拡張しなければデータサイズは32Kまでと言う説明が見つかりました。 ただし、どうすれば、32K以上のデータメモリーを使えるのかは、やりとりが英文である事もあって、良くわかりません。

そこで、日本語の情報を探すと、データメモリーが32Kまでで制限されている事。 これを32K以上に拡張する為には、レジスターの設定やアドレッシングなど、変更する必要は判りましたが、肝心なXC16による記述方法が良く判りません。

結局、インターネットから探しだした、以下の記述でコンパイラーがエラーを出さなくなり、ちゃんと文字の表示が可能になりました。

コンパイルエラーになった記述例

const unsigned char Font7_space[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };//ASCII 32
const unsigned char Font7_sharp[] = { 0xb, 0xa, 0xa, 0x3f, 0xa, 0x1a, 0x1a, 0x3f, 0x16, 0x16 };// ASCII 35

・・・・・・

・・・・・・

const unsigned char *Font7_table[] = {
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //ASCII 0-15

・・・・・

・・・・・

コンパイルエラーが無くなった記述例

__eds__ unsigned char Font7_space[] __attribute__((eds)) = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };//ASCII 32
__eds__ unsigned char Font7_sharp[] __attribute__((eds)) = { 0xb, 0xa, 0xa, 0x3f, 0xa, 0x1a, 0x1a, 0x3f, 0x16, 0x16 };// ASCII 35

・・・・・・

・・・・・・

__eds__ unsigned char *Font7_table[] __attribute__((eds)) = {
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //ASCII 0-15

・・・・・

・・・・・

Aafont7

左の[SWR ANALYZER]の文字が今回作成した10x6のフォントです。

文字を書き込むとき、フォントアドレスをポインターで指定しますが、このポインターの型宣言も下記のようにする必要がありました。

__eds__ unsigned char *fontptr;

INDEXに戻る

2015年8月 8日 (土)

アンテナアナライザーの製作(全機能組み込み)

<カテゴリ:アンテナアナライザー>

LCDドライバーのマイコンのROM容量が64Kをオーバーしそうになったので、ROM容量が128K品であるPIC24FJ128GB106に変更し、製作を継続してきましたが、正規の基板を使っていない事もあり、配線引き回しが多く、ノイズによる誤動作で苦労しました。 せめて両面高密度実装基板なら、こんな問題は起こらないのですが、そこは手作りの基板ゆえ、苦労が絶えません。 とりあえず、目標としたアンテナアナライザーの全機能を組み込む事ができました。 これから、実際に使ってみると、問題点も出るでしょうが、 アンテナアナライザーの製作の最終章です。

Aa50normal

Aa50cal

左上がノーマル状態、右上が校正モード時のLCD画面となります。

校正が完了した各ダミー抵抗によるADの出力値は赤色で表示されています。

校正は3.5MHzバンド付近のみで行い、他の周波数では行いません。 これは、センサー部分のブリッジからダミー抵抗まで約50mmあり、これが影響して周波数が高くなるに従い、検出されるRやXはもちろん、Zも変化するためです。

Aa50100dummy

ちなみに、100Ωのダミー抵抗(純抵抗)を接続し、Mコネクターの特性インピーダンスを仮に30Ωと置いて、周波数を可変した時の計算値は左の表のようになり、実際の値も、近い値を示します。 例えば、50MHzで100Ωのダミー抵抗による校正をするという事は、50MHzでZ=100にすることになり、実際値とは異なる数値になるからです。 従い、このアナライザーでは、3.5MHzにてZ=100と定義し、RとXはその時のSWR=2.0との関係より計算させるという方法を取っています。 そして、広帯域発振器の出力レベルを比較し、周波数により変化が有ればこれを補正する事にしました。

Aa5017m

Aa50fc_2

左上が私の18MHz用ループアンテナのSWR特性。 右上が今回追加した周波数カウンターモードの表示例です。

周波数カウンターは、WWVやWWVHで校正された基準周波数を入力して、内臓の周波数カウンターのゲート時間を正確に20m秒に調整する必要があります。 その時の外部基準信号をアンテナを接続するMコネクターから加える事にしましたが、この機能をそのまま、周波数カウンターとして使えるようにしました。 0dBmの信号で最高周波数110MHzくらいまでは100Hz単位で計測できます。 しかし、よくよく眺めると、SWR,ZやR,Xの表示がバラバラです。バラバラになるのは当然なのですが、見てくれは良く有りません。次回、変更のチャンスが有ったら、これらの表示が無効になるような対応を考えたいと思います。

一応、当初の目標としていた機能はすべて組み込み完了しましたが、ひとつだけ気になる問題があります。 18MHzのアンテナのSWR特性カーブの中の、SWR1.1付近で不自然にカーブがずれています。 この原因を詳しく調べると、この不自然な変化周波数を境にして右側はインピーダンスが50Ωより高くなっており、左側は50Ωより低くなっています。 SWRを換算するとき、50Ω以上の時と、50Ω以下の場合のSWRの換算方法が異なる為、この境目でSWRが一致しないという問題でした。 SWRが小さい状態でインピーダンスが50Ωを横切った場合、あまり目立ちませんが、SWRが大きい状態でインピーダンスが50Ωを横切ると、完全に段差が生じます。

このインピーダンスにより、換算値に誤差が出る原因は、SWRメーターとアンテナのリアクタンスの関係 の記事で触れたように、リアクタンスが含まれた時の計測誤差が影響しておりました。

Aa50swr0

Aa50swr1

Aa50swr2

上の画像は28MHzのCW運用バンドに合わせたループアンテナのSWR特性です。 

 左の画像が、インピーダンス50Ωを境に、高い時と、低いときでSWR換算方法を使い分けたものです。 50Ωを横切る周波数が2か所ある為、2か所で段差が生じています。

真ん中の画像は、換算方式を通常のSWR計と同じ方法にしたものです。段差が無くなった代わりに、中心周波数より離れた周波数で、SWRが低く表示されています。

右側の画像は、インピーダンスが全て50Ω以下と想定して、換算させたSWR特性です。

どの、画像も、SWRが1.5を超えたら、それぞれ誤差が大きくなり、特にSWR2以上の場合、いずれも、正確なSWRは表示していません。 アンテナ調整を行う時、悪いSWRが良く出る率が小さい方がましですので、このアナライザーは一番右の特性になる方式でいきたいのですが、SWR2.0の校正を100Ωでやっている関係で、一番右の換算方法では100Ω時のSWRが校正されません。 25Ωの抵抗で校正すれば、OKなのですが、世の中のアンテナアナライザーのほとんどが100Ωで校正されていますので、25Ωで校正した場合、比較したとき誤差が大きくなりそうです。 従い、このアナライザーも一般のアンテナアナライザーやSWR計と同じ校正方法となる真ん中の方式でいく事にします。

また、この製作の発端となったLCD表示のアナログメーターの動きも、大きな違和感なしで共振周波数を探る事が出来ます。  指針の動く速さを改善する手段として新たに、指針移動角度に応じて書き換える範囲を可変する事にしました。 指針が移動するとき、旧指針を消して、新しい位置に指針を書き込む必要がありますが、これを1回の書き換えで実現する為に、新指針のエリアより上下左右の広い範囲に目盛の再書き込みを行い、この操作で旧指針を消していました。 しかし、指針が2度の角度で移動するとき、左右で9ピクセル分の目盛データを上書きする必要がありました。  そこで、指針の移動角度小さいときは、それなりにカバーする範囲を小さくし、最少角の0.25度の時は、左右で3ピクセル分のみカバーさせる事にしました。 さらに、このカバーエリアの拡大は、指針が右へ動く時は、左側だけ、左に動く時は右側のみとして、書き換えるエリアの面積を常に必要最小限とする事により、 クラニシのアンテナアナライザーのメカニカルメーターと同等の速度まで改善する事ができました。

指針が0.25度動いたときの最大移動ピクセルは約0.7です。 0.7ピクセルは実在しませんので、実際は1ピクセル移動します。 従い、進行方向はゼロピクセル、後方は1ピクセルだけ再描画すれば旧指針は消えるのですが、実際は、ADの変換値がチラチラとばらつきますので、そのバラツキをカバーする為に、進行方向は1ピクセル、後方はさらに1ピクセルの2ピクセル分だけ再描画が必要です。さらに、0.5度間隔から0.25度間隔に変更した時点では、0.5度分のピクセルが残っていますので、これを吸収する為、さらに後方に1ピクセル分の再描画エリアを確保する必要がありました。  このアルゴリズムでプログラムを組んで様子を見ていますが、時々旧指針が消えずに残る時があります。 旧指針の範囲を指針が移動するまで残ります。 ただし、この異常現象は、バグ対策を行うほどに頻度が小さくなっていくようです。

各ADの出力値は温度や周波数でわずかに変化します。このわずかな変化を検知して、出力されたADデータ値を補正します。 この補正プログラムも組み込みましたが、過酷な温度試験は実施していません。 たちまちは、気温差が10度くらいで100Ωの指示誤差が+/-1Ω程度になるように、補正係数を調整しました。

今後、実用テストが出来るようにケースに収納した上で、デバッグを継続する事にします。

ROM容量が64Kをオーバーするかも知れないと、マイコンを128K品に交換しましたので、少しでも視認性を上げるべく、フォントを新作して、組み込む事にしました。 ところが、データエリアが32Kを超えたとたん、コンパイラーがエラーを吐きます。 なんとか対策できましたが、完成度はなかなか上がりません。

最新回路図をダウンロード

完成度はあがりませんが、せっかく実現した周波数対SWRのカーブをPCに転送してPCの画面上にグラフを描かせる事にトライする事にしました。 たちまちは予備検討です。

この記事でアンテナアナライザ製作を終了する予定でしたが、色々と問題点や改善テーマが出てきて、終了できませんでした。 しばらくは製作記事が継続します。

SWRグラフをSDカードへセーブ へ続く。

アンテナアナライザーの製作を最初のページから参照したい場合ここからどうぞ。

INDEXに戻る

2015年8月 3日 (月)

PIC24FJシリーズ SPI 誤動作

<カテゴリー:PICマイコン

アンテナアナライザーのLCDドライブ用に使用していたPIC24FJ64GA004のROMエリアがほぼフルになりましたので、128Kに換える事にしました。 選んだマイコンは、将来USB機能やSDカードを組み込むかも知れないとの考えから、PIC24FJ128GB106という品番のICにしました。 

Aa59pic24fj128gb106

左の画像が、128Kの64pin TQPF品に入れ替えた実装基板です。 変換基板の大きさが、44pinのときより小さくなっている関係で、以外とすっきり配線できました。

回路図的には、44pinの時と同じ構成で、一部i/oの割り当てを変更しただけで、さっそく動作確認です。 ところが、LCDの表示は問題なく表示されますが、コントロールマイコンとの通信がうまくいきません。 周波数表示はでたらめで時々暴走します。 UART通信のプログラムが異常なのかと、色々試しましたがうまくいきません。 じたばたしている内に、通信もうまくいかないのに、さらに、26バイトの伝送に15m秒くらいかかっている事が判り、LCDの表示速度も遅くなっている事に気付きました。 ボーレート38.4Kでは不足みたいです。 56K以上にアップする案もありましたが、 キー入力をADに変更して、ラッチアップの対策もできましたので、残りのUP,DOWNのキーもADに変更する事によりi/oポートが2本余ります。 この際、通信方式もi/o 1本のUARTからi/o 3本のSPIへ変更する事にしました。

しかし、これが、またまた、訳の判らない誤動作に悩まされる事になってしまいました。

時々、伝送に成功しますが、一度リセットをかけると、伝送データがでたらめになります。 約2週間悩んだ末、判った結論は、またまた、伝送路のリンギングによるマイコンのラッチアップでした。 ただし、ラッチアップの影響が小さい為、時々まともに動作するのは、プログラムの性ではないかと、ああでもない、こうでもないとやっていたのがいけなかったようです。 ふと、ハードが原因ではないかと、SPIのクロックやデータの波形をチェックしてみました。

Aa59spi0

Aa59spi1

上の画像は左が対策前の、クロック(下)とデータ(上)です。 右の画像は対策後の波形です。 対策前は、クロックにも、データにもリンギングのオーバーシュートやアンダーシュートが発生し、いずれも時々0.5Vを超えています。 これが伝送データがでたらめになる原因でした。 対策内容は、各ラインに1KΩの直列抵抗を挿入し、リンギングの発生をおさえますが、抵抗だけでは不十分でしたので、GNDとの間に68Pのコンデンサも追加しました。 波形がきれいになって暴走の確率はかなり減少しました。 

しかし、時々、電源ON直後に暴走します。 ただ、基板のGNDラインを指でつかむとか、オシロのGND端子へ接続すると完璧に直ります。 このような症状の原因はノイズです。 ふたつのマイコンのうち、どちらで暴走しているか確認したところ、コントロール側の24FV32KA302が暴走しています。 さらに、このマイコンの入力関係をひとつづつ殺して確かめても暴走するときは暴走します。 最後にたどりついたところはMCLR端子でした。 この部分についてデータシートを再確認したところ、推奨回路はMCLR端子にシリーズに100から470Ωを入れろと書かれていますが、8bit時の延長で抵抗は入れてありませんでした。 そこで、470Ωを追加し、10回くらいのPOWER ON/OFFでは暴走が起こらない事を確認できました。 しかし、頻度は少ないですが、たまに誤動作します。 このマイコンのデータシートには、さらに0.1μFでGNDへ落とせと書いてあります。  さっそく0.1μFのコンデンサを追加したところ暴走が起こらなくなりました。 しかし、PICKIT3の説明書では、MCLRラインにコンデンサを接続するなと書いてあります。 試にこのラインに0.1μFを接続したままで、フラッシュメモリーの書き換えを行ってみましたが、問題なく書き換えが出来ました。 もし、書き換えがうまくいかない時は、コンデンサを外し、アナライザーが完成したら、コンデンサを追加する事にして、コンデンサは追加したままにしています。

LCDドライブ用の24FJ128GB106のMCLRラインにはまだシリーズ抵抗は入っていませんので、抵抗だけは追加する事にしました。

対策済回路図をダウンロード

Aa59_spi2

このSPI通信は、PIC24FV32KA302をマスターとして、PIC24FJ128GB106をスレーブとした一方通行のシリアル通信です。 クロックは約156KHzとし、マスター側はワード(16bit)伝送で割込みなし、全17ワードを連続送信し、その間、CEとしてLの信号を送ります。 スレーブ側は、CE信号がLになったらこれを割込みで捉え、受信バッファのインデックスを0にした後、1ワード受信する度に割込みを発生させ、17ワードのデータをバッファにストアさせます。 CE信号を送ったり、CEを受けてインデックスを0にする動作以外、すべて、データシートにかかれた説明通りの設定です。 

上の画像は、下のパルスがSPIのクロック(SCK)で、上のパルスが受信割込みが発生したときのダミー信号です。 1ワード受信する度に割込みが発生し、先頭ワードのインデックスを0番として順次17ワードを受信バッファに格納していきます。

送信側のPIC24FV32KA302のmain内の初期設定と送信ファンクションは以下です。

main () {

・・・・・・・・・

SPI1CON1 = 0b0000011000111100;//マスターモード クロック1/64
SPI1CON2 = 0b0000000000000000;
SPI1STATbits.SPIROV = 0;
SPI1STATbits.SPIEN = 1;//SPI1有効化

・・・・・・・・・・・・・

送信処理

void sendDATA() {
    unsigned char i;
    SPIFlg = 0;//CE信号をL
     __delay_us(20);
    for (i=0;i <17;i++) {
        while(SPI1STATbits.SPITBF);
        SPI1BUF = TXData[i];
        }
     SPIFlg = 1;//CEをH
}

受信側PIC24FJ128GB106の初期設定と受信割込みルーチン

main() {

・・・・・・・・・・・・・・・

RPINR0bits.INT1R = 21;//INT1をRP21に割り当て(RG6)
 RPINR20bits.SCK1R = 26;//SCK1INをRP26に割り当て(RG7)
 RPINR20bits.SDI1R = 19;//SS1INをRP19に割り当て(RG8)
 SPI1BUF = 0x0;//SPIバッファークリアー
 IFS0bits.SPI1IF = 0;//SPI割込みフラグクリアー
 IEC0bits.SPI1IE = 1;//SPI割込み有効
 IPC2bits.SPI1IP = 3;//SPI割込み優先レベル3
 SPI1CON1 = 0b000011000000000;//SDO使用せず。スレーブモード
 SPI1CON2 = 0b000000000000000;//フレーム未使用
 SPI1STATbits.SISEL = 1;
 SPI1STATbits.SPIEN = 1;//SPI1有効化
 INTCON1 = 0b000000000000000;
 INTCON2 = 0b000000000000010;//INT1 ネガティブエッジ
 IFS1bits.INT1IF = 0;// INT1 割込みフラグクリアー
 IEC1bits.INT1IE =1;//INT1割込み許可
 IPC5bits.INT1IP = 3;//INT1割込み優先レベル3

 ・・・・・・・・・・・・・

CE割込み処理

void __attribute__((interrupt, no_auto_psv)) _INT1Interrupt(void) {
    IFS1bits.INT1IF = 0; //割り込みフラグ解除
    RXindex = 0;
}

SPI受信割込み処理

void __attribute__((interrupt, no_auto_psv)) _SPI1Interrupt(void) {
    unsigned int i;
 //    LED=1;
    IEC0bits.SPI1IE = 0;//受信割込み禁止
    IFS0bits.SPI1IF = 0; //受信割り込みフラグ解除
    i = SPI1BUF;
    RXdata[RXindex] = i;
    RXindex++;
    if (RXindex > 16) {
       RXreadyflag = 1;//全データ受信完了フラグ
       RXindex = 0;
       }
   IEC0bits.SPI1IE = 1;//受信割込み許可
//      LED=0;
}

INDEXに戻る

2015年7月11日 (土)

アンテナアナライザーの製作(SWRカーブの表示)

<カテゴリ:アンテナアナライザー>

LCDコントロール用のPIC24FJ64GA004のROM容量が93%まで詰まってきましたが、操作性やデザイン性は後回しにして、とにかく、周波数対SWRのグラフが描けるまでやってみる事にしました。

今までの実験中に気になった事項として、周波数表示のチラツキがあります。  デジタルカウンターの場合、一番最下位の桁は、常にチラつくのが普通です。  この対策の為、測定した周波数の5回分の平均値を表示させていますが、それでも、チラチラはかなり気になります。  そこで、周波数が1MHz以上の場合、100Hzの桁を表示させないようにする事にしました。 この対策でも100Hzの桁の0と9の堺では、1KHzの桁がチラツキますが、その頻度はかなり低くなりますので、結構精度が上がったように見えます。

周波数の調整は1800度(5回)回転の可変抵抗器で行っていますが、18MHzや24MHzの周波数調整が、かなりクリチカルです。  いままで、110KHzから64MHzまでを4バンドでカバーしていましたが、各バンドでのバリキャップ電圧の上限下限を調整して、6バンドに分割し直し、最高周波数も59MHzまでとしました。  この変更で、周波数可変抵抗器のホット側、GND側に直列に入る抵抗値を切り替える必要が生じ、i/oが不足しますので、SWRグラフ表示用に用意しておいたOPTION SWはADポートへ接続し、キーが押された時のADポートのDC電圧を測定して、どのキーが押されたかを判断する事にしました。  この変更により、i/oポートが2本空きましたので、これをバンド拡張の制御信号としました。

しかし、このADポートの電圧で、キーの判定を行うとき、ADポートが急に0Vになると、UARTのTX端子が、時々、Lに落ちるというトラブルが発生しました。 この場合、当然UARTが正しく動作しないだけでなく、プログラムも暴走します。  原因が判らず、1週間くらい悩みましたが、ADポートをいきなり0Vにするのではなく、最少電圧として、0.3Vくらいにしてやると、全く問題なく動作します。

Aa50ad0v

Aa50ad1v

上の画像は、左が、ADポートをタクトSWでいきなり0Vにした時のAD入力ポートの波形です。 右は、タクトSWにシリーズに1.6KΩをいれたときの波形です。  いきなりAD端子をGNDへショートすると、リンギングが発生し、瞬間的ですが、ADポートが最大で1.8Vくらいマイナス方向へ振られます。 これでラッチアップを起こし、マイコンが暴走する原因となっていました。 

 

LCD上に周波数対SWR特性のグラフを描かせようとすると、周波数を一定間隔で連続可変する必要がありますが、このアナライザーの場合、14VのDC電圧を10KΩの可変抵抗器で分割して、バリキャップに加え、発振周波数を可変させるものですから、自動SWEEPという機能は使えません。 SWEEPはハンド操作になりますので、バリキャップ電圧ラインに大きな時定数を持たせ、不規則なハンドによる周波数可変が有っても、バリキャップ電圧が滑らかに変化するような機能を追加しました。 ただし、この機能がONの場合、周波数可変つまみの変化に周波数が即追従しませんので、通常はOFF状態にしてあります。

グラフィックモードになったら、最初に中心周波数を決めます。この周波数は有効桁数3ケタの数値に丸め込みます。

1.8262MHz は 1.83MHz へ

14.2358MHz は14.2MHz へ

などのように設定しておきます。 次にこの中心周波数に対して、+/-何KHzもしくは+/-何MHzかの帯域幅を設定し、その範囲の周波数帯に限定して周波数対SWRのグラフをプロットさせます。 

Aa50swrgraph設定される帯域幅は任意ではなく

1,2,4,6,10,20,40,60

を基準とした予約数値で、グラフの周波数目盛となる縦線の位置が変わらないようにしました。 LWのときは最小幅+/-1KHz、最大幅+/-60KHzとなり、最高周波数の50MHzバンドでは、最小幅+/-100KHz、最大幅+/-6MHzとなります。 この幅はUP/DOWNキーで変更できます。

このように設定されたバンド幅で、周波数調整つまみをゆっくり回して、周波数が設定された範囲に入ったら、LCD画面上にSWRがプロットされます。

左の写真は、なんとか当初の狙い通り、SWRのプロットが出来るようになりましたので、私の7MHz用フルサイズ垂直DPのSWR特性をシャックの中で表示させたものです。

市販のアンテナアナライザーでスポット周波数をチェックし比較しても、ほとんど誤差なくグラフに表示されていますので、結構精度も出ているようです。

プロットされる周波数の分解能は設定されたバンド幅を222で割り算した周波数単位となります。 上のグラフの例では、バンド幅が400KHzですから400/222=約1.8KHzが最少分解能となります。 最少分解能が100Hzより小さくなると、グラフは線にならずドット表示になります。 

また、周波数を可変(スィープ)する速度が速すぎても、グラフは線にならずドットになりますが、これは、周波数カウンターが周波数を計測する時間間隔と、LCD上にドットをプロットする時間間隔によります。 このアナライザーの場合、コントロールマイコンのメインルーチンが1周するのに、約25msecかかっておりますので、周波数カウントの周期も25msec間隔となります。 ところが、LCD表示マイコンのメインルーチンが約42msecで1周しており、実際にグラフで表示されるのは、この42msec間隔となります。 ドット表示にしない為には、周波数変化スピードは42msecの間に、前述の最少分解能周波数以下である必要が有ります。 この条件を満足する為に、バリキャップ電圧回路に時定数回路を設け、電圧が急変しないようにします。 しかし、バリキャップ電圧の時定数を大きくし過ぎると、周波数つまみの動きと周波数変化の追従性の関係が悪化し、操作しにくくなりますので、実際に使いながら、時定数は決める事になります。 最終決定は、全て完成してから、ハードの定数をいじる事にします。

そして、ここまでのプログラム実装でROM容量が98%となりましたので、気が付いたバグや、操作性の改善、グラフ表示部分の見栄えなど、手を付けたくても不可となりました。

アンテナアナライザーの回路図をダウンロード

TFT LCDによる表示の詳細はこちらを参照下さい。

今後、マイコンのROMを128K品に変えて、完成度を上げる予定です。

後日、128K品に替えましたが、ハードやソフトの問題でなかなか思うように進行しません。 問題の様子はこちらに有ります。

アンテナアナライザーの製作(全機能組み込み) に続く。

INDEXに戻る

2015年6月25日 (木)

PIC24FV32KシリーズのEEPROM読み書き

<カテゴリー:PICマイコン

アンテナアナライザーのコントローラーとして、PIC24FV32KA302というマイコンを使っていますが、このマイコンに内臓されたEEPROMは、8bit系のマイコンとは異なり、プログラムメモリーのアドレス上に配置されています。 従い、EEPROMの書き込み読み出し方法は、従来の8bit系とは異なっています。

このEEPROMに書き込んだり、読み込む為の、サンプルプログラムはデータシートの中に出てくるのですが、イマイチ良く判りません。WEB上でサンプルを探しておりましたら、Microchipのホームページ内のFAQのところにひな形のプログラムがありました。 これをコピペしたら、エラーなくコンパイルされ、ちゃんと読み書きできました。

日本語ページでは、なかなか見つける事が出来ませんでしたので、以下そのソースを紹介します。

//データEEPROMへの読み書き

unsigned int eeRead(unsigned int address) {

  while(NVMCONbits.WR); // wait for any last write to complete

  TBLPAG = 0x7f; // eprom is a t 0x7ffe00

  return __builtin_tblrdl(0xFE00+address);

  }

 void eeWrite(unsigned int address, unsigned int data) {

   while(NVMCONbits.WR); // wait for last write to complete

   NVMCON = 0x4058; // Set up NVMCON to erase one word of data EEPROM

   TBLPAG = 0x7f; // eprom is a t 0x7ffe00

   __builtin_tblwtl(0xFE00+address, 0xffff);

   asm volatile ("disi #5");

    __builtin_write_NVM(); // Issue Unlock Sequence & Start Write Cycle

   while(NVMCONbits.WR); // wait for errase to complete

   NVMCON = 0x4004; // Set up NVMCON to write one word of data EEPROM

   __builtin_tblwtl(0xFE00+address, data); // Write EEPROM data to write latch

   asm volatile ("disi #5");

    __builtin_write_NVM();

   }

書き込みは下の1行です。

eeWrite(address,data);

addressがEEPROM内の相対アドレスで0から254までの偶数を指定します。

dataは書き込もうとするワードデータ(16bit)です。 書き込みは16bit単位で行われますので、8bit単位で行いたい時は、書き込む前に、ふたつの8bitデータを連結するか、空の8bit(例えば0x00)と書き込みたいデータを連結したワードデータを用意します。

読み出しは下の1行です。

DATA=eeRead(address);

DATAに16bitデータが格納されます。

PIC24FJ64GAシリーズのフラッシュメモリーに書きこむ例はこちらにあります。

INDEXに戻る

2015年6月24日 (水)

アンテナアナライザーの製作(SWR,R,Xの計算)

<カテゴリ:アンテナアナライザー>

50Ωダミー抵抗の場合、130KHzから64MHzまでSWR=1.0、R=50+/-1、X=0+/-0くらいの表示で収まっていますが、50Ω以外の抵抗では、大きく外れます。表示の数値が逆転する事はありませんが、曲りなりにも、デジタル表示付ですので、せめてSWR3以下くらいは、RもXもそこそこ表示できるように検討する事にしました。

今回、検波ダイオードに汎用品を使いましたので、当初から気にしていたRF電圧対検波DC電圧のデータを取る事にしました。

Aa50diode

上のグラフは、左が今回採用したRB751Sによる検波特性です。右は、SHF用ダイオードによる検波特性です。

グラフのX方向の目盛はADが出力したリニアデータで、Y方向は最大電圧を10000と定義したRF電圧です。 この二つのダイオードの大きな違いは、RF電圧が小さいとき、急激に直線性が悪化する度合いです。 RF電圧が小さい状態はインピーダンスの計測には影響が少ないですが、SWRの計測では、大きな問題になります。 一番知りたい、SWR1.5以下に大きな誤差が含まれます。 例え補正したとしても、その補正は相当クリチカルですから、安定して計測するには不向きです。 50Ωで校正して、100Ωで大きく狂うのは、このダイオードのカーブの性です。

やはり、アンテナアナライザーのセンサーとして、ダイオードを選定する場合、UHFやSHF用として作られたものを使わないと精度が落ちる事が判りました。 破壊強度は落ちますが、やむなくHSC285に変更する事にしました。

ルネサスのHSC285は個別販売していない上、生産中止品となっています。 現在も生産継続中のRFショットキーバリアダイオードで、アンテナアナライザーに使えそうな物としては下記3点が見つかっています。

RB861Y(ローム製):HSC285とほぼ同等。RSでバラ売り有り。 (Vfが0.1Vのとき順方向電流が0.1mAくらい)ただし、ワンパッケージ2個入りです。

HSMS-2850-BLKG (Avago Technologies製):HSC285とほぼ同等。RSでバラ売り有り。 こちらはワンパッケージ1個入りですが、外形のコンパチ性はありません。

JDH2S02SC (東芝製):Vfが0.1Vの時の順方向電流がHSC285の半分くらい。外形がHSC285とほぼ同じで、基板上での交換が簡単です。 ただし、バラ売りなし。 このダイオードの場合、アナログメーターだけなら我慢できますが、RやXをデジタル表示したい場合、使いたく有りません。

これらの高感度検波ダイオードは逆方向電流の温度依存性が他のダイオードより、きわめて大きいと言う欠点がありますので、そこは回路技術でカバー必要です。 また、逆耐電圧も数ボルトしかありませんので、普通のSWR計には使用出来ません。

前回の記事で、ベクトル計算による、R,X,SWRの算出方法を紹介しましたが、実験していくうちに、ダイオードの非直線性が、思った以上に大きく影響する事も判ってきました。 アンテナアナライザーで一番重要なデータは周波数とSWRです。  周波数はクリスタル制御のタイムゲートで測定しますので、そこそこの精度がでます。   問題はSWRのデータがいかに誤差が少ないかにかかっております。 ベクトル計算方式は、最初にダイオードの影響を補正しながらRF電圧を換算し、このRF電圧からRやXを求めて、さらに、このRとXから反射係数を求め、そして、反射係数からSWRを計算します。 VzとVsからそれぞれのRF電圧を補正しながら求めますので、この補正の時に大きな誤差が含まれます。 この誤差を含んだふたつのデータをベースにRやXを計算する事になります。 すなわち、誤差を2乗したようなものです。 一方、VzやVsからインピーダンスやSWRを直接換算する事もできます。  この場合も補正しながら換算する事になりますが、換算時のSWRやZの誤差は1回分だけとなります。  その変わり、RやXはこのふたつのデータから計算されますので、RやXには誤差の2乗が含まれる事になります。 しかし、RやXは 「アンテナアナライザーとインピーダンス」 の記事で取り上げたように、アンテナアナライザーとしては重要ではないので、VzやVsから直接ZやSWRを求める方がベターと思われます。 

もうひとつのADデータであるVoはそのレベルが大きく、ダイオードの非直線領域外での動作ですので、あまり影響は有りません。 ベクトル計算方法は理論的に正しくても、実際の測定器にはそぐわないのかも知れません。 

以上の経過からベクトル計算方式は諦めて、VzとVsからいきなりインピーダンスとSWRに換算する方式へ変更しました。 換算したZとSWRから以下の計算式でRとXを求めます。

Swrrxz

この計算式でRとXを算出し、50Ωダミー抵抗で校正を行い、3.5MHzバンドで100Ωダミー抵抗を装着すると、R=99、X=8、SWR=2.0と表示します。本来のXは0ではなく2くらいになるのですが、それでもかなりずれて表示している事になります。 まだ100Ωの時は校正されていません。 今後、校正プログラムが組み込まれたら、少しは改善するかも知れません。

校正プログラムはマイコン内部のEEPROMを使います。 このプログラム作成の前に、EEPROMの使い方を勉強する事になりました。 これが難解でやっとサンプルを見つけて、EEPROMの読み書きは出来るようになりました。

このEEPROMにラストバンドを書き込み、電源ON時に、このデータを読み込む事により、電源をOFFして、次に再度、ONしたとき、周波数はドリフト成分以外変化なしになります。 単3アルカリ電池3個で、消費電流は230mAくらいです。 単純計算では、連続8時間くらいはもちますが、実際の使用状態では、電池の消耗を気にして、ショッチュウPOWER-OFFしますので、ラストバンドメモリーは必須機能となります。

Aa50c100_2

このラストバンドメモリーの実装で、EEPROMの使い方が判りましたので、校正プログラムを仕込む事にしました。 コントロールマイコンからLCDマイコンへは一方通行の通信で、電源ON直後にLCD側が通信を受け入れられる状態かどうかが判らず、目見当で遅延時間を取り、データを送信するという、かなり適当な方法で、ふたつのマイコンのタイミングをとり、やっと、校正モード状態でのデータ推移が表示できるようになりました。

校正は3.5MHz付近の周波数で、50、100, 0Ωのダミー抵抗をつないだ状態とオープン状態の時の、それぞれのVZとVS及びVO(Osc電圧)をEEPROMに記録させます。記録が正しく実行されたかを確かめる為、LCD上にその記憶したデータが表示されるようにしています。 記憶スイッチ(今回はWIDTHキー)を押すたびにデータが書き換えられた事を確認できますので、安心できます。

このデータから、ZとSWRの校正を行います。校正ポイントは50Ωと100Ωになりますので、少なくともZ=50ΩとSWR=1.0、それにZ=100ΩとSWR=2.0は校正されます。 ただし、RやXの校正は行いませんので、50Ω以外の抵抗ではXがゼロにはなりません。 上の写真はたまたま、X=2を表示していますが、実際は0から7くらいまでばらつきます。 しかし、アンテナを調整する場合、この程度で十分ですので、これで良しとしました。

校正の仕方は実に簡単です。例えば、VZ50の下に1528という数字が表示されていますが、これは、50Ωダミー抵抗のとき、VZ(インピーダンスに比例したADの出力値)が1528であったという事です。 従い、ADが1528を出力したらZ=50Ωと定義します。また、VS100の下に0954という数値がありますが、これは100Ω時のブリッジ不平衡電圧をADが出力した値(VS)です。従い、VSが0954の時SWR2.0と定義します。 VS50の下の数値はゼロですから、ADの出力がゼロの場合、SWR1.0と定義します。 これで校正終了です。

50Ω、100Ω以外のインピーダンスの場合、0Ωから470Ωまでの16種類のダミー抵抗で実測したSWRとインピーダンスデータの表を作成し、このデータを基に「補間」技法で値を算出します。 (「補間」技法はプロの世界で、アンテナの任意の周波数のゲインを算出したい時などに利用されます。) これだけで、SWR10くらいまでなら、なんとかなります。また、10以上で数値が逆転するような事は有りません。 VOSCは校正データを取得した時の数値で、この電圧VOは常にチェックしており、校正時より現在のVOがどれだけ変化したかで、VZやVSの値を補正します。 VOは周波数を変えたり、温度が変わるとわずかに変化しますので、その変化分を測定データに反映させるためのものです。  VOSCとVZMAXは同じ電圧値になり、その1/2がVSMAXに一致しなければなりませんが、それぞれの検出回路に接続されたOP-AMPのゲインがバラツク事、VSは分解能を上げる為に2倍のゲインにしてありますので、AD値としては理屈通りにはなりません。 これは、計算時に理屈通りとなるように補正します。

LCDによるアナログメーターの動きを確認しました。 ほぼ予想通りの結果でした。

問題点は、LCDアナログメーターの応答速度と分解能です。 振れの速度は、0から無限大まで、約3秒かかります。 アナログメーターだけの場合、1秒以下で動いていましたが、デジタル数値の表示や電池残量表示を実際に動くようにしたら、ここまで遅くなってしまいました。 実際に7MHzのアンテナを接続し、共振周波数のチェックをしてみました。 指針の応答が遅いので、周波数調整つまみをゆっくりと動かす必要はありますが、共振周波数を見つける事はできます。 ただし、かなりぎこちないです。 現在指針分解能は1度きざみですから、本物のアナログメーターにはとても及びません。

現在1度きざみのサイン(sin)データのテーブルですが、これを0.25度きざみのテーブルに変更してみました。 指針の動きはかなり滑らかになりましたが当然、0から無限大までの時間は10秒近くになってしまいました。 そこで、小細工です。 ターゲットの角度に対して遠い時は1度刻みで送り、近くなったら、0.5度刻みにし、さらに近くなったら0.25度きざみで送る事にしました。この処置により、周波数可変つまみの動きに対して、指針の追従性がかなり改善し、SWRのデイップ点を探すのがスムースになりました。 しかし、まだ、納得いくレベルでは有りません。

次のステップとして、アナログメーターを消して、そのエリアに周波数対SWRのグラフデータを描かせるのですが、 現在の状態で、LCDマイコンのROM容量が93%になっています。  残り7%のROMで、完成は無理ですので、せめてSWRのグラフデータだけでも実現させるべく、トライします。

 

アンテナアナライザーの製作(SWRカーブの表示) に続く

INDEXに戻る

2015年6月17日 (水)

アンテナアナライザーの製作(コントローラー)

<カテゴリ:アンテナアナライザー>

RFブリッジのセンサー回路広帯域RF発振器がほぼ完成したので、次は、これらのアナログ回路の発振周波数を計測する周波数カウンター、SWRやインピーダンスの計算の基になる、センサー回路からのDC電圧計測機能、そしてこれらのデータから、SWRやZ,R,Xを計算する機能を持ったコントロール回路の製作に入りました。

このコントロール機能はLCDドライバーとは別の品種となるPIC24FV32KA302という16bitマイコンで構成します。このマイコンチップを選んだのは、内臓されているADが12bit品であるからでした。 過去、PIC16F1939で、予備検討した時のADは10bit ADでしたが、分解能にいまひとつ不満が有りました。 例えば、リアクタンスを表示するときの最少分解能が4Ωくらいしかなく、表示される数値は0,4,8・・・のように変化するものでした。 今回12bitのADを、仕様書通りに使いこなせば、0,1,2,3・・・のように変化する数値が得られると考えます。 ただし、10bitのときでも、なかなか、仕様書通りの性能が出ませんでした。それは、アナログの値がそこまで安定しなかったり、ノイズで差が出なかったりが原因で、これらの最大の原因はDC/DCによる電源のノイズでした。 今回、2回路のDC/DCを使いますので、もっと条件は不利になりますが、わざわざ12bitのADを使った価値が出せるかトライする事にします。

 

Aa50lcd0_2

Aa50pic1_2

上の写真はコントロールマイコンからUART経由でデータを受信して、LCD上に表示したショットとLCD基板の裏側に配置したふたつのPICマイコンです。 完成したあかつきには、ケースに入れ、操作が出来るように操作キーもLCDの隣に実装してあります。 一番下の赤のキーが電源でその上の、2個の青キーはバンドのUPとDOWNです。さらに緑の3個のキーがありますが、この時点では、何をするキーか決めておりませんが、マイコンのi/oへの配線だけはやってあります。  通信は38.4Kボーの一方通行です。 画面に示すLCD表示に関しては、ほぼプログラムの実装を終えています。 今後、周波数対SWRのグラフを描かせるためのアルゴリズムを検討し、その内容に従い、LCD表示のデザインをする事になりますが、その前に、アンテナアナライザーの基本機能として、周波数、SWR,インピーダンス(Z)の表示が出来るようにします。

まず、周波数表示ですが、今回採用したPIC24FV32KAのタイマーは他のPIC24FJシリーズと同じような構成になっていますが、設定レジスターが微妙に違うようです。 今回の周波数カウント最大値は100Hz単位を表示する為、 640,000を超えますので、 20bit以上のカウンターを必要とします。  TIMER2とTIMER3を連結して32bitカウンターがレジスターの設定のみで出来ますが、このタイマーは同期タイプで、外部カウントできる周波数上限は10数MHz止まりですので、今回は使う事が出来ません。 外部クロックでカウント可能な非同期カウンターはTIMER1の16bitしかありませんので、これにソフトで作った16bitカウンターを連結して32bitカウンターとしました。 TIMER1にプリセット値として64000をセットし、カウンターが64000になったらT1IFが1になりますので、これが1になる度に、ソフトカウンターをインクリメントするという手法で100MHzくらいまでは動作できるカウンターに仕上がりました。 T1IFフラグは割込み設定やT1IEの設定に関係なく立ちますので、カウンターモードに入ったら、全ての割込みを禁止します。 TIMER1のプリセット値を65536すなわち0000にしたら割込みフラグが立ちません。さらに、TIMER2で20msecのゲート時間を作った後、いくつかのNOP命令でこのゲート時間を微調整しますが、この微調整の時間内にTIMER1がキャリーオーバーしないように小さな値にしてあります。

周波数カウンターの校正は、ゲート時間を正しく20msecに調整するのではなく、正確な基準周波数を入力して、その基準周波数と同じ数値になるようにNOP命令の数を調整し、調整しきれない時は、水晶発振周波数をトリーマーで微調整します。  正確な基準周波数は10.00000MHzのWWVHをゼロビートで受信できるようにトランシーバーを調整しておき、受信周波数を10.12000MHzに設定した後、CW送信モードにして、この信号を入力したとき、カウンターの数値が10.1200になるようにトリーマーを調整するだけです。 もちろん、この調整の前に、受信周波数と、送信周波数にずれが無い事を、もう1台の受信機で確かめておきます。

次は、12bit ADの取り込みです。 インターネット上から、PIC24FJ用のADサンプルプログラムを入手し、4チャンネルのADが使えるようにプログラムしたのに、読み込んだデータはどうも10bitのようです。PIC24FV32のデータシートには12bit、10bit選択のレジスタービットは無効と書かれていますので、何もせずとも、12bit ADで動作すると思ったのですが、そうではないようです。ためしに、この12bit/10bitの選択ビットに1をセットしたら、12bit ADの動作となりました。このデータシートは英文も、日本文もこの部分は間違っているようです。

ADのデータを読めるようになりましたので、その数値を加工なしで、ベクトル計算し、R,X,Z,SWRを求め、LCD上に表示させる事にしました。

Aa50test1

上の写真は、50Ωのダミー抵抗を接続した状態で、ADのデータを補正なしで計算させたものです。 本来はZもRも50Ωとなり、SWRは1.0にならなければなりませんが、補正が出来ていませんので、R=36、X=15と表示されています。 このRとXの時の計算されたSWRは1.6ですから、SWRの表示は正しく表示されている事になります。

このRとXが50と0にならない最大の理由は検波ダイオードの非直線の性です。 これを正しく補正してやると、アナライザーは期待した通りの数値を表示する事になります。 

ここで、この製作の中でやろうとしているベクトル計算のアルゴリズムを紹介する事にします。 この方式はアンテナのインピーダンスが50Ω近辺なら、かなり精度が出ますが、SWRが2を超える当たりから誤差が大きくなります。 しかし、私たちがアンテナを調整する場合、SWR2以下の数値はそれなりに精度が出て欲しいですが、SWR2以上の場合、例えばSWR3とSWR4が逆転しない程度しか要求されません。 

Swrzrx1 上のJPGが測定原理を示したものです。 クリックしたら拡大します。 そして、下の黄色に塗った部分の式がこの原理から算出された、各データを得る為の式です。

 

Swrzrx3_2

 これらの計算を32bit浮動小数点型式で計算する事により、アンテナアナライザーとして表示したい数値が得られます。

ただし、単純に、この計算式をC言語で書いても、プログラムはすぐに暴走します。原因は、0で割り算したり、負の値を平方根した事によります。アンテナ端子に何もつながないときや、ショートした時の例外処理を入れておかないと、たちまちエラーになりますので、この例外処理は実験しながら、挿入位置を吟味する必要があります。

また、周波数やAD値のチラツキが目立ちます。特に、Zが100Ωを超えた当たりからのAD値のチラツキは激しく、メーターの指針も安定せずに、フラフラ揺れてしまいます。メカニカルのアナログメーターなら、安定して指示しますが、デジタル駆動ではそうはいかないみたいです。

Aa50test2

とりあえず、アンテナアナライザーの基本動作は出来るようになりましたので、AD値の補正方法を確立させ、校正プログラムを組み込むと、SWRのグラフィック以外、完成となります。SWRのグラフィック表示は、周波数のSWEEPをハンドで行う必要があり、確定したアルゴリズムは、まだ有りません。

かねてより考えていた、ダイオードで検波したDC電圧から、元のRF電圧を換算する計算式をプログラムの中に仕込んでみました。 50Ωのデータで校正してありますので、左の写真のごとく、ちゃんと50Ωのダミー抵抗を正しく測定して表示しました。しかし、校正していない100Ωのダミー抵抗では、R=87,X=36と表示し誤差が出ます。 今後この誤差を詰めていきます。 まだ確実なアイデアではありませんが、試行錯誤しながら解決策をみつけようと、このアンテナアナライザー製作の企画を思いついた次第です。 そして、やっと、その実験道具が出そろいましたので、ああでもない、こうでもないと、いつ終わるか、いつ投げ出すか、結論の見えない製作記事が続く事になります。

その後の検討で、ここで紹介したベクトル計算によるRやX、SWRの算出方法は現実的でない事が判ってきました。 その内容は次の記事で紹介しております。

アンテナアナライザーの製作(SWR,R,Xの計算) へ続く。

INDEXに戻る

2015年6月12日 (金)

アンテナアナライザーの製作(広帯域発振器)

<カテゴリ:アンテナアナライザー>

疑似両面基板で作ったブリッジ回路とインピーダンス、SWRセンサー回路に市販のアンテナアナライザーを接続し、インピーダンスやSWRに比例したDC電圧を取り出すことを確認できましたので、いよいよ、アナライザーの心臓部とも言える、広帯域発振器の製作にとりかかりました。

基板は、ブリッジ部分と同じように疑似両面基板として、過去検討した事のある回路をベースに、一部電源電圧の変更などの理由から抵抗やコンデンサの値を変えながら組み立て、とりあえず、18MHzから54MHzまでをカバーする発振回路の動作確認を行う事にしました。  この周波数帯がOKなら他のバンドは簡単に実現できると考えたからです。  しかし、それは甘い考えでした。

今回のアナライザーは単3アルカリ乾電池3本による4.5Vの電源をベースに、一度14Vのバリキャップ用電源をDC/DCで作った後、その14VをさらにDC/DCで5Vに変換し、アナログ回路を動作させ、5VからLDOで3.3Vを作り、これでアナライザーの計算部分を担当するPIC24FV32KA302とLCDの表示を担当するPIC24FJ64GA004とLCDそのものの電源をまかないます。 これらの電源をON/OFFするのはPIC12F675に任せます。電源OFFの時は、数秒後にSLEEPモードに入り、消費電流はナノアンペアとなります。

DC/DCからのノイズを比較的簡単に対策する方法を紹介します。 回路部品の配置や接続方法は大抵のDC/DC ICのデータシートに推奨パターンや配線方法が記載されていますので、それを踏襲しますが、その通り実現するには、チップ部品がマストです。その上で、この回路を両面基板の片面のみで構成させ、反対面にあるGNDラインに1点で接続します。 DC/DCのGNDラインのどのポイントを接続するかは、思案のしどころですが、DC/DCの入力も出力もきれいな直流電流ですので、DC/DCのパルス電流が流れていない所を選べば問題有りません。 しかし、GNDパターンは全て同一の導体ですから、どこでも同じではないかと言われるかも知れませんが、電流は常に最短距離を流れようとしますので、回路素子の接続ポイントを最短で結んでいくと、パルス電流が少ない場所を見つける事ができます。

マイコンが3.3Vで動作しますので、マイコンのADに加えることが出来るDC電圧は最大で3.5Vくらいしか許容できません。 ところが都合の良い事に、バッファアンプがLM358ですので、このアンプを5Vで動作させた場合、出力されるアナログの最大電圧が3.5Vくらいしかなく、ちょうど良い電源電圧設定となっています。

Aa50osc2

左の写真はそのようにして組み立てたOSC基板です。左上の一角は電源回路で4.5Vの電池から14V、5V、3.3Vの電圧を作っています。

右下の一角に広帯域発振回路を配置し、とりあえず18-54MHzバンドのみ実装してあります。 そして、この発振器の出力は4ピンのコネクターを経由してブリッジ回路に接続されています。 最初に電源投入したときは、発振動作せず悩みました。 原因は1608の抵抗電極がはげ落ちて抵抗の役目をしていない部分があり、正帰還がかかっていなかったものでした。

なんとか発振するようになりましたが、動作はかなり不安定です。 基板に手を近づけたり、オシロのプローグを当てるだけで、発振の振幅が大きく変わり、時にはブロッキング発振を伴ったり、停止したり、矩形波になったりです。 高周波の正帰還発振回路にDC負帰還をかけて、出力を安定させるのですが、ブロッキング発振を誘発します。 これは、負帰還回路の時定数だけでなく、RFの回り込みによる正帰還ループの変化にも関係します。 最初に実験した回路はセンサー基板とOSC基板をリード線で接続していましたので、機械的に固定されていなく、対策の立てようが無いという状況でした。

そこで、センサー基板と発振基板をピンヘッダーとソケットで固定し、3D構造が変わらないようにする事で、発振回路はかなり安定させました。 ここでの「安定」の意味は、バンド全域できれいに発振している状態ではなく、周波数や出力レベルを変えた時、正常発振やブロッキング発振や、発振停止が決まって起こるという事で、「安定」して、うまく動作しないという意味です。

Aa50osc5_2

Aa50osc6_2

ひび割れたセラミックコンデンサの交換や、ハンダがついていいない端子の修復などを行った結果、18-54MHzがなんとか正常に発振し始めましたので、5-20MHzバンド、1.6-6MHzバンド、130-500KHzバンドを追加しました。  マイコンがまだ接続されていませんので、バンド切り替えは、ロータリースイッチで行えるよう仮配線しました。 選択された各バンドの共振回路を発振回路に接続する為の高周波用PNPトランジスタの選定は重要で、今回はパナソニック製を使いましたが、コレクタ容量が1PF以下のPNPはそれほど多くないので、手配に苦労します。 フェアチャイルドのMMBTH81が最適ですが、これも入手は難しいです。 ただし、ONセミコンが同名のセカンドソースを出していますので、使えるかも知れません。

発振回路に使用しているFETはデュアルゲートである必要はありませんが、UHF帯まで比較的簡単な回路で使えるFETはデュアルゲートのものが選択子として広がります。 この回路ではNXP製のバイアス回路内蔵のFETを使いましたが、バイアス回路が無いので、外付けでバイアス回路を追加する必要がありますが、東芝の3SK293などでも代替え可能です。

周波数確認はオシロの水平目盛を読んで、おおまかな周波数を知るという仮組み立て状態にしておき、 電源ラインに電解コンデンサによるデカップリング回路を追加したり、回路ブロックごとにラインチョークを入れたり、抵抗、コンデンサの値を吟味して、1.6MHz以上はなんとか安定して発振させる事に成功しました。

次は、問題の500KHz以下の発振回路です。 過去、1MHzくらいまでは、発振実績がありましたが、今回、目標とする周波数はLW(ロングウェーブ)です。500KHz以下を発振させるのは、VHFの発振回路より難しく、ブロッキング発振が止まりません。 昔、現役のころ、ヨーロッパ向けのLWラジオを設計した事がありました。 受信周波数は145KHzからですが、局発はそれより455KHz高い、600KHz以上の周波数ですから、あまり苦労せずに出来た記憶があります。 今回はその時の周波数の1/4くらいで、LC発振器よりCR発振器の方が簡単という周波数帯です。 とりあえず、なだめすかして、やっと130KHzくらいまで発振できるようになりました。 ところが、この回路条件では、1.6-4MHz当たりが発振しなくなります。 全バンドうまく発振する為の定数選びをカット&トライする事、丸2日。 アナログ回路は、デジタル回路と違い、誰が何回作ってもうまく動作するとは限らないという所が苦労の種ですね。 このアナログ回路がLWからVHFまで安定に動作する為のカナメはR20とC17及びR23とC18の定数にかかっています。この4つの定数を最適化する事により広帯域発振回路が成功するか否かが決まります。

 

Aa5064mhz_2

Aa50500khz_2

Aa50130khz_2

 上のオシロ画面は、左から64MHz、500KHz,130KHzの発振波形です。 130KHzではかなり歪みがありますが、とりあえず安定して発振させる事ができました。 オシロの波形を見ていると、周波数が高いほど、RF信号の波高値が高くなっています。 これは、オシロのプローグの周波数特性が原因のようです。スペアナでチェックすると130KHzから64MHzまで+/-1dBくらいで収まっていました。 オシロのプローグは秋月から買った100MHz用ローコスト品ですから、こんなもんかと諦めています。  最高周波数は54MHz以上という目標にしましたが、実際には65MHzくらいまで発振します。周波数範囲が不必要に広いと、周波数調整がクリチカルになりますが、とりあえず、現状でおいておきます。 気になるようでしたら周波数調整用可変抵抗器の上下にシリーズに入れた抵抗値を調整できます。

検波に使ったダイオードはRF用ではないので気にしていましたが、50MHz付近までは問題ないようです。 以外と好結果を出すのが1N60ですが、サイズがでかすぎて、ブリッジ回路をうまく組めませんので、今回は、この汎用ダイオードでいく事にします。 

この状態で、インピーダンス検出DC電圧やSWR検出DC電圧をデジタルテスターでチェックすると、なまいきに、インピーダンスやSWRに比例した数値を表示します。 機械式アナログメーターに半固定抵抗をシリーズにつなぎ、50Ωや100Ωのダミー抵抗で校正し、目盛板に目盛を書き込めば、クラニシやコメットのアナライザーと同じくらいの精度で動作をします。 しかし、今回はここで終わりではなく、 すでに試作したLCDアナログメーターに表示させるところまでやります。

アンテナアナライザーの回路図をダウンロード

まだ、マイコンが接続されていませんが、マイコン回路込みの配線図となります。

コントロールマイコンがそこそこ動くようになると、アナログ回路も気になるようになります。 130KHz付近でレベルが変わる問題や、デジタル表示の誤差の問題から、低い周波数での発振波形歪みの改善、ダイオード検波の非直線性の改善など行い、アナログ回路はほぼ完成しました。 ダイオードはRB751SからHSC285に変更しました。

最終的な発振波形は以下の通りです。

Aa5064m_2

Aa507m

Aa50470k

Aa50130k

このアナライザーの周波数範囲は118KHzから546KHzまでと、1.4MHzから64MHzまでとなり、これらを4つのバンドに分割してカバーします。

 

アンテナアナライザーの製作(コントローラー) に続く。

INDEXに戻る

2015年6月 3日 (水)

アンテナアナライザーの製作(センサー回路)

<カテゴリ:アンテナアナライザー>

TFT LCDを使い、アンテナアナライザーの表示部分の試作を行いましたが、実際に動作させるには、アンテナアナライザーのハード部分が必要になります。 手っ取り早いのは、市販のアンテナアナライザーを買ってきて、そのアナログ回路から必要な信号のみをもらい、マイコンのADにつなげばテストはできますが、それでは、自作の意味がありませんので、多少時間がかかろうとも、アンテナアナライザーの自作にトライする事にしました。

アマチュアがRF回路のかたまりの製品を自作しようと思ったとき、一番困るのがプリント基板です。 メーカーに頼めば、数万円かかりますし、自作しようとすると、メーカーに依頼する以上の初期投資が必要になります。 ここにあまりお金をかけたくありませんので、最高周波数を、手作りでなんとか扱える50MHzバンドまでに限定し、代わりに136KHzをカバーできるアナライザーとする事にしました。

Aasensor1左の写真は2.54mmピッチの蛇の目基板に1608のチップ部品を載せて作った、インピダンスブリッジとセンサー回路です。 

この基板の裏側には厚さ0.1mmの銅箔を両面テープで張り付け、両面基板と同じ構造にした上で、アースが必要な部品は、銅線によるスルーホールで裏側のGND面に直につないであります。

Aasensor2

3個の49.9Ω抵抗でブリッジを組み、4個めの抵抗の代わりに、M型コネクターをつなぎ、ここにアンテナを接続します。 ブリッジ回路には、ショットキーダイオードによる検波回路を3回路接続し、アンテナのインピーダンスに比例したDC電圧、アンテナのSWRに比例したDC電圧、広帯域RF発振器にNFBをかけて、全帯域でフラットな出力を得る為の発振出力に比例したDC電圧を出力させます。

このセンサー部分の構造で、使用可能な最大周波数が変わります。この手作り疑似両面基板の場合、50Ωのダミー抵抗を接続した場合、100MHzくらいまで、SWR1.0をキープできますが、200MHzくらいまで、周波数を上げるとSWR1.1くらいになってしまいます。 もし、500MHzくらいまで、SWR1.0をキープしたい場合、ガラエポによる正規の両面基板に、全てチップによる部品を実装し、これでもかと言われるくらいスルーホールを追加しないと実現できません。 クラニシのアナライザーを修理した時、ほとんど、リード付の抵抗、コンデンサやダイオードを使っており、200MHz以上で、SWR1.1以下にならず、その実装に苦労した事がありました。 類似モデルを再設計したときの対策は、ストリップラインを短くする事。 短く出来ない場合、GNDと信号ラインを可能な限り幅広くしました。 VCCラインや制御用ラインは基板が生産できる最少幅(0.2mm)まで狭くし、その代りGNDと信号ライン(200MHzが流れるライン)は3mmくらいまで拡大した結果300MHzまでSWR1.01をキープできました。 ここで、悟った事は、少なくともブリッジを組む回路だけはチップ部品を使うという事です。 クラニシのアナライザーでも、ブリッジの50Ω部分だけはチップ部品を使用しています。 ただし、ブリッジの回路に接続する検波用ダイオードがリードタイプの為、これを交換したとき、なかなか正常時のSWRが確保できず何度も作り変えた事がありました。

また、周波数カウンターの入力信号用として、プリスケーラーで1/2分周した信号を取り出します。 周波数カウンターのカウントに使うマイコンは、最大カウント周波数として50MHzまで保証されており、例え54MHzでも実力で動作しますので、本来はプリスケーラーは不要なのですが、発振回路と同じ周波数の信号を引き回しますと、異常発振が起こる可能性が高く、あえて周波数を下げてあります。 異常発振対策としては、1/2より1/4分周のほうがより安定しますが、この分周比を大きくすると、カウンターのゲート時間も、その比の分だけ長くする必要が生じます。 今回は100Hz単位での周波数表示を行いますので、基本のゲート時間は10m秒必要です。 これに1/4のプリスケーラーを設けると、ゲート時間は40m秒必要となります。カウンターの周波数表示は40m秒でも問題ありませんが、インピーダンスやSWRの元データ取得周期も40m秒間隔となりますので、後々弊害が出るかも知れません。 とりあえずここは1/2に留めて置きます。

センサー部分に使う検波用ショットキーダイオードは、非常に重要で、今回は、壊れにくいロームのRB521Sというものを使いましたが、高周波用ではないので、20MHz付近を過ぎたあたりから、次第にDC出力が落ちてき、50MHzでは約30%くらいダウンします。 そこで、430MHzでSWR計に使用した実績のある、RB751Sを秋月から購入し、交換しました。 同じようなDC検波テストを行うと50MHzで約5%のダウンです。 DC出力が5%ダウンしたら、インピーダンス指示も5%ダウンする訳ではなく、NFB回路が動作して、指示は変化が無い代わりに、RFの出力が5%上昇します。 5%のRF出力上昇は一応許容範囲ですので、RB751で進行する事にします。

ただし、RB751は電流容量が小さいので、破壊耐力も小さくなっています。  メーカー品のアナライザーに使われているショットキーダイオードはGHz帯まで使えるものを使用しているようですが、これらの破壊耐力はもっと小さくなっています。この為、かなり特別な対策を行っているようです。 

MFJやクラニシが発表したアンテナアナライザーの最大の特徴は、少々手荒く扱っても壊れにくいというものですから、世界中で普及したと考えられます。 プロが使うVNAなどを同じように扱うとすぐに壊れますので、精度は高いが高価なVNAを選ぶより、せいぜい25Ωくらいから100Ωくらいまでしかカバーしない、ダイオードによる検波方式の方がアマチュア向きなのでしょう。 

出来上がったセンサー基板です。  実際に発振器やマイコンとつないだ時は、若干いじる必要があるかも知れません。

Aasensor3

Aasensor4

その後の検討で、ショットキーダイオードはRB751でも問題があり、最終的にダイオードはSHF用検波ダイオードHSC285に変更しました。 配線図も修正してあります。

センサー部分の配線図をダウンロード

センサー基板が、なんとか完成しましたので、次は広帯域発振器の製作にかかります。

アンテナアナライザーの製作(広帯域発振器) へ続く。

INDEXに戻る