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.
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:
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:
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.