Riporto il codice che ho trovato qui
https://forum.arduino.cc/t/program-mult ... pi/1098217 - Codice: Seleziona tutto
#include "Wire.h"
int FSYNC = 10; //in my example OR ANY PIN 0-13
int FSYNC2 = 31;
int SDATA = 11;
int SCLK = 13;
int i;
int k ;
unsigned long freq;
//byte wave=1;
void setup() {
freq=1; // start with frequency 1HZ as an example
//Application Note AN-1070 from Analog Devices
UpdateRegister(0x2100); UpdateRegister(0x50C7); UpdateRegister(0x4000);
UpdateRegister(0xC000); UpdateRegister(0x2000);
UpdateRegister2(0x2100); UpdateRegister2(0x50C7); UpdateRegister2(0x4000);
UpdateRegister2(0xC000); UpdateRegister2(0x2000);
UpdateRegister3(0x2100); UpdateRegister3(0x50C7); UpdateRegister3(0x4000);
UpdateRegister3(0xC000); UpdateRegister3(0x2000);
for(k=0;k<32;k++) pinMode(k, OUTPUT);
for (i=0;i<32;i++) digitalWrite(i,HIGH); // put pins 0-13 (FSYNC's) as output HIGH
// pinMode(FSYNC, OUTPUT); pinMode(SDATA, OUTPUT); pinMode(SCLK, OUTPUT);
//digitalWrite(FSYNC, HIGH);digitalWrite(SDATA, LOW);digitalWrite(SCLK, HIGH);
}
void loop() {
UpdateFreq(2300, 0x2020); // for every FSYNC pins 0-13 we update a desired frequency, 0x2000 is for sine wave, 0x2020 is for square etc
UpdateFreq2(200, 0x2020);
UpdateFreq3(800, 0x2020);
delay(500); // a delay to measure your desired programmed frequencies with a scope
}
void UpdateFreq(unsigned int freq, int form){
// function to program the frequency into registers - no touch
long FreqReg;
unsigned int MSB, LSB;
FreqReg = (freq * pow(2, 28)) / 25000000; // 25MHz Quarz
if (form == 0x2020) FreqReg = FreqReg << 1;
MSB = (int)((FreqReg & 0xFFFC000) >> 14);
LSB = (int)(FreqReg & 0x3FFF);
LSB |= 0x4000;
MSB |= 0x4000;
UpdateRegister(0x2100); // Control Register, Reset Bit DB8
UpdateRegister(LSB); // Frequency Register 0 LSB
UpdateRegister(MSB); // Frequency Register 0 MSB
UpdateRegister(0xC000); // Phase Register
UpdateRegister(form); // Exit Reset
}
void UpdateRegister(unsigned int data)
{ // function to program registers - no touch
unsigned int pointer = 0x8000;
digitalWrite(FSYNC, LOW);
for (int i=0; i<16; i++){
if ((data & pointer) > 0) {
digitalWrite(SDATA, HIGH);
}
else {
digitalWrite(SDATA, LOW);
}
digitalWrite(SCLK, LOW);
digitalWrite(SCLK, HIGH);
pointer = pointer >> 1 ;
}
digitalWrite(FSYNC, HIGH);
}
void UpdateFreq2(unsigned int freq, int form){
// function to program the frequency into registers - no touch
long FreqReg;
unsigned int MSB, LSB;
FreqReg = (freq * pow(2, 28)) / 25000000; // 25MHz Quarz
if (form == 0x2020) FreqReg = FreqReg << 1;
MSB = (int)((FreqReg & 0xFFFC000) >> 14);
LSB = (int)(FreqReg & 0x3FFF);
LSB |= 0x4000;
MSB |= 0x4000;
UpdateRegister2(0x2100); // Control Register, Reset Bit DB8
UpdateRegister2(LSB); // Frequency Register 0 LSB
UpdateRegister2(MSB); // Frequency Register 0 MSB
UpdateRegister2(0xC000); // Phase Register
UpdateRegister2(form); // Exit Reset
}
void UpdateRegister2(unsigned int data)
{ // function to program registers - no touch
unsigned int pointer = 0x8000;
digitalWrite(FSYNC2, LOW);
for (int i=0; i<16; i++){
if ((data & pointer) > 0) {
digitalWrite(SDATA, HIGH);
}
else {
digitalWrite(SDATA, LOW);
}
digitalWrite(SCLK, LOW);
digitalWrite(SCLK, HIGH);
pointer = pointer >> 1 ;
}
digitalWrite(FSYNC2, HIGH);
}
Quel codice sopra l'ho esteso per due moduli AD9833 e funziona riesco a generare due segnali distinti in due moduli (uno da 200Hz ed uno da 2300Hz sinusoidali), allego le tracce dell'oscilloscopio con i segnali di uscita.
La mia idea è quella di estendere il codice per 10 moduli AD9833, quindi la cosa giusta da fare
sarebbe creare una classe e dalla classe ricavare 10 oggetti come nel codice che riporto sotto:
- Codice: Seleziona tutto
#include "Wire.h"
#include "ad9833.h"
#include <SPI.h>
int FSYNC = 10; //in my example OR ANY PIN 0-13
int SDATA = 11;
int SCLK = 13;
int i;
int k ;
unsigned int freq;
Gen gen[10];
//byte wave=1;
void setup() {
freq=1; // start with frequency 1HZ as an example
//Application Note AN-1070 from Analog Devices
gen[1].UpdateRegister(0x2100); gen[1].UpdateRegister(0x50C7); gen[1].UpdateRegister(0x4000);
gen[1].UpdateRegister(0xC000); gen[1].UpdateRegister(0x2000);
for(k=0;k<32;k++) pinMode(k, OUTPUT);
for (i=0;i<32;i++) digitalWrite(i,HIGH); // put pins 0-13 (FSYNC's) as output HIGH
// pinMode(FSYNC, OUTPUT); pinMode(SDATA, OUTPUT); pinMode(SCLK, OUTPUT);
//digitalWrite(FSYNC, HIGH);digitalWrite(SDATA, LOW);digitalWrite(SCLK, HIGH);
}
void loop() {
gen[1].UpdateFreq(1000, 0x2020); // for every FSYNC pins 0-13 we update a desired frequency, 0x2000 is for sine wave, 0x2020 is for square etc
delay(1);
//FSYNC=0; //start FSYNC (AD9833 chip select ) from the beginning
delay(500); // a delay to measure your desired programmed frequencies with a scope
}
void Gen::UpdateFreq(unsigned int freq, int form){
// function to program the frequency into registers - no touch
long FreqReg;
unsigned int MSB, LSB;
FreqReg = (freq * pow(2, 28)) / 25000000; // 25MHz Quarz
if (form == 0x2020) FreqReg = FreqReg << 1;
MSB = (int)((FreqReg & 0xFFFC000) >> 14);
LSB = (int)(FreqReg & 0x3FFF);
LSB |= 0x4000;
MSB |= 0x4000;
gen[1].UpdateRegister(0x2100); // Control Register, Reset Bit DB8
gen[1].UpdateRegister(LSB); // Frequency Register 0 LSB
gen[1].UpdateRegister(MSB); // Frequency Register 0 MSB
gen[1].UpdateRegister(0xC000); // Phase Register
gen[1].UpdateRegister(form); // Exit Reset
}
void Gen::UpdateRegister(unsigned int data)
{ // function to program registers - no touch
//unsigned int pointer = 0x8000;
digitalWrite(FSYNC, LOW);
for (int i=0; i<16; i++){
if ((data & pointer) > 0) {
digitalWrite(SDATA, HIGH);
}
else {
digitalWrite(SDATA, LOW);
}
digitalWrite(SCLK, LOW);
digitalWrite(SCLK, HIGH);
gen[1].pointer = gen[1].pointer >> 1 ;
}
digitalWrite(FSYNC, HIGH);
}
ed il relativo file header:
- Codice: Seleziona tutto
class Gen
{
public:
void UpdateFreq(unsigned int , int);
void UpdateRegister(unsigned int);
private:
//unsigned int FreqReg;
//unsigned int MSB, LSB;
unsigned int pointer = 0x8000;
};
Dopo aver compilato e trasferito il codice noto che non funziona nemmeno per un modulo infatti io imposto da programma una freq. di 1000Hz ad onda quadra ed invece misuro una frequenza di 8.25Mhz con una forma d'onda assurda.
Allego la traccia.
Non capisco perché la generazione del segnale utilizzando la classe e l'oggetto da essa generato non funziona.
Scusate la mia igoranza con il C++ ma conosco poco questo linguaggio.
Mi potete aiutare a capire cosa ho sbagliato in quest'ultimo codice?


Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)







