Generare un dente di sega con AD9833 e Arduino Due
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:
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.
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.
ed a casa mia 2^28 = 268.435.456