2018年5月7日月曜日

ADF4351 PLL Local oscillator

35MHz-4400MHzまで出力できるADF4351エバボードが、Aliexpressで約$21で購入できる。購入した時より安価になった。VCOチューニングpinが出ているので、FM変調が出来るのでは? と期待しているが、取敢えずローカル発振器として纏めた。受信機で確認した限りでは、分解能10kHZであればC/N低下が認められなかった。50MHzから4480MHz(5.6GHzLO)使えるであろう。



回路図である。レベルコンバータ無しとしたので、Arduino pro mini(mega168 8MHz)を使った。周波数はBCD SWで行う様にした為、10chである。また、今後の事を考慮したI/O割付にした。










ADF4351PLLのレジスタチェックToolである。プログラムは、ADF435x software である。レジスタR5からR0まで、順次書き込めば、ADF4351が動作する。このプログラムでチェックした値を初期値としてスケッチに書いている。 









スケッチ

ダウンロードサイトのADF4351フォルダに保管ある。

//////////////////////////////////////////////////////////////////////////////
//       Copyright©2018.JA2GQP.All rights reserved.
//            ADF4351 Pll Local oscillator         
//                                                    2018/5/5
//                                                    JA2GQP     
//
//----------------------------------------------------------------------------     
//  The original is here. 
//      https://github.com/Giorgiofox/ADF4351-Arduino-LCDSHIELD
//
//////////////////////////////////////////////////////////////////////////////

#include <SPI.h>

//------------------------ Define value --------------------------------------- 

#define LOCK          4                       // pin4
#define LE             5                       //    5
#define Xtal_Freq     12.8                  // 12.8MHz(default 25(25MHz))
#define Scal_10kHz    0.01                // Scaling 10kHz

//------------------------ Register definition -------------------------------- 

/////////////////////////////////////////
// Frequency is 35.00MHz to 4400.00MHz
//     (set data is 3500 to 440000)
/////////////////////////////////////////

const long int FREQ[10] = {
        43000,                                // switch 0 430.00MHz
        43100,                                //            1 431.00MHz
        43200,                                //            2 432.00MHz
        43300,                                //            3 433.00MHz
        43400,                                //            4 434.00MHz
        43500,                                //            5 435.00MHz
        43600,                                //            6 436.00MHz
        43700,                                //            7 437.00MHz
        43800,                                //            8 438.00MHz
        43900};                               //            9 439.00MHz

/////////////////////////////////////////
// ADF4351 Register initialize value
/////////////////////////////////////////

uint32_t registers[6] = {               // 437.00MHz @12.8MHz
        0x888008,                          // Register 0( 0x4580A8   @25MHz)
        0x8008041,                         //               1(0x80080C9               )
        0x4E42,                              //               2(   0x4E42                  )           
        0x4B3,                                //               3(    0x4B3                  )
        0xB6703C,                          //               4( 0xBC803C                )
        0x580005} ;                        //              5( 0x580005                 )    

/////////////////////////////////////////
// Register declaration
/////////////////////////////////////////

double  RFout,
        REFin,
        PFDRFout = Xtal_Freq,                 // X'tal frequency set
        OutputChannelSpacing = Scal_10kHz,    // Scaling(10kHz)
        FRACF;
unsigned long int RFint,
        RFintold = 0,
        INTA,
        MOD,
        FRAC;
byte OutputDivider;

//------------------------ Setup ----------------------------------------------

void setup(){
  pinMode(LOCK, INPUT_PULLUP);               // PIN 2 en entree pour lock
  pinMode(14, INPUT_PULLUP);                  // PIN A0(Digital 14)
  pinMode(15, INPUT_PULLUP);                  //     A1(        15)
  pinMode(16, INPUT_PULLUP);                  //     A2(        16)
  pinMode(17, INPUT_PULLUP);                  //     A3(        17)
  pinMode(LE, OUTPUT);                            // Setup pins

  digitalWrite(LE, HIGH);
  SPI.begin();                                             // Init SPI bus
  SPI.setDataMode(SPI_MODE0);                 // CPHA = 0 et Clock positive
  SPI.setBitOrder(MSBFIRST);                      // highs in the lead
}

//------------------------ Main -----------------------------------------------

void loop(){
  RFint = FREQ[Bcd_switch()];
  Pll_ADF4351();  
}

//------------------------ SPI 32BIT Register Write proc. --------------------- 

void WriteRegister32(const uint32_t value){
  digitalWrite(LE, LOW);
  for (int i = 3; i >= 0; i-- )               
    SPI.transfer((value >> 8 * i) & 0xFF);
  digitalWrite(LE, HIGH);
  digitalWrite(LE, LOW);
}

//------------------------ ADF4351 Register set -------------------------------

void Set_Reg()                                
  for (int i = 5; i >= 0; i-- )               // Reg5 --> Reg0 Write
  WriteRegister32(registers[i]);
}

//------------------------ BCD switch read ------------------------------------

int Bcd_switch(){
  unsigned int sw = 0;

  if(digitalRead(14) == LOW)                  // Bit0 code set
    sw |= B00000001;
    else
      sw &= B11111110;
  if(digitalRead(15) == LOW)                  // Bit1 code set
    sw |= B00000010;
    else
      sw &= B11111101;
  if(digitalRead(16) == LOW)                  // Bit2 code set
    sw |= B00000100;
    else
      sw &= B11111011;
  if(digitalRead(17) == LOW)                  // Bit3 code set
    sw |= B00001000;
    else
      sw &= B11110111;

  return sw;                                  // return(Binary switch data)  
}

//------------------------ Pll ADF4351 proc. ----------------------------------

void Pll_ADF4351(){
  RFout=RFint;
  RFout=RFout/100;

  if (RFint != RFintold){
    if (RFout >= 2200){
      OutputDivider = 1;
      bitWrite (registers[4], 22, 0);
      bitWrite (registers[4], 21, 0);
      bitWrite (registers[4], 20, 0);
    }
    if (RFout < 2200){
      OutputDivider = 2;
      bitWrite (registers[4], 22, 0);
      bitWrite (registers[4], 21, 0);
      bitWrite (registers[4], 20, 1);
    }
    if (RFout < 1100){
      OutputDivider = 4;
      bitWrite (registers[4], 22, 0);
      bitWrite (registers[4], 21, 1);
      bitWrite (registers[4], 20, 0);
    }
    if (RFout < 550){
      OutputDivider = 8;
      bitWrite (registers[4], 22, 0);
      bitWrite (registers[4], 21, 1);
      bitWrite (registers[4], 20, 1);
    }
    if (RFout < 275){
      OutputDivider = 16;
      bitWrite (registers[4], 22, 1);
      bitWrite (registers[4], 21, 0);
      bitWrite (registers[4], 20, 0);
    }
    if (RFout < 137.5){
      OutputDivider = 32;
      bitWrite (registers[4], 22, 1);
      bitWrite (registers[4], 21, 0);
      bitWrite (registers[4], 20, 1);
    }
    if (RFout < 68.75){
      OutputDivider = 64;
      bitWrite (registers[4], 22, 1);
      bitWrite (registers[4], 21, 1);
      bitWrite (registers[4], 20, 0);
    }

    INTA = (RFout * OutputDivider) / PFDRFout;
    MOD = (PFDRFout / OutputChannelSpacing);
    FRACF = (((RFout * OutputDivider) / PFDRFout) - INTA) * MOD;
    FRAC =round(FRACF); // On arrondit le résultat

    registers[0] = 0;                         // Register 0
    registers[0] = INTA << 15;// OK
    FRAC = FRAC << 3;
    registers[0] = registers[0] + FRAC;

    registers[1] = 0;                         // Register 1
    registers[1] = MOD << 3;
    registers[1] = registers[1] + 1 ;   // adding the address "001"
    bitSet (registers[1], 27);              // Prescaler on 8/9

    bitSet (registers[2], 28);              // Register 2(Pll lock setup)
    bitSet (registers[2], 27);
    bitClear (registers[2], 26);

    Set_Reg();                                 // ADF4351 Register write
    RFintold = RFint;
  }
}

結果

ADF4351エバボード上の25MHzオシレータは個体差によるが、精度が悪く、12.8MHz TCXO(秋月電子)に交換した。スケッチでは、ADF435x softwareで求めた437.00MHzのデータを初期値にしているが、50MHzから1.2GHz帯までは動作確認した。






 

 


2018年4月21日土曜日

Knobless Wonder2

Knobless Wonderを作ってから約4カ月経過したが、今年度の製作講習会テーマとなった為、見直しを行った。不特定の人が作っても、容易で再現性がある事が望まれる。今回、PCBにシルク追加とジャンパーレス化を行った。先回pcbgogoにPCBを注文したが、FusionPCBに変更して数回トリミングして完成度を上げる計画で進めた。しかし、FusionPCBから届いたPCBは、作り直しをしたにも関わらず、逆パターンの物しか出来なかった。時間的な問題が有る為、逆パターンの裏シルクで部品実装する事にした。
誰でも容易に出来る様にする為、コアをFT37-43とT37-6の2種類にした。使う場所で、色が異なり、誤使用を低く抑えられる。特に工夫した点は、バイファラ巻き、トリファイラ巻きのペア線が判る様に絶縁チューブを入れた。これによりコイルが容易に作れるであろう。写真は、トリファイラ巻きの例。









出来上がったPCBが逆パターンの為、部品シルク面を裏側にして使う為、パターン面に部品実装しなければならない。その為の部品面シルク図である。












回路図である。
バッファ段定数見直しと終段トランジスタをBD135-16に変更をした。出力は、1.5W。製作講習会用の資料は、Knobless Wonderフォルダからpart2.pdfをダウンロード出来る。
       






  












2018年3月19日月曜日

QCXエンクロージャ

QCXの基板に部品を実装したまま、約4カ月放置していたので、エンクロージャに収納した。このエンクロージャは、Aliexpressでギターエフェクトbox(1590bb)120x95x35として販売している。製作したQCX外観は、エンクロージャ正面にパドルを固定した構造とした。また、QCX購入時のF/Wは、1.00cで有ったのでバージョンアップも行った。






パドル


生基板でフレーム部を作り、タクトスイッチを押す構造とした。バネなどを使わず、タクトスイッチのバネ圧を利用している。特徴は、パドル部にトランジスタを使った事である。









電源on時のトラブル

電源on時にF/Wが立上らないトラブルが有った。既知のトラブルとして対策が紹介されている。L5を外し、pin7とpin20間に外した100u(L5)を半田付けする改造を行った。その結果、電源on時にF/Wが立上らなかったトラブルは解消した。









F/Wのバージョンアップ

購入時のF/Wは、1.00cで有ったので1.00eにバージョンアップする事にした。F/Wは、QCXフォーラムにある。バージョンアップ方法はチュートリアルに書いてある手順で行った。また、AVRDUDESSはこちらからダウンロードできる。
   

2018年2月25日日曜日

si5351a3.h

Arduinoとstm32f103c8両方で使えるヘッダーファイル(ライブラリ構造してないので)としてsi5351a2.hを作ったが、自作仲間のJA2NKD松浦OMから水晶容量の指定、出力指定の要望があった。そこでsi5351a2.hを見直すことにし、si5351a3.hにした。
サンプルスケッチを含め、si53513.hはDownload siteにアップしてある。

si5351a3.h変更内容

1.水晶の容量指定
 setupに次の行を追加してください。

    si5351aXtalCp(_8pF);     // 8pF set

 0pFの指定は _0pF、6pFの指定は _6pF、 8pFの指定は _8pF、 10pFの指定
 は _10pFと指定してください。

2.出力強度指定
 si5351aの出力を次の様に、周波数と出力レベルを書いてください。

      si5351aSetFrequency(freq,_8mA);  // Strength 8mA set

 または、
      si5351aSetFrequency2(freq,_2mA);  // Strength 2mA set

 などのCLK0とCLK2で別の出力レベル設定も出来ます。
  2mAの指定は _2mA、 4mAの指定は _4mA、 6mAの指定は _6mA、 8mAの
 指定は _8mAと指定して下さい。

使い方

si5351a3.h(ヘッダファイル)のスケッチへの組込みは、次の2通りがある。

1.スケッチと同じフォルダにsi5351a3.hを保存
 この時のinclude記述 #include "si5351a3.h" 



スケッチのタブと別のタブが出来て、タブを切替える事で編集ができる。この方法は、ヘッダファイルの完成度が低く編集しながら開発を進める場合便利である。
 

2.スケッチが入っているフォルダにフォルダを作って、si5351a3.hを保存
  この時、スケッチフォルダ内にsrcフォルダを作り、srcフォルダにsi5351a3.hが保存
 して有る場合のinclude記述 #include "src/si5351a3.h"


スケッチのタブのみ現れるので、スッキリする。ヘッダファイルの完成度が高い場合、こちらの方法が良い。













 



サンプルスケッチ

#include "si5351a3.h"

long freq = 7000000L;
//----------  Setup  ---------------
        
void setup() {
  Wire.begin();
  si5351aXtalCp(_8pF);     // 8pF set
  Vfo_out(freq);
}

//----------  Main Loop  ---------------

void loop() {
}

//----------  VFO out  ---------------        

void Vfo_out(long freq){
    si5351aSetFrequency(freq,_8mA);  // Strength 8mA set
}

si5351a3.hの内容


////////////////////////////////////////////////////////////////////////

// Author: Hans Summers, 2015
// Website: http://www.hanssummers.com
//
// A very very simple Si5351a demonstration
// using the Si5351a module kit http://www.hanssummers.com/synth
// Please also refer to SiLabs AN619 which describes all the registers to use
//----------------------------------------------------------------------
// Modifications: JA2GQP,2017/5/20
//     1)Output is CLK0 and CLK2.
//     2)Arduino and stm32duino Operable.
//     3)Storingth lebel. 2018/2/25
//     4)Xtal CP. 2018/2/25   
////////////////////////////////////////////////////////////////////////

#include <Wire.h>

#define CLK0_CTRL   16               // Register definitions
#define CLK1_CTRL   17
#define CLK2_CTRL   18
#define MSNA_ADDR   26
#define MSNB_ADDR   34
#define MS0_ADDR    42
#define MS1_ADDR    50
#define MS2_ADDR    58
#define PLL_RESET   177
#define XTAL_LOAD_C 183

#define R_DIV_1      0b00000000     // R-division ratio definitions
#define R_DIV_2      0b00010000
#define R_DIV_4      0b00100000
#define R_DIV_8      0b00110000
#define R_DIV_16     0b01000000
#define R_DIV_32     0b01010000
#define R_DIV_64     0b01100000
#define R_DIV_128    0b01110000

#define XTAL_CL    0b00010010
#define _0pF         0b00000000     // 0pF
#define _6pF         0b01000000     // 6pF
#define _8pF         0b10000000     // 8pF
#define _10pF        0b11000000     // 10pF

#define Si5351A_ADDR 0x60

#define _2mA         0b00000000     // 2mA
#define _4mA         0b00000001     // 4mA
#define _6mA         0b00000010     // 6mA
#define _8mA         0b00000011     // 8mA
#define CLK_SRC_PLL_A 0b00000000
#define CLK_SRC_PLL_B 0b00100000

#define XTAL_FREQ     25000400    // Crystal frequency for Hans' board

////////////////////////////////////////////////////////////////////////
// I2C write
////////////////////////////////////////////////////////////////////////

void Si5351_write(byte Reg , byte Data){
  Wire.beginTransmission(Si5351A_ADDR);
  Wire.write(Reg);
  Wire.write(Data);
  Wire.endTransmission();
}

////////////////////////////////////////////////////////////////////////
// Set up specified PLL with mult, num and denom
// mult is 15..90
// num is 0..1,048,575 (0xFFFFF)
// denom is 0..1,048,575 (0xFFFFF)
///////////////////////////////////////////////////////////////////////

void setupPLL(uint8_t pll, uint8_t mult, uint32_t num, uint32_t denom){
  uint32_t P1;                            // PLL config register P1
  uint32_t P2;                            // PLL config register P2
  uint32_t P3;                            // PLL config register P3

  P1 = (uint32_t)(128 * ((float)num / (float)denom));
  P1 = (uint32_t)(128 * (uint32_t)(mult) + P1 - 512);
  P2 = (uint32_t)(128 * ((float)num / (float)denom));
  P2 = (uint32_t)(128 * num - denom * P2);
  P3 = denom;

  Si5351_write(pll + 0, (P3 & 0x0000FF00) >> 8);
  Si5351_write(pll + 1, (P3 & 0x000000FF));
  Si5351_write(pll + 2, (P1 & 0x00030000) >> 16);
  Si5351_write(pll + 3, (P1 & 0x0000FF00) >> 8);
  Si5351_write(pll + 4, (P1 & 0x000000FF));
  Si5351_write(pll + 5, ((P3 & 0x000F0000) >> 12) | ((P2 & 0x000F0000) >> 16));
  Si5351_write(pll + 6, (P2 & 0x0000FF00) >> 8);
  Si5351_write(pll + 7, (P2 & 0x000000FF));
}

////////////////////////////////////////////////////////////////////////
// Set up MultiSynth with integer divider and R divider
// R divider is the bit value which is OR'ed onto the appropriate 
// register, it is a #define in si5351a.h
////////////////////////////////////////////////////////////////////////

void setupMultisynth(uint8_t synth, uint32_t divider, uint8_t rDiv){
  uint32_t P1;                          // Synth config register P1
  uint32_t P2;                          // Synth config register P2
  uint32_t P3;                          // Synth config register P3

  P1 = 128 * divider - 512;
  P2 = 0;                               // P2 = 0, P3 = 1 forces an integer value for the divider
  P3 = 1;

  Si5351_write(synth + 0, (P3 & 0x0000FF00) >> 8);
  Si5351_write(synth + 1, (P3 & 0x000000FF));
  Si5351_write(synth + 2, ((P1 & 0x00030000) >> 16) | rDiv);
  Si5351_write(synth + 3, (P1 & 0x0000FF00) >> 8);
  Si5351_write(synth + 4, (P1 & 0x000000FF));
  Si5351_write(synth + 5, ((P3 & 0x000F0000) >> 12) | ((P2 & 0x000F0000) >> 16));
  Si5351_write(synth + 6, (P2 & 0x0000FF00) >> 8);
  Si5351_write(synth + 7, (P2 & 0x000000FF));
}

////////////////////////////////////////////////////////////////////////
// Switches off Si5351a output
// Example: si5351aOutputOff(CLK0_CTRL);
// will switch off output CLK0
////////////////////////////////////////////////////////////////////////

void si5351aOutputOff(uint8_t clk){
  Si5351_write(clk, 0x80);              // Refer to SiLabs AN619 to see 
                                        //bit values - 0x80 turns off the output stage
}

////////////////////////////////////////////////////////////////////////
// Xtal cp
// Example: si5351aXtalCp(_8pF);
////////////////////////////////////////////////////////////////////////

void si5351aXtalCp(uint8_t cp){
  Si5351_write(XTAL_LOAD_C, XTAL_CL | cp); 
}

////////////////////////////////////////////////////////////////////////
// Set CLK0 output ON and to the specified frequency
// Frequency is in the range 1MHz to 150MHz
// Example: si5351aSetFrequency(10000000,_8mA);
// will set output CLK0 to 10MHz
//
// This example sets up PLL A
// and MultiSynth 0
// and produces the output on CLK0
////////////////////////////////////////////////////////////////////////

void si5351aSetFrequency(uint32_t frequency,uint8_t mA){
  uint32_t pllFreq;
  uint32_t xtalFreq = XTAL_FREQ;
  uint32_t l;
  float f;
  uint8_t mult;
  uint32_t num;
  uint32_t denom;
  uint32_t divider;

  divider = 900000000 / frequency;        // Calculate the division ratio. 900,000,000 is the maximum internal
                                          // PLL frequency: 900MHz
  if (divider % 2) divider--;             // Ensure an even integer 
                                          //division ratio

  pllFreq = divider * frequency;          // Calculate the pllFrequency: 
                                          //the divider * desired output frequency

  mult = pllFreq / xtalFreq;              // Determine the multiplier to 
                                          //get to the required pllFrequency
  l = pllFreq % xtalFreq;                 // It has three parts:
  f = l;                                  // mult is an integer that must be in the range 15..90
  f *= 1048575;                           // num and denom are the fractional parts, the numerator and denominator
  f /= xtalFreq;                          // each is 20 bits (range 0..1048575)
  num = f;                                // the actual multiplier is mult + num / denom
  denom = 1048575;                        // For simplicity we set the denominator to the maximum 1048575

                                          // Set up PLL A with the calculated  multiplication ratio
  setupPLL(MSNA_ADDR, mult, num, denom);
                                          // Set up MultiSynth divider 0, with the calculated divider.
                                          // The final R division stage can divide by a power of two, from 1..128.
                                          // reprented by constants SI_R_DIV1 to SI_R_DIV128 (see si5351a.h header file)
                                          // If you want to output frequencies below 1MHz, you have to use the
                                          // final R division stage
  setupMultisynth(MS0_ADDR, divider, R_DIV_1);
                                          // Reset the PLL. This causes a glitch in the output. For small changes to
                                          // the parameters, you don't need to reset the PLL, and there is no glitch
//  Si5351_write(PLL_RESET, 0x20);
                                          // Finally switch on the CLK0 output (0x4F)
                                          // and set the MultiSynth0 input to be PLL A 
  Si5351_write(CLK0_CTRL, 0x4C | mA | CLK_SRC_PLL_A);    // Strength lebel set
//  Si5351_write(CLK0_CTRL, 0x4C | CLK_SRC_PLL_A);    // Strength 2mA
}

////////////////////////////////////////////////////////////////////////
// Set CLK2 output ON and to the specified frequency
// Frequency is in the range 1MHz to 150MHz
// Example: si5351aSetFrequency2(10000000,_8mA);
// will set output CLK0 to 10MHz
//
// This example sets up PLL B
// and MultiSynth 1
// and produces the output on CLK2
////////////////////////////////////////////////////////////////////////

void si5351aSetFrequency2(uint32_t frequency,uint8_t mA){
  uint32_t pllFreq;
  uint32_t xtalFreq = XTAL_FREQ;
  uint32_t l;
  float f;
  uint8_t mult;
  uint32_t num;
  uint32_t denom;
  uint32_t divider;

  divider = 900000000 / frequency;        // Calculate the division ratio. 900,000,000 is the maximum internal
                                          // PLL frequency: 900MHz
  if (divider % 2) divider--;             // Ensure an even integer 
                                          //division ratio

  pllFreq = divider * frequency;          // Calculate the pllFrequency: 
                                          //the divider * desired output frequency

  mult = pllFreq / xtalFreq;              // Determine the multiplier to 
                                          //get to the required pllFrequency
  l = pllFreq % xtalFreq;                 // It has three parts:
  f = l;                                  // mult is an integer that must be in the range 15..90
  f *= 1048575;                           // num and denom are the fractional parts, the numerator and denominator
  f /= xtalFreq;                          // each is 20 bits (range 0..1048575)
  num = f;                                // the actual multiplier is mult + num / denom
  denom = 1048575;                        // For simplicity we set the denominator to the maximum 1048575

                                          // Set up PLL B with the calculated  multiplication ratio
  setupPLL(MSNB_ADDR, mult, num, denom);  
                                          // Set up MultiSynth divider 0, with the calculated divider.
                                          // The final R division stage can divide by a power of two, from 1..128.
                                          // reprented by constants SI_R_DIV1 to SI_R_DIV128 (see si5351a.h header file)
                                          // If you want to output frequencies below 1MHz, you have to use the
                                          // final R division stage
  setupMultisynth(MS2_ADDR, divider, R_DIV_1);
                                          // Reset the PLL. This causes a glitch in the output. For small changes to
                                          // the parameters, you don't need to reset the PLL, and there is no glitch
//  Si5351_write(PLL_RESET, 0x80);
                                          // Finally switch on the CLK1 output
                                          // and set the MultiSynth0 input to be PLL B 
  Si5351_write(CLK2_CTRL, 0x6C | mA | CLK_SRC_PLL_B);    // Strength lebel set
//  Si5351_write(CLK2_CTRL, 0x6C | CLK_SRC_PLL_B);    // Strength 2mA
}

2017年12月5日火曜日

Knobless Wonder

Knobless Wonderは、VK3YEが開発 した単一周波数のSSBトランシーバである。このトランシーバは、ツマミが無く極めてシンプルな構造をしている。今回、7.15909MHzの水晶発振子を使い、7.160MHz版を作った。出力2W程のQRPであるが、数局とQSOした。電波品位に関しマイナス評価は、今の所ない。
ファイルは、Download siteのKnobless Wonderフォルダからダウンロード可能。






Knobless Wonderで最も重要となるのは、クリスタルフィルタである。水晶発振子は、中華の49US(小型の背が低いタイプ)を入手し、FRMSで特性を測った。最適値では無いが、LSBでのキャリアポイントは、7.1607MHzである。日本国内の7MHz帯運用状況から、1kHZステップでの運用が暗黙の了解なので、1kHZに丸める事が望ましい。従って、このフィルタは使えない。(キャリアポイント有りき、フィルタ帯域である。)



キャリアポイントを7.160MHz±100Hzを目標値とした時、市販部品で作れるフィルタである。一般的に、この様なSSBには不向きと思われる狭帯域となる定数は選ばないであろう。だが求めている物は、HiFi音質でなく、通信に必要な実用レベルの音質なので、これで良い。







オリジナルを改造した回路図である。オリジナル回路のコレクタ抵抗は、ゲインが不足することから、インダクタに交換。更に、低周波出力はスピーカーマイクを使う為にゲインを向上させた。






基板サイズ 73 × 95
pcbeでパターン設計し、中華にPCBを注文した。中華に発注したPCBで組立たが、終段で異常発振した。パターン引き回し上の単純なミスであった。左は、修正済みのパターン。 






2017年11月27日月曜日

stm32版si5351a VFO周波数校正

9月にsi5351a VFOに周波数校正機能を追加したが、機能をTwitterで紹介した程度であったので、機能説明をする。周波数校正機能の起動は、RITスイッチを約1秒長押する。周波数カウンタをCLK0周波数が10MHzとなる様、エンコーダで調整する。(LCDは、基準水晶発振子の周波数表示。)調整後、再びRITスイッチを約1秒長押しすると疑似EEPROMに書き込まれる。



周波数カウンタでCLK0出力周波数を表示している様子。













スケッチ

機能が含まれたスケッチは、JA2GQP's Download siteのstm32フォルダにあるstm32_si5351a.zipファイル。si5351a2.hは、水晶発振子の基本周波数を変数 xtalFreq が定義されているので、zipファイルに含まれたファイルを使う。
      

2017年11月2日木曜日

7.2MHz Knobless Wonder Filter

自作仲間JA2NKD 、JH8SST/7、Kさん でKnobless Wonderを試験している。ここで問題になっているのは、水晶発振子である。価格が安く、多く流通している物が使えれば好ましい。Knobless Wonderサイト、Knobless Wonderサイトに7.2MHz水晶発振子の紹介がある。そこで、日本国内で7.2MHz水晶発振子を使う場合、オフバンドが危惧されるので、バンド内に収まる様なフィルタを試験した。


試験した回路図である。7.2MHz以下に収める必要があるので、多少余裕を見てこの定数とした。試験回路をユニバーサル基板で作った。







FRMSで抵抗マッチング(680Ω)により測定した。一般的に-3dBにおける帯域幅をフィルタ帯域と言っているが、4ポールのシャープファクタの低いフィルタの為、-20dB(一般的なキャリアポイントの位置)でフィルタ定数を決めた。
cf(中心周波数) 7.1979MHz
cp(LSBキャリアポイント)7.1990MHz
試作した結果から、7.2MHzの水晶発振子をフィルタとして使える。ただし、最終的な回路を組み立て、実機検証する必要がある。






参考データ 

コンデンサを47pとした場合のデータである。
















今後の課題 

ユニバーサル基板で試作した為、リード線の浮遊容量が大きい。この回路方式の場合、浮遊インダクタンスの影響を大きく受けるので、最終的な姿で回路定数を決め検証する。