Monday, 25 August 2014

NEW NEW NEW! A great Digital Frequency Synthesiser

I was browsing the Arduino news the other day when I came across a new product from Adafruit.

Screen Shot 2014 08 25 at 16 36 22

Screen Shot 2014 08 25 at 16 36 28

It uses a very small SI5351 which is a PLL locked to a crystal, and subsequently divided down to the output you want. It has two PLLs and three outputs, all separately programmable.

Here's the very simple connections:

Photo 08 25 2014 16 32 29

What I have in mind is to squeeze a Softrock Lite ll SDR radio and one of these onto an Arduino shield to make a complete tuneable SDR. Unfortunately my build of the Softrock went wrong as I mounted the FST3253 IC up-side-down! Now I am waiting for replacement parts.

Screen Shot 2014 08 25 at 16 47 02

Code

// SI5351 dds

#include "Wire.h"
#include "Adafruit_SI5351.h"

// PLL frequency
#define XTAL 25
#define MULT 28

// dds object
Adafruit_SI5351 dds = Adafruit_SI5351();

float pll; // PLL freq
float freq = 3.6; // requested output freq

void setup()
{ 
  Serial.begin(9600);

  dds.begin();
  dds.setupPLLInt(SI5351_PLL_A, 28); // PLL = 25 * 28 = 700MHz
  
  Serial.println(freq);
}

void loop()
{


  float frac;
  float synth;
  long n;
  long m;
  int div;

  m = 100000;

  pll = XTAL * MULT;
  synth = pll/freq;
  div = (int)synth; // get integer part
  frac = (synth - div) * 100000; // get fractional part
  n = (long) frac;

Serial.print("Frequency = ");
Serial.println(freq);

  dds.setupMultisynth(0, SI5351_PLL_A, div, n, m); // out = PLL/(div+n/m)
  dds.enableOutputs(true);
  
  freq = get(); // get input freq MHz
}

// get input as an float
float get()
{
  float in;

  while(Serial.available() > 0)
    Serial.read();
    
  while(Serial.available()  == 0) 
    in = Serial.parseFloat();
    
  return in;
}

No comments: