OSCILLATORE A CONTROLLO NUMERICO. (DDS)

Posted in: Elettronica,Schemi e Progetti |

Introduzione

Salve, qualche anno addietro, per rimettere in funzione  un vecchio apparato per le HF, ho dovuto sostituire uno dei suoi PLL in avaria con un generatore DDS. Poiché, a mio avviso tale soluzione si adatta molto bene a tutti quei casi in cui, occorre uno specifico riferimento di frequenza e non si riesce a trovare il quarzo del valore desiderato, ho deciso di parlarvene tramite le pagine di questo sito, nell’eventualità potesse fare anche al caso vostro.

Descrizione

Come dicevo, si tratta di un generatore di segnali sinusoidali che può sostituire un qualunque oscillatore a PLL oppure quarzato. Questo lavoro di ricerca e sperimentazione ha avuto inizio quando mi si è presentato il problema di dover sostituire un introvabile integrato PLL sul transceiver IC-M600 della ICOM. Tale circuito, incaricato di generare le due sottoportanti per le bande laterali LSB ed USB, in effetti, potrebbe essere sostituito più agevolmente da un oscillatore di Miller quarzato; ma anche qui, non sono riuscito a superare lo scoglio della irreperibilità dei quarzi in questione, i cui valori sarebbero dovuti essere di 9.010,3 Khz e 9.013,3 Khz.

Abbandonata anche questa idea, ho iniziato a sperimentare o per meglio dire a giocare con un fantastico integrato prodotto dalla Analog-Device, la cui sigla è AD-9835. Si tratta di un generatore DDS, cioè a “Sintesi Diretta Digitale”, all’interno del quale vi è un NCO, cioè un “Oscillatore a Controllo Numerico”, per il cui funzionamento non sono utilizzati circuiti LC.

Il tutto funziona anche in modo abbastanza semplice: Un segale sinusoidale è registrato sotto forma di 4096 campioni con una risoluzione di 10 bit su una ROM interna, la quale viene letta con cadenza regolare ed a passi prestabiliti, in modo che attraverso un convertitore Digitale-Analogico, seguito da un opportuno filtro passa basso, sia riprodotta una perfetta sinusoide alla frequenza desiderata con una risoluzione di 1 hz. (incredibile ma vero)

La lettura dei campioni nella ROM è effettuata a frequenza prestabilita e costante, inoltre, i 4096 campioni non sono letti tutti uno di seguito all’altro, ma ad esempio uno ogni cento, se lo step è di cento; uno ogni centocinquanta, se lo step è di centocinquanta e così via. Il risultato che si ottiene è visibile nella fig.1 che spero possa essere più chiara di quanto lo sono stato io a parole, dove la sinusoide verde rappresenta tutti i campioni registrati sulla ROM, la sinusoide rossa è riprodotta dalla lettura dei soli campioni evidenziati in rosso e la sinusoide blu con ovviamente step diverso della precedente, dalla lettura dei soli campioni  evidenziati in blu.

Un altro aspetto molto interessante, riguarda il clock di riferimento del DDS, che può assumere qualsiasi valore, purché sia almeno il triplo della più alta frequenza da generare. Nel mio caso quindi, anche un valore di riferimento intorno ai 30 Mhz sarebbe andato bene lo stesso, ma con un leggero peggioramento della qualità del segnale riprodotto. Eventualmente ciò avrebbe comportato solamente una leggera modifica all’algoritmo del PIC, dove il nuovo valore avrebbe sostituito i 50 Mhz da me adottati, valore massimo consigliato dalla Analog-Device per questo tipo di chip. Più flessibile ed adattabile di così, non credo ci sia  nessun’altra cosa.

Il rapporto tra la frequenza d’uscita, il clock di sistema e lo step di lettura è determinato dalla seguente espressione,  Fout = Step * Clock / 2^32 ; dove:

Fout  =  frequenza del segnale d’uscita in MHz.
Step = valore del registro di fase a 32-bit.
Clock = valore del quarzo di riferimento in MHz.

Nel nostro caso, essendo note la frequenza da generare ed il clock di sistema, lo step di lettura della rom interna sarà uguale a: Step = Fout * 2^32 / Clock

Naturalmente, la spiegazione che ho dato prima non si può definire neppure sommaria, però se volete approfondire l’argomento per capire nei dettagli i vari aspetti legati alla generazione del segnale sinusoidale, vi suggerisco di scaricare presso il sito dell’Analog-Device il data-sheet dell’integrato, che ho trovato molto esauriente ed esplicativo soprattutto per la stesura del software per eventuali altri microcontrollori o CPU.
http://www.analog.com/static/imported-files/data_sheets/AD9835.pdf

Ebbene, anche in questo progetto chi gestisce tutto è il solito PIC, in questo caso l’onnipresente 16F84 della Microchip, a cui ho affidato il compito di leggere lo stato del deviatore, in funzione del quale produrre la sequenza opportuna dei segnali di clock, data e sync, da inviare al DDS per istruirlo sul valore di frequenza da generare.

Dato che non ci sono punti di taratura di nessun genere, non credo sia necessario aggiungere altro, occorre soltanto alimentare il circuito con una tensione continua stabilizzata di 5V e munire il DDS di un piccolo dissipatore termico. Siate molto cauti nel montaggio del DDS, reperibile purtroppo solo in contenitore TSSOP, le cui ridottissime dimensioni, come si vede nella fig.2 non facilitano certo tale operazione.

In fig.3 la soluzione da me adottata per il suo montaggio, che consiste nell’aver preparato un circuito stampato su vetronite per il solo DDS, che fa da supporto per il montaggio successivo su un’altra basetta, oppure come ho fatto io su una millefori.

Il software che ho messo a punto per il PIC, potrete scaricarlo qui. Inserite il nuovo dato di clock, se diverso dal mio e la frequenza da generare, tutto dovrà funzionare sin dalla prima accensione.

Non preoccupatevi se scorrendo il file .asm noterete  routine che nulla hanno a che vedere con questo progetto. Sono istruzioni che ho deciso di lasciare nel caso potessero servirvi, fanno parte di un precedente progetto ed in questo sono ignorate.

Eventualmente i nuovi valori di frequenza dovrete inserirli in questo punto del file:

ORG     0x2100 ;EEPROM
Data    09, 01, 03, 00
Data    09, 01, 33, 00

e se cambierete il valore del clock, dopo averlo convertito in esadecimale, dovrete inserirlo in questo punto del file:

;freq. del quarzo, divisore
;50.000.000 = 02FAF080 h
MOVLW   0x02
MOVWF   QUA_4
MOVLW   0xFA
MOVWF   QUA_3
MOVLW   0xF0
MOVWF   QUA_2
MOVLW   0x80
MOVWF   QUA_1

Con questo spero di aver detto tutto il necessario, affinchè, se ne avrete voglia, possiate riprodurre facilmente questo progetto.
Un cordiale saluto a tutti e buon divertimento.

IT9DPX – #135 – (FRANCESCO  MIRA)

(Articolo visitato: 3.889)

Lascia un Commento!