Estoy tratando de ejecutar el generador de frecuencia AD9833 para tener un cambio de frecuencia continuo suave. He ejecutado el módulo AD9833 como en aquí usando el código que se encuentra a continuación en internet y funciona bien y la forma de onda y la frecuencia que se muestran en el osciloscopio son las que se desean.
#include <SPI.h>
const int SQUARE = 0x2028;
const float refFreq = 25000000.0; // On-board crystal reference frequency
const int FSYNC = 10; // Standard SPI pins for the AD9833 waveform generator.
const int CLK = 13; // CLK and DATA pins are shared with the TFT display.
const int DATA = 11;
void setup() {
SPI.begin();
Serial.begin(9600);
}
void loop() {
if(Serial.available())
{
Serial.println("Serial is available");
float freq = Serial.parseFloat();
Serial.print("value to specify : ");
Serial.println(freq);
AD9833setFrequency(freq, SQUARE);
}
}
// Set the frequency and waveform registers in the AD9833.
void AD9833setFrequency(float frequency, int Waveform) {
long FreqWord = (frequency * pow(2, 28)) / refFreq;
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);
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 WriteRegister(int dat) {
// Display and AD9833 use different SPI MODES so it has to be set for the AD9833 here.
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(highByte(dat)); // Each AD9833 register is 32 bits wide and each 16
SPI.transfer(lowByte(dat)); // bits has to be transferred as 2 x 8-bit bytes.
digitalWrite(FSYNC, HIGH); //Write done. Set FSYNC high
}
Pero cada vez que intentaba cambiar el valor de la frecuencia, la lectura del osciloscopio muestra una "línea plana" entre cada cambio de frecuencia. Como estaba insertando el valor de frecuencia de 111.11Hz, muestra un valor aceptable de 111.13Hz. Pero el problema es que cuando intentaba cambiar la frecuencia para decir, 222.22Hz, el osciloscopio mostró una 'línea plana' un momento antes de mostrar la forma de onda de 222.24Hz. Si introduzco 333.33Hz, también 'se alinea' antes de mostrar la frecuencia deseada de 333.33Hz. Mi deseo es sin la 'línea plana', el cambio de frecuencia sin problemas de 111.11Hz, 222.22Hz y 333.33 Hz.
¿Se puede hacer mi cambio de frecuencia suave deseado o la línea plana está codificada y no se puede hacer?