Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Generare un dente di sega con AD9833 e Arduino Due

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[1] Generare un dente di sega con AD9833 e Arduino Due

Messaggioda Foto Utentealien75 » 16 giu 2025, 13:07

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.
Ultima modifica di Foto UtenteFranco012 il 16 giu 2025, 23:05, modificato 1 volta in totale.
Motivazione: Modificato leggermente titolo troppo lungo
Avatar utente
Foto Utentealien75
1 1 4 8
Sostenitore
Sostenitore
 
Messaggi: 588
Iscritto il: 31 lug 2011, 14:08

0
voti

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

Messaggioda Foto UtenteJackd » 19 giu 2025, 19:29

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.
Codice: Seleziona tutto
[code=php]per il codice a colori[/code]
Avatar utente
Foto UtenteJackd
794 4 7
Expert
Expert
 
Messaggi: 282
Iscritto il: 15 set 2014, 19:10
Località: Padova

0
voti

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

Messaggioda Foto Utentealien75 » 20 giu 2025, 7:13

ok rimetto aposto provo, grazie.
Che mi dici riguardo il codice: può funzionare?
Avatar utente
Foto Utentealien75
1 1 4 8
Sostenitore
Sostenitore
 
Messaggi: 588
Iscritto il: 31 lug 2011, 14:08

0
voti

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

Messaggioda Foto UtenteJackd » 20 giu 2025, 17:32

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.
Codice: Seleziona tutto
[code=php]per il codice a colori[/code]
Avatar utente
Foto UtenteJackd
794 4 7
Expert
Expert
 
Messaggi: 282
Iscritto il: 15 set 2014, 19:10
Località: Padova

0
voti

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

Messaggioda Foto Utentealien75 » 20 giu 2025, 18:19

Il codice non è mio, l'ho trovato su internet.
Avatar utente
Foto Utentealien75
1 1 4 8
Sostenitore
Sostenitore
 
Messaggi: 588
Iscritto il: 31 lug 2011, 14:08

0
voti

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

Messaggioda Foto Utenteedgar » 20 giu 2025, 22:05

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
Avatar utente
Foto Utenteedgar
10,0k 4 5 8
Master
Master
 
Messaggi: 5229
Iscritto il: 15 set 2012, 22:59

2
voti

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

Messaggioda Foto Utentegvee » 21 giu 2025, 0:54

Jackd ha scritto:Consiglio di darci una studiata ...

Visto i precedenti, direi che è tempo perso. :?
Avatar utente
Foto Utentegvee
1.470 5 7
Sostenitore
Sostenitore
 
Messaggi: 525
Iscritto il: 11 feb 2018, 20:34


Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite