Sweepino: uno sweep generator economico basato su Arduino e DDS da tre euri


La presenza su eBay di moduli DDS buoni per tutte le HF a un costo di circa €3 al pezzo è un'occasione troppo ghiotta per non giocarci un po'.
Secondo pareri piuttosto diffusi in rete il phase-noise è troppo elevato per impiegarli direttamente come vfo in apparecchiature "weak signals", ma ci sono comunque margini per divertisi lo stesso in un certo numero di applicazioni.
 
In particolare il primo progetto cui ho pensato è stato la realizzazione di uno sweep generator che mi permettesse di utilizzare l'oscilloscopio per tracciare la curva di risposta in frequenza di alcuni filtri che vorrei aggiungere al frontend del mio rtx hf. Nello shack è arrivato  un analizzatore di spettro con tracking, ma ormai vale la pena finire il progetto.
A ruota segue l'idea di mettere assieme un'analizzatore d'antenna low-cost.
In entrambi i casi il controllo del DDS verrebbe affidato ad una combinazione Arduino + LCD shield, anche loro acquistati in rete per pochi soldi.


 
Il controllo "base" del modulo è semplicissimo grazie al lavoro di Radio Artisan, oltretutto valido anche per dispositivi dalle prestazioni superiori.
Al contrario i primi esperimenti con il codice di Webshed mi davano un sacco di grattacapi. Le interconnessioni suggerite nei due casi sono leggermente diverse e in particolare l'impiego del pin "reset" del modulo sembra fosse causa di crash improvvisi.
 
La tecnica di connettere uno sweep generator all'oscilloscopio per tracciare le curve di risposta in frequenza non è niente di nuovo.
In questo caso però ho dovuto negoziare un paio di vincoli della piattaforma.
- gli sweep generators normalmente forniscono una tensione a dente di sega con cui pilotare l'asse X dell'oscilloscopio, utilizzato in modalità X-Y. La logica di controllo digitale dell'Arduino mal si presta a realizzarla. Gli esperimenti con pwm e condensatori producono al limite delle curve con la forma di una S allungata, che avrebbe causato una distorsione nella plottata; 
- in ogni caso al mio oscilloscopio digitale, almeno in prima battuta, la modalità X-Y sembrava piacere poco. Sicuramente dovrei imparare a usarlo meglio.
Ho così ovviato prevedendo, anziché una regolazione analogica dell'asse orizzontale, di utilizzare piuttosto un impulso o un cambio di stato (basso/alto o vv.) come trigger.
 
Il resto del lavoro sono funzioni di contorno che rendono più agevole l'utilizzo: l'impostazione delle frequenze tra due vfo e con una manualità che ricorda i contraves, scelta del passo di sintonia, calcolo dei tempi di sweep e calcolo dell'ampiezza di frequenza per quadretto (ho realizzato di recente che il loro numero può essere abbastanza variabile). Effettivamente la maggior parte del codice è finalizzata all'ergonomia dell'interfaccia.
 
Ancora da fare
- modalità "wobble", dove invece dei due vfo si imposta lo sweeping attorno a una frequenza centrale;
- verifica dei livelli in uscita e valutazione su necessità attenuazione/amplificazione;
- adattamento dell'impedenza d'uscita da 200 a 50 ohm;
- verifica sul filtro in uscita. Stando a N3ZI i moduli sarebbero venduti sottocosto per via di un errore di realizzazione nella rete d'uscita.
The AD-9850 modules being sold on ebay appear to have an error in the output filter design. If you check on
ebay you will find a large number of sellers offering a AD9850 Module similar to the one shown in the photo
above. My guess is that this is a liquidation due to a design build error, since they are being sold for a price of
about 1/2 the price of the DDS chip alone. The modules are assembled and tested. The design error I noticed is
that the wrong output filter is used. These boards use the 9850 running at 125MHz. A 125MHz DDS should
have a 50MHz LPF, but it seems that these modules have the 75MHz LPF the chip maker recommends for the
AD9851 running at 180MHz. My guess is, someone just copied the wrong filter from the wrong data sheet, and
it wasn't caught until they went into production.

Si potrà rettificare?

I6DVX è di parere diverso:
...Si evidenzia un notevole calo nel livello del segnale a 40 MHz, circa - 30 dBm. Probabimente ciò è dovuto all’aumento del ripple a causa del
disadattamento di impedenza del filtro (200 ohm) chiuso sull’ingresso dell’analizzatore di spettro (50 ohm). // possibilità di modificare, cambiando solo il valore di due
resistori, l’impedenza di uscita del modulo così da portarla a 50 ohm. Più precisamente è sufficiente montare due resistori da 68 ohm in parallelo a R7 e R9 (200 ohm).
Attenzione: questa operazione altera le caratteristiche del filtro, peggiorandone il ripple. Se ritenuto indispensabile, è possibile rivisitare il filtro, sostituendo i valori dei condensatori e degli induttori, così da contenere il ripple.
- dialogo con il pc o l'oscilloscopio: può valere la pena?
- completare questi appunti 8-)=

Connessioni
LCD Shield a parte -e qui avrei qualcosa da dire sulla sanità mentale di chi ha messo i pin disponibili in fila senza spiegare che la numerazione non corrispondeva ad un range tutto attaccato -:
PIN3 - segnale di trigger per l'oscilloscopio
PIN11 - data (DATA)
PIN12 - clock (W_CLK)
PIN13 - load (FU_UD sul mio DDS)
Naturalmente poi il modulo va alimentato: si possono prendere i 5V dall'Arduino.
Il pin RESET l'ho lasciato scollegato,
 
Utilizzo
Lo Sweepino ha due modalità di funzionamento:
- frequenza fissa, indicata da "F" come carattere all'estrema destra nella prima riga del display;
- sweep tra i due vfo, riscontrabile dal variare della frequenza sul display e dal carattere "S" come ultimo della prima riga.
La parte superiore dell'lcd è dedicata alle informazioni sulla frequenza operativa.
Quella inferiore mostra e consente di impostare alcuni parametri di funzionamento, come lo step, il tipo di trigger e le altre elencate qui sotto.
Il tasto <SELECT> dello shield sposta il cursore -e quindi il controllo- tra le due sezioni del display.
Destra e sinistra fanno scorrere il cursore sulla riga. Il cursore spostato più a sinistra del primo carattere ricompare in fondo alla riga e viceversa.

Per visualizzare lo sweep sull'oscilloscopio;
- collegare ad un canale (diciamo CH1) l'uscita del generatore o del DUT;
- collegare all'altro canale o alla presa TRIGGER (se sopporta 5V) il PIN dedicato dell'Arduino (3 nel mio caso)
- impostare il trigger per scattare su un impulso (freccia su/freccia giù sul Rigol) e un livello comodamente riconosciuto (es. > 0,5V).
- centrare la schermata in modo che l'intervallo tra un trigger e l'altro risulti perfettamente centrato a metà schermo


 
Navigazione e comandi
=== Prima riga ===
-   A/B: vfo di operazione. Con <UP>/<DOWN> si cambia da un vfo all'altro;
-   frequenza: <UP>/<DOWN> aumenta o diminuisce il valore in corrispondenza del cursore;
-   F/S: "fixed" e "sweep". Nel primo caso il DDS rimane fisso in frequenza, nel secondo inizia lo sweep tra i due vfo con lo step prefissato sino a quando non verrà nuovamente posto in modalità "fixed".
 
=== Seconda riga ===
Il cursore posto sui primi tre caratteri della riga permette con <UP>/<DOWN> di scorrere tra le voci visualizzabili.
Spostando il cursore sui caratteri più a destra (l'ultimo nel caso di funzioni on/off) si possono variarne le impostazioni.
- STEP: step da usare durante lo sweep. Naturalmente passi troppo piccoli rendono lo sweep più lento. A seconda della differenza impostata tra i due vfo potrebbero anche non essere distinguibili;
- ST: sweep time - tempo impiegato da un ciclo di sweep. Viene restituito solo dopo che se ne sia conclusa almeno uno;
- TRIG: tipo di segnale trigger da mandare all'oscilloscopio (PULSE/HI-LOW)

Queste altre funzioni servono nel caso si possa ottenere un tempo di sweep che quadra perfettamente con un certo numero di quadretti sull'oscilloscopio.
- DIV: base dei tempi effettiva nell'ultimo sweep. Impostando l'oscilloscopio a questo valore la curva dovrebbe corrispondere perfettamente alle dimensioni dello schermo;
- SCOPE DIVS: specifica il numero di divisioni presenti sullo schermo dell'oscilloscopio in uso. Serve come divisore per fornire informazioni sul tempo di sweep, ovvero lo span (copertura in frequenza) di ogni quadretto.

DOWNLOAD DEL CODICE PER ARDUINO



Il livello in uscita



Problemi noti
Ogni tanto va in crash:
- impostando la frequenza: sembra non rispettare la condizione di "decrementa solo se non sei sotto un certo valore"
- facendo lo sweep: esegue solo un certo numero di step (12?) e poi si pianta



Contact:indirizzo come immagine per diminuire lo spam


Last update: 17 Mar2013 20h00 - Home