Pagina 1 di 1

Generare un dente di sega con AD9833 e Arduino Due

MessaggioInviato: 16 giu 2025, 13:07
da alien75
Salve, sto cercando di far generare ad un AD9833 collegato all' SPI di ARDUINODUE
un dente di sega.
Riporto di seguito il codice trovato in rete che dovrebbe fare questo, ma il risultato è che non genera nessuna rampa.
Codice:
Codice: Seleziona tutto
#include <SPI.h>

#define FSYNC 31 // Pin per il controllo del chip AD9833
#define FREQ 100  // Frequenza desiderata (Hz)
#define PHASE_INCREMENT 100  // Incremento della fase per il dente di sega

// Funzione per scrivere un valore a 16 bit nell'AD9833
void spiWrite(byte data) {
  digitalWrite(FSYNC, LOW);
  SPI.transfer(data);
  digitalWrite(FSYNC, HIGH);
}

// Funzione per impostare la frequenza
void setFrequency(long frequency) {
  long f = (long)((frequency * 4294967296.0) / 25000000.0); // Calcolo del valore per il registro di frequenza
  // Imposta i bit MCLK/1 e MSB first
  spiWrite(11);
  spiWrite((byte)(f & 0xFF));
  spiWrite((byte)((f >> 8) & 0xFF));
  spiWrite((byte)((f >> 16) & 0xFF));
  spiWrite((byte)((f >> 24) & 0x0F));
}

// Funzione per impostare la fase
void setPhase(int phase) {
    long p = (phase * 65536L) / 360; // Converti gradi in valore per il registro di fase
    spiWrite(0xC0); // Imposta il registro di fase
    spiWrite((byte)(p & 0xFF));
    spiWrite((byte)((p >> 8) & 0xFF));
}

void setup() {
  SPI.begin();
  pinMode(FSYNC, OUTPUT);
  digitalWrite(FSYNC, HIGH);

  // Inizializzazione dell'AD9833
  spiWrite(0x00);  // Reset del chip
  delay(10);
  spiWrite(13); // Imposta il controllo del clock
  setFrequency(FREQ);
}

void loop() {
  static int phase = 0;
  setPhase(phase);
  phase += PHASE_INCREMENT;
  if (phase >= 360) {
    phase = 0;
  }
  delay(1); // Ritardo per controllare la frequenza
}


ho asseganto l'FSYNK al pin 31.
DATA al pin 11
CK al pin 13
Una volta compilato e trasferito il ocidce in ARDUINODUE vedo hce non genera nessuna RAMPA in uscita.
Forse dovrei usare il bus SPI di ARDUINODUE invece di usare i due pin DATA e CK sopraindicati?
Aiutatemi per favore a capire cosa ho sbagliato.

Re: Generare un dente di sega con AD9833 e Arduino Due

MessaggioInviato: 19 giu 2025, 19:29
da Jackd
Ciao,
puoi riportare meglio i collegamenti che hai fatto ?

Non ho mai usato la due, ma so che la Spi di default (che hai usato tu) è connessa nel connettore da 6 pin centrale, non sui pin 11-12-13 come sull'uno per capirci.

Re: Generare un dente di sega con AD9833 e Arduino Due

MessaggioInviato: 20 giu 2025, 7:13
da alien75
ok rimetto aposto provo, grazie.
Che mi dici riguardo il codice: può funzionare?

Re: Generare un dente di sega con AD9833 e Arduino Due

MessaggioInviato: 20 giu 2025, 17:32
da Jackd
Io ho usato direttamente la libreria proposta dall''ide ( su un arduino uno ) perché mi bastava fargli fare una sinusoide a frequenza fissa, ma dopo alcune prove abbiamo optato per un'altra soluzione, cosi il circuitino è finito nel cassetto della vergona :mrgreen:

Tornando al tuo codice, mi pare manchi la parte di inizializzazione, dove il reset bit del registro viene portato prima a 1.
da pagina 13 del datasheet https://www.analog.com/media/en/technic ... ad9833.pdf

To avoid spurious DAC outputs during AD9833 initialization, the reset bit should be set to 1 until the part is ready to begin generating an output. A reset does not reset the phase, frequency, or control registers. These registers will contain invalid data and, therefore, should be set to known values by the user. The reset
bit should then be set to 0 to begin generating an output.
The data appears on the DAC output seven or eight MCLK cycles after the reset bit is set to 0.


c'è anche un'altra cosa che non mi torna: la formula nella appnote https://www.analog.com/en/resources/app ... -1070.html
risulta essere: \frac{freq * 2^{28}}{clock} ed a casa mia 2^28 = 268.435.456

perché invece hai messo 2^32 = 4.294.967.296 ?

Sempre su quell'appnote c'è la sequenza corretta, ed un po spiegata.
Consiglio di darci una studiata, e usare la libreria pronta per verificare almeno il funzionamento come generatore di segnale prima di procedere oltre.

Re: Generare un dente di sega con AD9833 e Arduino Due

MessaggioInviato: 20 giu 2025, 18:19
da alien75
Il codice non è mio, l'ho trovato su internet.

Re: Generare un dente di sega con AD9833 e Arduino Due

MessaggioInviato: 20 giu 2025, 22:05
da edgar
alien75 ha scritto:Salve, sto cercando di far generare ad un AD9833 collegato all' SPI di ARDUINODUE
un dente di sega

Stando al datasheet si possono generare onde sinusoidali, quadre e triangolari. Il dente di sega non è previsto

Re: Generare un dente di sega con AD9833 e Arduino Due

MessaggioInviato: 21 giu 2025, 0:54
da gvee
Jackd ha scritto:Consiglio di darci una studiata ...

Visto i precedenti, direi che è tempo perso. :?