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

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年12月20日水曜日

QRP懇親会・忘年会@新宿

年の瀬にJARL QRP Club主催の懇親会(忘年会)が新宿で開催されました。

今年からQRP Clubに入会して何回か懇親会にお邪魔しましたが、開催日が野毛の横浜電子工作連絡会ミーティングに重なってしまうなどなかなか参加できませんでした。

今回は第2週の週末ということもあり、また忘年会をかねているということで参加しました。

場所はいつもの秋葉原ではなく新宿某所。


某所というかバレバレですが(笑)

10数名の工作好きオヤジ達が一室に集まりお酒と食事を楽しみながら、持ち寄った作品を披露していきます。

私もQCXとかもっと何か持っていけばよかったのですが、VNシリーズくらいしか持ってこなくてちょっと失敗しました^^;

数ある作品の中でとても気になったものを2点ほどご紹介します。

まずはこれ。


 なんと、おかきの缶をそのままケースにした真空管式短波帯CW送信機です。


 詳しいスペックはすっかり忘れてしまいましたが、このかっこよさに惚れました。

バリコンやコイルやら主要なほとんどの部品がジャンクから作られています。使われなくなった部品を組み合わせて新しいものを作るという作業はとても魅力的です。さすがに電源は別ですが、これに真空管式の受信機が同じようにおかきの缶で作れたら楽しいだろうなーと思いました。

マイコンや表面実装部品がこれからの工作の主流とはいえ、 一度はやってみたいですね。

次はこちらです。


 7MHzから50MHzまでのマルチバンドQRP CWトランシーバです。タカチ製のYMシリーズと思われるケースに収められていますが、これまたいろいろと工夫やこだわりが詰め込まれています。

とくに興味を引いたのが、メーターと後ろのスタンド、100均小型スピーカーのケースを利用したアンテナマッチングボックス・・・などです。

 発振器などの制御にはマイコンを使っているようでしたが、Sメータ(PWRメーターも?)はアナログのラジケータを敢えて利用しています。こだわりも感じますが、デザインのアクセントになっていて良い印象です。LCDのバーメータ表示よりも存在感バッチリです。それにフルスケール500Wというのも洒落が効いています。(本当はバックライトで文字が浮き上がるものなので換えられなかったとのことです)

後ろのスタンドは、直接撮影し忘れましたがカメラ固定用のスタンドでこれも100均で購入したそうです。ネジで着脱可能で写真のように本体を斜めに置けるので非常に使い勝手が良さそうです。この仕組みはVNシリーズにも採用したいところです。

 アンテナの根元の部分は小型スピーカーのエンクロージャにコイルとコンデンサが入っていて、ロッドアンテナのエレメントを同調させているとのことです。このくらいの大きさの市販のプラスチックケースよりもコストが安く済む(100均ですから)のでいろいろと他用途にも使えそうです。

 で、中身も見せていただきました。


 マルチバンドということもあって実装密度はかなり高いです。

これだけの密度の高さでちゃんと動作されるのは大変だったでしょう。しかしこのオンリーワンな自作機を持ち出してQSOするのはことのほか楽しいだろうなと 想像します。

 このあと、持ち寄った品々でオークションが行われました。いろいろと出てきましたが私はこれを分けていただきました。


 JA6IRK岩永さんが製作されたAD9834のモジュール基板です。AD9834はおなじみのDDSチップですが、手持ちがいくつかあるので実験用に組んでみようと思います。

そういうわけで、2時間があっという間に過ぎ場所を変えて自作話で盛り上がりました。

みなさんそれぞれが面白いことやっているなーと刺激になる良い会でした。

来年のことを言うと鬼が笑うそうですが、今年はひとつの目標が良い形に結実したので来年はさらにこの方向で進めていこうと考えています。

 たぶん本投稿で今年最後になるかと思います。皆様におかれましてはどうぞ良い年をお迎えくださいませ。

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年1月10日火曜日

秋葉原QRP懇親会とCWトランシーバ『一応』完成

正月まだ松の取れない先週末に、入会したてのQRP Clubメンバーによる定時懇親会が秋葉原で行われました。


開始時間前にいつもの場所までちょっとお買い物して・・・


 某会議室で大きなテーブルを囲み、自作品の披露やハードウエアや流行のJT65の話などいろいろなお話を聞くことが出来てとても有意義な時間を過ごしました。その後も近くの居酒屋でアルコールを補給しながら話が続きました。

オフラインでのやり取りは非常に刺激になります。月に一回開催されるようですが、1ヶ月というのはすぐに過ぎてしまうので、常に何か自分も進めていかないと取り残されてしまいます。参加を続けていくということは研鑽を積んでいくという姿勢も必要だと認識しています。大げさかな?(笑)

皆さんの作品や考え方を見てみたい気持ちは前々から持っているので、非常に良い機会です。横浜の自作ミーティングにも参加してみたいなぁ(チラッ

今週末もLFerの新年会があるので楽しみです。

閑話休題。

さて、ようやく年末到着した赤い基板に実装完了して動作まで漕ぎ着けました。


 今回の赤い基板では送信部の出力回路をE級ネットワークの考え方を取り入れて、スイッチング損失による発熱を抑え放熱器を装着しないでも良いようにするレイアウトに変更しています。

調整ポイントは、フライホイールインダクタの巻き数加減でスイッチポイントをあわせるところです。

 まずは計算値を当てはめ、T37-2コアに11回巻きで測定。
(赤がドレイン電圧、黄色がゲート電圧曲線)


正弦波状のドレイン電圧が立ち下がり0Vに到達するポイントがややゲート電圧立ち上がり点より早いです。巻き数を減らすとさらに速くなりピーク電圧も高くなって出力が増えます。ただし、出力波形がひずみ高調波が多くなってきます。

計算値より巻き数を2回ほど増やして測定。


 今度はドレイン電圧が下がりきらないところでゲート電圧の立ち上がりが見られます。それとゲート電圧にリンギングが見られており、インダクタンスとしては多すぎと思われます。

そこで1回だけ増やしたときは・・・


 ドレイン電圧の0V着地点とゲート電圧立ち上がり開始点がほぼ一致しています。

ドレイン電流は確かめられませんが、出力波形を見ると今回の回路ではフライホイールインダクタに直列に接続するキャパシタを省略したため歪が残っており後段の3段LPFでも2次高調波が十分低減できていません(-50dB行くかいかないかの微妙なところ)。

実装面積が小さいためLPFの性能も十分設計どおりになっていないのでしょうか。もう少し突き詰めないと(省略したキャパシタとRFCの追加、もしくはE級プッシュプルにするなど)いけませんね。

それから、受信部のほうは感度は十分でAGCのかかり具合も無調整でOKでしたが、いかんせん受信音が歪んでしまってボリウムを絞ってもとりきれません。

AFパワーアンプはD級を見送りNJM2113MというICを採用して実装しましたが、素子自体のゲインがまだまだ高いと考えて、ゲイン設定を当初の5倍から1倍に下げたところ歪みはほぼ解消してだいぶ聞きやすくなりました。



ちょうど埼玉コンテストでにぎやかだったので、バンド内ワッチしてみました。
混変調の程度やフィルターの切れなど含め感覚的には大きな問題はなさそうでした。

無信号時の消費電流は80-90mAといったところで、LCDバックライトはこのまま常時点灯でOKにしました。

ソフトウエアもバグ修正など施し、人柱版完成としました。

パーツをまとめて志願者に配布準備をこれから始めます。