Segnali seriali

Un oscilloscopio high-end

In questa pagina esamineremo segnali digitali non periodici, a volte difficili da visualizzare con un oscilloscopio o un analizzatore di stati logici. In particolare useremo Arduino per trasmettere un segnale seriale, cioè una sequenza di otto bit generati dall'hardware, ed un oscilloscopio digitale per la loro analisi; lo scopo è soprattutto apprendere l'uso del trigger dell'oscilloscopio con segnali non periodici.

Le immagini presenti in questa pagina sono state ottenute con un Picoscope 2205A MSO. Il software usato è la versione 7.1.39 l'ultima disponibile per Linux nel momento della stesura di questa pagina.

Segnale asincrono

Un segnale seriale asincrono, a volte indicato impropriamente come UART (nota 5), è costituito da:

Come indica il nome asincrono, non è trasmesso il segnale di clock che deve essere generato autonomamente dal trasmettitore (TX) e dal ricevitore (RX).

Tutti i bit hanno rigorosamente la stessa durata; l'inverso della durata di un bit è il bit rate ed è misurato in bit/s. A volte è usato il termine baud, misurato in simboli al secondo: in questo contesto coincide numericamente con il bit rate.

Qui una trattazione estesa, piuttosto datata e relativa all'implementazione tecnologica RS232.

Il grafico seguente mostra come esempio un segnale a 9 600 bit/s (9 600 baud); ciascun bit ha durata 1 / 9 600 = 104 µs. Il byte trasmesso è 0xAF (10101111) a partire dal bit meno significativo, in un certo senso "al contrario":

Segnale seriale asincrono

Il segnale mostrato è generato da Arduino sul pin 1 (TX) mentre esegue il seguente codice:

void setup()
{ Serial.begin(9600);
}

void loop()
{ Serial.write(0xAF);
  delay(10);
}

Per visualizzare il segnale con l'oscilloscopio occorre collegare la sonda al pin 1 (TX) di Arduino; per usare l'analizzatore di stati logici occorre collegare al pin 1 (TX) uno degli ingressi digitali. Ovviamente va collegata anche la massa (GND).

Triggerare un segnale complesso come un byte trasmesso serialmente potrebbe essere difficile; qui sotto alcuni suggerimenti.

Attività 1

Utilizzare la decodifica seriale (Serial decoding RS232/UART) per decodificare il segnale trasmesso:

Occorre:

Accanto al segnale seriale verà mostrato:

Decodifica seriale

Trigger

Triggerare correttamente un segnale seriale potrebbe essere complesso... La ragione risiede nel fatto che, per sua natura, il segnale seriale cambia continuamente e quindi non è periodico. In particolare non è facilmente distinguibile il bit di start da un altro bit LOW successivo ad un bit HIGH.

Alcuni suggerimenti:

Trigger sul fronte di discesa

 

Trigger dopo un impulso lungo

SPI

SPI permette di trasmettere un byte con due linee: il dato (COPI, Controller Out Peripheral In, in precedenza indicato come MOSI, Master Output Slave Input) ed il clock (SCK, Serial Clock).

Esaminiamo l'esempio seguente: gli otto bit 0x40 (0100 0000) vengono generati uno dopo l'altro (segnale blu, COPI/MOSI, nota 3) in corrispondenza del fronte di salita del clock (segnale verde, SCK). I due cursori sono in corrispondenza dei primi due bit (01000000). La frequenza del clock è 125 kHz, quindi un bit dura 8 µs.

Inoltre è spesso presente un terzo segnale (CS, Chip Select, in precedenza indicato come SS, Slave Select) che viene posto LOW all'inizio della trasmissione e posto HIGH al termine. In questo caso, per osservare il segnale, occorre disporre di un oscilloscopio con almeno tre canali oppure di un analizzatore di stati logici.

Un codice di esempio che utilizza il metodo SPI:

#include <SPI.h>
void setup() {
 pinMode(10, OUTPUT); // set the CS pin as an output
 SPI.begin();
 SPI.beginTransaction (SPISettings (125000, MSBFIRST, SPI_MODE0));
}

void loop() {
 digitalWrite(10, LOW);  // set the CS pin to LOW
 SPI.transfer(0xAF);     // send a data
 digitalWrite(10, HIGH); // set the CS pin HIGH
 delay(1);
}

Anche in questo caso potrebbe essere complesso l'uso del trigger: se presente, è particolarmente utile usare come riferimento CS.

Anche per il segnale SPI è disponibile la decodifica automatica (Serial decoding SPI-SDIO):

Decodifica del segnale SPI

Attività 2

Note

  1. Attenzione a non farsi ingannare dal grafico che, apparentemente, mostra per il livello logico alto una tensione di circa -4 V. In realtà i numeri lungo l'asse verticale sono relativi al solo canale analogico
  2. Sono possibili quattro diverse modalità di funzionamento
  3. La numerazione dei pin può essere reperita in questa pagina
  4. In alternativa è possibile collegare in un singolo Arduino uscita COPI ed ingresso CIPO, cioè trasmettere il byte... a se stesso (loopback)
  5. Universal Asynchronous Receiver-Transmitter è il dispositivo hardware che converte segnali seriali in parallelo o viceversa. A volte, per estensione, indica anche i segnali seriali generati


Pagina creata nel gennaio 2021
Ultima modifica:  27 marzo 2025


Licenza "Creative Commons" - Attribuzione-Condividi allo stesso modo 3.0 Unported


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima