AD9833 Cambio continuo de frecuencia

0

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?

    

1 respuesta

1

Creo que el comportamiento que ves es el resultado de escribir a todos registros para cada cambio y / o escritura:

  

WriteRegister (Waveform); // Salir & Restablecer a SINE, CUADRADO   o TRIANGULO

Si solo escriba en el registro que establece la frecuencia, tal vez obtenga el cambio de frecuencia que desee.

Haría una copia del procedimiento AD9833setFrequency, cambiaría su nombre y lo adaptaría de modo que solo escriba en los registros que realmente necesitan cambiar.

    
respondido por el Bimpelrekkie

Lea otras preguntas en las etiquetas