Analizzatore di segnali con interfaccia Ethernet (seconda parte)

Nella puntata precedente abbiamo presentato l'hardware di questo strumento compatto che combina un oscilloscopio, un analizzatore di spettro e un generatore di segnale in un unico sistema low cost. Questa volta entriamo nel dettaglio non solo dal punto di vista software, ma anche matematico, per capire cosa rende particolare questo strumento. In questa puntata ci soffermeremo sul software sia sul lato microprocessore che PC, e su alcuni principi matematici per fornire le basi di una elaborazione del segnale digitale.

La connessione Ethernet

Vediamo ora come viene instaurata la comunicazione tramite la connessione Ethernet. Lato microprocessore (dsPic33) sono stati utilizzati i driver ioLibrary_BSD, che implementano le funzioni per la gestione della comunicazione con il W5500 [1] [2]. L’utilizzo di questi driver ha comportato la scrittura di quattro funzioni, il cui codice è mostrato nel seguito:


// Declare W5500 driver SPI Functions
reg_wizchip_cs_cbfunc(wizchip_select, wizchip_deselect);
reg_wizchip_spi_cbfunc(wizchip_read, wizchip_write);

//Functions
void wizchip_select(void)
{
    WIZCS = 0;
}

void wizchip_deselect(void)
{
    WIZCS = 1;
}

void wizchip_write(uint8_t wb)
{
    uint8_t dummy;
    SPI1BUF = wb; // write to buffer for TX

	while( !SPI1STATbits.SPIRBF );

	// wait for TX complete
	dummy = SPI1BUF;
}

uint8_t wizchip_read()
{
    SPI1BUF = 0x00; // write to buffer for TX

	while( !SPI1STATbits.SPIRBF );

	// wait for TX complete
	return SPI1BUF; // read the received values
}

A questo punto, la comunicazione tra il modulo W5500 e il PC può essere instaurata utilizzando le funzioni recv(sn,buf,size) e send(sn,buf,­size) incluse nei driver ioLibrary_ BSD.

Lato PC, il codice C# richiesto per instaurare il collegamento Ethernet ed attuare lo scambio di dati è pressochè immediato. Quando l’applicazione parte, controlla quale dei quattro indirizzi IP menzionati in precedenza sono presenti sulla rete locale, e utilizza l’indirizzo rilevato per le comunicazioni successive. E’ perciò fondamentale che l’utente colleghi anzitutto l’analizzatore alla rete, e attenda qualche secondo (dando modo al W5500 di completare l’inizializzazione) prima di avviare l’applicazione su PC.

L’applicazione su PC utilizza la classe TcpClient, disponibile in Windows, per gestire la comunicazione sul canale Ethernet. Di seguito mostriamo il codice C# in carico della comunicazione tra il PC e il W5500:


var result = client.BeginConnect(IPAddress.Parse(ipaddress),4000,null,null);

result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(1)); //timeout if no CB

if (client.Connected)
{
    clientStream = client.GetStream(); //get a client stream
}

Una volta stabilita la connessione, le funzioni clientStream.Write(TxBuff,off¬set,size) e clientStream. Read(RxBuff,offset,size) sono tutto quello che serve per lo scambio di dati e comandi tra il PC e l’analizzatore con interfaccia W5500.

I generatori di segnale

L’utente ha a disposizione due distinti generatori di segnale. Il primo si trova nel microprocessore dsPIC, e genera un segnale analogico utilizzando la tecnica della sintesi digitale diretta (detta anche DDS, acronimo di Direct Digital Synthesis). Esso può essere utilizzato come semplice sorgente di segnale per alimentare applicazioni esterne, oppure si può collegare all’ingresso dell’analizzatore per essere poi analizzato. Il suo scopo principale è quello di servire come strumento per l’analisi e la sperimentazione del sistema NCSA, e non come sostituto di un strumento signal generator di tipo commerciale. Il secondo generatore di segnali si trova all’interno dell’applicazione su PC. Esso consente all’utente di generare vettori numerici che rappresentano diversi tipi di segnale, i quali possono essere visualizzati e sottoposti alla trasformata di Fourier, anch'essa disponibile nella stessa applicazione. Cominciamo con l’esaminare il generatore DDS.

Osservando lo schema a blocchi di Figura 1, possiamo subito notare un PWM collegato a un filtro passa-basso (LPF, acronimo di Low-Pass Filter).

Figura 9 – schema a blocchi del generatore di segnali DDS

Figura 1: schema a blocchi del generatore di segnali DDS

La combinazione di questi due oggetti si comporta come un convertitore digitale-analogico. Se ad esempio il duty cycle del PWM viene mantenuto costante, l’uscita del filtro LPF diventa un valore continuo (DC). Se invece si varia il duty cycle in modo tale da generare l’ampiezza desiderata per la forma d’onda, l’uscita dell’LPF coinciderà con quella forma d’onda. Il PWM del dsPIC33 gira alla frequenza fSYS / 256 = 120 x 106 / 256 = 468,750 Hz. Questa frequenza coincide anche con il rate di aggiornamento del DDS. Per selezionare il valore desiderato di duty cycle PWM, si utilizzerà una lookup table. Un accumulatore di fase a 32 bit (DDSp nel codice) tiene traccia della fase per la forma d'onda desiderata. Ad ogni ciclo di aggiornamento del DDS, l’accumulatore di fase viene incrementato di un valore (incremento di fase, DDSd nel codice), calcolato nel modo seguente:

incremento di fase = 232 x Frequenza Desiderata / rate di aggiornamento DDS

Se ad esempio si vuole generare una sinusoide alla frequenza di 10000 Hz (10 kHz), l’incremento di fase sarà pari a 91625968. Questo valore viene sommato al contenuto dell’accumulatore di fase ad ogni aggiornamento del DDS. L’accumulatore di fase a 32 bit tiene perciò una traccia accurata della fase della forma d'onda desiderata, in ogni istante di tempo. Poichè una lookup table di 232 valori occuperebbe un eccessivo spazio di memoria, utilizzeremo soltanto gli 8 bit più significativi dell’accumulatore di fase a 32 bit per indirizzare il contenuto della tabella. Il codice sorgente dell’NCSA consente di selezionare una forma d’onda a scelta tra sinusoidale, rettangolare, triangolare, e permette inoltre di selezionare il valore della frequenza. Un utente più ambizioso potrebbe facilmente modificare il codice sorgente, aggiungendo altre forme d’onda. Particolare attenzione bisogna porre nella selezione della frequenza di taglio del filtro LPF posto all’uscita del segnale PWM. Si vuole infatti che tale frequenza sia sufficientemente bassa da attenuare le oscillazioni (ripple) del PWM, ma anche sufficientemente alta da far passare il segnale generato. Per fortuna [...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 3135 parole ed è riservato agli abbonati PREMIUM. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici PREMIUM e potrai fare il download (PDF) dell'EOS-Book e Firmware del mese. ABBONATI ORA con PAYPAL è semplice e sicuro.

Abbonati alle riviste di elettronica
Elektor Post

Una risposta

Scrivi un commento

ESPertino è la nuova scheda per IoT compatibile ARDUINO.
Scopri come averla GRATIS!