Indoware - Electronics Online Store

Order barang yang masuk akan segera kami proses jam buka toko 08.30 sd 16.30 wib

 


User Manual

si5351 si5351a Si5351 VFO BFO dengan Arduino

Diposting oleh :admin
Kamis, 21 Januari 2016 - 22:13:38 WIB | Dibaca: 2547 kali



si5351 si5351a Si5351 VFO BFO dengan Arduino

Berawal dari kebutuhan perangkat VFO atau clock genarator yang meningkat, penggunaan DDS ad9850/ad9851 yang semakin mahal. Maka kami melakukan pencarian referensi ke alternatif penggunaan selain DDS. Selain DDS alternatif lain yaitu chip tunggal PLL terkontrol menggunakan jalur i2c dengan harga lebih ekonomis dari DDS chip. Chip pll tersebut adalah si5351 series, untuk kebutuh ini maka kita cukup menggunakan varian dari si5351 ini adalah seri a5351a. 

Dari beberapa referensi yang kita dapat, ada referensi yang bagus seperti link berikut ini:

http://ak2b.blogspot.co.id/2015/01/si5351-simple-vfo-hardware-setup.html

http://ak2b.blogspot.co.id/2015/04/multi-featured-vfo.html

http://www.jessystems.com/LBS_Detail.html

http://www.n6qw.com/LBS2.html

 

Beberapa referensi diatas akhir kami mencoba mendesai sebuat modul si5351a , arduino UNO, dan LCD 1602 yang digabung menjadi satu. Sehingga modul dan board tersebut akan lebih mudah dan memiliki harga yang lebih ekonomis dari pada kita membeli modul terpisah. Modul terpisah seperti referensi site "ak2b" yan g menggunakan UNO seperti gambar dibawah akan nampak fisik yang dibuat masih dalam ukuran board besar dan belum praktis.

referensi http://ak2b.blogspot.co.id/2015/04/multi-featured-vfo.html :

 

Sehingga dari referensi diatas penulis mendesai menjadi modul praktis, sesuai rancangan circuit berikut  http://indo-ware.com/support.php?file=si5351a_calibrasi_circuit.pdf. Board yang dirancang seukuran lebar LCD1602. 

board yang sudah dibuat:

 

Hal pertama yang kita lakukan adalah pemindahan isi file cd yang kita dapat ke perangkat pc atau laptop kita.  File yang bisa kita pake adalah code atau sketch VFO, file library rotary encouder dan library si5351 , file driver USB to serial TTL PL2303, gambar circuit, dan IDE Arduino 1.6.5. Berikut list isi cd bawaan:

 

langkah awal lakukan instlasi driver usb to serial ttl chip PL2303TA agar dapat terdeteksi oleh komputer, com port dari module si5351a ini.Langkah awal masukkan dan pasang kabel mini USB ke laptop/pc dan pasang ujung satunya kabel mini usb ke modul board tersebut. Komputer akan minta driver USB to Serial TTL PL2303 kalo pc tersebut belum pernah menggunakan USB to serial TTL. Jika sudah berhasil instalasi USB to Serial TTL di device manager akan nampak ProlificUSB to Serial Convert Port (Com Port). ComPort ini yang nantinya akan dijadikan perantara upload/programming chip dari IDE Arduino ke Board Arduino UNO Si5351a tersebut. Lihat gambar dibawah ini:

 

IDE arduino di cd sudah disiapkan IDE Arduino 1.6.5

 

sketch/code VFO si5351a Arduino:
[code]
/*
This entire program is taken from Jason Mildrum, NT7S and Przemek Sadowski, SQ9NJE.
There is not enough original code written by me to make it worth mentioning.
http://nt7s.com/
http://sq9nje.pl/
http://ak2b.blogspot.com/
*/

#include
#include
#include
#include

#define F_MIN        100000000UL               // Lower frequency limit
#define F_MAX        5000000000UL

#define ENCODER_A    2                      // Encoder pin A
#define ENCODER_B    3                      // Encoder pin B
#define ENCODER_BTN  11
#define LCD_RS        5
#define LCD_E                6
#define LCD_D4        7
#define LCD_D5        8
#define LCD_D6        9
#define LCD_D7        10

LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);       // LCD - pin assignement in
Si5351 si5351;
Rotary r = Rotary(ENCODER_A, ENCODER_B);
volatile uint32_t LSB = 899950000ULL;
volatile uint32_t USB = 900150000ULL;
volatile uint32_t bfo = 900150000ULL; //start in usb
//These USB/LSB frequencies are added to or subtracted from the vfo frequency in the "Loop()"
//In this example my start frequency will be 14.20000 plus 9.001500 or clk0 = 23.2015Mhz
volatile uint32_t vfo = 1420000000ULL / SI5351_FREQ_MULT; //start freq - change to suit
volatile uint32_t radix = 100;    //start step size - change to suit
boolean changed_f = 0;
String tbfo = "";

//------------------------------- Set Optional Features here --------------------------------------
//Remove comment (//) from the option you want to use. Pick only one
#define IF_Offset //Output is the display plus or minus the bfo frequency
//#define Direct_conversion //What you see on display is what you get
//#define FreqX4  //output is four times the display frequency
//--------------------------------------------------------------------------------------------------


/**************************************/
/* Interrupt service routine for      */
/* encoder frequency change           */
/**************************************/
ISR(PCINT2_vect) {
  unsigned 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)
{
  if (dir == 1)
    vfo += radix;
  if (dir == -1)
    vfo -= radix;

  //    if(vfo > F_MAX)
  //      vfo = F_MAX;
  //    if(vfo < F_MIN)
  //      vfo = F_MIN;

  changed_f = 1;
}
/**************************************/
/* Read the button with debouncing    */
/**************************************/
boolean get_button()
{
  if (!digitalRead(ENCODER_BTN))
  {
    delay(20);
    if (!digitalRead(ENCODER_BTN))
    {
      while (!digitalRead(ENCODER_BTN));
      return 1;
    }
  }
  return 0;
}

/**************************************/
/* Displays the frequency             */
/**************************************/
void display_frequency()
{
  uint16_t f, g;

  lcd.setCursor(3, 0);
  f = vfo / 1000000;     //variable is now vfo instead of 'frequency'
  if (f < 10)
    lcd.print(' ');
  lcd.print(f);
  lcd.print('.');
  f = (vfo % 1000000) / 1000;
  if (f < 100)
    lcd.print('0');
  if (f < 10)
    lcd.print('0');
  lcd.print(f);
  lcd.print('.');
  f = vfo % 1000;
  if (f < 100)
    lcd.print('0');
  if (f < 10)
    lcd.print('0');
  lcd.print(f);
  lcd.print("Hz");
  lcd.setCursor(0, 1);
  lcd.print(tbfo);
  //Serial.println(vfo + bfo);
  //Serial.println(tbfo);
}

/**************************************/
/* Displays the frequency change step */
/**************************************/
void display_radix()
{
  lcd.setCursor(9, 1);
  switch (radix)
  {
    case 1:
      lcd.print("    1");
      break;
    case 10:
      lcd.print("   10");
      break;
    case 100:
      lcd.print("  100");
      break;
    case 1000:
      lcd.print("   1k");
      break;
    case 10000:
      lcd.print("  10k");
      break;
    case 100000:
      //lcd.setCursor(10, 1);
      lcd.print(" 100k");
      break;
      //case 1000000:
      //lcd.setCursor(9, 1);
      //lcd.print("1000k"); //1MHz increments
      //break;
  }
  lcd.print("Hz");
}
void setup()
{
  Serial.begin(19200);
  lcd.begin(16, 2);                                                    // Initialize and clear the LCD
  lcd.clear();
  Wire.begin();

  si5351.set_correction(140); //**mine. There is a calibration sketch in File/Examples/si5351Arduino-Jason
  //where you can determine the correction by using the serial monitor.
 
  //initialize the Si5351
  si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0); //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 = ?

#ifdef IF_Offset
  si5351.set_freq((vfo * SI5351_FREQ_MULT) + bfo, SI5351_PLL_FIXED, SI5351_CLK0);
  volatile uint32_t vfoT = (vfo * SI5351_FREQ_MULT) + bfo;
  tbfo = "USB";
  // Set CLK2 to output bfo frequency
  si5351.set_freq( bfo, 0, SI5351_CLK2);
  //si5351.drive_strength(SI5351_CLK0,SI5351_DRIVE_2MA); //you can set this to 2MA, 4MA, 6MA or 8MA
  //si5351.drive_strength(SI5351_CLK1,SI5351_DRIVE_2MA); //be careful though - measure into 50ohms
  //si5351.drive_strength(SI5351_CLK2,SI5351_DRIVE_2MA); //
#endif

#ifdef Direct_conversion
  si5351.set_freq((vfo * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK0);
#endif

#ifdef FreqX4
  si5351.set_freq((vfo * SI5351_FREQ_MULT) * 4, SI5351_PLL_FIXED, SI5351_CLK0);
#endif

  pinMode(ENCODER_BTN, INPUT_PULLUP);
  PCICR |= (1 << PCIE2);           // Enable pin change interrupt for the encoder
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
  sei();
  display_frequency();  // Update the display
  display_radix();
}


void loop()
{
  // Update the display if the frequency has been changed
  if (changed_f)
  {
    display_frequency();

#ifdef IF_Offset
    si5351.set_freq((vfo * SI5351_FREQ_MULT) + bfo, SI5351_PLL_FIXED, SI5351_CLK0);
    //you can also subtract the bfo to suit your needs
    //si5351.set_freq((vfo * SI5351_FREQ_MULT) - bfo  , SI5351_PLL_FIXED, SI5351_CLK0);

    if (vfo >= 10000000ULL & tbfo != "USB")
    {
      bfo = USB;
      tbfo = "USB";
      si5351.set_freq( bfo, 0, SI5351_CLK2);
      Serial.println("We've switched from LSB to USB");
    }
    else if (vfo < 10000000ULL & tbfo != "LSB")
    {
      bfo = LSB;
      tbfo = "LSB";
      si5351.set_freq( bfo, 0, SI5351_CLK2);
      Serial.println("We've switched from USB to LSB");
    }
#endif

#ifdef Direct_conversion
    si5351.set_freq((vfo * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK0);
    tbfo = "";
#endif

#ifdef FreqX4
    si5351.set_freq((vfo * SI5351_FREQ_MULT) * 4, SI5351_PLL_FIXED, SI5351_CLK0);
    tbfo = "";
#endif

    changed_f = 0;
  }

  // Button press changes the frequency change step for 1 Hz steps
  if (get_button())
  {
    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 = 1;
        break;
    }
    display_radix();
  }
}
[/code]

 Sketc / code yang sudah di open di halaman ide Arduino 1.6.5 :

 

Hal utama setelah kita berhasil membuka IDE arduino kemudian dilanjutkan dengan penambahan library. Yaitu file library Rotary.h dan librari si5351.h. yang sudah kami berikan di cd bonus tersenut. 

 

library Rotary.h dan librari si5351.h berupa file dalam bentuk extension .zip file nama Rotary dan Si5351Arduino-master file WinRar atau Winzip archive, tambahkan satu per satu sehingga library bisa kita gunakan waktu compiller berjalan, sehingga tidak muncul error. Lihat gambar dibawah ini:

 

Jika file library Rotary.h dan librari si5351.h sudah ditambahkan di laptop/ pc kita, kita dapat melakukan compile dari file code atau sketch ARDUINO Vfo si5351a. 

 

 

 sketch code VFO Si5351a berhasil dicompail dan bisa jalan di board modul tersebut:

 

 

Board demo si5351a Si5351 a atmega328 usb to serial TTL yang sudah kita isikan code/ sketch VFO si5351,siap kita gunakan:

 

 

Dari sample/ code yang sudah dimasukkan di alat adalah settingan BFO frekuensi 9.000.000hz mode USB sebesar 9.001.500 hz dan BFO mode LSB sebesar 8.999.500 hz , code seperti bawah ini. Misalkan kita akan menggunakan untuk radio dengan BFO frekuensi yang lain yang perlu kita setting ualng atau rubah adalah parameter yang sudah kita beri warna kuning.

 

Berikut video uji coba dengan pesawat transceiver:

https://www.youtube.com/watch?v=Hthj-PbQ8Es

 

 

 

Berikut tulisan yang bisa kami sampekan.

Jika ada tulisan yang salah atau kurang jelas bisa inbox contact ke email support@indo-ware.com 

 

referensi hardware:

http://indo-ware.com/produk-4165-board-demo-si5351a-si5351-a-atmega328-usb-to-serial-ttl.html 

 

referensi kalibrasi modul si5351:

http://indo-ware.com/blog-43-kalibrasi-si5351-si5351a-calibrating-the-si5351-si5351a.html

 

 

(Tulisan link ini, masih akan di benahi/ dilanjutkan)


 

 





kalibrasi si5351 si5351a calibrating the Si5351 Si5351a
NOW EVERYONE CAN STUDY ABROAD
Modul mikrokontroller PIC 16F877A USB
Minimum Sistem 89S51 MCS51
Sistem Minimum Atmega128


0 Komentar :


Isi Komentar :

Nama:
Website:
Komentar:
 
 (masukkan 6 kode di atas)




Keranjang Belanja
0 item produk
Total: Rp. 0
Cek Pengiriman Barang

Testimoni Terakhir
17 Februari 2017
Suprijono
Mau pesan ic PLL 02A apa bisa ? klo bisa tlg hub saya via email atau hp 0816 488 3990. Terima kasih.
15 Februari 2017
Endah J
gan, kalo kirim surabaya ongkir brapa ya?
15 Februari 2017
Endah J
gan, kalo kirim surabaya ongkir brapa ya?
tulis testimoni
Link Partner