Segnali seriali

Un oscilloscopio high-end

In questa pagina esamineremo segnali digitali complessi. 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 banali.

Le immagini seguenti sono state ottenute con un Picoscope 3405A. Il software usato è la versione 6.14.36 beta, l'ultima disponibile per Linux nel momento della stesura di questa pagina.

Segnale asincrono

Un segnale seriale asincrono (UART) è costituito da:

Tutti i bit hanno la stessa durata.

Qui una trattazione estesa, anche se datata.

L'esempio seguente è relativo ad un segnale a 9 600 bit/s (9 600 baud; ciascun bit ha durata 104 µs (nota 1) trasmesso da Arduino. Il byte trasmesso è 0x0F (00001111) a partire dal bit meno significativo, cioè "al contrario":

Segnale seriale asincrono

Il segnale è generato dal seguente codice:

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

void loop()
{ Serial.write(0x0F);
  delay(4);
}

Per visualizzare il segnale con l'oscilloscopio occorre collegare la sonda al pin TX di Arduino. L'uso del trigger ordinario rende difficile sincronizzare il segnale e l'alternativa del pulsante STOP non è una buona scelta... Con le opzioni Advanced Triggers è possibile impostare oltre che i livelli di trigger anche la durata minima o massima dell'impulso ed altre caratteristiche che fanno "scattare" la registrazione del segnale. Alcuni esempi:

Trigger avanzato: impulso lungo

Trigger avanzato: intervallo

Per la decodifica automatica del segnale seriale esiste un apposito strumento (ToolsSerial Decoding) che inserisce nel grafico la riga testuale visibile nell'immagine sopra riportata:

Decodifica seriale

Ovviamente il byte decodificato dall'oscilloscopio deve coincidere con quanto trasmesso da Arduino.

Attività

SPI

SPI permette di trasmettere un byte ad alta velocità con due linee: il dato MOSI e clock CHK (nota 2).

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

Il codice che genera i segnali mostrati:

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

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

Anche in questo caso potrebbe essere complesso l'uso del trigger ed è disponibile la decodifica automatica:

Decodifica automatica di SPI

Attività

Note

  1. La scritta al di sotto del segnale digitale è una opzione impostata come mostrato qui
  2. Sono possibili quattro diverse modalità di funzionamento
  3. La numerazione dei pin indicata è relativa ad Arduino Nano
  4. In alternativa è possibile collegare in un singolo Arduino uscita MOSI ed ingresso MISO e fargli trasmettere il byte... a se stesso (loopback)


Pagina creata nel gennaio 2021
Ultima modifica:  11 novembre 2021


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


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima