To use the AD9850 module as a signal generator and to provide convenient control over the IF while testing the circuit, I wrote a quick test program for arduino (partially based off of examples):
#include <Arduino.h>
#include <AD9850SPI.h>
#include <SPI.h>
#include <string.h>
const int W_CLK_PIN = 13;
const int FQ_UD_PIN = 4;
const int RESET_PIN = 5;
double freq = 1000000;
double trimFreq = 124999500;
int phase = 0;
const byte maxChars = 32;
char receivedChars[maxChars]; // an array to store the received data
void printParams(void);
bool recCommand(void);
void setup(){
Serial.begin(9600);
DDS.begin(W_CLK_PIN, FQ_UD_PIN, RESET_PIN);
DDS.calibrate(trimFreq);
DDS.setfreq(freq, phase);
Serial.println("+-------------------------+");
Serial.println("| AD9850 Test Program |");
Serial.println("| Joseph R. Freeston 2022 |");
Serial.println("+-------------------------+");
Serial.println();
printParams();
Serial.println();
Serial.println();
Serial.println("Enter a command.");
Serial.println("Begin with either R, F, U, P, or D and an optional float following the first character.");
Serial.print(">>> ");
}
void loop(){
if(recCommand()) {
if(receivedChars[0] == 'F') { // Set frequency
freq = atof(&receivedChars[1]);
DDS.setfreq(freq, phase);
} else if(receivedChars[0] == 'R') { // Set reference
trimFreq = atof(&receivedChars[1]);
DDS.calibrate(trimFreq);
} else if(receivedChars[0] == 'P') { // Set phase
phase = atof(&receivedChars[1]);
DDS.setfreq(freq, phase);
} else if(receivedChars[0] == 'U') { // Up
DDS.up();
} else if(receivedChars[0] == 'D') { // Down
DDS.down();
} else {
Serial.println("Invalid command. Begin with either R, F, U, P, or D and an optional float following the first character.");
}
printParams();
Serial.print("\n>>> ");
}
}
void printParams() {
Serial.println("------------------------------");
Serial.print("Reference set to ");
Serial.print(trimFreq, DEC);
Serial.println("Hz");
Serial.print("Frequency set to ");
Serial.print(freq, DEC);
Serial.println("Hz");
Serial.print("Phase set to ");
Serial.print(phase*11.25, DEC);
Serial.println("°");
Serial.println("------------------------------");
}
bool recCommand() {
static byte i = 0;
const char endMarker = '\n';
char rc;
while (Serial.available() > 0) {
rc = Serial.read();
Serial.write(rc);
if(rc != endMarker) {
receivedChars[i] = rc;
if(i < maxChars) i++;
} else {
receivedChars[i] = '\0';
i = 0;
return true;
}
}
return false;
}
Then, in the serial terminal, the arduino can be given the following commands:
- U
- "up", turns on the AD9850
- D
- "down", turns off the AD9850
- F19390000
- This example sets the frequency to 19.390 MHz
- P1
- This example sets the phase to 12.5 degrees (see documentation of AD9850SPI.h)