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