Top Page Hi-Q-4/160 コントローラ製作
自作工程のメモとして
Jan.2013


  ホームページ上への掲載が年を越してしまいましたが、先日掲載しました「Hi-Q-4/160 RT MC-2 設置」に続いて、SD-330用に作ったコントローラを、Hi-Q-4/160に対応できるように改造しました。
そのため、前作と一緒に見ていただければ概要が分かると思います。

改造の主な内容は、モーターの回転を検出するセンサー(リードSW)の処理と、上限・下限にモーター位置が達したときにモーターを停止させる内容になります。これは、SD-330用に製作した時にも、あらかじめ回転検出用のポートを使うつもりで準備して有りました。

なお、SD-330との共用性を考えて、周波数の低い方向へのモーター移動をUP、高いほうへの移動をDownとして扱っています。
更に、高い周波数方向の端をホーム位置(カウンタ:ゼロ)として定義しています。これは、多用する周波数(7MHz〜21MHz)に近い位置に有り、ホー ム位置からのモーター移動時間が少なくて済むことから、反対側をホーム位置(カウンター:ゼロ)にするソフト上の設定は、今のところ考えていません。

動作中のビデオを追加しました。
(HP編集フリーソフトのComposerで、編集時に動画のプレビュー画面が出るようにするため、画像ファイルの形式を換えましました。2013/12/15)


操作対象のHi-Q-4/160アンテナ

 

 

1.センサー&モーター回路変更・追加

 回転センサー用の回路は、当初プルアップだけしたような簡単な回路を考えていましたが、アンテナエレメントの中でON/OFFする信号を扱うためMFJの回路を参考にさせていただきました。
また、モーター回路の過電流検出は、まねをする人は居ないと思われるような、変則的な回路構成をしています。

■ センサー信号受け回路と、モーター過電流検出回路

 

センサー回路はそのままですが、モーターの過電流検出はハイブリッドIC(TA7291P)のGNDラインに直接 1オーム(1Ω:1W)の抵抗を入れて検出しています。この抵抗によるグランドラインの変動は、0.3Vから0.7Vぐらい発生しますが、Vinのレベル が十分にあり誤動作はしていないようです。また、Vinにマイナスのバイアス電圧がかかりますが、今のところ問題は無いようです。

また、モーター回路にも5オーム(5Ω:2W)を直列に挿入しています。これは、モーターが上端・下端で停止したときに流れる電流を制限する目的で 入れています。この5オームにより、通常は、約1.5Vの電圧降下、モーター停止時は、約3Vの電圧降下が発生しますが、回転が極端におかしくなることは 無いようです。


■ 回転センサー受け基板

SD-330用を改造したため、メイン基板上に増設する十分なスペースが無く、コネクター近くにサブ基板を取り付けています。RFC(101)は、10年以上前に買ってあったと思われる手持ちの品を使っています。

■ センサー信号前処理回路

ここでは、直接PICに信号を取込むのではなく、コンパレータ(LM393)を使って前処理して、PICの割込みとして取込んでいます。これ は、PICのA/D変換はSWR検出に常時使っているため、Vref+に2.0V前後をかけており、0.5V前後の変化を読み取る精度とソフト処理の手間 を考えての選択となりました。
左側回路のボリューム:VRは、VCKピンにて0.5V前後になるように調整しています。

回転検出(右図)も、もう一つのコンパレータ回路を使って、ヒステリシスを多めに効かしたバッファー回路を入れています。この為かは分かりませんが、回転検出のミスは今のところ無いようです。

■ センサー信号前処理基板

  

今回も一品物のため、穴あき基板にそのまま配線しました。また、メイン基板のスペースも少なく、回路変更・追加時にメイン基板を外す手間を考え、二階建て構成にしました。(小亀基板)
裏面には少し多めにコンデンサーを追加していますが、こんなときもメイン基板を取り外さなくて良いことから、小亀基板は成功でした。

■ 全体回路

バイパスコンデンサ等の追加は、回路図上では、省略する場合があります。

 

2.ソフト処理

ここからがソフトウェアー処理です。ここでは主なものを参考までに記述しておきます。

■ ホイップ毎のアンテナの回転位置と最大・最低周波数のセット

 
// Hi-Q-4/160 専用パラメータSTART ----------------------------------------------
unsigned short int Max_freq = 22;       // 22MHz  Whip.72インチ(MFJ-1964:1.82m)
unsigned short int Min_freq = 2;        //  2MHz  Whip.72インチ(MFJ-1964:1.82m)
unsigned short int Rt1_8 = 255;                // for 1.8MHz
unsigned short int Rt1_9 = 255;                // for 1.9Mhz
unsigned short int Rt3_5 =  85;                // for 3.5MHz
unsigned short int Rt3_6 =  82;                // for 3.6MHz
unsigned short int Rt3_7 =  80;                // for 3.7MHz
unsigned short int Rt3_8 =  76;                // for 3.8MHz
unsigned short int Rt7_0 =  35;                // for 7.0MHz
unsigned short int Rt7_1 =  34;                // for 7.1MHz
unsigned short int Rt10  =  23;                // for 10MHz
unsigned short int Rt14  =  15;                // for 14MHz
unsigned short int Rt18  =   9;                // for 18MHz
unsigned short int Rt21  =   4;                // for 21MHz
unsigned short int Rt24  = 255;                // for 24MHz
unsigned short int Rt28  = 255;                // for 28MHz
unsigned short int Rt50  = 255;                // for 50MHz
long Freq_Max_tmp;
long Freq_Min_tmp;
// Hi-Q-4/160 専用パラメータEND ------------------------------------------------

 ここでは、あらかじめソース上に設定していますが、設置条件やホイップエレメントの長さによって同調する周波数範囲と、それぞれの 大まかな回転位置が決まってきます。そのため、範囲を超えて同調位置を検出しないためと、バンドチェンジ後の移動位置をセットしておき、その位置に到着し た後に詳細な位置調整をする方式をとります。
この数値は、私の環境でWhipにMFJ-1964を使ったときの物です。プログラムの書込みで初期化されるたびに入力するのが手間で、あらかじめセット してますが、今のところEEPROMに4本のWhipを選択・編集して格納できるようにしています。設定できるWhipの数は、EEPROMの容量 (256バイト)に依存しますが、10本以上は可能です。

■ バンド選択における回転位置の取り込み

 
int Posi_Cal( long Band_data )
{
    int ustmp = 255;

    if ( Band_data >= 6000000 ){
        if((Band_data >= 7000000 ) && (Band_data <= 7099999 )) ustmp = Rt7_0;
        if((Band_data >= 7100000 ) && (Band_data <= 7200000 )) ustmp = Rt7_1;
        if((Band_data >= 10100000 ) && (Band_data <= 10150000 )) ustmp = Rt10;
        if((Band_data >= 14000000 ) && (Band_data <= 14350000 )) ustmp = Rt14;
        if((Band_data >= 18068000 ) && (Band_data <= 18168000 )) ustmp = Rt18;
        if((Band_data >= 21000000 ) && (Band_data <= 21450000 )) ustmp = Rt21;
        if((Band_data >= 24890000 ) && (Band_data <= 24990000 )) ustmp = Rt24;
        if((Band_data >= 28000000 ) && (Band_data <= 29700000 )) ustmp = Rt28;
        if((Band_data >= 50000000 ) && (Band_data <= 54000000 )) ustmp = Rt50;
    }else {
        if((Band_data >= 3745000 ) && (Band_data <= 3805000 )) ustmp = Rt3_8;
        if((Band_data >= 3702000 ) && (Band_data <= 3770000 )) ustmp = Rt3_7;
        if((Band_data >= 3680000 ) && (Band_data <= 3687000 )) ustmp = Rt3_6;
        if((Band_data >= 3500000 ) && (Band_data <= 3612000 )) ustmp = Rt3_5;
        if((Band_data >= 1907000 ) && (Band_data <= 1913000 )) ustmp = Rt1_9;
        if((Band_data >= 1810000 ) && (Band_data <= 1825000 )) ustmp = Rt1_8;
    }
        return ustmp;
}

 単純な処理ですが、バンドデータ(ヘルツ単位)をCI-V又は手動で設定し、このルーチンから回転数をリターン値として受け取り、処理しています。
ここで示すアマチュアバンド以外の周波数帯については、自動で同調しません。BCLとして使用する等の需要があれば、パラメータ(RtXX)の追加と、判断を追加すれば可能となります。
また、その場合でも送信しないため、近くのアマチュアバンドから手動SWでモーターを回して、近くに合わせることも可能です。(あらかじめ放送帯毎の大まかな回転位置を、SWRアナライザー等を使って調べておく)

 

3.SWR計算

前作のSD-330用のコントローラの時から、アンテナの同調状態をLogアンプの出力値でみていましたが、Hi-Qに対応したのを機会に、擬似SWR値で表示するように変更しました。

■ 変換ルーチン

 
char Swr_Cal( int AD_data )
{
    char swrtmp = 0;

    if ( AD_data >= 877 ){
        if(Ad_data >= 924 ) swrtmp = 99;
        if((923 >= Ad_data ) && (Ad_data >= 921 )) swrtmp = 29;
        if((920 >= Ad_data ) && (Ad_data >= 918 )) swrtmp = 28;
        if((919 >= Ad_data ) && (Ad_data >= 914 )) swrtmp = 27;
        if((913 >= Ad_data ) && (Ad_data >= 911 )) swrtmp = 26;
        if((910 >= Ad_data ) && (Ad_data >= 906 )) swrtmp = 25;
        if((905 >= Ad_data ) && (Ad_data >= 902 )) swrtmp = 24;
        if((901 >= Ad_data ) && (Ad_data >= 897 )) swrtmp = 23;
        if((896 >= Ad_data ) && (Ad_data >= 891 )) swrtmp = 22;
        if((890 >= Ad_data ) && (Ad_data >= 885 )) swrtmp = 21;
        if((884 >= Ad_data ) && (Ad_data >= 877 )) swrtmp = 20;
    }else {
        if((876 >= Ad_data ) && (Ad_data >= 869 )) swrtmp = 19;
        if((868 >= Ad_data ) && (Ad_data >= 859 )) swrtmp = 18;
        if((858 >= Ad_data ) && (Ad_data >= 848 )) swrtmp = 17;
        if((847 >= Ad_data ) && (Ad_data >= 834 )) swrtmp = 16;
        if((833 >= Ad_data ) && (Ad_data >= 816 )) swrtmp = 15;
        if((815 >= Ad_data ) && (Ad_data >= 794 )) swrtmp = 14;
        if((793 >= Ad_data ) && (Ad_data >= 762 )) swrtmp = 13;
        if((761 >= Ad_data ) && (Ad_data >= 711 )) swrtmp = 12;
        if((710 >= Ad_data ) && (Ad_data >= 596 )) swrtmp = 11;
        if(595 >= Ad_data )  swrtmp = 10;
    }
        return swrtmp;

非常に大まかな処理ですが、Picで読みとった数値をAD8307のデータシートの特性に合わせてエクセルで表を作り、SWR値の小数点以下2桁目 を四捨五入して、1.0〜2.9(それ以上は、9.9と表記)を返しています。(表示ルーチンで、2桁の数字の間に小数点を挿入して表示しています。)
一度、MakroCの関数を使って計算で求めようとしましたが、オブジェクトコードの容量が一気に増加したため、簡易的な処理に落ち着いています。

算出は、AD8307の入力レベルと出力レベルの傾き(-20dB=0.5V)から、PicのAD入力1/1000(VrefでMAX値を1000として調整)当たり0.08dBの変化があると仮定。

先ず、リターンロスの指数を求め・・・・ RLx = (1000-(PicのAD変換値))×0.08 / 20

次に、VSWRを算出する・・・・  VSWR =  (10RLx +1)/(10RLx -1)

最後に、エクセルの表から小数点以下2桁目を四捨五入して、境界値を求める。

 

 

4.近日更新用

 

 

 

 

99.追記用(予備)