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カードへセーブ へ続く。

 

MicrochipのFILEIOライブラリーを使い、SDカードに記録されたBMPファイルをLCD上に表示するプログラム例をここで公開しました。

 

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に戻る

 

2015年5月30日 (土)

TFT LCDによるアナログメーター 3

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

Aameter2_2

PC上で動作するコードジェネレーターのバグと、C言語のポインターの使い方でかなり苦労しましたが、左のような、アンテナアナライザーの表示画面ができました。 

なぜLCD上の疑似アナログメーターの表示にこだわるかと言えば、それは、マルチファンクション画面が得られるからです。 画面はこれで完成ではなく、アナログメーター部分を消して、周波数対SWRのグラフを描かせる事により、LCD表示のアナログメーターも生きてくる訳です。 しかし、ここまでの表示で、const用に使えるROMエリアを含めて85%くらい使っており、これ以上のグラフィックを仕込むとエラーになります。 SWRのグラフ表示は、実際にハードと結合した時の様子を見ながら考える事にします。

通常、プログラムの効率化の為、共通の関数を条件判断しながら、使い回ししますが、これをやると、条件判定の為、動作が少しだけ遅くなります。今回のプログラムでも、メーター指示や、数値の表示の中で、IF文が多くなると、目に見えてメーターの動きはおそくなりました。

対策としては、条件判定を必要最小限に抑える代わりに、関数をいくつも設けることにしました。ROMの容量アップになりますが、プログラム用の容量より、グラフィック用のROM容量がはるかに大きく、全体的にはあまり影響はありません。

残り15%のROM容量でどこまで出来るかは、これからの作業になりますが、ROM容量128Kバイトのマイコンは64pinのQFPですので、出来ることなら、この44pinの64Kに収めたいところです。 また、クロックも現在20MHzですが、これを32MHzまで上げる事にします。

このLCDの表示状態で、SWRやZ,R,Xをリアルタイムにデジタル表示すると、アナログメーターの指針の動作速度は、どんどん遅くなっていきますが、 その上で、周波数カウンターを動かすと、周波数カウンターの基本ゲート時間が10ミリ秒必要であり、メーターの指針の動きはもっと遅いものになりそうです。 改善策としては、周波数カウンターは、外付けPICマイコンで処理し、カウントした結果だけをもらうという案になりそうです。

また、RやXを表示させるためには、10000倍した整数計算では、その精度が不十分で、32bit浮動小数点による計算はマストですから、これもLCD表示マイコンから切り離した方がよさそうです。

これら、周波数カウンターやR、Xのベクトル計算も、LCD上でのグラフィック表示がなければ、8bitマイコンでも十分処理可能なものです。

これからハードの設計を始めますが、基本設計はほとんど出来ていますので、蛇の目基板を使い、いかにして手作りするかが、本当の課題です。 完成はいつの事やら。

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

2015年6月30日追記

ハードウエーアーが基板状態ですがほぼ完成し、LCDアナログメーターの改善を行う事が出来る時期になりました。 当初、メーターの振れ分解能は1度きざみでしたが、動きが粗く、とてもアナログメーターの動きをまねる事ができませんでしたので、LCDの1ピクセル単位の変化となる、0.25度きざみでドライブする事にしました。 しかし、0.25度きざみでそのまま駆動すると、ゼロから無限大までの移動時間は10秒を超えてしまいます。 動きはスムースですが、実用的では有りません。

Aa50meter3_2

そこで、目標の角度と、現在位置の差を計算し、T/Gに対して数度しか離れていない場合、0.25度きざみで送り、その倍の差が有る場合、0.5度きざみで送り、同様に差が倍になるごとに送る角度も2倍にし、最大で2度きざみで送るようにしました。 この細工により、T/G角度近くになると、指針の動きにブレーキがかかりますので、本物のメーターの動きに、より近くなりました。

結果は非常に良好で、7MHzのアンテナをつないで、実際にSWR最少周波数を探す操作をすると、かなりスムースに指針が追従し、なんなく共振点に周波数を合わせる事が出来るようになりました。 本物のアナログメーターには及びませんが、さほど違和感なしに操作できます。 これから完成度を上げていきますが、ROM容量が、目いっぱいの状態ですので、マイコンを変更するまでは、とりあえず、お預けとなりそうです。

左のLCD画像は最新の表示画像で、50Ωのダミー抵抗を装着した時の表示です。

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

INDEXに戻る

2015年5月12日 (火)

TFT LCDによるアナログメーター 2

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

 8bitのPICマイコンでは容量不足で、まともにLCDの表示が出来なかった為、マイコンを16bitに替え、かつLCDも一回り大きな2.4インチサイズにして、実用サイズのLCDアナログメーターを実験中です。

16bitpic_pwb_4

16bitpic_lcd

マイコンはi/oに不足がありますが、とりあえず簡単に実験できそうな、PIC24FJ64GA004という16bit品と、前回と同じメーカーDisplaytechの、DT024CTFTという、320x240ピクセル2.4インチサイズで作ることにしました。 マイコンが16bit品になったので、コンパイラもXC16に変更必要です。そこで、開発環境も、MPLAB Xに変更する事にしました。 しかし、これが、くせもので、従来のやり方では、全く動きません。 すでに通り過ぎた方は、問題ないにしても、これから、XC16やMPLAB Xの環境でPIC24xxxの開発を始めようと思っている方に多少なりとも、役にたつならと、失敗と対応方法を紹介します。

まず、MPLAB Xですが、エジターの日本語が文字化けして読めません。 WEBで調べていくと、プロジェクトを作るときにEncodingの指定をやるのだそうですが、それを見落としてプロジェクトを作ってしまっているので、後から、Encodingを変更する方法を探す必要がありました。 

プロジェクトをオープンして、プロジェクト名の周りが青色になっている状態で、マウスを当て、右クリックすると、一番下にPropertiesがありますので、これをクリックします。出てきたダイアログの一番上にるGeneralの文字をクリックすると、中央下にEncodingの設定ランがあります。その中から、Shift_JISを選択すると、文字化けは直ります。

初期段階として、PICのソースファイルにConfig事項を書き並べて、チップの初期設定をおこないますが、HI-TECH CとXC8やXC16では全く書式が異なります。

HI-TECH Cによる16F1939のConfig記述例

 __CONFIG ( FOSC_INTOSC & WDTE_OFF & PWRTE_ON
 & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_OFF & CLKOUTEN_OFF & IESO_OFF
& FCMEN_OFF);
 __CONFIG ( WRT_OFF & VCAPEN_OFF & PLLEN_OFF & STVREN_OFF & BORV_LO
& LVP_OFF );

これに対して、XC16で24FJ64のconfig記述例

// コンフィギュレーション設定 Fosc=20MHz Xtal
#pragma config POSCMOD = HS, I2C1SEL = PRI, IOL1WAY = ON
#pragma config FCKSM = CSDCMD, FNOSC = PRI
#pragma config WUTSEL = LEG, IESO = OFF, WDTPS = PS1
#pragma config FWDTEN = OFF, ICS = PGx1, COE = OFF, BKBUG = OFF
#pragma config GWRP = OFF, GCP = OFF, JTAGEN = OFF

XC16をデフォルトでインストールすると、以下のホルダーの中に、各PICの品種ごとに、どのように設定するか説明があるのですが、書いてある単語が何を意味するのか判らず、結局、該当チップの英文データシートを読む必要が生じます。それも大変な作業で、今回のPIC24FJ64の設定がなんとなく判るまで2日間もかかりました。 それでも上の設定が正しいのかは?です。とりあえず動いいていますので、良しとします。

C:\Program Files (x86)\Microchip\xc16\v1.24\docs\config_docs

最近のPICマイコンは、i/oピンの多重化がすさまじく、何もしなければパラレルポートを使う事が出来ません。このマイコンも、端子機能はピン配置図に書かれている名称の左から順に優先度が高いと説明されていますが、一番右側に書かれたパラレルi/oをそのまま使う方法が判りません。

ほとんどのi/oで一番左側に書かれている機能はADです。 ADを使うか使わないかを最初に設定しないと、i/oをHに設定したのに、いつのまにかLになっているとかの異常動作に遭遇します。 HI-TECH CでもADは最初に設定する事が必要でしたが、16bitになって、ほとんど全てのi/oがAD対応になっていますので、面倒がらずに、全部設定が必要でした。 ADの設定を行うと、各ピンの一番右側に書かれた端子機能をそのまま使う事ができました。 

次にHI-TECH CではLATB1などのようにi/oのビット指定が出来るのですが、この単語ではエラーになります。これらの定義はincludeファイルの中にあるはずですが、そのファイルを見つける事ができませんでした。結局、WEBで調べてLATBbits.LATB1のように記述したら良いと判るまで、またまた2日間もかかってしまいました。 16bitをパラレルで一挙に書き込む場合はLATB = 0xFFFFでOKでした。

とりあえず、マイコンはソフトで書かれた通りi/oのH,Lの設定が出来るようになりましたが、今度は、LCDがまともに動作しません。 このメーカーのホームページにサンプルコードがありますが、このクラスのLCDは8bit RGBドライブオンリーで、マイコンからのパラレルドライブやシリアルドライブの実働例はありません。FAQなどを調べていくと、世界中のユーザーが困っているようです。 私の実験では、マイコンからのパラレル8bitドライブはなんとかなっても、シリアルドライブは全く不可というのが実態のように思えます。多分、自社でもテストした事がないのでしょう。

このような環境で、案の定、16bitドライブにしてもまともにカラーが出ません。悪戦苦闘の末判った事はRGBモード時設定するように説明されたカラーコードフォーマットの指定をマイコンからのパラレル接続でも行わないとダメという事でした。

このLCDは以下の初期設定で16bitパラレルドライブの基本的な動作は可能となります。

IM0をHとして、IM1-IM3はL(GND)にしておき、ハードリセットをかけた後のイニシャル処理です。

void init_LCD() {
 lcd_CMD(0x01);//ソフトリセット
 __delay_ms(120) ;
 lcd_CMD(0x11);//Sleep Out
 __delay_ms(120) ;
 lcd_CMD(0x13);
 lcd_CMD(0x0036);//Memoryアクセス(画面のスイープ方向設定)
 lcd_DATA(0x0048);//画面は縦置きOnly
 lcd_CMD(0x3a);//カラーモード書式設定
 lcd_DATA(0x55);//16bit(5-6-5)        この設定が必要でした。
 lcd_CMD(0x002A);//カラムアドレスセット
 lcd_DATA(0x0000);//SC[15-8] 0から
 lcd_DATA(0x0000);//SC[7-0]
 lcd_DATA(0x0000);//EC[15-8] 319まで
 lcd_DATA(0x00EF);//EC[7-0]
 lcd_CMD(0x002B);//ローアドレスセット
 lcd_DATA(0x0000);//SP[15-8] 0から
 lcd_DATA(0x0000);//SP[7-0]
 lcd_DATA(0x0001);//EP[15-8] 239まで
 lcd_DATA(0x003F);//EP[7-0]
  lcd_CMD(0x0029);//Display ON 検討中はこのタイミングで。
 lcd_CMD(0x002C);
 __delay_ms(200) ;
 
}

今回の配線図を下記からダウンロードできます。

マイコンとLCDは専用ラインでつながっていますので、CE端子は常時Lで良く、またLCDの内部情報の読み出しも行いませんので、RD端子も常時Hとしております。

LCDMeter0.pdfをダウンロード

Lcd320meter1

開発開始してから約1週間経過した時点で左のようなアナログメーターの表示に成功しました。

前回のドット数は160x128でしたが、今回は320x240でそれなりに分解能も向上しておりますが、単純に約4倍の面積に拡大しただけでは、このような綺麗なグラフィックにはなりません。 

まず、JW CADを使い、正確な目盛板を作成します。 JW CADのフォントは限られていますので、グラフィックの部分のみを作画して、これをスクリーンショットでGIF画像に変換します。 この時のサイズは面積比で16倍以上あります。 この画像をWindows標準のペイントで読み込み、文字を入れます。フォントも色も豊富にありますので、デザインは簡単です。

デザインが終わったら、実際のLCDに表示するピクセルサイズまでペイントで縮小します。 この状態での各ピクセルのカラーデータをそのまま取り込むという手法で実現できます。

PCでの画像処理は、その豊富なアプリのおかげで、簡単に実現できますので、これをマイコンが扱えるデータに変換する為に、変換プログラムを作る必要が生じます。 PICのマイコンとLCDをにらみながら、ちまちまソフト開発をやるはずでしたが、 このSWRメーターの目盛が表示できたのを境に、マイコンプログラムの開発ではなく、PCのアプリ開発がメインになってしまいました。

そして、さらに、1週間くらい過ぎた時点で、PCアプリが完成しました。

下の画像は、PCの画面上に表示された、LCD表示用カラーコードジェネレーターです。  LCDと同じピクセルサイズに縮小したグラフィックデータを読み込むと、C言語で扱えるLCDへ表示する為のデータファイルを出力します。 出力されたファイルを#include命令で読み込み使う事ができるようになります。  バグだらけのアプリでしたが、なんとか動作するようになりました。

Ccg0

 このアプリはTcl/TKと呼ばれるインタープリンターで作られておりますので、動作は遅いですが、コードジェネレーターですから、たとえ1分かかろうが問題ありません。  実際のところは数秒で出力されます。

バグだらけですが、ソースをダウンロードできます。Ccord_Generator4.tclをダウンロード

defaultcolor.txt を同じディレクトリーに置いてRUNさせて下さい。defaultcolor.txtをダウンロード

グラフィックデータをC言語で出力するのはOKですが、フォントデータを出力させる場合、都度ソースを微調整していましたので、このままでは機能しません。 取説が無いので作った本人も、もう忘れてしまいました。

このアプリはTcl/Tkというインタプリンターをインストールする必要があります。インストールの詳細は「Tcl/Tk」で検索してください。 ダウンロード元は全部英文で、個人情報の登録が必要です。

メーターの振れ角を66度として、0.5度きざみで指針データを作り、これをROM上に配置して指針の動きを表現するもので、PC上でのシュミレーションではうまくいってましたが、いざPIC24Fのマイコンに書き込む作業をしたところ、ROM不足でエラーとなってしまいました。

なぜなら、この指針用データが90Kバイトくらいあり、完全なメモリー不足でした。 本来は、もっと早く気付くべきところですが、アプリが完成して、コードを出力したら、そのファイル容量が170Kバイトくらいを示しましたので、やっと判った次第です。 データのスパンを1度ごとにして、容量を半分にしてみましたが、指針データ以外で24Kくらい使っていますので、やはり足りません。

現在のROM容量64Kに収まる範囲で可能な方式として、指針データは常に計算で出し、指針より少しだけ広い四角い範囲のグラフデータに、指針データを重ねると、ちょうどドット数の多いフォントと同じようなデータが作れますので、これをグラフ画面上に上書きすることにしました。

Lcdswrmeter2

左の画像は、そのようにしてメーター目盛の上に、指針とその周囲の目盛画像を上書きしたものです。最初の案より指針データを計算する分だけ動作が遅くなっています。

この目盛のSWR1.0から無限大までの指針移動時間は実測で、約3.3秒ありました。指針位置の計算はsin()と平方根で出していました。

Y座標は、半径やXの値を2乗してから、平方根ですから、かなり時間がかかりそうです。 そこで、平方根を止め、Xはsin()で、Yはcos()で計算させると、指針の速さは約2.7秒まで改善しました。

三角関数は時間がかかると思われますので、sin()の0度から90度までを予め、PCで計算し、その結果を10000倍した数値を整数として、配列に記憶させ、sin(deg)はそのまま取り出し、cos(deg)はsin(90-deg)で取り出す事にしました。   結果は約1.3秒まで改善しました。

関数のなかを見渡して、繰り返しループの中で、初期設定など、結果が変化しない処理事項を取り出し、ループの外に置くとか、見やすくするために置いた変数を固定値に変えるとかの作業を行った結果SWR1.0から無限大までの指針移動時間は約1秒まで改善出来ました。

Lcdswrmeter3

次に、一部、浮動小数点(double)を使用していた計算式を10000倍の整数計算した後、四捨五入した整数に直す方法で、全ての計算を整数で行った結果、ゼロからフルスケールまでの時間は約0.65秒となりました。

左の画像はその速さで指針が動いている時のショットです。動きが速いので、指針もボケて写っていますが、見た目のチラツキは少ないです。

アナログメーターの指針移動時間で違和感が無いのはゼロからフルスケールまで0.3秒くらいの移動時間ですから、あと半分くらいは短縮必要です。

しかし、 現在はメータードライブだけしかやっていませんので、例えば、SWRメーター以外にインピーダンスメーターも同時に表示したり、周波数カウンターの周波数表示など、負担が増えるばかりで、指針の移動スピードもどんどん遅くなってしまいます。

また、この方式の場合、チラツキは最少に抑えられますが、指針の移動スパンは1度以内に限られます。VUメーターではないので、かなり遅い追従時間でも問題は無いと思われますが、実際に作ってみないと、何とも言えません。

次回は、LCDの全画面表示にトライします。

TFT LCDによるアナログメーター 3 に続く。

INDEXに戻る

2015年5月 4日 (月)

TFT LCDによるアナログメーター1

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

AadigitaltestPICのマイコンを使用して、アンテナチューナーのコントローラーやATUの製作を行ってきましたが、この過程で、SWR計も作ってきました。 PICマイコンに少し、慣れたころ、このマイコンのAD入力にCAA-500のインピーダンス検出DC信号や、SWR検出DC信号を加え、アンテナアナライザーによるインピーダンスやSWRのデジタル表示にトライし、RやXの表示も行えるところまで実験ができましたので、次の目標は、オール自作のアンテナアナライザーと決めました。 左の画像は、CAA500のセンサー基板に、PIC16F1939を使用した自作のマイコンボードとLCDディスプレーを接続し、マイコンで周波数や、SWR、インピーダンス、R、Xを表示させている実験風景です。

アンテナアナライザーのセンサー部分や、広帯域発振回路など、なんとかなりそうですが、これをメカニカルアナログメーターや、キャラクタ表示の液晶で実現してもMFJやコメットと同じなので、面白く有りません。  そこで、マイコンでは、無理と言われる、液晶表示の疑似アナログメーターの実験を始める事にしました。 最近の車のインパネは高精細度の液晶によるスピードメーターやタコメーターがすばらしいデザインの元で実装されております。またKENWOODの最新モデルにも、液晶表示のアナログメーターが実装され、デジタル駆動にもかかわらず、非常にわかりやすいアナログメーターとなっています。 これらの最新技術のLCDアナログメーターに及ばないにしても、安いマイコンと、安い液晶でどこまで、液晶表示のアナログメーターが実現できるかの実験記です。

使うマイコンは、少し役不足ですが、ATUに使ったPIC16F1939。 これで160x128ドットのTFT液晶をドライブします。 液晶は262K色対応で、普通の写真を表示させても、遜色のないカラー画像が表示できるという中国製です。

とりあえずは、TFT LCDを初期設定し、画像や、文字を表示できるところまでトライします。

この実験ボードの配線図です。TFT-LCD.pdfをダウンロード

実験に使うマイコンはROMもRAMもグラフィックLCDをドライブするには小さすぎますので、今回は、基本動作を得とくする事が目的となり、実践版は次の試作までお預けとします。

試用するLCDはDisplaytechのDT018ATFTという品番で、液晶ドライブIC ILI9163Cが内臓されています。 このILI9163Cという台湾製のICはインターネット上でも良くみかけるST7735とコンパチで、ST7735用のイニシャルルーチンでちゃんと初期設定されてしまいます。初期設定が成功したら、後は、ILI9163Cのデータシートを読みながら、ああでもない、こうでも無いと試行錯誤する事になりますが、いつのまにか、文字表示や自作したイメージデータの表示が出来るようになりました。

Pic_lcd_demo

左の画像は、なんとか表示できるようになったので、SWR計の目盛をLCD上に表示させたものです。SWR検出信号をADにつなげば、赤色の指針がSWRを指します。

メーターの目盛は3角関数とピタゴラスの定理を駆使して、描かれており、ブリッジの不平衡電圧を角度に変えて、目盛と同じ式で指針を表示していますので、指示誤差は有りません。

150x50ピクセルくらいの範囲で描画していますので、あまりきれいではありませんが、実験機としては十分です。

ただし、大きな問題があります。

動作がおそろしく遅いのです。

指針が移動するのに、0.5秒くらいかかります。1度移動しようが、60度移動しようが0.5秒です。 これでは、全く使いものにはなりません。  これは、指針も3角関数と、ピタゴラスの定理でXYドットをいちいち計算して表示していたのが最大の原因です。  

これを、指針のドットのみ1度ごとのXYデータの配列として記憶させて置き、測定された指針角度から、このイメージデータを呼び出し、表示させる事にしました。 角度データは80度分必要ですが、とりあえず10度分だけ作って振らせてみました。 指針は赤色で描画した後、一度白色で再描画し、指針を一度消し、次に新しい位置に、赤で描画するという事を繰り返します。 このドット単位での書き換え動作は、目盛と指針が重なった場所の目盛表示を復帰させるのも、ドット単位で行えますので、復帰させるドット情報も簡単に計算できます。 しかし結果は、かなり早くなりましたが、指針のチラツキが目立つようになりました。 まだまだ、改善が必要です。

次に、文字フォントと同じように8x16の書き換え可能なドットパターンを用意し、この範囲に含まれる目盛のドットに加えて、指針のドットも書き込み、これを指針角度に応じて、画面上に再描画させる動作を実験しました。この場合、指針の移動に伴い、旧指針を消すという動作と消えた目盛の復帰動作が不要になりますので、面を書き換える時間増より、コマンド切り替えの回数減少から、LCD側の動作速度がかなり早くなります。 また、ちらつきもほとんど無くなる事も判りました。 ただし、LCDにカラードットを書き込む前のドットパターン作成作業は複雑になりますので、マイコンのクロックを上げたり、16bit RISCタイプに変えるなど、対応が必要になると思われます。

次は、マイコンを16bit品に変え、かつLCDも320x240ドット品に変えて、動作速度の改善に取り組みます。

同じようなLCDをお使いになりたい時の為に、このLCD用の初期設定ルーチンだけですが、以下に示します。

void lcd_CMD(unsigned char CM) {//1-byteコマンド
      RS = 0;
      WR = 0;
      LATD =CM;
      WR = 1;
      RS = 1;
     }
void lcd_DATA(unsigned char DA) {
      WR = 0;
      LATD = DA;
      WR = 1;
     }

void init_LCD() {
      lcd_CMD(0x01);//ソフトリセット
       __delay_ms(120) ;
      lcd_CMD(0x11);//Sleep Out
      __delay_ms(120) ;
      lcd_CMD(0x36);
      lcd_DATA(0xC8);
      lcd_CMD(0x2A);
      lcd_DATA(0x00);
      lcd_DATA(0x00);
      lcd_DATA(0x00);
      lcd_DATA(0x9F);
      lcd_CMD(0x2B);
      lcd_DATA(0x00);
      lcd_DATA(0x00);
      lcd_DATA(0x00);
      lcd_DATA(0x7F);
      lcd_CMD(0x36);
      lcd_DATA(0xAC);
// lcd_CMD(0x29);//Display ON このコマンドは画面クリアーの後が良い。
      lcd_CMD(0x2C);
      __delay_ms(200) ;
 }

TFT LCDによるアナログメーター 2 に続く。

INDEXに戻る

2015年3月 2日 (月)

160m垂直アンテナ

<カテゴリ:アンテナ>

設置可能な環境の中で、色々と160m用アンテナの実験を行いましたが、やはり、アンテナは屋根より高くないといけないようです。 そこで、前回挑戦して挫折した、7MHz用垂直ダイポールとスカイドアエレメントを利用した垂直アンテナに再トライする事にしました。

160mv5_2

前回の失敗原因は送信出力でアンテナの共振周波数が変わるとい問題でした。  この原因は、近接平行する他のバンドのエレメントとの干渉が高周波電圧で変化し、共振周波数がずれてしまうものでしたので、逆に、近接するすべてのエレメントをショートして、垂直アンテナの頂冠としてしまえば、この問題は解決しそうです。  前回、これを実行しなかったのは、160mから他のバンドへQSYするとき、アンテナワイヤーの接続替えをやらねばならず、それが面倒な事でした。  その為、実験もせずに諦めていた訳です。

ちょうど、今晩から広島WASコンテストが始まるという日の午後、急きょ、この全アンテナエレメントショートの垂直アンテナをでっち上げて、使って見る事にしました。

 

7MHz用垂直ダイポールの下側エレメントを切り離し、上部エレメントを下の方へ延長し、例の金網のところまで降ろします。 18MHz用スカイドアのエレメントは、ベランダに置かれたプリセットMTUから外し、この7MHz垂直ダイポールの上部エレメントに接続します。 さらに6m用のヘンテナもアンテナチューナーから切り離し、これも垂直ダイポールの上部エレメントに接続しました。

160mv5box

この状態でマッチングBOX内のローディングコイルは約2μHで1.910MHzに共振します。 インピーダンス変換トランスは10:6のタップですので18Ωくらいのインピーダンスになっているようです。  アンテナアナライザーで1.910KHz付近に共振周波数がある事を確認し、実際に10Wの出力でSWR最少周波数を確認してみました。1.909KHzでSWR最少1.05となっていました。60W送信してもSWRの悪化や共振周波数のずれは有りません。

一応、使用可能になりましたので、これを2015年広島WASコンテストで使ってみました。 3時間の国内コンテストですが、20局しか交信できませんでした。 昨年のコンテストでは31局と交信していました。 アンテナの形態は昨年と同じですから、多分コンディションが良くなかったのでしょう。 

下に、MMANAによる指向性データを示します。

160mv5data

既存のDPやスカイドア、ヘンテナのワイヤーを一度MTUから切り離し、これを互いにショートした上で、地面まで引き降ろすという作業はかなり面倒です。 次の日の朝、ハイバンドのコンテストが朝8時から始まりますので、雨の中、この切り替えを元に戻す作業をしましたが、かなり手こずりました。 暖かくなったら、このワイヤーの切り替えをスイッチで行えるように切り替え器を設置する事にします。 

その後、アクティビティも下がり、このアンテナの改良は頓挫していましたが、2022年になり、1.8MHzのSSBで国内ラグチューをやる目的で、再度160mバンドアンテナにトライです。

160m用 8m高のスローパー へつづく。

INDEXに戻る