SATSAGEN 0.4

Scarica SATSAGEN 0.4 e versioni successive dalla seguente pagina:

SATSAGEN Download Page

Highlights:

  • Supporto doppio dispositivo SDR
  • Generatore con frequenza di uscita LO

Supporto doppio dispositivo SDR

Dalla versione 0.4.0, SATSAGEN può gestire due dispositivi. In questa modalità, il primo dispositivo funziona come RX e il secondo come TX.

Questa modalità consente di azzerare il crosstalk interno tipico di questi dispositivi, aumentando di conseguenza la dinamica del sistema.

Configurazione in modalità doppio dispositivo

Per abilitare questa modalità, specificare i due dispositivi nella scheda Devices in Settings. Il primo device funzionerà come RX e il secondo come TX. Se non verranno specificati i dispositivi e le caselle Connection string override sono lasciate vuote, allora verranno utilizzati gli URI predefiniti per la connessione ai dispositivi. L’URI predefinito per il primo dispositivo è ip:192.168.2.1 e per il secondo è ip:192.168.3.1

Se hai cambiato l’account di default dei dispositivi, è possibile salvarlo nel programma in modo sicuro. Fai click su Set credential e inserisci l’account. Questi username e password verranno utilizzati dal programma per inviare dei comandi utili ad identificare in modo univoco i dispositivi. Per esempio queste credenziali verranno usate per inviare i comandi di inversione dei LED se utilizzate le rispettive funzioni dai pulsanti LED On. Con questa funzione è possibile identificare velocemente i dispositivi, perché il normale lampeggio dei LED di attività dei dispositivi verrà invertito.

Nella configurazione del secondo dispositivo di TX, è presente una casella Discipline XO. Se selezionata, la sorgente di riferimento del TX verrà periodicamente corretta in frequenza in base alla forma e posizione del segnale ricevuto dal dispositivo RX. Queste correzioni avverranno durante le scansioni e le fasi di calibrazioni, a patto sia presente un’ampiezza in ingresso sufficiente. La funzione di Discipline XO aiuta a mitigare la naturale deriva dei TCXO di fabbrica presenti nei dispositivi. Con questa funzione disabilitata, la deriva dei TCXO standard può portare a considerevoli variazioni di ampiezza del segnale ricevuto durante le scansioni.

La funzione Discipline XO non è attiva quando:

  • La frequenza di lavoro è inferiore a 71 MHz
  • Sono stati specificati offset di RX o TX
  • E’ attiva la modalità moltiplicatore o armonica di TSA
  • L’ampiezza in RX scende sotto i -20 dBm per la correzione fine in base alla forma del segnale ricevuto
  • L’ampiezza in RX scende sotto i -60 dBm per la correzione in base alla posizione del segnale ricevuto

Nella modalità a doppio dispositivo, la scheda Level Correction ha una sezione apposta dove possono essere specificati i file di linearizzazione specifici dei dispositivi RX e TX.

Funzionamento in modalità doppio dispositivo

Il funzionamento è identico alla modalità usuale a singolo dispositivo, anche l’interfaccia utente non cambia se non per il piccolo LED posto in basso a destra del pannello TSA il quale indica lo stato della funzione di Discipline XO. Il LED diventa verde in una condizione di normale funzionamento, inoltre indica anche la correzione effettuata in Hz sulla sorgente di riferimento, nell’esempio -222 Hz.

Prima di fare una calibrazione ed eseguire delle misure, suggerisco di lasciare “girare” per un po’ di volte le scansioni con il solo cavo di loopback collegato. Questa accortezza permette alla funzione di Discipline XO di trovare il valore più giusto di correzione per ricevere al meglio il segnale.

La migliore condizione comunque si raggiunge quando i dispositivi entrano in temperatura, soprattutto se utilizzano i TCXO di fabbrica.

Generatore con frequenza di uscita LO

Selezionare DC per spegnere la modulazione della portante del generatore.

Questa funzione migliora la qualità del segnale in uscita del generatore, inoltre essendo la frequenza in uscita la stessa dell’oscillatore locale, è più semplice per l’utente calcolarne le armoniche. In questa modalità viene applicata una continua agli ingressi I e Q dei mixer TX.

plutotx

plutotx è una semplice applicazione a linea di comando che pilota ADALM-PLUTO per generare un tono CW alla frequenza e intensità specificati dall’utente.

Spero che questo articolo e il codice sorgente in C di plutotx possano essere un piccolo aiuto per chi desidera iniziare un nuovo progetto SDR.

Il file compresso che troverai qui sotto contiene anche i binari x86 per Windows e Linux, per cui potrebbero essere utili anche per chi non è programmatore, ma è solo interessato a sperimentare con Pluto:

plutotx (10 august 2020)
File size: 690,282 Bytes
MD5 36FEE854E3D118A153675C930BF36B18
SHA1 3905F554B962C7553264A128FD558A0A39556525
SHA256 EDD8E7D41D7DEE758F7FCFD791274688076F1C1A0B25A583DBBFC77E3F3ED62E

Il file ZIP contiene le librerie necessarie per l’esecuzione in ambiente Windows mentre per compilare ed eseguire Pluto sotto Linux occorre scaricare e installare la libreria libiio di ADI per il tuo specifico OS da qui: libiio.

plutotx richiede tre parametri: frequenza espressa in kHz, livello di uscita in dBm e opzionale, indirizzo URI del device da connettere.

Per esempio: plutotx 432410 -10

plutotx effettuerà la connessione all’indirizzo di default URI ip:192.168.2.1 se il terzo parametro non viene specificato.

Come funziona

Per migliorare la comprensione dei passaggi necessari per la generazione del tono CW, descriverò il codice in porzioni semplificate:

  • Connessione al device Pluto ed acquisizione della struttura context
  • Verifica se il modello del transceiver corrisponde a un AD9364 (richiesto per il completo range di frequenze)
  • Ricerca dei device physical transceiver e del DAC/TX output driver (FPGA)
  • Ricerca dei canali I, Q, catena TX e oscillatore locale TX
  • Applicazione di una configurazione di default del dispositivo
  • Impostazione dell’attenuatore TX
  • Impostazione della larghezza di banda TX
  • Impostazione dei parametri di scala, frequenza e phase dei canali I e Q
  • Impostazione della frequenza dell’oscillatore locale TX
  • Attivazione dei canali I e Q in modo raw per ottenere il segnale in uscita

Prima di tutto occorre effettuare la connessione al dispositivo ed acquisire la struttura context:

struct iio_context *ctx;
ctx = iio_create_context_from_uri("ip:192.168.2.1");

Verifica se il modello del transceiver corrisponde a un AD9364:

if((value=iio_context_get_attr_value(ctx, "ad9361-phy,model"))!=NULL)
  {
  if(strcmp(value,"ad9364"))
    stderrandexit("Pluto not expanded",0,__LINE__);
  }else
   stderrandexit("Error retrieving phy model",0,__LINE__);

Ricerca dei device physical transceiver e del DAC/TX output driver (FPGA):

phy = iio_context_find_device(ctx, "ad9361-phy");
dds_core_lpc = iio_context_find_device(ctx, "cf-ad9361-dds-core-lpc");

Ricerca dei canali I, Q, catena TX e oscillatore locale TX:

tx0_i = iio_device_find_channel(dds_core_lpc, "altvoltage0", true);
tx0_q = iio_device_find_channel(dds_core_lpc, "altvoltage2", true);
tx_chain=iio_device_find_channel(phy, "voltage0", true);
tx_lo=iio_device_find_channel(phy, "altvoltage1", true);

Applicazione di una configurazione di default del dispositivo. Forse questo passaggio non è necessario, ma è raccomandato nel caso di un utilizzo precedente di un altro programma SDR che potrebbe aver variato la configurazione di default del dispositivo.

//enable internal TX local oscillator
if((rc=iio_channel_attr_write_bool(tx_lo,"external",false))<0)
  stderrandexit(NULL,rc,__LINE__);

//disable fastlock feature of TX local oscillator
if((rc=iio_channel_attr_write_bool(tx_lo,"fastlock_store",false))<0)
  stderrandexit(NULL,rc,__LINE__);

//power on TX local oscillator
if((rc=iio_channel_attr_write_bool(tx_lo,"powerdown",false))<0)
  stderrandexit(NULL,rc,__LINE__);

//full duplex mode
if((rc=iio_device_attr_write(phy,"ensm_mode","fdd"))<0)
  stderrandexit(NULL,rc,__LINE__);

//calibration mode to manual
if((rc=iio_device_attr_write(phy,"calib_mode","manual"))<0)
  stderrandexit(NULL,rc,__LINE__);

La linea 18 imposta la calibrazione del TX in modo manuale, questo per evitare che l’automatismo di calibrazione generi dei picchi in uscita che potrebbero superare il livello di potenza specificato dall’utente.

Impostazione dell’attenuatore TX. Il valore dell’attenuatore si ottiene sottraendo al valore di intensità specificato dall’utente, il valore di potenza in uscita di Pluto (circa 10 dBm definito da REFTXPWR):

if((rc=iio_channel_attr_write_double(tx_chain,"hardwaregain",dBm-REFTXPWR))<0)
  stderrandexit(NULL,rc,__LINE__);

Impostazione della larghezza di banda TX:

if((rc=iio_channel_attr_write_longlong(tx_chain,"rf_bandwidth",FBANDWIDTH))<0)
  stderrandexit(NULL,rc,__LINE__);

Impostazione dei parametri di scala, frequenza e phase dei canali I e Q:

if((rc=iio_channel_attr_write_double(tx0_i,"scale",1))<0)
  stderrandexit(NULL,rc,__LINE__);

if((rc=iio_channel_attr_write_double(tx0_q,"scale",1))<0)
  stderrandexit(NULL,rc,__LINE__);

if((rc=iio_channel_attr_write_longlong(tx0_i,"frequency",FCW))<0)
  stderrandexit(NULL,rc,__LINE__);

if((rc=iio_channel_attr_write_longlong(tx0_q,"frequency",FCW))<0)
  stderrandexit(NULL,rc,__LINE__);

if((rc=iio_channel_attr_write_longlong(tx0_i,"phase",90000))<0)
  stderrandexit(NULL,rc,__LINE__);

if((rc=iio_channel_attr_write_longlong(tx0_q,"phase",0))<0)
  stderrandexit(NULL,rc,__LINE__);

Impostazione della frequenza dell’oscillatore locale TX. La frequenza dell’oscillatore locale TX è ottenuta sottraendo al valore richiesto dall’utente, la frequenza del tono CW definita da FCW:

if((rc=iio_channel_attr_write_longlong(tx_lo,"frequency",freq-FCW))<0)
  stderrandexit(NULL,rc,__LINE__);

Attivazione dei canali I e Q in modo raw per ottenere il segnale in uscita:

int rc;

if((rc=iio_channel_attr_write_bool(
        tx0_i,
        "raw",
        1))<0)
 stderrandexit(NULL,rc,__LINE__);

if((rc=iio_channel_attr_write_bool(
        tx0_q,
        "raw",
        1))<0)
 stderrandexit(NULL,rc,__LINE__);

Intero codice sorgente di plutotx:

/*
 Author: Alberto Ferraris IU1KVL - http://www.albfer.com

 This program is free software: you can redistribute it and/or modify
 it under the terms of the version 3 GNU General Public License as
 published by the Free Software Foundation.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 */
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "iio.h"

#define URIPLUTO "ip:192.168.2.1"
#define MINFREQ 50000000
#define MAXFREQ 6000000000
#define MINDBM -89
#define MAXDBM 10
#define REFTXPWR 10
#define FBANDWIDTH 4000000
#define FSAMPLING 4000000
#define FCW 1000000

struct iio_channel *tx0_i, *tx0_q;

void stderrandexit(const char *msg, int errcode, int line)
{
if(errcode<0)
  fprintf(stderr, "Error:%d, program terminated (line:%d)\n", errcode, line);
  else
  fprintf(stderr, "%s, program terminated (line:%d)\n",msg, line);
exit(-1);
}

void CWOnOff(int onoff)
{
int rc;

if((rc=iio_channel_attr_write_bool(
		tx0_i,
		"raw",
		onoff))<0)
 stderrandexit(NULL,rc,__LINE__);

if((rc=iio_channel_attr_write_bool(
		tx0_q,
		"raw",
		onoff))<0)
 stderrandexit(NULL,rc,__LINE__);
}

int main(int argc, char* argv[])
{
struct iio_context *ctx;
struct iio_device *phy;
struct iio_device *dds_core_lpc;
struct iio_channel *tx_chain;
struct iio_channel *tx_lo;
const char *value;
long long freq;
double dBm;
int rc;
int ch;

if(argc<3)
  {
  printf("Usage: plutotx kHz dBm [uri]\n");
  return  0;
  }

freq=atol(argv[1])*1000;

if(freq<MINFREQ || freq>MAXFREQ)
  stderrandexit("Frequency is not in range",0,__LINE__);

dBm=atof(argv[2]);

if(dBm<MINDBM || dBm>MAXDBM)
  stderrandexit("dBm is not in range",0,__LINE__);

if(argc>3)
  ctx = iio_create_context_from_uri(argv[3]);
  else
  ctx = iio_create_context_from_uri(URIPLUTO);

if(ctx==NULL)
  stderrandexit("Connection failed",0,__LINE__);

if((value=iio_context_get_attr_value(ctx, "ad9361-phy,model"))!=NULL)
  {
  if(strcmp(value,"ad9364"))
    stderrandexit("Pluto is not expanded",0,__LINE__);
  }else
   stderrandexit("Error retrieving phy model",0,__LINE__);

phy = iio_context_find_device(ctx, "ad9361-phy");
dds_core_lpc = iio_context_find_device(ctx, "cf-ad9361-dds-core-lpc");  
tx0_i = iio_device_find_channel(dds_core_lpc, "altvoltage0", true);
tx0_q = iio_device_find_channel(dds_core_lpc, "altvoltage2", true);
tx_chain=iio_device_find_channel(phy, "voltage0", true);
tx_lo=iio_device_find_channel(phy, "altvoltage1", true);

if(!phy || !dds_core_lpc || !tx0_i || !tx0_q || !tx_chain || !tx_lo)
  stderrandexit("Error finding device or channel",0,__LINE__);

//enable internal TX local oscillator
if((rc=iio_channel_attr_write_bool(tx_lo,"external",false))<0)
  stderrandexit(NULL,rc,__LINE__);

//disable fastlock feature of TX local oscillator
if((rc=iio_channel_attr_write_bool(tx_lo,"fastlock_store",false))<0)
  stderrandexit(NULL,rc,__LINE__);

//power on TX local oscillator
if((rc=iio_channel_attr_write_bool(tx_lo,"powerdown",false))<0)
  stderrandexit(NULL,rc,__LINE__);

//full duplex mode
if((rc=iio_device_attr_write(phy,"ensm_mode","fdd"))<0)
  stderrandexit(NULL,rc,__LINE__);

//calibration mode to manual
if((rc=iio_device_attr_write(phy,"calib_mode","manual"))<0)
  stderrandexit(NULL,rc,__LINE__);

CWOnOff(0);  

if((rc=iio_channel_attr_write_double(tx_chain,"hardwaregain",dBm-REFTXPWR))<0)
  stderrandexit(NULL,rc,__LINE__);

if((rc=iio_channel_attr_write_longlong(tx_chain,"rf_bandwidth",FBANDWIDTH))<0)
  stderrandexit(NULL,rc,__LINE__);

if((rc=iio_channel_attr_write_longlong(tx_chain,"sampling_frequency",FSAMPLING))<0)
  stderrandexit(NULL,rc,__LINE__);

if((rc=iio_channel_attr_write_double(tx0_i,"scale",1))<0)
  stderrandexit(NULL,rc,__LINE__);

if((rc=iio_channel_attr_write_double(tx0_q,"scale",1))<0)
  stderrandexit(NULL,rc,__LINE__);

if((rc=iio_channel_attr_write_longlong(tx0_i,"frequency",FCW))<0)
  stderrandexit(NULL,rc,__LINE__);

if((rc=iio_channel_attr_write_longlong(tx0_q,"frequency",FCW))<0)
  stderrandexit(NULL,rc,__LINE__);

if((rc=iio_channel_attr_write_longlong(tx0_i,"phase",90000))<0)
  stderrandexit(NULL,rc,__LINE__);

if((rc=iio_channel_attr_write_longlong(tx0_q,"phase",0))<0)
  stderrandexit(NULL,rc,__LINE__);

if((rc=iio_channel_attr_write_longlong(tx_lo,"frequency",freq-FCW))<0)
  stderrandexit(NULL,rc,__LINE__);

CWOnOff(1);

printf("TX ON! Q to exit or E to keep TX ON and exit\n");

while(1)
     {
     ch=getchar();
     if(ch=='q' || ch=='Q')
       {
       CWOnOff(0);
       break;
       }
     if(ch=='e' || ch=='E')
       break;
     };

iio_context_destroy(ctx);

return 0;
}

SATSAGEN

SATSAGEN è un’applicazione Windows che permette di utilizzare un dispositivo SDR come Spectrum Analyzer. Al momento SATSAGEN supporta solo il device ADALM-PLUTO.

E’ mio desiderio rendere disponibile in forma gratuita alla comunità dei Radioamatori questa mia realizzazione, con la speranza che SATSAGEN possa essere apprezzato come uno strumento utile per la nostra attività di sperimentazione Radio.

Le ultime novità su SATSAGEN le puoi trovare nella seguente pagina:

 http://www.albfer.com/en/satsagen-news/ 

Da qui potete scaricare l’ultima versione:

 SATSAGEN Download Page 

I prerequisiti per il garantito funzionamento dell’applicazione sono:

  • OS: Da Windows 7 in poi…
  • Driver per ADALM-PLUTO installati: PlutoSDR-M2k-USB-Drivers
  • Dispositivo ADALM-PLUTO con firmware >=0.31 (non mandatorio)

ATTENZIONE: Al primo avvio, l’applicazione effettuerà sul dispositivo l’estensione in frequenza e bandwidth prevista per l’utilizzo del range 70MHZ-6000MHZ, facendo “vedere” al firmware il transceiver AD9363 come un AD9364. L’estensione è necessaria per il funzionamento dell’applicazione, ma se non desiderate che avvenga, non avviate SATSAGEN.

Desidero ringraziare gli amici Gianni IW1EPY, Domenico I1BOC e Mauro IZ1OTT per avermi fornito l’idea, il sostegno in ogni senso, i componenti e le attrezzature necessarie per la realizzazione del progetto!

Un particolare ringraziamento va a Boian Mitov per le preziose librerie www.mitov.com utilizzate in SATSAGEN!

Di seguito trovate un altro prezioso contributo di Gianni IW1EPY scritto per l’occasione, mentre al termine dell’articolo troverete un breve video che illustra le nozioni base dell’applicazione.

Alberto IU1KVL

Posseggo un Adalm Pluto da un po’ di tempo e ho familiarizzato con l’utilizzo di diverse applicazioni (SDR console, SDRAngel) usandolo sia in RX che TX.
Con il tempo e l’uso la mia indole misuristica ha prevalso, dopo aver provato un po’ di oggetti, analizzatori scalari fino a 4,4 GHz, i vettoriali fino a 900 MHz, ho pensato che anche Pluto avrebbe potuto avere un adeguato utilizzo specialmente nella sua gamma estesa 70 MHz – 6 GHz.
Dopo alcune prove incoraggianti per i risultati a RF ottenuti, ma deludenti dal punto di vista tempi di esecuzione delle misure utilizzando Matlab, ho letteralmente preso per i capelli il mio amico Alberto che non ha saputo dirmi di no e siamo partiti in questa avventura.
Oltre allo splendido lavoro software fatto da Alberto voglio solo aggiungere alcune note hardware.
Pluto non è ovviamente uno strumento e come tale soffre di alcuni problemi.
Data l’estensione di banda, per altro forzata in quanto Pluto nasce con una gamma di utilizzo da 325 MHz a 3,8 GHz, l’impedenza di ingresso e di uscita di certo non è 50 Ohm.
Una coppia di attenuatori mitigano il problema, riducono il range dinamico di utilizzo ma per usi radioamatoriali lo ritengo accettabile.
Con una coppia di attenuatori da 10 dB che possono essere ridotti o annullati accettando il relativo disadattamento rimangono ancora 40 dB verso il basso dal livello di calibrazione e una 20 verso l’ alto per l’ inserzione di un dispositivo attivo sotto test.
Di sicuro Adalm Pluto soffre nella gamma alta di frequenze la mancanza di un contenitore metallico e del accoppiamento fra TX e RX, ma qualcosa si potrebbe fare…
La struttura attuale permette un esame diretto di funzioni di trasferimento di filtri, amplificatori, mentre per l’analisi di impedenze di ingresso è necessario un accoppiatore direzionale o un ponte riflettometrico.
In futuro pensiamo di aggiungere alcune funzionalità per quest’ultima modalità.
Tutto questo è possibile nella modalità Spectrum analyzer con Tracking, ma è possibile usare il solo Generatore o l’analizzatore di spettro.
E’ possibile inserire una curva di correzione per linearizzare l’uscita del generatore, purtroppo ogni Pluto è un po differente e andrebbe personalizzata, per ora ne ho analizzati 4 e le curve di correzione sono disponibili.
In tutti i Pluto analizzati con una adeguata curva di correzione, l’errore di potenza del generatore sta entro un dB contro i 10 dB di un Pluto non corretto, particolarmente variabili la zona da 70 a 300 MHz e da 4 a 6 GHz per altro c’era da aspettarselo essendo le zone di fuori range rispetto al prodotto originario.
E’ possibile inserire una curva di calibrazione del ricevitore, fattibile senza strumenti, una volta calibrato il generatore e accettandone gli inevitabili errori .
Il guadagno del ricevitore e l’attenuazione del generatore non introducono significativi errori per cui una sola curva di correzione permette un buon utilizzo a patto di non portare o il generatore o il ricevitore in saturazione ma la cosa diventa evidente.
Per migliorare le prestazioni dell’analizzatore di reti è possibile effettuare una calibrazione con un attenuatore da 40 dB, purtroppo questa linearizzazione corregge gli errori del livello -40 e -30 ma deteriora il responso per altro già molto compromesso per segnali inferiori es -50 in quanto a questi livelli le tipologie di errore non sono congruenti con i modelli adottati.
Tutti i livelli di ricezione e generazione nonchè le attenuazioni inserite sono programmabili permettendo di variare l’ uso del sistema.
Ogni idea di miglioramento è bene accetta e metto già in lista alcune cose che stiamo esaminando:
Calibrazione con accoppiatore direzionale o ponte riflettometrico con open corto e carico.
Possibilità di analisi con offset fra ricezione e trasmissione per verifica o taratura Transverter o qualsivogli sistema di conversione di frequenza.
Credo che Pluto coprendo 6 gamme radioamatoriali possa essere di aiuto a molti Radioamatori con un prezzo di acquisto contenuto.
IW1EPY

SA TSA GEN per ADALM-PLUTO

Il progetto consiste nella realizzazione di un’applicazione Windows per l’utilizzo di ADALM-PLUTO (recentemente ricevuto in dono da un carissimo amico) come analizzatore di spettro.

Spero a breve di creare un post con più dettagli a proposito, per il momento elenco i punti salienti dell’oggetto:

  • Analizzatore di spettro con span intero range di esercizio, 70MHz-6GHz e rappresentazione ampiezza segnali in dBm.
  • Analizzatore di spettro con tracking generator. Risoluzione fino a 1024 punti.
  • Generatore con possibilità d’impostare la frequenza a passi di 1 KHz

I requisiti per l’applicazione sono:

  • CPU: un vecchio Pentium M da 1,7GHz è più che sufficiente!
  • OS: >= Windows 7 (su necessità dei driver per ADALM-PLUTO)
  • ADALM-PLUTO esteso per far “vedere” al FW il AD9363 come un AD9364
  • Driver Analog Devices installati ( PlutoSDR-M2k-USB-Drivers )

A presto!