Il generatore di segnali AD9833

In commercio c’è un simpatico integrato della Analog Devices chiamato AD9833 (Programmable Waveform Generator) che si trova a prezzi decisamente accessibili già saldato nel suo mini moduletto che comprende tutto il necessario per farlo funzionare.

Modulo AD9833
Modulo AD9833

Modulo AD9833

Il nostro amico è un generatore di funzioni ad onda quadra, sinusoidale e triangolare. Viene comandato via interfaccia SPI (3 fili) ed esistono diverse librerie per Arduino adatte a gestirlo.  Utilizzandolo non si può non notare la buona qualità delle forme d’onda generate, tanto da poter seriamente pensare di realizzarci un generatore adatto all’uso hobbistico in laboratorio. L’integrato “potrebbe” raggiungere una frequenza massima di 12.5 Mhz ma necessita per questo scopo di appositi filtri di uscita in quanto la forma d’onda a queste frequenze lascia molto a desiderare. Se ci accontentiamo di un generatore per basse frequenze (fino a massimo 1 Mhz) allora la circuitazione necessaria è decisamente meno complessa.

Lo schema a blocchi di questo gioiellino è il seguente:

Schema a blocchi AD9833
Schema a blocchi AD9833

L’uscita è gestita da un DAC a 10 bit, quindi con una discreta risoluzione (diversi generatori commerciali sono ad 8 bit). L’onda triangolare arriva direttamente dal “PHASE ACCUMULATOR” mentre quella sinusoidale viene formata tramite la “SIN ROM” che “smussa” digitalmente la triangolare. L’onda quadra, invece, è ottenuta prelevando il segnale “prima” di entrare nel DAC. l’AD9833 dispone di due generatori, con frequenza e fase distinti che possono essere utilizzati alternativamente (non contemporaneamente).

Giusto per avere un’idea ecco le forma d’onda prese direttamente dall’uscita del modulo:

Sinusoidale 1Khz
Sinusoidale 1Khz
Sinusoidale 100Khz
Sinusoidale 100Khz
Sinusoidale 1Mhz
Sinusoidale 1Mhz
Triangolare 1Mhz
Triangolare 1Mhz
Quadra 1Mhz
Quadra 1Mhz

Per testare detto moduletto ho utilizzato Arduino nano utilizzando i PIN 10, 11 e 13 come FSYNC, SDATA e SCLK

La libreria la trovate qui https://github.com/Billwilliams1952/AD9833-Library-Arduino

Il codice per testare velocemente il modulo:

#include <AD9833.h>     // Include the library
#define FNC_PIN 10       // Can be any digital IO pin

AD9833 gen(FNC_PIN);       // Defaults to 25MHz internal reference frequency
float freq = 1000;

void setup() {
    gen.Begin();              
    gen.ApplySignal(TRIANGLE_WAVE,REG0,freq);  
    gen.EnableOutput(true);   
    Serial.begin(115200);
}

void loop() {
  if ( Serial.available() ) {
    float Counter=Serial.parseInt();
    if (Counter>4) {
      freq=Counter;
      gen.SetFrequency(REG0,freq);
    } else if (Counter>0) {
      switch ( (int)Counter ) {
        case 1:
        gen.ApplySignal(TRIANGLE_WAVE,REG0,freq);  
        break;  
        
        case 2:
        gen.ApplySignal(SINE_WAVE,REG0,freq);  
        break;  
  
        case 3:
        gen.ApplySignal(SQUARE_WAVE,REG0,freq);  
        break; 
  
        default:
        Serial.println(F("*** Invalid command ***"));
        break;                    
      }      
    }
  }
}

Usando il monitor seriale avremo che con 1(invio), 2(invio) e 3(invio) selezioneremo la forma d’onda in uscita (triangolare, sinusoidale, quadra) mentre qualsiasi altro numero superiore modificherà la frequenza di uscita. Da notare che mentre la sinusoidale e la triangolare presentano un valore massimo Vpp di circa 500/600mV l’onda quadra arriva a 5V quindi sarà necessario, nel caso di utilizzo come generatore di funzioni, “normalizzare” tali valori e prevedere l’offset regolabile di tensione.

Prossimamente vedremo una applicazione pratica di questo simpatico generatore.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.