ラベル PIC の投稿を表示しています。 すべての投稿を表示
ラベル PIC の投稿を表示しています。 すべての投稿を表示

2020年6月16日火曜日

USB入りのPICにブートローダを仕込む実験の備忘録

マイクロコントローラ(マイコン)にファームウエアなど実行ファイルをプログラムするのには、たいていはそれ専用のプログラマ(PICではPickitシリーズ、AVRではAVRISP、STMではST-Linkなど)が必要になります。

しかしデバイス自身にプログラムが可能なマイコンであれば、ブートローダという書き込み専用プログラムをデバイスに組み込むことで、外から転送された実行ファイルを自身のフラッシュメモリに書き込む事が出来るので、いちいち専用のプログラマを取り出して書き込みしなくても済みます。

転送方法はUARTとUSBが主のようで、PC側では転送用のソフトウエアを用意することにより基本的にPCさえあればいくらでもファームウエアの書き換えが可能になります。

Arduinoはブートローダがすでにマイコンに組み込まれた状態で販売されています。ユーザーはArduino IDEさえPCにインストールすれば、このソフトウエアだけでコードを書いて、コンパイル、そしてUSBなどを経由して簡単にプログラミングが出来てしまうという手軽さからいろんな電子工作界隈で普及しています。(もう少し高度なMbedもそうですね。Raspberry Piもありますが、近年ほとんどPC化しているのでもう別物です(笑))

もちろん無線電子工作のAKCのメンバーも自作機器の制御に好んでArduinoを使っておられます。

Arduinoが好きじゃないわけではありませんが、同じことしても面白くないしPICでも簡単にできないだろうかと思っていました。もともとUSB内蔵のPICでPIC18F14K50は以前から秋月で扱っておりマイコンボードも購入していましたが、USB対応には外付けXTAL発振が必要で2ポート取られるためいまいち乗り気にならずそのまま放置状態でした。しかしつい最近(1年ほど前から扱っているようですが)PIC16F1459というUSB対応のモデルを見つけました。EEPROMは内蔵していませんが、外付けXTALを必要とせず内部発振でUSB対応可能な点に惹かれ、早速秋月から取り寄せてブートローダ組み込みとプログラミング実験を行いました。

1.ブートローダ組み込みで必要なモノ
・USB内蔵PIC
これがないと始まりません(笑)今回はPIC16F1459を取り寄せました。DIPタイプは秋月で1個190円とPIC18F14K50より安価でピンコンパチです。

・周辺部品
実験用なのでブレッドボードで組みますが、0.1μFのパスコンと3.3Vレギュレータ用の0.33μF程度のパスコン、ブートローダ起動選択用のボタンとポート用プルアップ抵抗10kΩ、ステータス表示用のLEDと電流制限抵抗1kΩ、microUSBコネクタDIP変換ボード、配線ワイヤ、USBコード(microUSB-USBtypeA)くらいでしょうか。

・PC
言わずもがなですが、私はWindows10の自作PCを使っています。

2.ブートローダイメージファイルの準備
ブートローダのhexファイルはmicrochipでは公開されていません。MLAといういろいろなサンプルコード集の中からブートローダ用サンプルプロジェクトをMPLAB X IDEに取り込んでXC8pro版でコンパイルし、PICにプログラムしなくてはなりません。
ネット検索で内蔵発振に対応したブートローダのhexファイルを見つけることができるかもしれません。見つけたらダウンロードし実験用として利用するのも手です。
一方自前でファイルを生成する場合ですが、XC8のpro版を個人で所有するケースは稀です。Free版の場合でも少々コードを変更するとコンパイル通りますが、ファイルサイズは大きくなります。手順は検索するといくつか出てきますので参考にする事が出来ます。
それとはまた別にファイルサイズが極めて小さくなるブートローダもGitHubで公開されています。

3.PICへのブートローダのプログラミング
ブートローダの組み込みにはPickit3などのプログラマはやはり必要です。MPLAB X IDEでブートローダをコンパイルして直接プログラムするか、hexファイルをMPLAB X IPEで取り込み通常通りにPICにプログラムします。

 4.ブートローダの起動とユーザ作成ファイルのプログラム
あらかじめHIDBootloaderWindowsというソフトをダウンロードし起動させ、ブートローダ起動選択ボタンを押しながらPIC側からPCのUSBコネクタに接続するとPCがPICを認識します。HIDBootloaderWindowsで接続が確認されたら、ユーザ作成のファイルを選択してプログラムボタンを押すとPICに書き込まれます。リセットボタンを押すとユーザ作成のソフトが起動します。

5.ユーザプログラムをビルドする上での注意点
PICに組み込んだブートローダが格納されているメモリ領域を避ける設定を加えます。詳細はネット上に解説がいくつかあるので検索してください。

6. ブートローダのデメリットについて
・フラッシュメモリの消費
ブートローダはPICのフラッシュメモリに格納されているので、その分ユーザアプリケーションで使える容量が減ります。PIC16F1459の場合約3分の1が消費されます。XC8Free版で生成された場合それ以上にフラッシュメモリ領域が占有されてしまいます。
・venderID, productIDについて
個人的な実験や使用についてはあまり問題はないのですが、小ロット頒布を含めて商用利用する場合は少なくともUSB-IFへの申請が必要になりますとくにMLAを利用する場合microchip社との契約も必要になるかもしれません。かかる費用もそれなりに高く個人での利用はかなり難しいです。(ただしある一定数の範囲内のものについては、サブライセンスにするなどメーカーによっては敷居が低い場合もあるようです。)

ともあれ取り寄せたPIC16F1459にブートローダを組み込み、テスト用プログラムを書いてビルドしたファイルをPickit3なしでプログラムして動作させる事が出来ました。


Arduino IDEとまではいきませんが、専用プログラマーなしでプログラムできるのは快適ですね。

2020年3月20日金曜日

VN-L5シリーズ進捗状況

昨年末から立ち上げたVN-L5シリーズの開発進捗状況です。


9名の人柱版製作者からフィードバックをいただきながら改善や機能追加を行い、正式リリースに向けてほぼ仕様が固まってきました。

大きな改善点は、送受切り替え時のノイズとサイドトーンポップノイズの低減、キーイングの立ち上がり部分を緩やかにするソフトキーイングの実装です。

ソフトキーイング処理前の送信波形(黄色)
ソフトキーイング処理した送信波形
ソフトキーイングは以前より実装したかった機能で、送信開始から数ミリ秒ほど定間隔のパルス波で終段の電源制御を行い立ち上がりを鈍化させています。

そのほかエンクロージャと小型の内蔵パドル作成しました。

プログラムの不具合もほぼ解消し、最終的な基板作成に移ろうと思います。

フィードバックいただきました人柱版製作者の皆様にこの場をお借りして御礼申し上げます。

2020年1月14日火曜日

ローバンド(160m, 80mバンド)用小型CWトランシーバVN-L5シリーズ人柱版モニター募集について ⇒ 1/17定員に達したので締め切ります

昨年末から試作を続けていました、ローバンド用新VNシリーズ”VN-L5シリーズ”の人柱版の基板が到着し、実際に組み立てて動作を確認しましたのでベータテスターを募集します。

組み立てた実機は来る2月9日(月)兵庫県尼崎市で開催されます関西ハムシンポジウム2020で参考展示し、人柱版のフィードバックを受けて7月に開催されると思われる関西アマチュア無線フェスティバルもしくは10月開催予定のハムフェアで正式頒布を考えています。

そういうわけでイベントに先行して人柱版を少数頒布しますが、以下の応募条件にすべて該当する方を募集します。応募方法は、jl1vnq(アットマーク)gmail.comあてに、「VN-L5シリーズ人柱版キット頒布希望」の件名で(お持ちであれば)コールサイン、お名前、住所(発送先)、連絡が取れるメールアドレスをお送りください。

申し込みはメールに限ります。
twitterやfacebookなどのSNSのDM、messengerでは送らないでください。

折り返しモニター依頼のメールをお送りします。募集人数に達した段階で締め切ります。

応募要項 ⇒ 1/17募集人数に達したので締め切りました

募集人数8名(締め切りました)

応募条件
1.無線機の自作もしくは無線機キット製作経験があり、かつ表面実装部品の装着に十分慣れていること。
2.必ず組み立てること。(積みキットにしない)
3.ある程度自身でトラブルシュートが可能であること。
4.20MHz以上のオシロスコープを所有し、かつ操作できること。
5.PICプログラマ(Pickit3)を所有し、MPLAB X IDE環境があること。
(装着してからでないとPICにファームウエアをプログラムできないため)
6.改善案などのフィードバックもしくは製作レポートの公開(SNSやブログで)が出来ること。
7.ファームウエアのソースコードは現時点で非公開なので、無断で公開したり第三者への配布をしないこと。

必須条件ではありませんが、免許をおろして実運用していただけると嬉しいです。

キット頒布価格7,000円前後を予定

頒布時期2月前後を予定

キット内容
VN-L5シリーズCTRL部、TX部、RX部各基板と装着パーツすべて
(160m、80m両方のバンド依存パーツ同梱、どちらか好きなバンドを選択可能)

上下アクリルパネル(スイッチの穴加工が必要です)とスペーサ、つまみ類

160m、80m用のファームウエアとプログラムコード、簡単な説明書(pdfファイル)
(いずれもオンラインで提供)

ちなみに組みあがるとこんな感じです。(画像右上)

黒い基板のやつです

※参考
VN-L5シリーズ現時点での主な仕様

 [受信部]
 受信周波数 VN-160L5 0.5~2MHz,VN-80L5 3.2~4MHz
 受信部構成 高1中2シングルスーパーヘテロダイン
 中間周波数 6MHz
 クリスタルフィルタ通過帯域 約500Hz
 受信感度 -130dBm前後(簡易SG測定)
 消費電流 110mA(無音時)

 [送信部]
 送信周波数 JAバンドプランに準拠(オフバンド送信禁止)
 終段形式 プッシュプルE級増幅
 送信出力 20W@14.5V,18W@13.8V,13W@12V,10W@10V,5W@7.4V
     (周波数による変動あり)
 不要輻射 2次高調波-50dBc以下 帯域外不要輻射-40dBc以下
 効率(システム全体で)約75~80%

 [制御部]
 VNシリーズと同等
 追加点 パワーメーター,電源電圧表示,バンドプラン内表示

 外形サイズ(突起物除く) W64mm x H84mm x D42mm
 電源電圧 6.5~15.5V

 というわけで、よろしくお願いいたします。

追記:1/17 8名申し込みありましたので募集を締め切ります。ありがとうございました。

2019年7月7日日曜日

通過型電力計の製作(その2~マイクロコントローラ編)

回路図が決まったところで、次は得られた進行波と反射波の整流電圧を測定して計算表示させるまでを担うマイクロコントローラー(マイコン)部分のプログラムを設計していきましょう。

わざわざマイコンなんて使わなくても感度の良い電流計を取り付けて校正すればいいじゃん・・・はい、ごもっともです(汗)

しかし高周波とマイコンが融合する姿に私としては非常に引き付けられるものがあるので、ここはぜひマイコンを活用しようではないか!というわけで強引に進めていきます(笑)

具体的にマイコンを選定する前に、何をマイコンにさせるかということを決めておくことが大事です。それからマイコン動作の基本を理解することです。マイコン動作の本質は『計算』です。つまり、外から入力したデータを『計算』して出力に送る、ということです。その『計算』の手順を示すものがいわゆるプログラムということになります。

今回製作した通過型電力計に当てはめてみます。まずデータの入力ですが、進行波や反射波の電圧レベルはそのままマイコンで計算することができないので、最初にアナログーディジタル変換(AD変換)によって電圧レベルをディジタル値に変換します。このディジタル値をもって初めてマイコンによる『計算』が可能になります。それから計算した結果をキャラクターLCDディスプレイで表示するため、計算結果を含めたデータをLCDに送ることによってLCDに表示させます。あとはおまけとしてLCDバックライト電源を制御する出力とファンクションボタン入力を加えています。

ということで、マイコンに必要なポートを列挙してみると・・・

1.入力
 進行波電圧入力(アナログ)
 反射波電圧入力(アナログ)
 ファンクションボタン(ディジタル)

2.出力
 LCDへの通信ポート(今回は2線シリアルI2Cバス SCLポート,SDAポート)
 LCDバックライト電源ポート(ディジタル出力)

と、入出力合わせて6ポート必要になります。

ということは、8ピンPICですべてのポートを使い切るということになります。特に機能拡張をする予定はないので必要最小限の8ピンPICを使うことにしました。


8ピンのPICは12Fシリーズがポピュラーですが、その中でも上位クラスの拡張ミッドレンジコアを持っている12F1840を採用しました。値段も秋月で1個120円と非常に安価です。これでAD変換やEEPROM、いくつかの通信モジュールもひとつ小さなパッケージに内蔵されているのは驚きです。

最近の8bitPICにはほとんどがAD変換とシリアル通信、EEPROMモジュールが内蔵されていて、発振源も内蔵CR発振が選択出来て外部に水晶振動子やセラロックを接続しなくても良い設計になっています。ましてや8ピンしかないマイコンには内部発振は必須といってよいかも知れません。



またPICのピンには各々役割が複数あって、初期設定で各々のモジュールのレジスタに書き込み設定を行っています。今回のプログラムでの割り当ては赤色の枠になっています。

では処理の流れをブロックダイヤグラム風に示してみます。
実際のプログラムに落とし込みますが、最初にPICのコンフィギュレーションの記述やヘッダファイルxc.hのインクルード、初期設定(PIC各ピン(入出力、アナログ・ディジタル、プルアップなど)、モジュール(ADC、I2Cバス))を行い、メインループ内にAD変換、各電力値とVSWR値計算、計算結果表示関数を置きます。

通常表示するだけであればメインループ内で繰り返し処理を行うようにしてほぼリアルタイムに表示させていけばOKですが、進行波と反射波表示切替やバックライトの制御を加えて少し使いやすくしてみます。

通常自分がスイッチによる制御を加える場合は、タイマー割込み処理でスイッチ状態を監視してメイン処理を修飾するようにしています。

タイマー処理はTIMER0で割り込みをかけるようにしています。時間設定は1ミリ秒としてスイッチの状態をメモリにコピーし、コピーしたメモリを参照してあるパターンに一致したときにフラグを立ててメインループ内でフラグに応じた処理を修飾するという流れです。
スイッチは一つしかありませんが、押し続ける時間によって機能をいくつか持たせるようにしてピンの少なさをカバーしています。(スイッチポートをアナログにして電圧変化に応じて複数の機能を持たせる方法もあります)

次にメインの計算処理についてですが、AD変換された値(AD value)は電圧の整数値(符号なしの10bit値)です。電力はW=V^2 / Rで導かれますので、電力値に変換するにはAD valueを2乗し適当な定数を乗すれば良さそうです。この方法ではある程度信号が大きければ問題ないのですが、ダイオードによる整流のためダイオードのVf付近つまりはQRP電力の場合ダイオードのひずみにより、単純にAD valueの2乗ですべてOK!というわけにはいきません。

そこで実際の電力値とAD valueを測定、表にプロットして計算方法を探ることにしました。

縦軸は出力電力値、横軸はPICのAD変換で得られたAD value ( = det) の2乗値det^2です。

det^2値が14000超えの場合はdet^2とPowerはほぼ1次関数に収まりますが、14000以下の場合はダイオードの低VfでのVf-If特性を踏まえて上表の青色の式のように当てはめるようにしました。(2次曲線に近似しており、この領域では整流電圧と電力の関係を1次関数とみなしています。言い訳ですが(笑)、この程度の測定器であればこれ以上突き詰めても仕方ないでしょう。)

また計算途中で必要な変数の型については、AD変換で得られる値のbit桁数は10bitなので2乗としても20bitあれば事足ります。ですので計算プログラムの変数の型はunsigned longでOKです。整数同士の計算なので4MHz駆動の8bitPICでもサクサク動いてくれます。

またVSWRの計算はおなじみの

VSWR値 = (|Vf| + |Vr|) / (|Vf| - |Vr|)

をそのまま当てはめています。

最後に表示にはI2C接続の16x2キャラクタLCDを使い、LCDとのI2C通信にはMSSPモジュール使用しています。

それでは実際のコードを公開しちゃいます。

//
// VSWR_meter.c
// Copyright JL1VNQ / HARU
//
//
//  ver.1.00 9 June 2019
//  first release
//
//  ver.1.10 12 June 2019
//  change power calculation algorithm
//


#define EEPROM_SIZE  256
#define _XTAL_FREQ  4000000


#include <xc.h>


//for 12F1840 config
#pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
#pragma config CPD = OFF, BOREN = OFF, CLKOUTEN = OFF, IESO = OFF, FCMEN = OFF
#pragma config WRT = OFF, PLLEN = OFF, STVREN = ON, LVP = OFF


#define POW   LATAbits.LATA5      // backlight LED control
#define FUNC  PORTAbits,RA3       // function switch
#define LCD_AD  0x7C    // Akiduki's I2C LCD(AQM0802, AQM1602) address
#define TMR0_set 0x83    // TMR0 1msec interval


unsigned char contrast = 5;

unsigned long forward = 0;
unsigned long reverse = 0;
unsigned long po = 0;                   // calculated power (x10^-1 watts)
unsigned int vswr = 0;                  // VSWR * 10

unsigned char for_rev = 0;              // display change (0:forward, 1:reverse)

void msec_delay(unsigned short time);

void I2C_send(unsigned char data);
void lcd_cmd(unsigned char work);
void lcd_data(unsigned char work);
void lcd_init(void);
void lcd_clear(void);
void cgram_set(void);
void lcd_position(unsigned char li, unsigned char col);

void lcd_str_disp(unsigned char li, unsigned char col, const char *string);
void lcd_char_disp(unsigned char li, unsigned char col, unsigned char ascii);

void var_disp_conv(unsigned char li, unsigned char col, unsigned int val);
void pow_disp(unsigned char li, unsigned char col);
void vswr_disp(unsigned char li, unsigned char col);


void __interrupt() isr(void){
 if(INTCONbits.TMR0IF){
  INTCONbits.GIE = 0;
  TMR0IF = 0;
       
        static unsigned int cnt0 = 0, cnt1 = 0;
        static unsigned char sw_mem = 0, sw_down = 0, dim = 0;
       
        sw_mem <<= 1;
        if(FUNC == 0) sw_mem |= 1;
       
        if((sw_mem & 0x0F) == 0x03) sw_down = 1;
       
        if(sw_down == 1){
            if(cnt0 < 2000) cnt0 ++;
           
            if(cnt0 < 1000){
                if((sw_mem & 0x0F) == 0x00){
                    if(dim == 0) dim = 1;
                    else if(dim == 1) dim = 0;
                    sw_down = 0;
                    cnt0 = 0;
                    cnt1 = 20000;
                }
            }
            else{
                if(for_rev == 1) for_rev = 0;
                else if(for_rev == 0) for_rev = 1;
                sw_down = 0;
                cnt0 = 0;
            }
        }
       
        if(dim == 1){
            if(forward > 10) cnt1 = 5000;
            if(cnt1 > 0){
                cnt1 --;
                if(POW == 0) POW = 1;
            }
            else POW = 0;
        }
        else POW = 0;

  TMR0 = TMR0_set;
  INTCONbits.GIE = 1;
 }
 else if(INTCONbits.IOCIF){   // for Interrupt On Change(hang-up occur if compiling without this code)
  INTCONbits.GIE = 0;
  IOCAF = 0;

  INTCONbits.GIE = 1;
 }
}

void main(void){

 OSCCON = 0x6A;      // 4MHz internal OSC no PLL

    PORTA = 0x00;
 ANSELA = 0x11;                      // RA4, RA0 Analog Input
 TRISA = 0x1F;
 WPUA = 0x2E;      // PORTA weak pull-up

 OPTION_REG = 0x02;     // weak pull_up, TMR0 internal clock(1us/cycle), prescaler 1:8

 POW = 1;       // LCD LED POW PORT on
 SSP1CON1 = 0b00101000;              // I2C Master mode
 SSP1STAT = 0b10000000;
 SSP1ADD = 9;      // I2C Freq = (SSP1ADD + 1)*4/Fosc = 100kHz

 ADCON1 = 0b11000000;    // ADFM = 1 (right), ADCS = 100 (fosc/4), ADPREF = 00 (Vref = VDD)
 ADCON0bits.ADON = 1;    // ADC module enable
   
    msec_delay(10);

 lcd_init();
    cgram_set();

 lcd_str_disp(0,0,"VSWR Meter QPM01"); //startup splash for AQM1602
 lcd_str_disp(1,0,"(c)HARU 20190612");
 msec_delay(750);
   
    POW = 0;

 lcd_clear();

 TMR0 = TMR0_set;     // 1msec
 INTCONbits.TMR0IF = 0;
 INTCONbits.TMR0IE = 1;
 INTCONbits.IOCIE = 1;
 INTCONbits.GIE = 1;

 IOCAN = 0xFF;      // interrupt on change negative edge detect
 IOCAF = 0;


 while(1){

  ADCON0 = 0b00000001;  // AN0
        __delay_us(10);
  ADCON0bits.GO = 1;
  while(!ADCON0bits.GO){
  }
         __delay_us(10);
  forward = ((unsigned int)ADRESH << 8) + (unsigned int)ADRESL;

  ADCON0 = 0b00001101;  // AN3
        __delay_us(10);
  ADCON0bits.GO = 1;
  while(!ADCON0bits.GO){
  }
        __delay_us(10);
  reverse = ((unsigned int)ADRESH << 8) + (unsigned int)ADRESL;
       
        if(for_rev == 1){
            if(reverse < 118) po = (reverse * 5428) / 10000;
            else po = ((reverse * reverse + 20000) * 19) / 10000;
            po = po * 11 / 10;
        }
        else if(for_rev == 0){
            if(forward < 118) po = (forward * 5428) / 10000;
            else po = ((forward * forward + 20000) * 19) / 10000;
            po = po * 11 / 10;
        }
       
        var_disp_conv(0,0,po);
        pow_disp(0,10);
       
        if(forward > 10 && forward > reverse) vswr = (forward + reverse) *10 / (forward - reverse);
        else vswr = 9;
       
        if(vswr > 9) var_disp_conv(1,0,(vswr - 10) * 30);
        else var_disp_conv(1,0,0);

        vswr_disp(1,10);

        msec_delay(40);
 }
}


void msec_delay(unsigned short time){
 unsigned short i;
 for(i=0;i<time;i++){
  __delay_ms(1);
 }
}


void lcd_init(void){
 lcd_cmd(0x38);
 lcd_cmd(0x39);
 lcd_cmd(0x14);
 lcd_cmd(0x70 + contrast);
// lcd_cmd(0x73);
 lcd_cmd(0x56);      // 3.3V
// lcd_cmd(0x52);      // 5V
 lcd_cmd(0x6C);
 msec_delay(210);
 lcd_cmd(0x38);
 lcd_cmd(0x0C);
 lcd_cmd(0x01);
 msec_delay(2);
}


void I2C_send(unsigned char data){
 SSP1IF = 0;
 SSP1BUF = data;
    while(!SSP1IF){
    }
}


void lcd_cmd(unsigned char work){
 SSP1CON2bits.SEN = 1;
    while(SSP1CON2bits.SEN){
    }
 I2C_send(LCD_AD);
 I2C_send(0x80);      // Co=1, RS=0
 I2C_send(work);
 SSP1IF = 0;
 SSP1CON2bits.PEN = 1;
    while(SSP1CON2bits.PEN){
    }
    SSP1IF = 0;
 __delay_us(30);
}


void lcd_data(unsigned char work){
 SSP1CON2bits.SEN = 1;
    while(SSP1CON2bits.SEN){
    }
 I2C_send(LCD_AD);
 I2C_send(0xC0);      // Co=1, RS=1
 I2C_send(work);
 SSP1IF = 0;
 SSP1CON2bits.PEN = 1;
    while(SSP1CON2bits.PEN){
    }
    SSP1IF = 0;
 __delay_us(30);
}


void lcd_position(unsigned char li, unsigned char col){
 lcd_cmd(0x80 | (li << 6) | col);
}


void lcd_str_disp(unsigned char li, unsigned char col, const char *string){
 unsigned char i = 0;
 lcd_position(li,col);
 while(((col + i) < 16) && string[i]){
  lcd_data(string[i]);
  i++;
 }
}


void lcd_char_disp(unsigned char li, unsigned char col, unsigned char ascii){
 lcd_position(li,col);
 lcd_data(ascii);
}


void pow_disp(unsigned char li, unsigned char col){
   
    if(for_rev == 0) lcd_char_disp(li,col,'F');
    else if(for_rev == 1) lcd_char_disp(li,col,'R');
   
    if(po < 1000) lcd_data(' ');
    else lcd_data(po / 1000 + '0');
    po %= 1000;
    lcd_data(po / 100 + '0');
    lcd_data('.');
    po %= 100;
    lcd_data(po / 10 +'0');
    lcd_data('W');
}


void vswr_disp(unsigned char li, unsigned char col){
    lcd_str_disp(li,col,"SWR");
    if(vswr < 10){
        lcd_data(' ');
        lcd_data(' ');
        lcd_data(' ');  
    }
    if(vswr < 100){
        lcd_data(vswr / 10 + '0');
        lcd_data('.');
        lcd_data(vswr % 10 + '0');
    }
    else{
        lcd_data('>');
        lcd_data('1');
        lcd_data('0');
    }
}


void lcd_clear(void){
 lcd_cmd(0x01);
 msec_delay(2);
}


void cgram_set(void){        // bargraph caharacter setting
 unsigned char i;
 for(i=0;i<7;i++){
  lcd_cmd(0x40 + i);       // bar0
  if(i == 0) lcd_data(0x01);
  else if(i == 1) lcd_data(0x15);
  else lcd_data(0x00);

  lcd_cmd(0x48 + i);       // bar1
  if(i == 0) lcd_data(0x01);
  else if(i == 1) lcd_data(0x15);
  else lcd_data(0x10);

  lcd_cmd(0x50 + i);       // bar2
  if(i == 0) lcd_data(0x01);
  else if(i == 1) lcd_data(0x15);
  else lcd_data(0x14);

  lcd_cmd(0x58 + i);       // bar3
  if(i == 0) lcd_data(0x01);
  else lcd_data(0x15);

  lcd_cmd(0x60 + i);       // bar4
  if(i == 0) lcd_data(0x07);
  else lcd_data(0x17);
 }
 lcd_cmd(0x68);
 lcd_data(0x11);
 lcd_cmd(0x69);
 lcd_data(0x15);
 lcd_cmd(0x6A);
 lcd_data(0x15);
 lcd_cmd(0x6B);
 lcd_data(0x0A);
 lcd_cmd(0x6C);
 lcd_data(0x00);
 lcd_cmd(0x6D);
 lcd_data(0x00);
 lcd_cmd(0x6E);
 lcd_data(0x00);
}


void var_disp_conv(unsigned char li, unsigned char col, unsigned int val){
    char value = 0;
    value = (char)(val >> 5);
   
 unsigned char col_max = 0, reg_col = 0;
    col_max = value / 3;
 reg_col = value % 3;

 lcd_position(li, col);

 if(value < 28)
  {
  for(unsigned char i=0;i<col_max;i++){
   lcd_data(3);
   }
  if(col_max < 9){
            lcd_data(reg_col);
   for(unsigned char i=0;i<(8-col_max);i++){
   lcd_data(0);
    }
   }
  }
 else{
  for(unsigned char i=0;i<8;i++){
   lcd_data(3);
   }
        lcd_data(4);
  }
}


(EOF)

最新のMPLAB X IDEとXC8コンパイラ(フリー版)でコンパイル可能です。(フリー版でない場合は最適化オプションによっては動作がうまくいかない可能性があります。検証していませんが(通常版持ってないし))

次はPCBデザイン編です^^

秋月Cタイプユニバーサル基板に実装テスト 1.8~50MHz帯、20Wまで使えそうです

2017年11月30日木曜日

VNシリーズの頒布準備ほぼ完了

だいぶ間が開いてしまいました。

しばらく時間がかかってしまいましたが、VNシリーズのキット通算100セット目の梱包が終了、マニュアルも整備できたところでようやく頒布開始の段階までこぎつけました。

もともとこのプロジェクトは、小型でありながら充分な機能と市販機に引けをとらない性能をもつトランシーバを作りたいという個人的で欲張りな願望から出発したものです。設計、試作、プログラミングの土台的なところは自分個人で立ち上げましたが、人柱版や初回頒布セットを製作していただいた方々からの改善案や機能追加要望、不具合報告やその解決法の模索などを通じ、自分が想像つかなかったところまでどんどんとブラッシュアップされています。ただ作って終わりではなく、より良くして楽しく使いたいという気持ちがよく伝わってきます。

もはやこれは自分だけでなく、製作したみなさんが育てていくプロジェクトになりつつあるのかなという印象なのです。

 そんなわけで今回用意した50セット(VN-4002が20セット、VN-3002が30セット)を受け取ったみなさん、セットをどうするのかはもちろん自由ですし強制はしませんが、完成されたらなんでも良いので感想なりいただけたらありがたいです。それが進化の大きな原動力になるからです。

なんだか技術的なところからかなり遠い記事になってしまいましたが、生存報告兼ねて。

最後に、
通算100セット目のパッケージを。

頒布に関しては近日中に”Pocket Size QRP CW Transceiver VNxx02 Page”にアップします。

2017年6月1日木曜日

電波の日とポケットサイズ40m QRP CWトランシーバVN-4002の正式版について

今日は6月1日ということで、『電波の日』だそうです。

1950年6月1日に電波三法が施行され一般に電波が開放された日です。それまではラジオの聴取には政府の許可が必要だったんですねぇ。翌年には民放開局やラジオも普及して再生式からスーパー式に移っていくなど劇的に変化して、当時身をおいていたのならわくわく面白く過ごしただろうなと思います。

電波の日に関してはこちらのサイトの中で詳しく説明されているので、ぜひご覧になってください。というか、こちらの博物館すごく面白そうです。一度行ってみたいですね。

閑話休題。

正式版はこれよりもうちょっとだけ変更を加えています
さて人柱版頒布からしばらく経ってしまいましたが、正式版の頒布準備が整ってきました。
小さな表面実装部品が多くてパッケージングをどのようにしたら良いか結構悩んでしまいましたが、なるべく部品の取り違えのないようにSMDなCRLを値ごとにシーラーを使って分包してみました。

このために富士インパルスのシーラーを購入しました^^;でもシーラーって便利ですよ
こうすることでひとつずつ袋を切って取り出せるので、実装時の間違いが少なくなるのではと思います。(袋詰め結構時間かかりますが、直接テープに書くのもたいへんですし^^;エラーが少なくなるのならこの方法もアリかと)


VN-4002はコントロール部とRF部の2パートに分かれるため、各々袋でまとめてあります。アクリルパネル外装関係も別に袋にまとめて箱詰めしました。

Keyer Mini-V2 Revision2キットを購入いただいた方なら分かると思いますが、同じ外箱を使っています。

で、頒布についてですが梱包はすべて自分ひとりで仕事の合間に行っており、どうしても一度にたくさん作ることができず明日にもというわけには行かないことをご了承ください。

 状況を見てパーツの再調達なども必要になるだろうと思うのですが、まずは7月の関西ハムフェスティバルのブースで10セット、ハムフェアで10セット頒布を考えています。イベントへ参加予定なくご興味いただける方は、jl1vnqあっとまーくgmail.comまでメールお送りください。

またKeyer Mini-V2と同様に専用ブログに分けます。リンク先はこちらになります。
まだ記事がありませんが随時書き込む予定ですのでよろしくお願いします。 

40mのVN-4002のほか30mのVN-3002, 20mのVN-2002開発中です

2017年3月24日金曜日

mcHF送信部ファイナルMOSFET組み込みと基板到着

mcHF v0.6の受信部正常動作を確認したところで送信部のファイナル用素子として手持ちのRD16HHV1を2本装着、大き目のヒートシンクをネジ加工してファイナルと電源部の低電圧レギュレータにそれぞれ装着しました。ロータリーエンコーダに小さなつまみも取り付けました。

大き目のヒートシンクが後脚になって、ほどよい傾斜になってます^^
 ケースは一時eBayなどで専用のものが頒布されていたようですが現在は残念ながら出てないようで、自力で起こすしかなさそうです。ネットをみると3Dプリンタで作ったりいろいろと工夫されているようです。小型軽量なので移動用にも持ち出してみたいですし、折角なので自分で作ってみようかと思います。

 さてこのヒートシンクですが、ファイナル部はこのくらいの大きさは仕方ないにしても電源のレギュレータICにこの大きさは・・・と思われるかもしれません。しかし、動作時これら2本のレギュレータがハンパなく熱くなってしまうのです。回路図では12V電源から低周波アンプとファイナル部のバイアス、USBホスト電源用、後に続く別の5Vライン生成用に8Vに調整されたレギュレータと5V生成用のレギュレータが熱源になっています。

このくらいの大きめな放熱器をもってしてもまだ暑いくらいなので、スイッチングノイズが気になりそうですがここの部分をもっと効率のよいDCDCコンバータに切り替えてみたいです。

基板の裏側から
いよいよダミーロードを繋いで設定でバイアス電流調整とバンドごとの出力調整を行います。

ローバンドでは余裕で5Wは超えましたが、ハイバンドでは最大で2から3Wにとどまります。おそらく終段のトランスT2の2次側の巻き数を若干増やすと10mでも5Wくらいは出せそうです。でもまぁ慌てずあとの楽しみのためしばらくデフォルトのままにしておきます。
また160mも出力できますが、専用のLPFが内蔵されていないので2,3次高調波レベルが著しくそのままではアンテナには繋げられません。ドキュメントにももし運用するのであれば外付けでLPF装着するように促しています。オシロスコープでみると正弦波にはほど遠いので恐ろしくてそのままアンテナに繋いで送信出来ませんね。

それから日本ではまだアマチュアに解放されていない60mバンドも送信できてしまうので、保証認定の際は要注意です。

というわけでまだいろいろと調整が必要ですが、とりあえずトランシーバとしての体をなすところまでは辿りつけたようです。

いまのところバンドや短波放送などをワッチしています。選択したフィルタにも拠りますが全体的に音質は良いとおもいます。AGCのかかり方もごく自然でメーカー製のリグと変わらないレベルだと思います(オーディオ関係は詳しくないのであてにならないかもしれませんが^^;)。

閑話休題

人柱版で指摘されたポイントなどをまとめレイアウト調整を行った正式版に使おうと考えている基板が出来上がりました。

安くてお得意先になったFUSION PCBに発注し、少しデータトラブルがあったものの2週間弱で手元に到着しました。

お隣の国から1日強で到着します。早い。
初めてオーダーした青いレジスト色なかなか良いです
 RGB3色同時発注してみました。なぜ3色なのかは秘密です(笑)

この新基板で最終試作テストを行い頒布に進む予定です。

2017年2月24日金曜日

Si5351A周波数設定関数の改良

ポケットサイズ7MHzQRP CWトランシーバ VN-4002のベータ版(人柱版)は7名の方が現在製作中です。小さいサイズなのでやはりいろいろと難しいらしく悪戦苦闘しておられます。改良要する点などいくつか出てきており大変助かります。

JF1DIRさんがVN-4002人柱版の組み立て過程をライブ配信と動画で公開されています。ご興味ある方はぜひご覧になってください。JF1DIRさんのYouTubeチャンネルはこちらです。

部品装着が問題なければ再現性は高いと思うので、皆さんがんばって完成させてください。

ところでこのトランシーバですが、派生版の構想があります。他のバンド(30m, 20m,17mや6mに160m,2200mも)版やSSB版など、いろいろと拡がりそうでとても面白いと思っています。30mから17mあたりは受信フロントエンドの同調回路とLPF、フライホイール定数の変更で対応できそうですが、6mや2200mは発振周波数の拡張が必要であることと、160m,2200mはコイルのインダクタンスが高いため小型化が難しく別途基板を起こす必要がありそうです。

まずは広いバンドに対応させるべくSi5351Aの設定周波数を拡げるためにプログラムの改良を行いました。

おさらいとして過去のブログ記事から改良前の周波数設定アルゴリズムを。

I.Si5351Aの周波数設定式

1.VCO周波数設定(PLLA, PLLB)

 fvco = fXTAL x (a + b / c)
    a...15~90, b...0~1048575, c...1~1048575, fXTAL = 25MHz or 27MHz

 fvco = 375MHz~900MHz

2.VCO分周設定(MultiSynth0,1,2,...)

 fout = fvco / (d + e / f)
    d...4~900, e...0~1048575, f...1~1048575

II.出力周波数と各パラメータの関係表 


a(16~32(36))cd
16~36MHzF100000025
8~16MHz2F50000050
4~8MHz4F250000100
2~4MHz8F125000200
1~2MHz16F62500400
(FはMHzオーダーの値)

この関係表の周波数を上と下方向に拡張すればよいのですが、各パラメータの制限にかかるのでひと工夫が必要になります。

 まず上方向から。

36MHz以上の場合、パラメータaは0.5F, cは2000000, dが12.5となりますが、cは最大値を超えるのとdが整数でなくなるためそのまま適用できません。(eとfを使えば12.5分周可能ですが、fractional分周になるため出力信号にジッタが増える恐れが出てきます)

最小10Hzステップになることに目を瞑れば、dの整数が保てる範囲内でdを10分の1にすることで160(180)MHzまで出力周波数を伸ばすことが可能になります。

今度は下方向。

0.5MHzから1MHzの場合、aが32F, cが31250, dは800となりますが、1MHz以下のためa値が条件を満たさなくなってしまいます。

そこで、もうひとつ出力直前に設けてある後分周設定を適用します。
Rxにおいて信号が全体的に分周されるので、プログラムでは入力された周波数値を分周分だけ最初に乗算してから計算するようにすればOKです。

最終的に改良後の出力周波数と各パラメータ関係表は次のとおりになります。


a(16~32(36)) c d R
80~180MHz 2F 500000 5 0
40~80MHz 4F 250000 10 0
36~40MHz 8F 125000 20 0
16~36MHz F 1000000 25 0
8~16MHz 2F 500000 50 0
4~8MHz 4F 250000 100 0
2~4MHz 8F 125000 200 0
1~2MHz 16F 62500 400 0
0.5~1MHz 16F 62500 400 2
0.25~0.5MHz 16F 62500 400 4
0.125~0.25MHz 16F 62500 400 8
62.5~125kHz 16F 62500 400 16
31.25~62.5kHz 16F 62500 400 32
15.625~31.25kHz 16F 62500 400 64
8~15.625kHz 16F 62500 400 128

色付き部分の関係を満たすようにプログラム追加修正分を書き込んでテストしました。

まずは136kHz帯。 


オシロスコープ画面の左下の周波数表示を確認してください。このくらいの低い周波数では矩形波がピシッとしていて綺麗ですね。

つぎにプログラムを入れ替え50MHz帯を。


測定しているオシロスコープの帯域は100MHzなので、矩形波は波形がなまって表示されています。しかし設定した周波数で出力されています。

というわけで、派生版への第一歩がひとまず完了です。

2017年1月21日土曜日

7MHz ポケットサイズ QRP CW トランシーバ人柱版の完成

改修を重ねてきたQRPトランシーバですが、人柱版として頒布可能な条件が整いました。

最後にネックになっていたのは、送信波のスプリアスでした。帯域外近接スプリアスはとくに大きな問題はなかったものの2次高調波が基本波の-40dB強といまひとつ抑えきれていませんでした。新スプリアス基準では空中線電力1Wを超え5W以下の場合、スプリアス領域における不要発射の強度の許容値が50μW(-13.0dBm)と定められており、出力3W(+34.8dBm)とすると-47.8dBの減衰量が必要になり、このままでは3W(電源電圧13.8V時)出力の場合アウトです。

 もともと設計上終段はE級の要素を取り入れていましたが、部品省略のためフライホイールの共振回路のQを低くせざるを得ず、その結果LPF手前の波形がかなり歪んでいました。こんな感じです。

黄色がLPF通過前 赤がアンテナ出力波形

フライホイールネットワークはFETがOFFの状態で共振させているので、ONになるとドレインーソース間の容量が消えて共振周波数が高くなり出力波形のマイナスの振れの部分のピークが早くなった結果上のように大きく波形が歪みます。

そこで基本に立ち返り、標準のQ=5としてフライホイールの出力側のキャパシタと電源供給用のRFCを追加しごく普通のE級増幅回路にしました(最初からそうすべきだった(汗))


 フライホイールのコイルは巻き数を増やし実装しなおし、インピーダンス変換トランスの接続ポイントを変更。裏面にはフライホイール用コンデンサ(電圧が高いので(←パラにしても耐圧は変わらないので間違いです)50V耐圧の積層セラミックコンデンサをパラに)、RFCを装着。

 でもって早速測定を。

60dBのアッテネータを介しておじさん工房APB-3に接続
 スペアナで観察する前に、まずオシロで波形をみてみましょう。

黄色がゲート電圧、赤がドレイン電圧曲線 スイッチポイントはOK
出力曲線 まだわずかに歪んでますがかなりましな波形に
 波形を観察する限り改修の効果はあったようで、出力も上昇しています。

次にAPB-3で送信波を観察しました。


 普通に観察すると2次高調波は基本波に対して54dB程度抑えられています。


 もう少し詳しく見るために、200トレース平均をかけて基本波レベルをリファレンスとして表示させてみました。こうするとノイズフロアの変動が抑えられて小さな信号が判別できるようになります。3次以降はほぼ-70dB前後で抑制されていました。

 次に、基本波帯域外不要輻射を観察してみます。

サイドトーンOFF時
サイドトーンON時(ボリウム最小)
サイドトーンON時(ボリウムほぼ最大)
 と、まぁこんな感じでPWM出力とAFパワーアンプ出力で変調がかかっているような波形になってしまいます。いずれも60dB以上は抑えられていますが、ちょっとすっきりしませんね。電源系から入り込んでいるのか今のところ経路は不明ですが、今後何とか対策したいところです。

 課題はまだまだ残っていますが、一通り実運用に支障ない程度のものが出来たようです。

最新のRFパートの回路図を載せちゃいます(禁無断転載)


 人柱版お待ちの方はもうしばらくお待ちください。

 今度の関西ハムシンポが終わってから用意進めます。

2017年1月4日水曜日

2017年始動しました

旧年中はいろいろと多方面でお世話になりました。
年末の別の行事で無線(というか電子工作)活動をほぼ停止していましたが、無事に終了し年が明けたのでぼちぼち再開となりました。

昨年末に調達したのは、まずこれ。


中国語で書かれたタイトルのなにやら難しそうな本に見えますが、開いてみると・・・


SMDチップ抵抗のサンプルキットでした。

これには0805(2012)サイズのE24系列値のチップ抵抗が揃っています。秋月や千石ではごく一部の抵抗値しか手に入らない(マルツでは少し種類が多いようです)のである程度個数のあるサンプルキットを探していました。eBayで検索するとかなり安く手に入るようですし、チップインダクタのキットもあるみたいなので機会があったら入手しようと思っています。

それからもうひとつ。


トロイダルコアをまとめて扱っているところがあったのでT68-1, T37-2, T25-2, FT23-43, FT37-43の5種類頼んでみました。

#1コアは日本では見かけませんが、高Qが得られる至適周波数が150kHz~3MHzと低く136kHzの機器に使えそうです。ALも11.5と同サイズの#2コア5.7の2倍で巻き数も少なくて済むと思うので、136kHz帯用のLPFなどに使ってみようと思います。

少々横道にそれましたがこれで発注した10セット分のパーツがほぼ揃ったので、まず1台最終試作を始めました。

最初はコントロール部を実装。


部品点数はそれほど多くなく、Si5351Aと基準Xtalの装着もだいぶ慣れました。
本当はこれらの極小パーツはリフローでの装着が確実で楽なのかもしれませんが・・・

1,2時間ほどで装着完了してPickit3でプログラムをPICに注入して動作確認です。


今回LCDをバックライト付きのものにしましたが、電流制限抵抗100Ωとして消費電流7mA弱に抑えました。無信号時で全体の消費電流は、電源電圧12Vで57mAでした。受信部を加えて80mA台でで収まるかなと。

というわけで、Si5351Aの出力もオシロスコープで確認し完成です。次はRF部を順追って組み上げようと思います。

閑話休題。

正月は終わってしまいましたが、今年初めの記事なので今年の目標を。

電子工作は、このQRPトランシーバを発展させてSSBモードの追加や他バンド版の製作、それから136kHz帯(475kHz帯)のスタンドアロンなトランシーバの製作、このあたりを進めていこうと考えています。

SDRはkiwiSDRをつかったWebSDRの構築(アンテナ、ネットワーク)を、またソフトウエア処理の勉強と実践あたりを。

運用では136kHz帯アンテナの改善(効率上げるためエレメントをもっと高くするなど)と昨年出来なかった車を使わない移動の実現。移動する局に475kHz帯を加えること。

と、こんな感じでしょうか。

そんなわけで、本年もよろしくお付き合いくださいませm(_ _)m

2016年11月5日土曜日

QRPコンテストにちょい参加

先日3日文化の日にJARL QRPクラブ主催のQRPコンテストが開催されました。

QRPコンテストには自作機部門があります。KD1JVのtribanderもあったのですが、折角ならオール自作の7MHzQRP機で参加したいと思っていました。つい最近7MHzのQRP機が出来上がったので運用テスト兼ねて参加決めていました。この日は仕事だったのでフル参加は出来ませんでしたが、ひと段落して国内コンディションが良さそうな夕方1時間ほど出てみました。


使用したQRP機はユニバーサル基板で組み上げて免許をおろしたプロトタイプ2号機で出力部分をE級化したものです。12VのACアダプターを電源にして約3W出力でした。アンテナは屋上に取り付けたセンターローディングのモービルホップという構成でしたが、コンディションはまずまずで結構参加局の信号が入ってきたので、1時間の中runせずずっと呼びまわりで15Qできました。ユニバーサル基板で組んだため、クリスタルフィルター入出力間で信号漏れがありましたが300Hz幅でQRMはそれほど感じませんでした。

ただ、内蔵スピーカーの設置がよろしくなく音量はそこそこでしたが音割れやひずみが気になりました。外部スピーカーでは綺麗に聞こえるので、内臓スピーカー用のチャンバーを設置するとか何か工夫が必要そうです。まぁ無理して内蔵としなくてもよいのですが、ここまでコンパクトに出来たので何とかしたいところです。スマホ内蔵スピーカの構造など研究して応用できると良いなぁ。

ログを整え自作機の内部写真を撮影して提出すると、参加賞いただけそうなので楽しみです。

点数ばかり気にするよりも、こういった参加して楽しいコンテストは良いですね。

2016年10月17日月曜日

7MHz CW QRP(p)トランシーバ動作最終プロトタイプ完成

かねてから製作中の7MHz CW 小型QRPトランシーバの最終プロトタイプが完成しました。


制御部とRF部は通常の連結用ピンヘッダ・ソケットで相互に接続しています。最初なぜか感度がとても悪くしばらく悩みましたが、配線をチェックすると局発信号線とGND線の配列が基板相互で逆になってしまい、その結果局発信号がGNDに落ちているというパターン配線間違いが判明しました。そこでGND線のピンを切断して局発信号線を正しい端子に導くようにしたところ、正常に動作しました。

アンテナを繋げワッチしてみると、オペアンプで構成したAGC回路はうまく動作しているようでしたが、強い信号のときにAGCが効きすぎているのかしゃっくり現象のような状態となり受信音が汚くなりました。

オシロスコープ上では理想的なファーストアタック、スローリリースなAGC電圧曲線を描いていましたが、AF増幅(オペアンプによる)後の信号を整流しているためか信号タイムラグによるAGC動作そのものの遅延が原因かもしれません。

プロダクト検波直後の信号を整流したほうが良いかもしれないので、追って実験してみようかと思います。信号レベルは小さいですが、オペアンプの整流回路はダイオードでいうところのVfが0.1Vレベル以下であることをオシロで確認しているので期待は持てます。

当座は整流回路内の時定数設定コンデンサの容量を大きくして並列に22kΩ程度の抵抗を繋いで立ち上がりをやや遅くしてみたところ、強い信号で若干ポコる(信号のあたまがごく一瞬大きく聞こえる)もののだいぶかかり具合が良くなりました。

実装完了したRF部 IFアンプの増幅率が大きく若干発振気味
あとは、IFアンプ部のシールドを強化して発振気味になる現象を押さえ込んでいけば良さそうです。

現用無線機と比較しても感覚的な感度に差異はほとんど無く、フィルターの切れもまずまずです。


パターン修正した基板を近々発注してケーシングに移りたいと思います。

2016年10月7日金曜日

7MHz CW QRP(p)トランシーバ 基板が出来上がってきたけれど・・・

今月初旬にP板に製作依頼していた基板が出来上がってきました。

梱包は非常に丁寧です 納期も早いのですが少々お値段高めです
 パッケージを開けておそるおそる1枚取り出します。

2種類面付けして中央にVカット入れてもらいました

表面実装ICのハンダ付けをしやすくするために、銅箔露出面は有鉛ハンダレベラー処理を指定しました(以前は指定しなかったのですが、環境面配慮ということで指定が必要になったようです)。

まずは、制御部の実装を行いました。

基板発注時にデザインルールなどの問題点はクリアしていましたが、出来上がった基板を実装完了した時点で配線パターンミスなどがいくつか重なり最初はLCDに何も表示されず焦ってしまいました。

少し落ち着いた時点でトラブルシューティングです。

PIC自体はちゃんと動作しているようなので、まずはLCD周りをチェック。

データシートを確認するとピンの割り当てがまるで違っていました。どうも回路図を描く際に16x2タイプのLCDのピン割り当てにしたのが原因でした。AQM-0802と1602は同系統のLCDのため割り当ても同じだろうという思い込みから、ピン数は同じでも割り当てが異なっているという罠にまんまと引っかかってしまいました。

そこで、SMDユニバーサル基板の切れ端に新しいAQM-0802を載せてワイヤーで接続しなおしたところ無事に表示されました。

次にSi5351Aの出力に不具合がありました。基準発振の25MHzは問題なく発振しておりデバイス自体は生きているようでしたが、3つのクロックのうち1つしか発振出力されていません。これは、ICのピンの一部の配線間違いとソフトウエア上のクロック出力割り当ての問題で、配線間違いはICのピンを一本持ち上げてワイヤを直接ハンダ付けするという力技(笑)、ソフトウエアの修正で無事に3出力出るようになりました。

最後にオーディオ出力まわりで、オーディオアンプに採用したPAM8303は8ピンMSOPタイプなのですが、本来0.65mmピッチを10pinMSOPと同じ0.5mmピッチと思い込んでしまいPAM8303の脚間隔をカッターナイフとピンセットで微妙に狭めてなんとか装着しました。とどめに出力ジャックの先端と中央スリーブの取り違えでアンプ出力が常にショートした状態になり音が出ないばかりかPAM83031本飛ばしてしまいました(汗)。新しいPAM8303に付け替え、ジャック周りのパターン配線を修正しました。

以上いくつか不具合がありましたが、要は自分の思い込みでやりすごしチェックを怠ったというのが原因で、前作の教訓が生かされていないですね・・・

気を取り直して、修正して動作した制御部です。


幸いにもパーツの寸法は問題なく、RF部とのコネクション位置もずれは見られませんでした。

次にRF部ですが、一気に実装するのではなくパートごとに少しずつ実装して動作チェックするようにしました。

まずは送信部とLPF部の実装です。


送信部は比較的単純で、Si5351Aからの矩形波とキーイング信号をロジックIC(7400系NANDロジック)で受けてBS170へのバッファとして動作します。ファイナルはBS170の2パラ接続で頭に小型のヒートシンクを貼り付けます。出力にはRFチョーク兼1:4のインピーダンス変換トランスを繋げて3段のチェビシェフ型LPFを通してアンテナ端子まで導きます。

トランスには小型のFT-37-43に0.4mmUEWを10回バイファイラ巻きとしています(インダクタンスは約50μH)。LPFのコイルにはさらに一回り小さなT25-2トロイダルコアに17ないし18回巻きしています。

基板の送信部が占める割合は受信部に比べてかなり小さくなっています。

で、実際にダミーロードを繋げて送信すると写真のように電源電圧9Vで約2W出力でほぼ想定どおりでした。ちゃんとした基板に実装したためかオシロスコープで見る限りでは綺麗なサイン波になっていました。追々スペアナでスプリアスのチェックをする予定です。

週末は出かけるため、受信部は来週以降少しずつ(フロントエンド→ミクサー→IFアンプ→プロダクト検波→オペアンプによるAGC電圧生成回路)動作確認しながら進めようと思います。

修正したパターンによる基板起こしはRF部の動作が問題ないことを確認したら発注かけます。