Guida alla realizzazione di un semplice generatore di segnali con ESP32

Introduzione

Generatore di segnali con ESP32. Un generatore di segnali è uno strumento fondamentale in elettronica, utilizzato per produrre forme d’onda di varie frequenze e ampiezze. Questi dispositivi sono cruciali per il collaudo, la calibrazione e lo sviluppo di circuiti e sistemi elettronici. Possono generare diversi tipi di onde, ciascuna con specifiche applicazioni pratiche. Esso produce segnali elettronici con forme d’onda specifiche, come sinusoidale, quadra e triangolare. Questi segnali vengono utilizzati per testare e calibrare circuiti elettronici, verificare la risposta in frequenza di amplificatori e filtri e sviluppare dispositivi audio e di comunicazione.

Utilità e applicazioni

  • Onda sinusoidale:
    • Descrizione: una forma d’onda continua e liscia, caratterizzata da una variazione periodica e simmetrica.
    • Applicazioni: test di circuiti audio, analisi della risposta in frequenza di amplificatori e filtri, generazione di segnali portanti in sistemi di telecomunicazione.
  • Onda quadra:
    • Descrizione: una forma d’onda con transizioni rapide tra due livelli di tensione, creando un profilo rettangolare.
    • Applicazioni: test di circuiti digitali, generazione di segnali di clock, controllo di motori passo-passo e simulazione di segnali digitali.
  • Onda triangolare:
    • Descrizione: una forma d’onda lineare che varia simmetricamente tra due valori di tensione, creando un profilo a dente di sega.
    • Applicazioni: modulazione di larghezza di impulso (PWM), test di circuiti lineari, generazione di segnali di scansione per oscilloscopi e strumenti di misura.

Oltre alle tre forme d’onda base, i generatori più avanzati possono produrre anche forme d’onda più complesse, come impulsi, onde a dente di sega e segnali arbitrari definiti dall’utente.

Funzionalità e utilizzo

I generatori di forme d’onda tipicamente offrono diverse funzionalità per controllare e modulare il segnale in uscita:

  • Frequenza: determina il numero di cicli completi della forma d’onda al secondo, misurato in Hertz (Hz).
  • Ampiezza: stabilisce l’altezza massima o picco-picco del segnale, misurata in Volt (V).
  • Duty cycle: nel caso di un’onda quadra, rappresenta la percentuale del periodo in cui il segnale si trova al livello alto.
  • Sfasamento: permette di sincronizzare o ritardare l’uscita di un generatore rispetto a un altro.

L’utilizzo di un generatore di forme d’onda è relativamente semplice. In genere, l’utente seleziona la forma d’onda desiderata, imposta i parametri di frequenza, ampiezza e altre caratteristiche, e collega l’uscita del generatore al dispositivo o circuito da testare o analizzare.

In questo articolo realizzeremo un semplice generatore di segnali tramite un ESP32.

Come al solito utilizzeremo l’IDE PlatformIO per scrivere il codice.

La libreria DacTone per la generazione delle sinusoidi

La libreria DacTone è progettata per facilitare la generazione di segnali audio utilizzando i convertitori digitali-analogici (DAC) integrati nell’ESP32. Questa libreria consente di creare forme d’onda sinusoidali, semplificando il processo di configurazione e produzione del segnale. Con DacTone, è possibile specificare la frequenza del segnale e avviare la generazione dell’onda sinusoidale con poche righe di codice, rendendola ideale per applicazioni audio e test di circuiti.

Funzionalità principali

  • Facilità d’uso: semplice API per la generazione di onde sinusoidali.
  • Configurazione della frequenza: possibilità di impostare la frequenza desiderata per il segnale.
  • Integrazione con ESP32: sfrutta i DAC integrati dell’ESP32 per produrre segnali analogici di alta qualità.

La libreria limita la frequenza massima generata a 5 kHz quindi la sinusoide generata può arrivare al massimo a 5 kHz.

Esempio di utilizzo

Ecco un esempio di come utilizzare la libreria DacTone per generare un’onda sinusoidale:

#include "DacTone.h"

DacTone audio;

void setup() {
  Serial.begin(115200);
  audio.tone(1000); // Generates a 1000 Hz sine wave
}

void loop() {
  // The signal continues to be generated in the background
}

Generazione di onde quadre tramite LEDC sull’ESP32

L’ESP32 utilizza il modulo LEDC (LED Control) per generare onde quadre. Il modulo LEDC è progettato per controllare i LED ma è versatile e può essere usato per generare segnali PWM (Pulse Width Modulation). Per creare un’onda quadra, il modulo LEDC alterna rapidamente tra due livelli di tensione, creando transizioni nette e regolari.

Configurazione e codice

  1. Configurazione del canale LEDC:
    • Setup: configura il canale LEDC con una frequenza e una risoluzione specifica. La risoluzione determina la precisione del duty cycle.
    • Attacco del pin: assegna un pin GPIO all’uscita del canale LEDC.
  2. Generazione dell’onda quadra:
    • Duty cycle: imposta il duty cycle al 50% per un’onda quadra simmetrica.

Un esempio di codice è visibile di seguito:

#define SQUARE_PIN 26 // Pin for square wave

void setup() {
  Serial.begin(115200);

  const int freq = 1000; // Frequency in Hz
  const int ledChannel = 0;
  const int resolution = 8;

  // Configure the LEDC channel
  ledcSetup(ledChannel, freq, resolution);
  // Attach the LEDC channel to the GPIO pin
  ledcAttachPin(SQUARE_PIN, ledChannel);
  // Set duty cycle to 50%
  ledcWrite(ledChannel, 128); // 50% duty cycle (risoluzione 8-bit: 128/255)
}

void loop() {
  // The square wave continues to be generated in the background
}

In questo esempio, il canale LEDC è configurato per generare un’onda quadra a 1000 Hz con una risoluzione di 8 bit. Il duty cycle è impostato al 50%, garantendo che l’onda quadra sia simmetrica. Questo metodo permette di creare segnali di alta frequenza e precisione con l’ESP32.

Generazione di onde triangolari con ESP32

L’onda triangolare viene generata utilizzando il DAC integrato nell’ESP32. La funzione generateTriangleWave(int frequency) crea un’onda triangolare regolando continuamente la tensione di uscita del DAC.

La funzione generateTriangleWave(int frequency) dell’ESP32 è progettata per generare un’onda triangolare utilizzando il convertitore digitale-analogico (DAC) integrato. Inizia disattivando il modulo LEDC per garantire che il DAC funzioni correttamente. Il DAC sul canale 1 viene quindi abilitato. La funzione calcola il numero di campioni necessari per ciclo per ottenere una buona risoluzione dell’onda.

Durante l’esecuzione, il valore di tensione del DAC viene incrementato e decrementato linearmente per formare il profilo a dente di sega caratteristico dell’onda triangolare. Questo valore varia tra 0 e 255, creando un andamento lineare crescente e decrescente. Un ritardo calcolato in base alla frequenza desiderata garantisce che l’onda venga generata alla corretta velocità. Il risultato è un’onda triangolare fluida e precisa, ideale per varie applicazioni elettroniche.

Un esempio di funzione è visibile di seguito:

void generateTriangleWave(int frequency) {
  ledcWrite(0, 0); // Turn off LEDC for DAC operation
  dac_output_enable(DAC_CHANNEL_1); // Enable DAC

  const int samples = 500; // Increase the number of samples per cycle to improve resolution
  int value = 0;
  int increment = 256 / (samples / 2);

  for (int i = 0; i < samples; ++i) {
    dac_output_voltage(DAC_CHANNEL_1, value);
    value += increment;
    if (value >= 256) {
      increment = -increment;
      value = 256 + increment;
    } else if (value <= 0) {
      increment = -increment;
      value = 0 + increment;
    }

    delayMicroseconds((1000000 / frequency) / samples);
  }
}

Di che componenti abbiamo bisogno per il nostro generatore di segnali con ESP32?

La lista dei componenti non è particolarmente lunga:

  • una breadboard per connettere la NodeMCU ESP32 agli altri componenti
  • alcuni fili DuPont (maschio – maschio, maschio – femmina, femmina – femmina)
  • (opzionale) un frequenzimetro digitale per misurare con precisione la frequenza del segnale generato dall’ESP32. Questo strumento può aiutarti a verificare che il generatore stia funzionando correttamente.
  • (opzionale) un oscilloscopio, fondamentale per visualizzare l’onda generata.
  • e, ovviamente, una NodeMCU ESP32 !

Il modello di ESP32 scelto per questo progetto è quello dell’azienda AZ-Delivery.

Realizzazione del progetto

Lo schema elettrico

Prima di realizzare il circuito vero e proprio diamo un’occhiata al pinout della board:

Pinout della ESP32
Pinout della ESP32

Come puoi osservare dall’immagine seguente, lo schema elettrico (realizzato con Fritzing) è veramente elementare:

Schema elettrico del generatore di segnali con ESP32
Schema elettrico del generatore di segnali con ESP32

Creiamo il progetto PlatformIO

Abbiamo già visto la procedura di creazione di un progetto PlatformIO nell’articolo Come creare un progetto per NodeMCU ESP8266 con PlatformIO.

Anche se si riferisce alla board ESP8266, la procedura è simile.
Semplicemente, nella scelta della piattaforma, dovrai scegliere la AZ-Delivery ESP-32 Dev Kit C V4.

Non installare nessuna delle librerie indicate nell’articolo.

Ora modifica il file platformio.ini per aggiungere queste due righe:

monitor_speed = 115200
upload_speed = 921600

in modo che il file abbia un aspetto del genere:

[env:az-delivery-devkit-v4]
platform = espressif32
board = az-delivery-devkit-v4
framework = arduino
monitor_speed = 115200
upload_speed = 921600

e aggiungi la libreria DacTone in modo che il file abbia un aspetto del genere:

[env:az-delivery-devkit-v4]
platform = espressif32
board = az-delivery-devkit-v4
framework = arduino
monitor_speed = 115200
upload_speed = 921600
lib_deps = https://github.com/bhall66/DacTone

Puoi scaricare il progetto dal link seguente:

decomprimerlo, prendere il file main.cpp e sostituirlo al posto di quello che hai nel progetto precedentemente creato.

Vediamo ora come funziona lo sketch.

Lo sketch inizia con l’inclusione delle librerie necessarie:

#include <Arduino.h>
#include "DacTone.h"           // this is the DAC audio library

Vengono poi definiti il GPIO 26 per l’onda quadra, l’oggetto audio di tipo DacTone, la frequenza e la risoluzione del PWM:

#define SQUARE_PIN 26 // Pin for square wave


//  triangular  GPIO25
//  sinusoidal  GPIO26
//  square      GPIO26


DacTone audio;                 // create audio object

const int freq = 1000; // Frequency in Hz
const int resolution = 8; // PWM resolution

Incontriamo poi una enum che contiene le possibili forme d’onda generabili, la definizione della variabile waveType con la quale impostiamo il tipo di onda da generare e il prototipo della funzione generateTriangleWave implementata più sotto:

enum WaveType {
  SINE_WAVE,                   // max 5 kHz
  SQUARE_WAVE,            // max 300 kHz
  TRIANGLE_WAVE           // max 300 Hz
};

WaveType waveType = TRIANGLE_WAVE; // SINE_WAVE, SQUARE_WAVE, TRIANGLE_WAVE


void generateTriangleWave(int freq);

Segue la funzione setup che attiva la porta seriale e, se l’onda selezionata è quadra oppure triangolare, attiva il blocco che gestisce il modulo LEDC:

void setup() {
  Serial.begin(115200);
  delay(2000);

  if(waveType != SINE_WAVE) {
    // Square wave configuration
    ledcSetup(0, freq, resolution);
    ledcAttachPin(SQUARE_PIN, 0);
    ledcWrite(0, 128); // 50% duty cycle
  }
}

La funzione loop gestisce la generazione dell’onda selezionata tramite la variabile waveType:

void loop() {
    switch (waveType) {
      case SINE_WAVE:
        audio.tone(freq);
        break;
      case SQUARE_WAVE:
        break;
      case TRIANGLE_WAVE:
        generateTriangleWave(freq);
        break;
  }
}

Infine la funzione generateTriangleWave genera l’onda triangolare come già spiegato al paragrafo “Generazione di onde triangolari con ESP32”:

void generateTriangleWave(int frequency) {
  ledcWrite(0, 0); // Turn off LEDC for DAC operation
  dac_output_enable(DAC_CHANNEL_1); // Enable DAC

  const int samples = 500; // Increase the number of samples per cycle to improve resolution
  int value = 0;
  int increment = 256 / (samples / 2);

  for (int i = 0; i < samples; ++i) {
    dac_output_voltage(DAC_CHANNEL_1, value);
    value += increment;
    if (value >= 256) {
      increment = -increment;
      value = 256 + increment;
    } else if (value <= 0) {
      increment = -increment;
      value = 0 + increment;
    }

    delayMicroseconds((1000000 / frequency) / samples);
  }
}

Considerazioni finali

Il progetto del generatore di segnali con ESP32 ha dimostrato come sia possibile creare un dispositivo versatile e potente per la generazione di onde sinusoidali, quadre e triangolari. Utilizzando il DAC integrato e il modulo LEDC, abbiamo realizzato un generatore in grado di soddisfare diverse esigenze di test e sviluppo elettronico. Tuttavia, è importante notare alcune limitazioni intrinseche a questo sistema.

Limiti delle frequenze

  • Onda sinusoidale: la frequenza massima raggiungibile per l’onda sinusoidale è di 5 kHz. Questo limite è imposto dalla libreria DacTone che non genera sinusoidi a frequenza superiore.
  • Onda quadra: l’ESP32 è in grado di generare onde quadre fino a una frequenza massima di 300 kHz. Questa capacità sfrutta il modulo LEDC, che permette di creare transizioni rapide tra due livelli di tensione, ideale per simulare segnali digitali e di clock.
  • Onda triangolare: la frequenza massima per l’onda triangolare è limitata a 300 Hz. Questo limite è determinato dalla velocità con cui il DAC può cambiare i valori di tensione, mantenendo una forma d’onda stabile e senza distorsioni.

Limitazioni e miglioramenti

Per applicazioni che richiedono frequenze significativamente più alte o una maggiore precisione, un generatore di segnali DDS (Direct Digital Synthesis) pilotato dall’ESP32 rappresenta una soluzione avanzata. I generatori DDS offrono una migliore banda passante e precisione, consentendo di generare segnali a frequenze molto superiori e con maggiore stabilità. Un generatore DDS può essere pilotato dall’ESP32 per ottenere frequenze di uscita più elevate e una maggiore fedeltà del segnale. Questo approccio combina la facilità di programmazione dell’ESP32 con le capacità avanzate di generazione del segnale del DDS, ideale per applicazioni professionali e di ricerca.

Test con l’oscilloscopio

Di seguito i test fatti all’oscilloscopio sui tre tipi di onda:

Onda quadra
Onda quadra

Onda sinusoidale
Onda sinusoidale

Onda triangolare
Onda triangolare

In conclusione

Nonostante queste limitazioni, il generatore di segnali realizzato con ESP32 è un ottimo punto di partenza per hobbisti, studenti e professionisti che desiderano esplorare e sperimentare con segnali elettronici. La semplicità di configurazione e l’accessibilità dell’ESP32 rendono questo progetto ideale per una vasta gamma di applicazioni educative e sperimentali.

Con questo progetto, hai ora gli strumenti necessari per creare e testare segnali di base, comprendendo le limitazioni e le potenzialità di questo microcontrollore. Se desideri espandere le capacità del tuo generatore di segnali, considera l’integrazione con hardware aggiuntivo o l’utilizzo di strumenti più avanzati. Buona sperimentazione!

Newsletter

Se vuoi essere aggiornato sui nuovi articoli, iscriviti alla newsletter. Prima dell’iscrizione alla newsletter leggi la pagina Privacy Policy (UE)

Se ti vuoi disiscrivere dalla newsletter clicca sul link che troverai nella mail della newsletter.

Inserisci il tuo nome
Inserisci la tua email

0 0 votes
Valutazione articolo
guest
0 Commenti
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
Torna in alto