Ένα πολύ χρήσιμο module για όπου χρειαζόμαστε μια σταθερή, συγκεκριμένης τιμής συχνότητα, όπως ένα BFO, μέχρι τους 12 MHz. Μπορεί να μας δώσει ημίτονο ή τρίγωνο ή τετράγωνο παλμό (όχι συγχρόνως). Φυσικά χρειάζεται και ένα μικροελεγκτή για τη λειτουργία του, δηλαδή κάποιο αρντουνοειδές (για εμάς τους τεμπέληδες). Συνδυασμένο με ένα Pro Mini αποτελούν ένα πολύ συμμαζεμένο και οικονομικό σύνολο, της τάξης των 6Ε, που μπορεί να μπει ακόμα και σε μια ήδη υπάρχουσα συσκευή αν απαιτείται.

Εδώ φαίνονται επάνω σε μια bb.

FrC 003b.jpg

Ένα ημίτονο στους 1843.2 KHz.

FrC 004b.jpg

Και ένα τρίγωνο στους 110 KHz.

FrC 002b.jpg

Στο διαδίκτυο βρήκα δυο - τρεις κώδικες για αρντουίνο που όμως είναι πολύ μπερδεμένοι γιατί περιλαμβάνουν LCD, encoders και λοιπά. Ο παρακάτω κώδικας είναι απλούστερος και δεν χρησιμοποιεί κάποια ιδιαίτερη βιβλιοθήκη. Η συχνότητα και η κυματομορφή της εξόδου ορίζονται μέσα στον κώδικα άπαξ.

Κώδικας:
/* 
AD9833 simple frequency BFO.
Most of the code is based on "AD9833 Waveform Module vwlowen.co.uk".
Thanks to creators.
By Akritas.
*/

#include <SPI.h>

const int SINE = 0x2000;
const int SQUARE = 0x2028;
const int TRIANGLE = 0x2002;

const float refFreq = 25000000.0;  // this may be changed a little
long BFO_FREQ = 1843200;           // set BFO frequency here

int FSYNC = 10;     //connected to FSYNC 
//int SPI_CLK = 13;   connected to SCLK
//int SPI_MOSI = 11;  connected to SDATA
  
void setup()
{
  //SPI.setClockDivider(SPI_CLOCK_DIV2);
  //SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE2);
  SPI.begin();
  delay(50);
  digitalWrite(FSYNC,HIGH);
  AD9833_reset;
  setFrequency(BFO_FREQ);
  SPI.end;
}

void WriteRegister(int dat)
{
  digitalWrite(FSYNC, LOW);
  delayMicroseconds(10);
  SPI.transfer(highByte(dat));
  SPI.transfer(lowByte(dat));
  digitalWrite(FSYNC, HIGH);
}

void AD9833_reset()
{
  WriteRegister(0x100);
  delay(10);
}

void setFrequency(long frequency)
{
  long FreqWord = (frequency * pow(2, 28)) / refFreq;
  int MSB = (int)((FreqWord & 0xFFFC000) >> 14);
  int LSB = (int)(FreqWord & 0x3FFF);
  
  LSB |= 0x4000;
  MSB |= 0x4000;
  
  WriteRegister(0x2100);
  WriteRegister(LSB);
  WriteRegister(MSB);
  WriteRegister(0xC000);
  WriteRegister(SINE);    // may be SQUARE or TRIANGLE
}  

void loop()
{
  
}

Ο παρακάτω κώδικας κάνει στην ουσία το ίδιο πράγμα αλλά είναι επεκτάσιμος στην περίπτωση που θέλουμε να βάλουμε για παράδειγμα δυο ή περισσότερες συχνότητες που θα επιλέγονται με κάποιο μπουτόν (πχ. USB - LSB).

Κώδικας:
/* 
AD9833 simple frequency BFO.
Most of the code is based on "AD9833 Waveform Module vwlowen.co.uk".
Thanks to creators.
By Akritas.
*/

#include <SPI.h>

const int SINE = 0x2000;
const int SQUARE = 0x2028;
const int TRIANGLE = 0x2002;

const float refFreq = 25000000.0;  // this may be changed a little
long BFO_FREQ = 1843200;           // set BFO frequency here

int FSYNC = 10;     //connected to FSYNC 
//int SPI_CLK = 13;   connected to SCLK
//int SPI_MOSI = 11;  connected to SDATA
  
boolean SET_FREQ = true;

void setup()
{
  //SPI.setClockDivider(SPI_CLOCK_DIV2);
  //SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE2);
  SPI.begin();
  delay(50);
  digitalWrite(FSYNC,HIGH);
  
  AD9833_reset;
 
  //SPI.end;
}

void WriteRegister(int dat)
{
  digitalWrite(FSYNC, LOW);
  delayMicroseconds(10);
  SPI.transfer(highByte(dat));
  SPI.transfer(lowByte(dat));
  digitalWrite(FSYNC, HIGH);
}

void AD9833_reset()
{
  WriteRegister(0x100);
  delay(10);
}

void setFrequency(long frequency)
{
  long FreqWord = (frequency * pow(2, 28)) / refFreq;
  int MSB = (int)((FreqWord & 0xFFFC000) >> 14);
  int LSB = (int)(FreqWord & 0x3FFF);
  
  LSB |= 0x4000;
  MSB |= 0x4000;
  
  WriteRegister(0x2100);
  WriteRegister(LSB);
  WriteRegister(MSB);
  WriteRegister(0xC000);
  WriteRegister(SINE);    // may be SQUARE or TRIANGLE
}  

void loop()
{
  if (SET_FREQ)
    {
      setFrequency(BFO_FREQ);
      SET_FREQ = false;
    }  
}