Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Problema pilotaggio 2 moduli AD9833 con Arduino Due

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteWALTERmwp, Foto Utentexyz

-2
voti

[11] Re: Problema pilotaggio 2 moduli AD9833 con ARDUINODUE

Messaggioda Foto Utentealien75 » 31 dic 2025, 8:55

Scusami ma mi devi seguire riguardo non tanto per la creazione dei vari scheletri dei metodi,
ma per quanto riguarda di cosa fa cosa. Ad esempio quale istruzione e registro resetta, quale imposta la frequenza etc...
Ad esempio come resetto? MSB e LSB con che valori li imposto? Scusami ma ci capisco poco con questi registri.
Per il momento ho scritto questo per fare una prova:
Codice: Seleziona tutto
#include "Arduino.h"
#include <SPI.h>
#include "Wire.h"

int FSYNC = 52;
int FSYNC2 = 50;
int SDATA = 11;
int SCLK = 13;

void setup()
{
    unsigned int MSB, LSB;
    LSB = 0x4000;
    MSB = 0x4000;
    UpdateRegister(0x0100, FSYNC);  //CMD reset
    UpdateRegister(0xC000, FSYNC); //CMD scrivi fase: imposta 0 nel registro di fase 0
    UpdateRegister(0xE000, FSYNC); //CMD scrivi fase: imposta 0 nel registro di fase 1
    UpdateRegister(0x2100, FSYNC);  //CMD scrivi freq 28b word in reset mode, imposta onda SIN, out da reg 0 (FSELECT=0)
    // calc freq LSB  e MSB per reg 0 (D15 D14 = 0 1)
    UpdateRegister(LSB, FSYNC);  //scrivi  LSB
    UpdateRegister(MSB, FSYNC);  //scrivi  MSB
    UpdateRegister(0x2000, FSYNC);  // CMD scrivi  28b word, imposta onda SIN, out da reg 0 (FSELECT=0) e esci da reset mode
    // calc freq LSB  e MSB per reg 1  (D15 D14 = 1 0)
    UpdateRegister(LSB, FSYNC);  //scrivi  LSB
    UpdateRegister(MSB, FSYNC);  //scrivi  MSB
}

void UpdateFreq(unsigned int freq, int form, int sc){
// 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, sc); // Control Register, Reset Bit DB8
  UpdateRegister(LSB, sc);    // Frequency Register 0 LSB
  UpdateRegister(MSB, sc);    // Frequency Register 0 MSB
  UpdateRegister(0xC000, sc); // Phase Register
  UpdateRegister(form, sc);   // Exit Reset
}

Avatar utente
Foto Utentealien75
1 1 4 8
Sostenitore
Sostenitore
 
Messaggi: 590
Iscritto il: 31 lug 2011, 14:08

0
voti

[12] Re: Problema pilotaggio 2 moduli AD9833 con ARDUINODUE

Messaggioda Foto UtenteJackd » 1 gen 2026, 12:35

ci ho messo un po a scrivere la risposta, mi intrufolo perché ho anche io questo modulino che ho preso e messo nel cassetto per parecchio tempo a prendere la polvere, ancora sigillato... e prendendo spunto da questa conversazione potrei riesumarlo :mrgreen:

Oltre a quanto ti hanno già detto, ho trovato delle cose nel tuo codice originale che non mi tornano.
Capisco che il codice sia un estratto con altre parti omesse, non è un problema, ma ti chiedo per disambiguazione, in questa parte:

Codice: Seleziona tutto

int FSYNC 
= 52;
int FSYNC2 = 50;
int FSYNC3 = 48;
int FSYNC4 = 46;
int FSYNC5 = 44;
int FSYNC6 = 42;
int FSYNC7 = 40;
int FSYNC8 = 38;
int FSYNC9 = 36;
int FSYNC10 = 34;
#define cs1 32
#define cs2 30
#define cs3 28
#define cs4 26
#define cs5 24
#define cs6 22

void setup() {
...
// put pins 0-13 (FSYNC's) as output HIGH
for(k=0;k<41;k++)  pinMode(k, OUTPUT);
for(
i=0;i<41;i++) digitalWrite(i,HIGH);  
...
}
 

Hai assegnato dei nomi ai 16 pin pari, dal 22 al 52, nel commento hai annotato che voresti impostare tutti i 14 pin, non solo quelli pari, dal 0 a 13 come uscita HIGH, nel codice invece tu qui stai impostando TUTTI i 42 pin, dal 0 al 41, come ucita HIGH.
Non credo sia effettivamente quello che vorresti fare, anche perché il pin0 e pin1 sono per il colloquio seriale, ammetto che non so se poi il modulo seriale prenda il sopravvento, salvano la situazione.

Se la tua intenzione è impostare solo i pari dal 22 al 52, puoi correggere così
Codice: Seleziona tutto
for(k=22;k<52;k+2)  pinMode(k, OUTPUT);
for(
i=22;i<52;i+2) digitalWrite(i, HIGH);  

Ricordati che nel ciclo "for", puoi partire da qualsiasi numero di partenza io qui sono partito dal 22; e puoi modificare il valore come preferisci, sia incrementare che decrementare a seconda di cosa ti torni comodo, e qui ti ho messo k+2 perché stiamo ragionando solo sui numeri pari.

Poi vedo che alla riga 98 cominci un commento multiriga "/*" senza più chiuderlo.

Sistema un pochino le cose con ordine e vediamo che altro modificare
Codice: Seleziona tutto
[code=php]per il codice a colori[/code]
Avatar utente
Foto UtenteJackd
794 4 7
Expert
Expert
 
Messaggi: 284
Iscritto il: 15 set 2014, 19:10
Località: Padova

0
voti

[13] Re: Problema pilotaggio 2 moduli AD9833 con ARDUINODUE

Messaggioda Foto Utentealien75 » 1 gen 2026, 18:31

Allora ho sistemato con una classe in questo modo:
Codice: Seleziona tutto
#include "Arduino.h"
#include <SPI.h>
#include "Wire.h"
#include "9833.h"

int k, i;
int FSYNC = 52;
int FSYNC2 = 50;
int SDATA = 11;
int SCLK = 13;

void setup()
{
    for(k=0;k<53;k++)  pinMode(k, OUTPUT);
    for (i=0;i<53;i++)  digitalWrite(i,HIGH);
    Gen gen[10];
    gen[0].reset(FSYNC);
}
 
 
void loop()
{
   gen[0].reset(FSYNC); //reset
   gen[0].begin(FSYNC);
   gen[0].signal(2000,0x2000,FSYNC);  //genera un segnale da 2000Hz sin
}


poi 9833.h:
Codice: Seleziona tutto
class Gen
{
   public:
      void begin(int);
      void reset(int);
      void signal(unsigned int, int, int);
   private:
      void UpdateRegister(unsigned int, int );
      long FreqReg;
      unsigned int LSB, MSB;
}


poi 9833.cpp:
Codice: Seleziona tutto
void Gen::reset(int sc)
{
   UpdateRegister(0x0100, sc);   //reset
}

void Gen::begin(int sc)
{
   UpdateRegister(0xC000, sc); //fase 0 in 0
   UpdateRegister(0xE000, sc); //fase 0 in 1
}

void Gen::signal(unsigned int freq, int shape, int sc)
{
   FreqReg=(freq * pow(2,28))/25000000;
   if(shape==0x2020) FreqReg = FreqReg << 1;
        MSB = (int)((FreqREg & 0xFFFC000) >> 14);
   LSB = (int)(FreqReg & 0X3FFF);
   LSB |= 0X4000;
   MSB |= 0x4000;
   UpdateRegister(0x2100, sc); //Controll Reg
   UpdateRegister(LSB, sc);    //FreqREg LSB
   UpdateRegister(MSB, sc);    //FreqReg MSB
   UpdateRegister(0xC000, sc); //phase Reg
   UpdateRegister(shape, sc);  //exit reset
}


Che te ne pare? Non l'ho ancora compilato, perché mi da problemi col salvataggio dei file acessori 9833.h e 9833.cpp.
Avatar utente
Foto Utentealien75
1 1 4 8
Sostenitore
Sostenitore
 
Messaggi: 590
Iscritto il: 31 lug 2011, 14:08

0
voti

[14] Re: Problema pilotaggio 2 moduli AD9833 con ARDUINODUE

Messaggioda Foto UtenteGioArca67 » 2 gen 2026, 10:21

Mi pare che è un inizio, ma siamo lontani.
Primo fra tutti l'obiettivo ovvero che deve fare il programmino. Che spero sia chiaro a te, ma anche se fosse, è sempre meglio precisarlo.

Poi un po' di domande:
Che cosa significa scrivere un programma sw?
e perché le varie righe si chiamano istruzioni o comandi?

Infine, cosa deve fare il tuo programma?
Avatar utente
Foto UtenteGioArca67
4.580 4 6 9
Master EY
Master EY
 
Messaggi: 4591
Iscritto il: 12 mar 2021, 9:36

0
voti

[15] Re: Problema pilotaggio 2 moduli AD9833 con ARDUINODUE

Messaggioda Foto Utentealien75 » 2 gen 2026, 12:20

Il mio programma deve impostare la forma d'onda e la frequenza del segnale in questione e pure la fase.
Non riecco a compilare senza errori: nn mi riconosce il modulo 9833.cpp e nememno 9833.h mi da errori di riconoscimento moduli SW.
Scusasmi ma ho il PC fisso in riparazione, sto scrivendo dal portatile e nel portatile non parte ARDUINOIDE.
Appena torna il PC fisso ti mando gli errori che mi da l 'IDE.
Avatar utente
Foto Utentealien75
1 1 4 8
Sostenitore
Sostenitore
 
Messaggi: 590
Iscritto il: 31 lug 2011, 14:08

1
voti

[16] Re: Problema pilotaggio 2 moduli AD9833 con ARDUINODUE

Messaggioda Foto UtenteJackd » 2 gen 2026, 12:50

Mi permtto di farti analizzare meglio questa parte:
alien75 ha scritto:
Codice: Seleziona tutto
...
int k, i;
int FSYNC = 52;
int FSYNC2 = 50;
int SDATA = 11;
int SCLK = 13;
...
void setup()
{
    for(k=0;k<53;k++)  pinMode(k, OUTPUT);
    for (i=0;i<53;i++)  digitalWrite(i,HIGH);
}



Tu stai impostando come "Output HIgh" , praticamente tutti i pin i/o tra cui molti pin che hanno altre funzioni (colloquio seriale e spi per esempio). Per quanto le librerie di Arduino ti vengano in contro per risolvere alcuni conflitti, ho il serio dubbio che la seriale o i dispositivi che andrai a collegare sui pin0 e pin1 non funzionino come tu credi.
In ogni caso, io eviterei come la peste di impostare come OUTPUT qualsiasi piedino che non sia strettamente neccessario, specialmente con schedini prototipo in fase di debug, dove l'errore di collegamento potrebbe danneggiare l'uscita del micro.

A sto punto, il consiglio più sensato che ti si possa dare è di evitare il ciclo for ed impostare i pin uno ad uno, per avere il controllo puntuale di quello che la scheda effettivamente sta facendo
Codice: Seleziona tutto
[code=php]per il codice a colori[/code]
Avatar utente
Foto UtenteJackd
794 4 7
Expert
Expert
 
Messaggi: 284
Iscritto il: 15 set 2014, 19:10
Località: Padova

0
voti

[17] Re: Problema pilotaggio 2 moduli AD9833 con ARDUINODUE

Messaggioda Foto UtenteGioArca67 » 2 gen 2026, 14:16

alien75 ha scritto:Il mio programma deve impostare la forma d'onda e la frequenza del segnale in questione e pure la fase.

Quali sono gli input che ti servono?
Quale frequenza e quale fase e in base a cosa?

Inizia a descrive da quali registri è composto l'AD9833
Avatar utente
Foto UtenteGioArca67
4.580 4 6 9
Master EY
Master EY
 
Messaggi: 4591
Iscritto il: 12 mar 2021, 9:36

0
voti

[18] Re: Problema pilotaggio 2 moduli AD9833 con ARDUINODUE

Messaggioda Foto Utentealien75 » 2 gen 2026, 16:08

Gli input che mi servono sono frerqunza, fase, forma d'onda.
Ecco gli errori che mi da in fase di compilazione:
Codice: Seleziona tutto
Arduino:1.7.11 (Windows 8.1), Scheda:"Arduino Due (Programming Port)"

Opzioni di compilazione cambiate, ricompilo tutto
9833.cpp:1:10: error: 'Gen' has not been declared
     void Gen::reset(int sc)
          ^
9833.cpp: In function 'void reset(int)':
9833.cpp:3:33: error: 'UpdateRegister' was not declared in this scope
        UpdateRegister(0x0100, sc);   //reset
                                 ^
9833.cpp: At global scope:
9833.cpp:6:10: error: 'Gen' has not been declared
     void Gen::begin(int sc)
          ^
9833.cpp: In function 'void begin(int)':
9833.cpp:8:33: error: 'UpdateRegister' was not declared in this scope
        UpdateRegister(0xC000, sc); //fase 0 in 0
                                 ^
9833.cpp: At global scope:
9833.cpp:12:10: error: 'Gen' has not been declared
     void Gen::signal(unsigned int freq, int shape, int sc)
          ^
9833.cpp: In function 'void signal(unsigned int, int, int)':
9833.cpp:14:8: error: 'FreqReg' was not declared in this scope
        FreqReg=(freq * pow(2,28))/25000000;
        ^
9833.cpp:14:32: error: 'pow' was not declared in this scope
        FreqReg=(freq * pow(2,28))/25000000;
                                ^
9833.cpp:16:13: error: 'MSB' was not declared in this scope
             MSB = (int)((FreqREg & 0xFFFC000) >> 14);
             ^
9833.cpp:16:26: error: 'FreqREg' was not declared in this scope
             MSB = (int)((FreqREg & 0xFFFC000) >> 14);
                          ^
9833.cpp:17:8: error: 'LSB' was not declared in this scope
        LSB = (int)(FreqReg & 0X3FFF);
        ^
9833.cpp:20:33: error: 'UpdateRegister' was not declared in this scope
        UpdateRegister(0x2100, sc); //Controll Reg
                                 ^
Errore durante la compilazione



0xC000 registro di fase
0x0100 registro di reset
LSB |= 0X4000; frequenza
MSB |= 0x4000;
Avatar utente
Foto Utentealien75
1 1 4 8
Sostenitore
Sostenitore
 
Messaggi: 590
Iscritto il: 31 lug 2011, 14:08

0
voti

[19] Re: Problema pilotaggio 2 moduli AD9833 con ARDUINODUE

Messaggioda Foto UtenteGioArca67 » 2 gen 2026, 17:56

L'AD9833 ha
1 registro di controllo
2 registri per memorizzare una frequenza di funzionamemto
2 registri per memorizzare un offset di fase
Hai messo queste variabili nella tua classe?
Poi ti serve dove memorizzare FSYNC.
Se ti muovi a casaccio non otterrai nulla di utile.
In che modo micro riceverà le variazioni di frequenza fase e forma d'onda?
Avatar utente
Foto UtenteGioArca67
4.580 4 6 9
Master EY
Master EY
 
Messaggi: 4591
Iscritto il: 12 mar 2021, 9:36

0
voti

[20] Re: Problema pilotaggio 2 moduli AD9833 con ARDUINODUE

Messaggioda Foto Utentealien75 » 3 gen 2026, 9:12

Registri di fase:
Codice: Seleziona tutto
0xE000
0x=C000


Il registro di controllo non lo vedo nel codice.
Avatar utente
Foto Utentealien75
1 1 4 8
Sostenitore
Sostenitore
 
Messaggi: 590
Iscritto il: 31 lug 2011, 14:08

PrecedenteProssimo

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 10 ospiti