Friday, September 14, 2018

Modifikasi Yaesu FT 180A dengan DDS VFO Si5351

Setelah iseng2 cari sana-sini selama kurang lebih 3-6 bulan, menemukan bakalan Yaesu FT 180A yang masih orisinil, berisi hanya 1 channel saja. Ngoprek dimulai dengan melepas Kristal Osilator bawaan pabrikan.


setelah prototype diatas dapat bekerja dengan sempurna saat-nya unt. memasukkan prototype ke dalam box FT 180 sehingga dapat fitting sempurna dengan tanpa merusak secara masif existing komponen maupun casing yang sudah ada(kesan vintage-nya masih ada).

berikut adalah modul si5351 yang dimasukkan ke dalam kotak oscillator, gunanya untuk meminimalkan interferensi terhadap output DDS si5351 dan sekaligus menjaga kestabilan output-nya.


bagian dari OLED Display, Rotary Encoder termounting pada PCB Lubang IC - Single Layer dan sekaligus Arduino Mini Pro beserta regulator DC 5v dan 3.3V tersolder permanen pada modul tersebut.


nampak warna merah-orange adalah LED indikator dari DC Regulator Modul dan Arduino Mini Pro Modul, terpadang pada panel sisi kiri dari FT 180A.


diatas adalah penampakan OLED Display yang terpasang mengisi space dari papan angka FT 180A yang sebelum-nya, lampu DC 12V existing dilepas beserta soft light cover-nya. Band Selector LPF dilepas dari mounting-nya (selector otomatis akan di desain selanjut-nya).

Bagaimana dengan Rangkaian DDS VFO menggunakan modul Si5351?, dibawah ini adalah rangkaian simple-nya, semua dapat dibeli modul-modul-nya secara terpisah di toko online tanpa melakukan solder mensolder secara njelimet. Kita bisa menggunakan Arduino Nano dengan kelebihan sudah ada serial TTL dan tersedia DC 3.3V beserta 5V, sedangkan kekurangan-nya adalah bentuknya yang cukup besar sehingga untuk masuk kedalam box FT180 akan mengalami kendala extra.


dibawah adalah rangkaian prototype yang saya buat menggunakan Arduino Pro Mini sehingga ukuran-nya yang kecil membuat lebih mudah untuk melakukan casing-isasi terhadap rangkaian yang sudah kita buat sebelum-nya.



nampak ukuran board yang kecil, kekurangan-nya adalah kita musti menyediakan regulator tambahan DC5V(tetapi hal ini tidak kita butuhkan apabila kita pesan Arduino Pro Mini 3.3V) dan DC 3.3V untuk mensuplay DC pada Rotary Encoder dan modul si5351 dan juga kita membutuhkan serial TTL untuk melakukan upload sketch ke dalam arduino pro mini tersebut.

alat pemrograman tersebut dapat digunakan universal terhada semua perangkat digital untuk keperluan update firmware, upload sketch pada arduino, serial debugging, dll.

setelah lengkap hardware yang kita pasang saat-nya untuk upload sketch pada arduino tersebut, berikut adalah sketch dalam format arduino-nya :

#include
#include  
#include
#include
#include
#include
#include

/**************************************************************************
*  Definitions
**************************************************************************/
#define ENCODER_A     2       // Encoder pin A INT0/PCINT18 D2
#define ENCODER_B     3       // Encoder pin B INT1/PCINT19 D3
#define ENCODER_BTN   4       // Encoder pushbutton D4
#define OLED_RESET    13       // OLED reset
#define Calibrbtn     5       // Calibrate
#define RIT_Switch    6       // RIT Switch
#define TX_Switch     7       // Select TRx or BFO

#define F_MIN        1000000UL        // Lower frequency limit
#define F_MAX        300000000UL      // Upper frequency limit

/**************************************************************************
*  EEPROM data locations 
**************************************************************************/
#define EE_SAVED_RADIX  0   // Stepsize pointer
#define EE_SAVED_AFREQ  4   // Actual Tx Frequency (CLK0)
#define EE_SAVED_BFREQ  8   // BFO (IF) Frequency  (CLK2)
#define EE_SAVED_XFREQ  12  // X-tal frequency  (25 or 27 MHz)
#define EE_SAVED_OFSET  16  // store correction
#define EE_SAVED_CALBR  20  // calibrated indicator

Adafruit_SSD1306 display(OLED_RESET);
Si5351 si5351;
Rotary r = Rotary(ENCODER_A, ENCODER_B);
const int sampleWindow = 50;                              // Sample window width in mS (50 mS = 20Hz)
unsigned int sample;

/**************************************************************************
*  Declarations
**************************************************************************/
volatile uint32_t bfo_f = 900000000ULL / SI5351_FREQ_MULT;    // CLK0 start IF
volatile uint32_t vfo_t = 1420000000ULL / SI5351_FREQ_MULT;   // CLK2 start Tx freq
volatile uint32_t vfo_r = vfo_t - bfo_f;                      // CLK1 start Rx freq
volatile uint32_t vfo_s = vfo_t;                              // Saved for RIT
uint32_t vco_c = 0;                                           // X-tal correction factor
uint32_t xt_freq;
long radix = 100L, old_radix = 100L;                          //start step size
boolean changed_f = 0, stepflag = 0, calflag = 0, modeflag = 0, ritset = 0;
boolean calibrate = 0;
byte  act_clk = 0, disp_txt = 0;

/**************************************/
/* Band Swicth  */
/**************************************/
int Band_80m = 12; // 3.5MHz sd 4.5MHz
int Band_40m = 11; // 6.5MHz sd 7.5MHz
int Band_30m = 10; // 11MHz sd 12MHz
int Band_20m = 9; //  14MHz sd 15MHz 
int Band_10m = 8; //  27MHz sd 28MHz 


/**************************************/
/* Interrupt service routine for      */
/* encoder frequency change           */
/**************************************/
ISR(PCINT2_vect) {
  char result = r.process();
  if (result == DIR_CW)
    set_frequency(1);
  else if (result == DIR_CCW)
    set_frequency(-1);
}


/**************************************/
/* Change the frequency               */
/* dir = 1    Increment               */
/* dir = -1   Decrement               */
/**************************************/
void set_frequency(short dir)
{
  switch (act_clk)
  {
    case 0:                 // Tx frequency
      if (dir == 1)
        vfo_t += radix;
      if (dir == -1)
        vfo_t -= radix;
      break;
    case 1:                 // Tx frequency (only if RIT is on)
      if (dir == 1)
        vfo_t += radix;
      if (dir == -1)
        vfo_t -= radix;
      break;
    case 2:                 // BFO frequency
      if (dir == 1)
        bfo_f += radix;
      if (dir == -1)
        bfo_f -= radix;
      break;
  }

  if(vfo_t > F_MAX)
    vfo_t = F_MAX;
  if(vfo_t < F_MIN)
    vfo_t = F_MIN;

  changed_f = 1;
}


/**************************************/
/* Read the buttons with debouncing   */
/**************************************/
boolean get_button()
{
  if (!digitalRead(ENCODER_BTN))            // Stepsize
  {
    delay(20);
    if (!digitalRead(ENCODER_BTN))
    {
      while (!digitalRead(ENCODER_BTN));
      stepflag = 1;      
    }
  }
  else if (!digitalRead(Calibrbtn))         // Calibrate
  {
    delay(20);
    if (!digitalRead(Calibrbtn))
    {
      while (!digitalRead(Calibrbtn));
      calflag = 1;
    }
  }
  else if (!digitalRead(TX_Switch))         // Selection
  {
    delay(20);
    if (!digitalRead(TX_Switch))
    {
      while (!digitalRead(TX_Switch));
      modeflag = 1;
    }
  }  
  if (stepflag | calflag | modeflag) return 1;
  else return 0;
}


/********************************************************************************
 * RIT switch handling
 * Switch to small stepsize (100 Hz)
 *******************************************************************************/
void RIT_switch()                               // Read RIT_switch
{
  if (!digitalRead(RIT_Switch) && ritset == 0){     // RIT on
    act_clk = 1;
    ritset = 1;
    vfo_s = vfo_t;                              // Save Tx freq
    old_radix = radix;                          // Save actual stepsize
    radix = 100;                                // Set stepsize to 100 Hz
  }
  else if (digitalRead(RIT_Switch) && ritset == 1){ // RIT 0ff
    act_clk = 0;                                // RTx mode
    ritset = 0;
    vfo_t = vfo_s;                              // Restore to original vco_t
    radix = old_radix;                          // Back to old stepsize
    disp_txt = 0;                               // Clear line
    
// Update Rx frequency based on the restored Tx frequency    
    if (vfo_t <= bfo_f) vfo_r = vfo_t + bfo_f;  // Upper / lower mixing  
    else vfo_r = vfo_t - bfo_f;   
    si5351.set_freq((vfo_r * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK1);
  }
}

/**************************************/
/* Displays the frequency and stepsize*/
/**************************************/
void display_frequency()
{
  display.setTextSize(2);  
  char LCDstr[12];
  char Mhz[5], Herz[12];
  int p,q;
  unsigned long freq;
  display.clearDisplay();

  switch(act_clk)
  {
    case 0:                               // Tx frequency
      freq = vfo_t;
      break;
    case 1:                               // Tx frequency (Used in RIT Mode)
      freq = vfo_t;
      break;
    case 2:                               // MF frequency
      freq = bfo_f;
      break;
  }
    
  Herz[1]='\0';                           // empty arry

  sprintf(LCDstr, "%ld", freq);           // convert freq to string
  p=strlen(LCDstr);                       // determine length

  strncpy(Mhz,LCDstr,(p-6));              // get MHz digits (1-3)
  q=p-6;
  Mhz[q]='\0';                            // end with null character
  strcpy(Herz,LCDstr);                    // get Herz digits (6)
  strcpy(LCDstr+q,Herz+(q-1));            // copy into LCDstr
  LCDstr[q]='.';                          // decimal point

  display.setCursor(15,20);
  display.println(LCDstr);
  display_settings();
  
}


/**************************************/
/* Displays step, mode and version    */
/**************************************/
void display_settings()

// DISPLAY S-METER
{
   unsigned long startMillis= millis();                   // Start of sample window
   float peakToPeak =    0;                                  // peak-to-peak level
   unsigned int signalMax = 0;                            //minimum value
   unsigned int signalMin = 1023;                         //maximum value

                                                          // collect data for 3000 mS
   while (millis() - startMillis < sampleWindow)
   {
      sample = analogRead(A0);                             //get reading from microphone
      if (sample < 1023)                                  // toss out spurious readings
      {
         if (sample > signalMax)
         {
            signalMax = sample;                           // save just the max levels
         }
         else if (sample < signalMin)
         {
            signalMin = sample;                           // save just the min levels
         }
      }
   }
   peakToPeak = signalMax - signalMin;                    // max - min = peak-peak amplitude
   float db = map(peakToPeak,80 ,1030,50,  550 );             //calibrate for deciBels
  
    for(int x =5;x<114 draw="" nbsp="" p="" scale="" x="x+10){ ">
   display.drawLine(x, 55, x, 52, WHITE);
    }
   display.drawRoundRect(0, 55, 125, 9, 2, WHITE);       //draw outline of bar graph
   int r = map(db,0,125,1,125);                           //set bar graph for width of screen
   display.fillRoundRect(1, 56, r, 10, 2, WHITE);         //draw bar graph with a width of r
   

// Stepsize  
  display.setCursor(1, 4 );  
  display.setTextSize(1);  
  //display.print(F("Step:"));
  switch (radix)
  {
    case 1:
      display.println(F("   1Hz"));
      break;
    case 10:
      display.println(F("  10Hz"));
      break;
    case 100:
      display.println(F(" 100Hz"));
      break;
    case 1000:
      display.println(F("  1kHz"));
      break;
    case 10000:
      display.println(F(" 10kHz"));
      break;
    case 100000:
      display.println(F("100kHz"));
      break;
    case 1000000:
      display.println(F("  1MHz"));
      break;
    
  }

// Mode
  display.setCursor(45, 4);
  display.setTextSize(1);  
  switch (act_clk)
  {
    case 0:
      display.println(F("V3.0"));
      break;
    case 1:
      display.println(F("RIT"));
      break;
    case 2:
      display.println(F("BFO"));
      break;
  }

// LSB and USB Mode  
    if (vfo_t >= 10000000UL) 
      {
        display.setCursor(75, 4 ); 
        display.print(F("USB"));
      }

  else if (vfo_t <= 10000000UL)
      {
        display.setCursor(75, 4); 
        display.print(F("LSB"));
      }

// Band Text
    if (vfo_t >= 3500000UL && vfo_t <= 4500000)
      {
        display.setCursor(100, 4);
        display.print (F("80M"));
      }
   else if (vfo_t >= 6500000UL && vfo_t <= 7500000)
      {
        display.setCursor(100, 4);
        display.print (F("40M"));
      }

   else if (vfo_t >= 11000000UL && vfo_t <= 12000000)
      {
        display.setCursor(100, 4);
        display.print (F("30M"));
      }
      
  else if (vfo_t >= 14000000UL && vfo_t <= 15000000)
      {
        display.setCursor(100, 4);
        display.print (F("20M"));
      }
      
  else if (vfo_t >= 27000000UL && vfo_t <= 28000000UL)
      {
        display.setCursor(100, 4);
        display.print (F("10M"));
      }

  //display.clearDisplay();
 display.setCursor(1,42);
 display.setTextSize(1);
 display.println("S1 3 5 9  20  40  +60");

// Kotak Frekwensi
display.drawRect(1, 16, 125, 22, WHITE);
// Kotak Kuning
display.drawRect(1, 0, 125, 15, WHITE);     
// Messages
  display.setCursor(100,4);
  switch (disp_txt)
  {
    case 1:
      display.print(F("SW RIT Off"));
      break;
    case 2:
      display.print(F("Set to TRx"));
      break;
    case 3:
      display.print(F("CAL"));
      break;      
    case 4:
      display.print(F("  "));
      break;  
    case 5:
      display.print(F("LSB"));
      break;
    case 6:
      display.print(F("USB"));
      break;                
  }
  display.display();

}

/**************************************/
/*            S E T U P               */
/**************************************/
void setup()
{
  // Band Switch
      pinMode(Band_10m, OUTPUT);
      pinMode(Band_20m, OUTPUT);
      pinMode(Band_30m, OUTPUT);
      pinMode(Band_40m, OUTPUT);
      pinMode(Band_80m, OUTPUT);
        
  Serial.begin(115200);
  Wire.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x64)


// Clear the buffer.
  display.clearDisplay();
  // Show the display buffer on the hardware.
  // NOTE: You _must_ call display after making any drawing commands
  // to make them visible on the display hardware!
  


// Read EEPROM
  radix = eeprom_read_dword((const uint32_t *)EE_SAVED_RADIX);
  if ((radix < 10UL) | (radix > 1000000UL)) radix = 100UL;  
  
  vfo_t = eeprom_read_dword((const uint32_t *)EE_SAVED_AFREQ);
  if ((vfo_t < F_MIN) | (vfo_t > F_MAX)) vfo_t = 14000000ULL;

  bfo_f = eeprom_read_dword((const uint32_t *)EE_SAVED_BFREQ);
  if ((bfo_f < F_MIN) | (bfo_f > F_MAX)) bfo_f = 9000000ULL;  

  vco_c = 0;
  if (eeprom_read_dword((const uint32_t *)EE_SAVED_CALBR) == 0x60)  {
    vco_c = eeprom_read_dword((const uint32_t *)EE_SAVED_OFSET);
  }  
  xt_freq = SI5351_XTAL_FREQ + vco_c;

//initialize the Si5351
  si5351.set_correction(0); // Set to zero because I'm using an other calibration method
  si5351.init(SI5351_CRYSTAL_LOAD_8PF, xt_freq); //If you're using a 27Mhz crystal, put in 27000000 instead of 0
  // 0 is the default crystal frequency of 25Mhz.
  si5351.set_pll(SI5351_PLL_FIXED, SI5351_PLLA);
  
// Set CLK0 to output the starting "vfo" frequency as set above by vfo = ?
  si5351.set_freq((vfo_t * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK0);
  si5351.drive_strength(SI5351_CLK0,SI5351_DRIVE_2MA);
// Set CLK1 to output the Rx frequncy = vfo +/- bfo frequency
  if (vfo_t <= bfo_f) vfo_r = vfo_t + bfo_f;    // Upper / lower mixing  
  else vfo_r = vfo_t - bfo_f;  
  si5351.set_freq((vfo_r * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK1);
  si5351.drive_strength(SI5351_CLK1,SI5351_DRIVE_2MA);
// Set CLK2 to output bfo frequency
  si5351.set_freq((bfo_f * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK2);
  si5351.drive_strength(SI5351_CLK2,SI5351_DRIVE_2MA);


// Clear the buffer.
  display.clearDisplay();
  display.display();
  
// text display tests
  display.setTextSize(1);
  display.setTextColor(WHITE);
  
// Encoder setup
  pinMode(ENCODER_BTN, INPUT_PULLUP);
  PCICR |= (1 << PCIE2);                       // Enable pin change interrupt for the encoder
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);

  sei();

// Pin Setup
  pinMode(Calibrbtn, INPUT_PULLUP);   // Calibrate
  pinMode(RIT_Switch, INPUT_PULLUP);  // RIT Switch
  pinMode(TX_Switch, INPUT_PULLUP);   // Select TRx or BFO
  
// Display first time  
  display_frequency();  // Update the display
}

/**************************************/
/*             L O O P                */
/**************************************/
void loop()
  {
  
  if (disp_txt == 4) {
    delay(3000);                  // Display calibration OK and wait 3 seconds
    disp_txt = 0;
  }

// Band Switch
   if (vfo_t >= 3500000UL && vfo_t <= 4500000)
        {
         digitalWrite(Band_80m,HIGH);
          }
   else {
         digitalWrite(Band_80m,LOW);      
          }
   if (vfo_t >= 6500000UL && vfo_t <= 7500000)
        {
         digitalWrite(Band_40m,HIGH);
          }
   else {
         digitalWrite(Band_40m,LOW);         
          }

   if (vfo_t >= 11000000UL && vfo_t <= 12000000)
        {
        digitalWrite(Band_30m,HIGH);
         }
   else {
         digitalWrite(Band_30m,LOW);         
          }
          
  if (vfo_t >= 14000000UL && vfo_t <= 15000000)
        {
        digitalWrite(Band_20m,HIGH);
         }
   else {
         digitalWrite(Band_20m,LOW);         
          }
          
  if (vfo_t >= 27000000UL && vfo_t <= 28000000UL)
      {
        digitalWrite(Band_10m,HIGH);
      }
   else {
         digitalWrite(Band_10m,LOW);         
          }
           
// Update the display if the frequency has been changed
  if (changed_f)  {
    display_frequency();
    
    if (act_clk == 0 && !calibrate)                   // No Tx update during calibrate
    si5351.set_freq((vfo_t * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK0);
    else if (act_clk == 2)                            // BFO update
    si5351.set_freq((bfo_f * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK2);      
// Update Rx frequency    
    if (vfo_t <= bfo_f) vfo_r = vfo_t + bfo_f;      // Upper / lower mixing  
    else vfo_r = vfo_t - bfo_f;    
    si5351.set_freq((vfo_r * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK1);

    changed_f = 0;
    disp_txt = 0;                   // Clear line
  }

  RIT_switch();                     // read RIT switch
  
// Button press changes the frequency change step for 1 Hz steps
// Also stored the last used frequency together with the step size before store
  if (get_button()) {
    if (stepflag) {                 // Stepsize button
      eeprom_write_dword((uint32_t *)EE_SAVED_RADIX, radix);
      eeprom_write_dword((uint32_t *)EE_SAVED_AFREQ, vfo_t);
  
      switch (radix)
      {
      case 1:
        radix = 10;
        break;
      case 10:
        radix = 100;
        break;
      case 100:
        radix = 1000;
        break;
      case 1000:
        radix = 10000;
        break;
      case 10000:
        radix = 100000;
        break;
      case 100000:
        radix = 1000000;
        break;
      case 1000000:
        radix = 1;
        break;       
      }
      stepflag  = 0;
    }
    else if (modeflag)  {         // Mode button
      if (act_clk == 0) act_clk = 2; else act_clk = 0;
      eeprom_write_dword((uint32_t *)EE_SAVED_BFREQ, bfo_f);
      modeflag = 0;  
      disp_txt = 0;                                 // Clear line
    }
    else if (calflag) {                             // Calibrate button
      if (!digitalRead(RIT_Switch)){                // RIT is on
        disp_txt = 1;                               // Message RIT off
      }
      else if (act_clk == 2){                       // BFO mode on
        disp_txt = 2;                               // Message BFO off        
      }
      else if (!calibrate)  {                       // Start calibrate
        vfo_s = vfo_t;                              // Save actual freq
        old_radix = radix;                          // and stepsize
        vfo_t = SI5351_XTAL_FREQ;                   // en set to default x-tal
        disp_txt = 3;                               // Message Calibrate
        calibrate = 1;
        radix = 10;                                 // Set to 10 Hz        
        si5351.set_freq((vfo_t * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK0); // Set CLK0
      }
      else if (calibrate) {                         // after tuning x-tal freq
        calibrate = 0;
        vco_c = vfo_t - SI5351_XTAL_FREQ;           // difference
        vfo_t = vfo_s;                              // restore freq
        radix = old_radix;                          // and stepsize
        disp_txt = 4;                               // Message Calibrate OK
        
        eeprom_write_dword((uint32_t *)EE_SAVED_OFSET, vco_c);        // store correction
        xt_freq = SI5351_XTAL_FREQ + vco_c;                           // Calibrated x-tal freq
        eeprom_write_dword((uint32_t *)EE_SAVED_CALBR, 0x60);         // Calibrated
        si5351.init(SI5351_CRYSTAL_LOAD_8PF, xt_freq);                // Initialize
        si5351.set_pll(SI5351_PLL_FIXED, SI5351_PLLA);        
        si5351.set_freq(bfo_f * SI5351_FREQ_MULT, SI5351_PLL_FIXED, SI5351_CLK2);   // correct BFO frequency
        si5351.set_freq(vfo_t * SI5351_FREQ_MULT, SI5351_PLL_FIXED, SI5351_CLK0);   // Correct Tx freq
        if (vfo_t <= bfo_f) vfo_r = vfo_t + bfo_f;                                  // Upper / lower mixing
        else vfo_r = vfo_t - bfo_f;
        si5351.set_freq(vfo_r * SI5351_FREQ_MULT, SI5351_PLL_FIXED, SI5351_CLK1);   // correct Rx frequency
      }
      calflag = 0;
    }
  }
  display_frequency();                              // Update display



                                
}



// end while loop

download Service Manual Yaesu FT180a pada link  dibawah ini : https://1drv.ms/f/s!AuMtm9KDRI6mgdsuCrW51F1OBv1zYw

diperlukan modifikasi BPF pada board RF Unit Yaesu FT 180A(band 80m, 40m, 26m dan 20m) dengan menggunakan Trafo IF warna biru, dan setting jumper simplex pada LPF selector


saya sertakan juga referensi saya yang lainnya untuk modifikasi lilitan BPF dan nilai kapasitor-nya 


dibawah ini pemasangan BPF on progress ... yg existing dilepas.


board yang existing, sebelum dimodifikasi 


dan trafo BPF baik RX maupun TX sudah terpasang dengan sempurna seperti gambar dibawah, masih tersisa 2 selector BPF dimana pada FT 180A ini range LPF-nya mulai dari 1.6MHz s/d 18MHz.


hal yang perlu diperhatikan adalah dalam pemilihan Capacitor untuk BPF, alangkah baik-nya kita ukur mengunakan L-C Meter, mengingat sepengalaman saya hampir 80% nilai capacitor yang ada di retail nilai-nya tidak bisa konsisten dan memiliki deviasi yang lumayan signifikan.


bagaimanakah proses installasi Adruino beserta modul Si5351-nya, detail dapat dilihat pada gambar dibawah ini 



Sekarang saat-nya untuk perhitungan matematis-nya

Default dari Yaesu FT-180A unt. BFO menggunakan Crystal 10.7MHz dan pada USB menggunakan Crystal Filter 10.69845MHz, dan kendalanya untuk main di LSB kita musti pasang Crystal Filter lagi, dari beberapa referensi yang ada dan eksperiment dengan adjust frekwensi osilator dan clarifier akhirnya memberanikan mengubah design.

BFO yang semula statis menggunakan Crystal Filter 10.7MHz, saja lepas Crystal 10.7MHz-nya, diinject dengan BFO dari si5351 yang dinamis, dapat kita adjust sesuai dengan yang kita inginkan. jadi teori-nya adalah Crystal Filter USB bawaan dari Yaesu kita gunakan sebagai Crystal utama sedangkan untuk main USB nilai BFO-nya yang dinamis 1500Hz diatas ataupun dibawah dari nilai 10.69845MHz.

Hasilnya yang sudah saya terapkan pada 40m band saat ini nilai VFO adalah Freq display ditambahkan freq BFO(Freq center dari Crystal Filter USB pada IF Board Yaesu FT-180A), si5351 secara otomatis untuk frekwensi 10MHz akan menggunakan USB mode, berikut tabel dari penjelasan diatas :




untuk si5351 CL2 adalah Freq BFO, CL1 adalah nilai VFO+BFO sedangkan CL0 adalah nilai Freq yang tampil di LCD OLED Display tersebut.

SELAMAT MENCOBA, apabila ada yang ditanyakan feel free untuk kontak saya by email ke redy@wibisono.xyz

8 comments:

Alexandra Christie said...

ayam berlaga ayam sabung taji

Unknown said...

mantap ditunggu sambunganya om

Redy Wibisono said...

sudah saya tanbahkan Pak Herry Mardianto

Unknown said...

Mantap! Om redy blog ini sangat membantu sekali.

Redy Wibisono said...

terima kasih untuk informasi-nya

lekgun said...

Boleh izin minta source code lengkapnya om

Ricky said...

izin sedot source code-nya. bisakah saya dapatkan file librarynya ?

Anonymous said...

Wah jan mumet sirahe, tapi pelan 2 karena melewat zaman.