#include <SPI.h>
const byte FSYNC = 10;
void setup() {
Serial.begin(9600);
}
void AD9833setup() {
pinMode(FSYNC, OUTPUT);
digitalWrite(FSYNC, HIGH);
SPI.begin();
delay(50);
}
void WriteRegister(int dat) {
SPI.setDataMode(SPI_MODE2);
digitalWrite(FSYNC, LOW); // Set FSYNC low before writing to AD9833 registers
delayMicroseconds(10); // Give AD9833 time to get ready to receive data.
SPI.transfer(dat>>8); // Each AD9833 register is 32 bits wide and each 16
SPI.transfer(dat&0xFF); // bits has to be transferred as 2 x 8-bit bytes.
digitalWrite(FSYNC, HIGH); //Write done. Set FSYNC high
}
void AD9833reset() {
WriteRegister(0x100); // Write '1' to AD9833 Control register bit D8.
delay(10);
}
void AD9833setFrequency(long frequency, int Waveform) {
long FreqWord = (frequency * pow(2, 28)) / 25.0E6;
int MSB = (int)((FreqWord & 0xFFFC000) >> 14); //Only lower 14 bits are used for data
int LSB = (int)(FreqWord & 0x3FFF);
//Set control bits 15 ande 14 to 0 and 1, respectively, for frequency register 0
LSB |= 0x4000;
MSB |= 0x4000;
WriteRegister(0x2100); //DB13 is set to 1. This allows a complete word to be loaded
//into a frequency register in two consecutive writes. The
//first write contains 14 LSBs. The second write contains 14 MSBs.
//RESET bit DB8 is set to 1
//This resets internal registers to 0, which corresponds to an analog output of midscale
WriteRegister(LSB); // Write lower 16 bits to AD9833 registers
WriteRegister(MSB); // Write upper 16 bits to AD9833 registers.
WriteRegister(0xC000); // Phase register
WriteRegister(Waveform); // Exit & Reset to SINE, SQUARE or TRIANGLE
}
void loop() {
int Waveform;
AD9833reset();
// AD9833 documentation advises a 'Reset' on first applying power.
AD9833setup();
// Set the frequency and waveform registers in the AD9833.
AD9833setFrequency( 10000, 0x2020); // WAVE_SINE = 0x2000,
// WAVE_SQUARE-MSB = 0x2028,
// WAVE_SQUARE-MSB/2 =0x2020,
// WAVE_TRIANGLE = 0x2002.
//Serial.println(AD9833setFrequency( 0x400, 0x2000));
}