
L’idea del generatore di segnali scaturisce dalla necessità di avere uno strumento di laboratorio a basso costo, con le caratteristiche di un’apparecchiatura semiprofessionale. Il modo più veloce e semplice di progettare un generatore di segnali con buone caratteristiche è quello di utilizzare un integrato ad hoc. Quindi dopo un’attenta analisi, ho optato per i sistemi a DDS (direct digital syntesis). In particolare ho utilizzato l’AD9833 dell’Analog Devices; sostanzialmente è un sintetizzatore digitale di onde sinusoidali, quadre, triangolari; come si può notare dal datasheet, ha un ampio range di funzionamento (0Hz-25Mhz), e una precisione impostabile che dipende da quest’ultimo. Il progetto completo prevede quindi il pilotaggio del DDS con il classico micro, io ho utilizzato un ATmega8515; inoltre l’impostazione della frequenza avviene tramite una tastiera, la frequenza, e i vari menu che ho previsto vengono visualizzati tramite un semplice display alfanumerico 16x2.
Introduzione:
Il DDS viene programmato/pilotato via software dal microcontrollore Atmega8515 caricando un registro a 28 bit con l’informazione binaria sulla frequenza che si vuole in uscita. Il clock massimo è di 25Mhz, cui corrisponde una risoluzione di 0.1Hz; al diminuire della frequenza di pilotaggio aumenta la precisione disponibile sulla frequenza d’uscita. L’interfaccia con cui è pilotato il dispositivo è a tre fili “SPI”, disponibile sulla maggior parte dei micro. Nel mio progetto non utilizzo tutte le potenzialità dell’AD9833, come il poter generare segnali modulati in frequenza o in fase; infatti, da un’attenta analisi dello schema interno si possono notare due registri per la frequenza e due per la fase. Vengono posti tutti a zero, e verrà caricato solo uno di quelli di frequenza, che conterrà l’informazione binaria sulla frequenza d’uscita. Tutti i blocchi interni sono controllati dal control register; in cui ogni bit corrisponderà un determinato settaggio del DDS. Esempio: selezione di un determinato registro frequenza, tipo di segnale d’uscita ecc. Questo verrà opportunamente caricato dal firmware del micro tramite la porta SPI.
Tool di sviluppo:
I tool di sviluppo utilizzati nel progetto sono: la scheda STK500 di Atmel e AVR studio 4.
Caratteristiche dell’apparecchiatura:
- Utilizzo del DDS AD9833 prodotto dall’Analog Devices.
- Utilizzo del microcontrollore ATmega8515.
- Range di funzionamento da 0,04Hz a 1,999999Mhz.
- Risoluzione 0,04Hz.
- Selezione dell’onda sinusoidale, quadra e triangolare.
- Funzione sweep preimpostata, durata 6s, range 0Hz-50Khz, utilizzabile con qualsiasi forma d’onda.
- Interfacce utente, display e tastiera, entrambe alfanumeriche.
Mappa di flusso generale sul funzionamento del generatore di segnali:
Un pò di teoria sul DDS:
In generale un segnale sinusoidale viene rappresentato in termini della sua ampiezza A(t) = sine(ωt), come si può notare, però la funzione è non lineare, quindi difficilmente ricostruibile digitalmente; sé, però consideriamo l’informazione di fase, essa è lineare in natura e si ripete ciclicamente a ogni periodo. La velocità angolare dipende dalla frequenza come dal prodotto ω = 2πf. Quindi sapendo che la fase è lineare e dando come intervallo di riferimento il periodo del master clock, la rotazione di fase sarà:
ΔPhase = ωΔt
Esplicitando rispetto a ω si ha:
ω = ΔPhase/Δt = 2πf
Esplicitando rispetto a f e sostituendo il periodo di riferimento Δt con 1/fmclk si ha:
F = ΔPhase x fmclk/2π (fmclk = master clock)
Quindi il funzionamento del DDS si basa sulla formula precedentemente ricavata. La formula viene implementata digitalmente attraverso una serie di componenti: l’oscillatore controllato numericamente (NCO), un modulatore di fase, una SIN ROM e un convertitore digitale analogico (DAC). Questi componenti sono visibili nello schema a blocchi dell’AD9833 nella figura seguente.
Considerando che l’accumulatore di fase è a 28 bit (in realtà contiene due registri a 28 bit selezionabili indipendentemente), nella formula F = ΔPhase x fmclk/2π, il parametro “2π” viene mappato su 28 bit, quindi 2π = 2^28, in definitiva F = ΔPhase x fmclk/2^28; dove fmclk/2^28 rappresenta la risoluzione.
Esempio:
Se si vuole in uscita una frequenza di 400Hz, bisogna caricare uno dei registri a disposizione, con il valore binario determinato come segue: ΔPhase = F x 2^28/fmclk = 400[Hz] x 2^28/10[Mhz] = 29F1[16].
Mappe di flusso sul funzionamento dell’AD9833:
Per ottenere l’uscita desiderata dal generatore di segnali, si dovranno seguire alcune procedure di settaggio nell’AD9833; vedere la mappa di flusso del DDS nelle figure che seguono, e quella del micro che pilota tutti i blocchi. Nelle mappe di flusso si noteranno delle barre su alcuni blocchi, questo perché io non ho implementato nessuna funzione che preveda l’utilizzo della fase del segnale (come ad esempio nelle modulazioni PSK). In particolare la prima cosa da fare è resettare il dispositivo per un corretto funzionamento, questa operazione porterà l’uscita del dispositivo (l’uscita del DAC, vedi schema a blocchi) in alta impedenza in modo da evitare transienti sul carico, nel frattempo si effettuerà il setup dei vari blocchi, infine si abilita l’uscita ponendo il bit reset del control register a 0. Tutta la procedura completa sarà più chiara nelle mappe di flusso seguenti.
Mappe di flusso del firmware:
Il firmware:
Il programma è composto da parecchie routine che sono descritte in un documento allegato, qui verrà spiegato il funzionamento a grandi linee dell’algoritmo che gestisce tutto il sistema. Come ho già descritto nei paragrafi precedenti, l’interfaccia utente è composta da vari menu, per selezionare la modalità sweep o normale. Nei sottomenu si può poi scegliere il tipo di onda con relativa frequenza oppure il tipo di onda da sweeppare. Nel caso in cui si sceglie la modalità di generazione segnale con relativa frequenza, questo porterà a una serie di passaggi prima che il segnale esca dal chip DDS. Prima di proseguire apriamo una piccola parentesi. Considerando che abbiamo a disposizione un micro a 8 bit e una tastiera con una numerazione limitata, non possiamo caricare dalla stessa dei valori che superano il 9, ma se avessimo una tastiera con una numerazione maggiore, non potevamo di certo inserire valori maggiori di 256, questo perché i registri sono a 8 bit; quindi per inserire frequenze che raggiungono il milione, i valori verranno caricati sullo stack, per poi essere ricostruiti con una look up table, quindi andremo a prelevare un valore alla volta dallo stack, cercheremo il peso corrispondente nella look up table e lo sommeremo di volta in volta, per ricostruire la frequenza digitata, queste operazioni saranno effettuate chiaramente tutte in binario. Dopo di che il valore di frequenza che sarà spalmato su quattro registri verrà moltiplicato con una costante che deriva dalla formula del DDS. Adesso dovrà essere opportunamente formattato per esser trasferito tramite porta SPI all’AD9833. Per generare lo sweep di una qualsiasi onda, l’algoritmo in questo caso parte dalla frequenza più bassa è incrementerà il valore fino a una certa frequenza, tra un incremento e l’altro ci sarà una pausa, che concorrerà a formare la durata dello sweep.
Schema elettrico:
Lo schema elettrico è più chiaro nel file allegato; perché può essere anche zoomato. Il generatore è alimentato a 5V con un assorbimento di massimo 60mA, la tensione di 5V è tipica di tutti i dispositivi nello schema. Mentre il resto dei componenti è stato descritto, rimane il buffer del clock, esso smista il segnale sia al DDS sia al micro, questo piccolo chip pilota il quarzo, e ne stabilizza il segnale d’uscita, i componenti di contorno servono a polarizzare nella zona lineare il buffer e a ottenere il circuito oscillante di Pierce. Le capacità intorno al DDS eliminano eventuali transitori e accoppiamenti che possono sporcare il segnale, così come le capacità collegate all’alimentazione. Un componente importante da notare è la resistenza di carico del DDS, questa deve essere tarata per ottenere il segnale voluto d’uscita; poiché l’impedenza totale d’uscita vista dai diversi segnali disponibili è diversa da segnale a segnale.
Componenti:
I componenti con i valori sono visibili nello schema elettrico allegato, il micro utilizzato è l’ATmega 8515.
Risorse del microcontrollore utilizzate:
Considerazioni sull’uscita del DDS:
Considerando che il DDS è sensibile alle variazioni del master clock si è dovuto utilizzare come riferimento di clock un oscillatore al quarzo bufferizzato, che risulta più stabile di un qualsiasi altro oscillatore. Nonostante questo, durante la costruzione dei segnali si verificano degli errori intrinseci (naturali e non eliminabili) che modificano leggermente la frequenza all’uscita. Il massimo scostamento è stato calcolato su un campione di 13 valori (l’errore si ripete uguale nell’intero range), è stata utilizzata la seguente formula per determinare il massimo scostamento dal valore digitato:
ErroreMax %= |Valore_Digitato – Valore_Misurato| X 100 = 1.6%
Conclusioni:
Limitazioni del dispositivo:
Miglioramenti possibili:
Allegati

Ciao, il problema della velocità è dato dal micro, infatti la massima velocità di segnalazione è la metà di quella del master clock che pilota tutto il sistema 10,245MHz, l’spi del DDS come puoi notare anche dal datasheet può arrivare fino a 40Mhz su questo modello. Chiaramente si può adottare un micro superiore, che avrà sicuramente una SPI più veloce; per quanto riguarda la generazione di onde arbitrarie, sicuramente ad ogni modo, da questo DDS non le potrai ottenere, a causa della circuiteria custom interna, anche utilizzando un micro superiore; a meno che, non utilizzi direttamente quest’ultimo per la generazione dei segnali. In realtà io avevo pensato di implementare l’architettura DDS su dispositivi FPGA, in modo da poter avere un sistema che potesse fornire anche segnali arbitrari e/o con altre caratteristiche, rispetto all’ad9833; purtroppo tempo e denaro sono tiranni.
Non considerando l’iva e le spese di spedizione, su RS i prezzi per componente sono:
AD9833 -> 8,73 euro
ATmega8515 -> 3,78 euro
Display 16×2 -> 4,62 euro
Tastiera -> 12,46 euro
La versione del buffer che ho utilizzato io non è più disponibile su RS, ci sono altri che comunque andrebbero bene; dovrebbe costare qualche decina di centesimi di euro.
Quindi il totale circa, sarà di 29,59 euro.
Questo progetto è molto interessante (molto utile la tastiera per l’inserimento della frequenza) e consente di realizzare uno strumento indispensabile per il laboratorio di elettronica. In passato ricordo il generatore di funzioni MAX038 di Maxim (probabilmente ora è fuori produzione). Qual’è il costo totale dei componenti (circa)?
Bel progetto.. per ora forse quello più completo sia dal p.to di vista pratico che teorico/professionale 😉
Un generatore di segnali è uno strumento necessario nel laboratorio del progettista elettronico!
Concordo sulle implementazioni da fare, in particolare l’amplificatore di uscita per ottenere valori un poco più elevati.
Inoltre doterei il sistema di una porta seriale, la usart del micro non è usata. Si potrebbe quindi collegarlo al PC e tramite un comune programmino di comunicazione seriale, impostare le forme d’onda direttamente. Ma anche avere a schermo segnalazioni in tempo (quasi) reale. L’utilizzo di un micro più performante sarebbe necessario, almeno per sfruttare pienamente la velocità del AD933.
Per la generazione delle forme d’onda arbitrarie, la vedo dura….
http://instrumentation.analog.com/en/electronic-test-measurement/arbitrary-waveform-generator/segment/im.html
La vedrei come una vera e propria espansione con un altro canale gestito da un dsp dedicato (o fpga)
Ottima l’introduzione al DDS
Sicuramente hai ragione Emanuele; per rendere più professionale il generatore bisognerebbe controllare lo stesso anche da PC, oltre a effettuare le migliorie già elencate e utilizzare un microcontrollore superiore; Secondo il mio modesto parere, per implementare forme d’onda arbitrarie, converrebbe a questo punto utilizzare direttamente un FPGA, la versione che integra magari un micro, quindi configurare il dispositivo secondo l’architettura base di un DDS, e integrare anche le funzioni per generare segnali arbitrari.
Ciao Già…chiaramente non mi devi niente, se ti interessa lo puoi riprodurre e migliorare naturalmente, per quanto riguarda il collaudo, adesso non ho a disposizione l’oscilloscopio purtroppo, e quindi non sò come farti vedere realmente il suo comportamento….però ti posso assicurare che quando l’ho testato, la riproduzione era fedele….Saluti.
Ciao, come hai fatto a togliere gli scalini dovuti alla conversione digitale/analogica?
io ho provato a costruire il progetto, ho però dei problemi sulla forma d’onda triangolare e quadrata….
Saluti
Ciao, mi sorprende questa cosa che mi dici, in quanto l’integrato ha già tutto il necessario per generare forme d’onda complete, quindi ha già anche un filtro interno per la costruzione dei segnali; inoltre ti posso dire che io l’ho testato su un oscilloscopio, variando la frequenza e la forma d’onda e naturalmente non ho notato scalini in nessuna forma d’onda. Probabilmente c’è qualcosa che non va nella costruzione fisica, praticamente sull’uscita dovresti aver inserito un trimmer che va settato in modo diverso a seconda se la forma d’onda è sinusoidale/triangolare o quadra, perchè altrimenti vedi un segnale saturato o troppo attenuato, quindi devi fare ogni volta una calibrazione sul trimmer quando passi da un’onda sinusoidale/triangolare (considera che siccome l’onda sinusoidale e triangolare, vengono generate entrambe dal dac, dovresti avere problemi anche su quella sinusoidale, l’onda quadra invece non viene generata dal dac) a quadra; penso che il problema tuo sia questo, ma potrei sbagliarmi, fammi sapere! saluti.
Scusami, praticamente ho trovato un errore nello schema elettrico che ho allegato, dovrebbe essere quello, che ti dà problemi; devi modificare la connessione al trimmer d’uscita, infatti, semplicemente, devi collegare l’out dell’ad9833 in parallelo allo stesso e sempre da qui prendi l’uscita del generatore, l’altro capo del trimmer con il suo punto centrale lo devi collegare a massa (stai attento a non regolare il trimmer all’estremo che collega l’uscita direttamente a massa altrimenti si brucia il DDS). Spero di essere stato comprensibile. Saluti.
Ciao, premetto che ho utilizzato un modulo dds già assemblato, acquistato su ebay e adattato al progetto. la forma d’onda sinusoidale presenta le scalinature dovute alla conversione, l’onda triangolare risulta deformata, sembra più una sinusoide schiacciata…
L’onda quadra invece sembra che cambi di fase ciclicamente…
Purtroppo senza vedere la scheda che hai acquistato e senza lo schematico in dettagli non ti so rispondere in merito ai problemi che descrivi…..prova a implementare magari alla lettera lo schema che ho postato io!
Tieni presente che c’è un errore nello schematico, che può portare ai problemi che descrivi…ho già spiegato in una risposta precedente come porvi rimedio, fai riferimento quindi ai commenti precedenti e fammi sapere se il problema persiste…..
Salve
è possibile avere lo schema completo e il firware del progetto?
grazie
Salve Federico,
sono in allegato. Grazie della segnalazione 😉