Questo articolo presenta un generatore di segnali flessibile basato sul Raspberry Pi RP2040, che può essere controllato da un PC tramite un’interfaccia RS-232. Con un hardware minimo e quindi a basso costo, è possibile generare un’ampia gamma di forme d’onda in un intervallo di frequenza fino a 100 kHz. 

Il generatore di segnali utilizza una scheda XIAO RP2040, che è molto compatta e può essere alimentata e programmata tramite un connettore USB-C. Il pinout di questa scheda è mostrato nella Figura 1. Attenzione: la numerazione dei 14 pin di collegamento (sono disponibili 10 GPIO dell’RP2040) inizia da 0! Poiché il processore RP2040 non dispone di un convertitore digitale-analogico, è stato aggiunto un MCP4821 di Microchip per l’uscita. Con questo DAC esterno è possibile ottenere circa 200 kSample/s con una risoluzione di 12 bit. Il DAC è collegato all’interfaccia SPI dell’RP2040.

 XIAO RP2040 CPU board
Figura 1: Pinout della scheda CPU XIAO RP2040 (Seeed Studio).

La Figura 2 mostra quanto facilmente l’hardware possa essere montato su una piccola scheda millefori con la scheda XIAO-RP2040 come CPU; in effetti, lo schema elettrico della Figura 3 è difficile da battere in termini di semplicità. La piccola scheda entra comodamente in una scatola di fiammiferi. Oltre all’uscita analogica Vout, il circuito dispone di quattro uscite digitali Dig0Dig3 per generare segnali digitali. All’uscita Sync è possibile generare un segnale di trigger, se necessario. L’uscita PWM permette di osservare la generazione del clock mostrando il segnale PWM (maggiori dettagli più avanti).

Construction of the signal generator.
Figura 2: Realizzazione del generatore di segnali.

L’interfaccia RS-232, piuttosto insolita, funziona perché nell’RP2040 è possibile attivare inverter interni che garantiscono la corretta polarità dei segnali RS-232. Con 3,3 V, l’inverter genera un livello sufficiente per la maggior parte degli adattatori RS-232/USB. Una comunicazione USB diretta tra PC e RP2040 non sarebbe stata opportuna, poiché gli interrupt USB avrebbero disturbato la temporizzazione precisa dei segnali nel microcontrollore.

Schematic of the signal generator.
Figura 3: Schema elettrico del generatore di segnali.

Configurazione

La configurazione del generatore di segnali viene effettuata inviando comandi dal PC tramite l’interfaccia seriale. Questo può essere fatto da un programma terminale. Tuttavia, in questo progetto viene utilizzato un programma Java nell’ambiente Processing per inviare comandi e ricevere dati (vedi sotto).

I comandi e il loro significato sono elencati nella Tabella 1; ciascuno è codificato con una singola lettera. La maggior parte dei comandi invia una risposta, così il PC sa che il comando è stato compreso. Ad esempio, inviando i si riceve in risposta l’ID del programma. Se si invia v, si riceve V: un semplice test di comunicazione. Per inviare parametri numerici, il software utilizza due variabili intere chiamate inpDec e inpHex. Le variabili vengono aggiornate quando si inviano numeri, ma prima devono essere azzerate, ad esempio con il comando n. Molti comandi lo fanno automaticamente per il comando successivo. Ad esempio, inviando n100s, il valore 100 viene inviato all’uscita tramite l’MCP4821 e inpDec viene impostato a zero. In risposta si riceve S.

Simple sig table 1
Tabella 1: Elenco dei comandi del PC.

Le forme d’onda sono memorizzate dal software in una tabella chiamata BUF, che viene riempita con il comando S. La posizione corrente in questa tabella è mantenuta nella variabile BUFwrPtr, che viene impostata a 0 con il comando R. Il numero di valori che la tabella deve contenere deve essere definito in anticipo con il comando N.

Il modo migliore per capire come funzionano i comandi è osservare gli esempi di programma, che possono essere scaricati da Elektor Labs.

Generazione del clock

Il clock dei campioni viene generato tramite l’hardware PWM dell’RP2040. L’unità PWM produce un interrupt a ogni impulso PWM; la routine di interrupt gestisce quindi l’uscita temporizzata dei valori. Riutilizzando l’unità PWM, è disponibile anche un prescaler: il clock della CPU di 125 MHz viene prima diviso da questo prescaler (parametro PWMpreDiv). La durata del periodo PWM è definita dal parametro PWMwrap; il duty cycle è PWMlevel. Questi tre parametri PWM vengono impostati dal PC in base all’applicazione. Dopo ogni periodo PWM viene generato un nuovo campione.

Dati in tempo reale dal PC

Nella modalità più semplice, il PC invia direttamente i valori dei campioni al generatore, che li riproduce immediatamente (programma EEsendLive1V01). La Listing 1 mostra il codice di invio; con send() i valori vengono trasmessi.


Listing 1: Generazione semplice di segnali live.

void liveTest () {

  while(true) {

    send(3000) ;

    send(4000) ;

    send(2000) ;

    send(0) ;

    delay(5) ;

  }

}


Forme d’onda arbitrarie

Nel successivo esempio l’RP2040 recupera i campioni da una tabella precedentemente riempita dal PC e li emette ripetutamente. La tabella può contenere fino a 50.000 valori.

Generatore DDS

Per generare segnali periodici con elevata risoluzione di frequenza è stata implementata una routine DDS (Direct Digital Synthesis).

Overclocking

Quando si utilizza il generatore DDS per produrre la frequenza DCF77 di 77,5 kHz, si nota che la purezza spettrale è relativamente scarsa perché la frequenza è troppo vicina alla frequenza massima di 100 kHz. Per superare questo problema, l’RP2040 è stato overcloccato: invece dei 125 MHz standard, nel codice sorgente del generatore di segnali è stato impostato un clock della CPU di 200 MHz.

Uscita digitale

Quattro segnali digitali sui pin Dig0–Dig3 possono essere generati nello stesso modo dei segnali analogici. Nel buffer vengono memorizzati i pattern di bit dei campioni, che vengono poi emessi in sequenza sulle porte GPIO dell’RP2040.

Rete R2R

In alternativa al DAC MCP4821 è possibile utilizzare una rete R2R (nota anche come scala R2R) per la conversione digitale-analogica. Tuttavia la scheda XIAO RP2040 non dispone di un numero sufficiente di pin I/O, quindi viene sostituita da una scheda Pico.

Clock PWM frazionario

Per ottenere clock PWM con regolazione più fine, il prescaler dell’RP2040 è realizzato come divisore frazionario con 4 bit frazionari, consentendo una regolazione con precisione di un sedicesimo.

Generatore universale

Con un hardware minimo è stato possibile realizzare un generatore di segnali universale per frequenze fino a 100 kHz. La flessibilità del generatore deriva dalla configurazione via PC. Il software di questo progetto è disponibile per il download.


Domande sul generatore di segnali?

Avete domande tecniche o osservazioni su questo articolo? Contattate la redazione Elektor all’indirizzo editor@elektor.com.


Nota della redazione: questo articolo (250205-01), curato da Rolf Gerstendorf, appare in Elektor marzo/aprile 2026.

Registrazione
Iscriviti per ricevere e-mail di avviso sui tag riguardanti Signal Generator!

```