4 Sistemi di misura digitali
Tutti gli strumenti di misura in questo laboratorio saranno in ultima analisi digitali. Questo comporta che una variabile continua \(x(t)\) sia discretizzata in due modi diversi: le misure vengono effettuate a tempi discreti, e ciascuna misura produce un valore preso in un insieme discreto di possibilità , in base alla rappresentazione digitale usata. Del primo dei due si è occupato il capitolo precedente — campionamento, aliasing e leakage sono tutte conseguenze (affatto banali) della discretizzazione nel tempo; qui affrontiamo il secondo, cioè la discretizzazione del valore.
4.1 Conversione analogico-digitale
Gli strumenti di misura che useremo sono digitali nel senso che la loro rappresentazione intera del valore fisico misurato è discreta e con un numero finito di valori possibili, idealmente equispaziati, come illustrato in Figura 4.1. Partiamo da alcune definizioni di base che caratterizzano questa corrispondenza, che viene realizzata tramite un ADC (Analog to Digital Converter) in un verso e un DAC (Digital to Analog Converter) nell’altro.
DefinizioneDefinizioni chiave
Qui si assume di lavorare in condizioni ideali, con una mappatura discretizzata ma regolare e con livelli perfettamente equispaziati. Eventuali deviazioni da questa condizione verranno discusse in seguito.
- Codice. Dal lato digitale, il valore fisico è rappresentato da un numero intero chiamato codice di ingresso (in un DAC) o codice di uscita (in un ADC), tipicamente indicato con \(D\).
- Numero di bit. In qualsiasi strumento che useremo la rappresentazione interna di \(D\) è binaria e il numero di bit \(n\) quantifica quanti valori diversi lo strumento è in grado di determinare, ossia \(2^n\).
- Intervallo di fondoscala. Indicato in Figura 4.1 come FSR, indica la massima variazione possibile nei valori misurati, ossia la distanza fra il primo e l’ultimo codice. Attenzione al conto, che è quello dei pali di un recinto: \(2^n\) codici sono separati da \(2^n-1\) gradini, quindi \({\rm FSR}=(2^n-1)\Delta x\). Il range è spesso un po’ superiore a quello dichiarato per lasciare un margine di calibrazione.
- Risoluzione. La più piccola variazione di valore \(\Delta x\) che lo strumento è in grado di fornire, pari a \({\rm FSR}/(2^n-1)\), ossia il fondoscala diviso il numero di gradini. A volte questo valore è anche detto digit o per estensione LSB (Least Significant Bit).
Date queste definizioni, ci aspettiamo che il valore misurato nella conversione sia
\[x = x_0 + \frac{D}{2^n-1}\,{\rm FSR} = x_0 + D\,\Delta x, \tag{4.1}\]
dove \(D\) è l’intero prodotto dal convertitore, \(x_0\) il valore che corrisponde al codice zero — il centro del codice zero, ossia il misurando che lo strumento rilegge come \(D=0\), e non il bordo inferiore dell’intervallo di ingresso, che sta mezzo LSB più in basso — e \(\Delta x = {\rm FSR}/(2^n-1)\) la risoluzione appena definita. Leggere uno strumento digitale è tutto qui: un intero e due costanti di taratura. Qui si noti che \(D\) potrebbe essere anche codificato come un intero con segno, con ovvie conseguenze sul significato della formula e degli estremi dell’intervallo di misura. Le conseguenze della discretizzazione di \(x\) sono discusse nella sezione a seguire.
AttenzioneAttenzione: risoluzione \(\neq\) precisione \(\neq\) accuratezza
Va notato che la risoluzione non dice molto sulla precisione della misura fornita da uno strumento. La precisione, ossia la fluttuazione statistica del dato sarà tipicamente peggiore della risoluzione (per via del rumore), ma potrebbe anche diventare molto migliore usando tecniche quali oversampling. Come mostrato in seguito, in genere è desiderabile che il rumore sia un po’ superiore alla risoluzione, mentre all’altro estremo l’oversampling è una pratica possibile ma da gestire con grande attenzione.
L’accuratezza dello strumento di misura è una ulteriore questione quasi completamente sconnessa e dipende in larga parte dalla calibrazione. Tuttavia, è bene notare che la quantizzazione stessa può introdurre delle deviazioni sistematiche, che andrebbero classificate come un problema di accuratezza.
AttenzioneRecap - rappresentazione binaria dei numeri
Sedici bit possono significare tutto e niente, dipende dalla convenzione scelta e quindi dalla rappresentazione binaria dei numeri. Qui è bene conoscerne almeno tre, che sono illustrate in Figura 4.2: (1) gli interi senza segno, uint16 nella fattispecie; (2) gli interi con segno, int16; (3) i numeri con la virgola float16.
Numero superiore di bit. In figura ci siamo limitati per praticità a 2 byte, dove come ben noto un byte sono otto bit oppure due nibble da quattro. Per completare lo slang informatico, due byte anche detti word, due word (32 bit) fanno una dword e quattro word (64 bit) fanno una qword. I float16 sono anche detti numeri a “mezza precisione”, e sono oggi molto usati per calcoli che devono essere rapidi ma non necessariamente super-precisi, per esempio in un contesto di gaming o deep learning. I formati più comuni sono poi
floato numeri a singola precisione occupano 32 bit, di cui 8 dedicati all’esponente e 23 alla mantissa;doubleo numeri a doppia precisione occupano 64 bit, di cui 11 dedicati all’esponente e 52 alla mantissa.
In maniera simile esistono dei nomi speciali per gli interi: un intero a 8 bit è anche detto char (codifica un carattere ASCII), uno a 16 bit è anche detto short, il classico int è a 32 bit mentre salendo ulteriormente si può trovare anche il termine long o long int. In questo è fondamentale non farsi ingannare dai nomi: per esempio in un linguaggio come python int vuole dire tutto o niente; una variabile di questo tipo potrebbe occupare in memoria un numero piccolo di bit, oppure anche un numero di bit molto più elevato di 64. Questo succede perché python è un linguaggio di “alto livello” (come sinonimo di “astratto”, in contrasto con linguaggi come C/C++, che sono a “basso livello”, ossia più vicini all’hardware) con delle rappresentazioni dei numeri “dinamiche”, che possono cambiare in base alle esigenze numeriche contingenti senza che l’utente ne sappia nulla.
Numeri speciali. Chi ha giocato con Figura 4.2 si sarà forse accorto che è possibile ottenere risultati curiosi nella codifica float16. Quando la mantissa è nulla ma l’esponente è il più grande possibile, ossia b11111 pari a 31, il numero viene interpretato come Inf o -Inf in base al segno specificato: questo numero speciale è dedicato a registrare valori che vanno oltre il massimo ammesso in questa rappresentazione. Quando invece l’esponente è massimo e la mantissa diversa da zero si ottiene un NaN, Not a Number; questo è per esempio il risultato di una operazione come \(0/0\) oppure \(\infty-\infty\). Si noti che \(1/0\) dà invece Inf, ossia il caso appena descritto: dividere per zero un numero finito è una divergenza con un segno, non una forma indeterminata.
All’altro estremo c’è l’esponente nullo, b00000, che non segue la regola generale. Con mantissa nulla codifica lo zero, che esiste in due copie, \(+0\) e \(-0\), a seconda del segno. Con mantissa diversa da zero dà i numeri subnormali (detti anche denormalizzati): il valore è \((-1)^s\cdot 2^{-14}\cdot m/1024\), cioè l’esponente resta bloccato a \(-14\) e la mantissa perde l’1 implicito davanti alla virgola. I subnormali riempiono il buco che altrimenti resterebbe fra lo zero e il più piccolo numero normale, \(2^{-14}\simeq 6.10\times10^{-5}\), con un passo costante di \(2^{-24}\simeq 5.96\times10^{-8}\), che è anche il più piccolo float16 positivo. Il prezzo è la precisione: un normale ha sempre 11 bit significativi (i 10 della mantissa più l’1 implicito), un subnormale solo quelli della mantissa a partire dal suo primo 1, e scendendo verso \(2^{-24}\) ne resta uno solo. Il campo dei valori indicato in alto a destra in Figura 4.2, da \(\pm 6.10\times10^{-5}\) a \(\pm 65\,504\), è quello dei numeri normali e non ne tiene conto: provate a mettere a zero tutti i bit dell’esponente e ad accendere solo l’ultimo bit di mantissa.
I numeri più precisi. Se credete che siano i double resterete delusi, perché esistono i decimal che sono nati per una applicazione in cui l’accuratezza della rappresentazione è ancora più importante che nella scienza… ossia nella finanza! I double hanno il problema di non essere in grado di rappresentare bene i numeri in base 10, con la spiacevole conseguenza che è possibile ottenere cose come questa (provare per credere):
0.3-0.2-0.1 = -2.7755575615628914e-17generando una sequela di errori spiacevoli. Questo succede perché nessuno dei tre numeri a sinistra dell’uguale ha una rappresentazione esatta nella codifica double. Anche i decimal includono una mantissa e un esponente, che tuttavia sono in base 10: la rappresentazione è a 128 bit, più precisa di quella dei double e in grado di riprodurre accuratamente numeri in base dieci fino ad almeno 28 cifre significative.
Codifica binaria in complemento due. Nella Figura 4.2 è stata data una regola poco ortodossa. In un numero intero con segno la procedura più spesso rintracciabile è la seguente: “Se il bit più significativo è 1 allora il numero è negativo e il valore assoluto del numero si ottiene prendendo gli altri bit e (a) invertendoli per poi (b) aggiungere 1”. Questo protocollo decisamente ostico e poco intellegibile può semplicemente essere ridefinito come segue:
- Convertire il numero come se fosse un intero senza segno;
- Se il bit piĂą significativo vale 1 allora bisogna togliere \(2^n\).
La regola riportata in figura è riconducibile a quanto appena dichiarato: quando si toglie \(2^n\), il bit più significativo non vale \(+2^{n-1}\) ma bensì \(-2^{n-1}\). Guardando la cosa da un altro punto di vista, di fatto questa è sostanzialmente una rappresentazione modulo \(2^{16}\), fatta con il salto causato dall’operazione di modulo non messo in corrispondenza dello zero ma fra \(2^{n-1}-1\) e \(-2^{n-1}\). Qualunque sia la razionalizzazione che preferite, a livello programmatico lo step 2 nel caso di 16 bit può essere banalmente scritto in MATLAB e python come segue:
if N > 2^15-1 % Oppure N > 32767, che infatti è il massimo intero positivo a 16 bit
N = N - 2^16 % Oppure N = N - 65536
endif N > 2**15-1: # Oppure N > 32767, che infatti è il massimo intero positivo a 16 bit
N = N - 2**16 # Oppure N = N - 655364.1.1 Errore di quantizzazione
Gli errori di discretizzazione (o quantizzazione) sono molto meno innocui di quel che sembrano. Si immagini di avere una quantità generica \(x\), che viene passata attraverso una funzione di quantizzazione \(Q(x)\) che arrotonda all’intero più vicino. Questa operazione pone delle problematiche sorprendenti, nonostante la sua semplicità abbastanza sconvolgente, come illustrato anche in Figura 4.3.
- L’operazione implementata da \(Q(x)\) è non-lineare, per esempio \(Q(0.4)=0\) ma \(Q(2\times 0.4)=1\); la non-linearità è sempre fonte di cose interessanti e/o problematiche.
- L’operazione \(Q(x)\) può sopprimere le fluttuazioni, per esempio supponiamo \(x\) abbia distribuzione gaussiana con \(\mu=0\) e \(\sigma=0.01\): è davvero improbabile (\(50\sigma\)….) che \(x\) raggiunga la soglia per avere \(Q(x)=1\), quindi il risultato sarà \(0\), con una bassissima fluttuazione.
- L’operazione \(Q(x)\) può amplificare le fluttuazioni, per esempio se \(\mu=0.5\) e \(\sigma\) piccola a piacere, \(Q(x)\) sarà una sequenza casuale di \(0\) e \(1\), con una fluttuazione non gaussiana piuttosto grande.
Dopo aver demolito le vostre certezze sulla propagazione del rumore, passiamo ad un’altra finta ovvietà : è naturale pensare che \(Q(x)\), arrotondando \(x\) all’intero più vicino, porti ad una irrimediabile perdita di informazione. Questo è falso, e la cosa più sorprendente è che il modo per ricostruire l’informazione completa può essere piuttosto controintuitivo e richiedere di aggiungere del rumore a \(x\).
4.1.2 Dithering e oversampling
L’idea di base è che se \(Q(x)\) è una barriera alla propagazione dell’informazione, il rumore può essere ciò che permette all’informazione di passare tale barriera, mentre il sovracampionamento o oversampling è ciò che permette di ricostruire l’informazione originaria con una precisione arbitrariamente buona.
Il termine precisione è voluto: il processo descritto funziona alla perfezione in un mondo ideale ed è teoricamente possibile ricostruire alla perfezione \(x\). Tuttavia, nel mondo reale tutto questo può generare degli errori di accuratezza piuttosto complicati e difficili da gestire, di cui è bene essere coscienti. L’operazione generale che si vuole analizzare è la seguente: si supponga che \(x\) è un valore fisso e infinitamente preciso, a cui si somma una fluttuazione \(\eta\) casuale da meglio definire. Idealmente si potrebbe cercare di ricostruire il valore di \(x\) facendo delle medie
\[ \hat x = \frac{1}{N}\sum_{i=1}^{N} Q\bigl(x + \eta\bigr), \qquad \eta_i \ \text{rumore casuale}. \tag{4.2}\]
Funziona? In un caso è facile dimostrare che in effetti funziona perfettamente
TeoremaDithering e oversampling
Se aggiungiamo a \(x\) un rumore con distribuzione piatta su \([-0.5,0.5]\) LSB, nel limite \(N\to\infty\) l’operazione di Equazione 4.2 è in grado di ricostruire alla perfezione la \(x\) prima della discretizzazione. La media di \(N\) letture ha una dispersione che decade come \(1/\sqrt{N}\) e converge su \(x\).
Dimostrazione
Sia \(x=n+dx\) il valore “vero” pre quantizzazione, dove \(n\) è l’intero più vicino e \(dx\) la parte mancante. Per via del rumore \(\eta\), i valori che effettivamente entrano nel quantizzatore sono \(y=x+\eta\) con una distribuzione \(P(\eta)=1\) per \(|\eta|<0.5\). La distribuzione può essere spezzata in due parti:
- \(y\in[x-0.5,n+0.5]\), che sarĂ letto come \(n\) da \(Q(y)\);
- \(y\in[n+0.5,x+0.5]\), che sarĂ letto come \(n+1\) da \(Q(y)\).
dove per definizione \(|dx|<0.5\) ma qui assumiamo anche \(dx>0\), un discorso equivalente può essere fatto per \(dx\) negativo.
Come si vede anche in Figura 4.4, il primo caso copre un range di \((n+0.5)-(x-0.5)=1-dx\), con una probabilità pari alla larghezza del range; il secondo \(dx\). Ergo il valore medio atteso del risultato di quantizzazione è
\[E[Q(y)] = n(1-dx)+(n+1)dx = n+dx = x.\]
Il resto del lavoro è fatto dal teorema del limite centrale per cui la media converge a \(x\) con una varianza che scala asintoticamente come \(1/N\).
Lo stesso meccanismo è mostrato in Figura 4.5, dove una foto a livelli di grigio viene discretizzata all’estremo: in bianco e nero. In questo caso la media può semplicemente essere fatta “con gli occhi” confrontando pixel vicini e la densità relativa di pixel bianchi e neri. Questa tecnica, in una variante più regolare in termini spaziali, è alla base della stampa.
AttenzioneMeraviglie dell’oversampling e fit da incubo
Quella appena descritta è una situazione matematicamente corretta, ma altamente ideale, in cui:
- Il discretizzatore \(Q(x)\) è perfetto, ha gradini perfettamente equidistanti e regolari;
- Il rumore ha una distribuzione rettangolare, perfettamente allineata al gradino di quantizzazione.
Inutile dire che tutto questo non si realizza davvero in un sistema reale, anche se vale asintoticamente per un \(\sigma\) che diventa grande rispetto al \(\Delta x\) corrispondente a LSB. Se il dithering non è in grado di cancellare tutti gli effetti della discretizzazione, l’errore in Figura 4.3 rimane, ed è un errore di difficile gestione: è sistematico e dipende anche in maniera complicata dal valore del dato. In cima a questo la discretizzazione \(Q(x)\) non è mai perfetta, come vedremo in seguito.
Quindi, in conclusione, se l’oversampling vi permette in maniera forse insperata di scendere perfino sotto la risoluzione dello strumento, questo ha molto spesso un prezzo e i dati che ne risultano possono essere facilmente molto difficili da trattare e dare \(\chi^2_\nu\) pessimi nei fit. Il motivo è che dopo aver soppresso le fluttuazioni statistiche, il vostro dato rimane inquinato da effetti sistematici di difficile gestione. Questo può accadere senza volerlo, facendo un numero inutilmente grande di medie o acquisendo un numero inutilmente grande di punti: è fondamentale interiorizzare che misurare molto non è necessariamente utile a rendere le vostre stime migliori, ma potrebbe semplicemente renderle di più difficile gestione, senza alcun miglioramento.
Come ultima raccomandazione, non è sempre necessario fittare per forza qualsiasi cosa: lo scopo è ottenere una stima di un parametro, non un \(\chi^2_\nu=1\). Se per esempio si misura la risposta in frequenza di un filtro passa basso, probabilmente è facile determinare perfino “ad occhio” la frequenza da cui taglio; non è quindi accettabile che una procedura di fit produca una stima che è sbagliata di un fattore \(2\pi\)… perché si è applicato ciecamente un algoritmo statistico raffinato, perdendosi dei pezzi fondamentali per strada. In aggiunta, è anche poco accettabile che nessuno sia in grado di dare a tale stima una incertezza sensata, magari perché alla fine si è cercato di fittare i dati in condizioni (di media, di intervallo di misura, numero di punti, eccetera) in cui sostanzialmente non avete alcun buon modello di fit, ne è uscito \(\chi^2_\nu=10^6\) e non sapete più che fare: una stima senza una incertezza credibile è altrettanto inutile.
4.1.3 Architetture ADC
Come si realizza fisicamente \(Q(x)\)? Tutte le architetture fanno la stessa cosa — confrontare l’ingresso con una griglia di livelli — ma spendono risorse diverse per farla. In Figura 4.6 sono illustrate le principali tecniche, che offrono vantaggi complementari in termini di velocità , costo, risoluzione. La velocità è un aspetto che abbiamo finora completamente ignorato ma come illustrato in seguito è importante a seconda dell’applicazione: questa si misura in campioni al secondo ovvero Sa/s.
L’illustrazione a seguire è volutamente non-tecnica e mira a riassumere alcuni concetti e approcci di base, che possono servire ad inquadrare la conversione analogico-digitale e ad apprezzare il tipo di caratteristiche e problemi che può comportare. Vari concetti quali integratori, “decoder”, ecc potranno essere chiariti solo più avanti nel corso e verranno ripresi in quella sede. Per ora basti accettare dogmaticamente che il simbolo circuitale triangolare con due ingressi marchiati con “+” e “-” è un comparatore: un comparatore confronta i due voltaggi di ingresso e verifica se è vero che \(V_{+}>V_{-}\). Useremo presto lo stesso simbolo per gli amplificatori operazionali, che infatti possono essere facilmente usati come comparatori.
Flash: confronto parallelo
Il flash fa la cosa più ovvia: produce tutti i valori di riferimento con un grande partitore e confronta \(V_{in}\) in parallelo con ognuno di questi. Nel circuito di Figura 4.6 il simbolo triangolare rappresenta un comparatore, che si attiva se l’ingresso \(+\) è effettivamente maggiore dell’ingresso \(-\). Il simbolo è identico a quello di un amplificatore operazionale, che presto studieremo; in effetti, un operazionale può essere usato come un comparatore. Il circuito di decoder semplicemente verifica fino a che ingresso il confronto è positivo, e traduce il tutto in un valore binario. Questo processo di misura si può pensare come l’equivalente di prendere un oggetto, avvicinarlo ad un righello e verificare quale sia la tacca più vicina.
Caratteristiche. Questo metodo offre la massima velocità possibile, perché la conversione avviene sostanzialmente in maniera istantanea. Tuttavia, richiede ben \(2^n-1\) comparatori e quindi è molto dispendioso in termini di hardware, infatti la tecnologia è spesso limitata a pochi bit. Questo è il tipo di ADC che si trova in genere negli oscilloscopi veloci, dove conta il campionamento rapido più della risoluzione fine.
SAR: ricerca binaria per bisezione
In una SAR, o Successive approximation register, si prende la via diametralmente opposta. In questo caso c’è un solo comparatore e il processo di confronto è sostanzialmente una sequenza iterativa di bisezioni. Nella Figura 4.6 il circuito mostra i tre pezzi che servono: il comparatore, un registro che registra in vari bit i risultati dei test precedenti, e il DAC che genera il livello di prova. Il processo di ricerca per bisezione è illustrato a destra: la fascia azzurra dei valori ancora possibili si dimezza a ogni passo, il livello provato viene tenuto (verde) o scartato (grigio).
Caratteristiche. Pregi e difetti sono l’immagine speculare del flash: il SAR è iterativo (\(n\) passi, quindi più lento), ma richiede un solo comparatore più un DAC interno, il che rende più facile estendere la conversione a molti più bit. Gli svantaggi dei SAR includono, oltre alla velocità inferiore, una certa propensione a subdoli errori di conversione, forse già riscontrati negli ADC integrati negli Arduino.
AttenzioneApprofondimento — il classico errore dei SAR vicino alle potenze di due
La ricerca binaria è elegante quanto fragile. Il bit più significativo si decide confrontando l’ingresso con metà scala: se quel confronto fallisce — magari perché il valore è proprio vicino alla soglia, un disturbo fa propendere per il verso opposto o perfino la soglia generata dal DAC è scalibrata — l’errore non si corregge più, e anzi si trascina su tutti i bit successivi. Tipicamente, dopo un confronto sbagliato a metà scala verso il basso, i bit rimanenti risultano tutti \(1\): questo produce il classico errore da SAR, ossia valori che “accumulano” in prossimità di una potenza di due.
\(\Sigma\text{-}\Delta\): modulazione filtrata come misura
Qui si cambia completamente approccio: un modulatore \(\Sigma\text{-}\Delta\) contiene un DAC a 1 bit che opera ad una frequenza di vari MHz e genera una sequenza binaria di valori alti e bassi con uno scopo semplice: cercare di riprodurre “in media” il misurando \(V_{in}\). Questo viene ottenuto integrando la differenza fra \(V_{in}\) e il DAC e usandola come feedback di controllo per il modulatore, che viene aggiornato periodicamente cercando di correggere via via le discrepanze, come illustrato in Figura 4.6. La misura a questo punto si ottiene come media del DAC.
Spesso la spiegazione del meccanismo \(\Sigma\text{-}\Delta\) si chiude qui, e di base sarà così anche per noi. Tuttavia, è bene dire che una comprensione più profonda richiederebbe di parlare di modulatori di ordine superiore. Senza di questi, il meccanismo descritto richiederebbe \(2^n\) cicli per stimare una quantità a \(n\) bit: considerando che questi ADC hanno spesso \(n=24\), questo può costituire un problema. Per chi volesse approfondire, la sezione opzionale in seguito fornisce qualche indizio sulla direzione in cui si può migliorare tutto questo.
Caratteristiche. Questa architettura è spesso usata in convertitori di alta precisione (spesso questi ADC hanno \(n=24\) bit di risoluzione), ma dove non è necessario andare troppo veloci. Questa è l’architettura dei multimetri di precisione, di sensori digitali di alta precisione, delle bilance e delle tecnologie audio.
AttenzioneModulatori di ordine superiore
Formalizziamo… perché a chiacchiere se ne usciamo male. Semplifichiamo al massimo dicendo che \(V_{in}\) varia solo in \([0,1]\) e così pure che il nostro DAC generi solo una fra due configurazioni binarie: \(\left\{0,1\right\}\). La differenza fra i due viene data in pasto ad un circuito integratore che esegue l’operazione \(x=(1/\tau)\int (V_{in}-D)dt\). Chiamiamo quindi \(x_i\) il valore integrato nel periodo del temporizzatore che aggiorna il DAC: dopo ogni periodo \(\Delta t\) l’integrale evolve secondo
\[x_i = x_{i-1}+(V_{in}-D_{i-1})\alpha,\]
dove \(\alpha=\Delta t/\tau\) è il rapporto adimensionale fra il tempo di integrazione e la costante di tempo dell’integratore, mentre \(D_i\) è l’output del DAC sopra citato. Dopo ogni passo di integrazione il circuito confronta \(x_i\) con la soglia \(0.5\) e decide se al ciclo successivo il DAC debba immettere un \(1\) oppure uno \(0\) per approssimare meglio la media:
\[ D_{i}= \begin{cases} 1 &{\rm se} & x_{i}\ge 0.5\\ 0 &{\rm se} & x_{i} < 0.5 \end{cases} \]
Con questa regola, che riproduce quanto mostrato in Figura 4.6, il DAC insegue “in media” il valore di \(V_{in}\). La precisione con cui lo fa è quantificabile sommando tutti gli integrali su \(M\) cicli
\[\sum_{i=1}^M(V_{in}-D_{i-1})\alpha = \sum_{i=1}^M (x_{i}-x_{i-1}) = x_M-x_0\]
da cui infine vediamo come la media approssima il misurando \(V_{in}\) come segue
\[V_{in} - \frac{1}{M}\sum_{i=0}^{M-1}D_i = \frac{x_M-x_0}{M\alpha}.\]
L’errore di questa stima evolve come \(1/M\) e, come già anticipato, per fare una misura con risoluzione a \(n\) bit ci aspettiamo di dover accumulare \(M\approx 2^n\) valori binari: non pochi se vogliamo \(n=24\).
Modulatore \(\Sigma\text{-}\Delta\) del secondo ordine. Ora modifichiamo il nostro algoritmo e facciamo in modo che l’uscita dell’integratore \(x_i\) finisca in un secondo integratore a cui sottraiamo di nuovo il valore del DAC, ossia assumendo integrazione discreta… \[ \begin{aligned} x_i &= x_{i-1}+(V_{in}-D_{i-1})\alpha \\ w_i &= w_{i-1}+(x_i-D_{i-1})\alpha. \end{aligned} \]
A questo punto supponiamo che la scelta su come aggiornare il valore del DAC sia fatta in base al secondo integratore
\[ D_{i}= \begin{cases} 1 &{\rm se} & w_{i}\ge 0.5\\ 0 &{\rm se} & w_{i} < 0.5, \end{cases} \]
quindi qui il DAC non corregge piĂą direttamente la differenza fra la media dei \(D_i\) e \(V_{in}\), ma piuttosto il suo accumulo. A questo punto una valutazione simile a quella giĂ fatta implica che
\[ \sum_{i=1}^M(x_{i}-D_{i-1})\alpha = \sum_{i=1}^M (w_{i}-w_{i-1}) = w_M-w_0 \]
da cui concludiamo anche
\[ \begin{aligned} w_M-w_0 &= \sum_{i=1}^M \left[ x_0+ \sum_{j=0}^{i-1} (V_{in}-D_{j})\alpha \right]\alpha -\sum_{i=1}^M D_{i-1}\alpha\\ &= V_{in}\frac{M(M+1)\alpha^2}{2} + Mx_0\alpha - \sum_{i=1}^M \sum_{j=0}^{i-1} D_{j}\alpha^2 - \sum_{i=1}^M D_{i-1}\alpha \end{aligned} \]
e infine possiamo scrivere
\[V_{in}-\mathcal{F}(D) = \frac{w_M-w_0-Mx_0\alpha}{M(M+1)\alpha^2/2}\]
dove \(\mathcal{F}(D)\) è un cosiddetto filtro digitale definito da
\[\mathcal{F}(D) = \frac{2}{M(M+1)} \left( \sum_{i=1}^M \sum_{j=0}^{i-1} D_{j} +\frac{1}{\alpha}\sum_{i=1}^M D_{i-1} \right) \]
ossia una funzione lineare che converte la sequenza binaria nel tempo \(D_i\) in un numero, che in effetti è la versione discreta delle convoluzioni descritte nel prossimo capitolo quando parleremo di filtri “veri”. Quindi ora non facciamo più una banale media, ma qualcosa di più complicato, sebbene ben definito e riproducibile. Il risultato notevole è che la discrepanza fra questa stima e il misurando ora scala con \(M\) come \(\approx 1/M^2\), quindi per campionare a \(n=24\) bit non serve più \(M\approx 2^{24}\) ma bensì qualcosa di più vicino a \(M\approx 2^{12}\), un numero certamente molto più agevole.
La tipica razionalizzazione è che la doppia integrazione spinge gli errori di quantizzazione verso le alte frequenze, rendendo possibile la loro eliminazione con un opportuno filtro e una convergenza più efficiente da un punto di vista del numero di cicli \(M\) necessari ad abbattere gli errori sotto una data soglia. Contiamo che questo semplice conto dia qualche elemento in più per chiarire che cosa significhi questa affermazione.
AttenzioneADC pipeline e altre tecnologie
Convertitori pipeline. Fra flash e SAR esiste un continuo di possibilità in cui invece di fare una bisezione fra due intervalli, si costruisce un circuito in grado di distinguere fra \(2^n\) intervalli. Questo richiede più comparatori, ma riduce il numero di passi necessari a completare la conversione. Per esempio, una conversione a 16 bit può richiedere
- Flash: servono \(2^{16}-1 = 65535\) comparatori e la conversione avviene one-shot
- SAR: basta un comparatore ma la conversione richiede 16 step
- Esempio pipeline: un sistema in grado di discriminare fra \(2^4=16\) livelli richiede 15 comparatori ma solo 4 step di conversione.
Sostanzialmente questo permette di fare un trade-off fra hardware e velocitĂ , interpolando fra i due limiti della bisezione pura del SAR e della conversione immediata dei flash.
Convertitori a rampa. Molto spesso quando si misura conviene convertire il misurando in tempo, dato che esistono tecniche molto raffinate di misura del tempo, sostanzialmente basate sul numero di periodi di una sorgente a frequenza nota. Uno dei modi possibili per convertire un voltaggio in tempo è di fare un integrale del voltaggio (vedremo in seguito come si possa fare). In questa classe di convertitori viene prima integrato il misurando \(V_{in}\) per un tempo fisso \(T_1\), e poi si procede integrando \(-V_{ref}\) fino a tornare a zero in un tempo \(T_2\). Il valore del misurando a questo punto si può facilmente determinare come \(V_{in} = V_{ref}T_2/T_1\), e si noti che il risultato non dipende né da \(R\) né da \(C\) dell’integratore. Che a essere integrato per un tempo fisso sia l’ingresso non è un dettaglio: scegliendo \(T_1\) multiplo di \(20\ \mathrm{ms}\) il ronzio di rete si media esattamente a zero, ed è la ragione per cui i multimetri da banco usano questa architettura.
Le due variabili principali che distinguono le diverse implementazioni ADC sono il numero di bit e la velocità di conversione: un flash è molto rapido ma ha pochi bit, un \(\Sigma-\Delta\) può avere moltissimi bit ma è molto più lento. Tutto questo è riassunto in Figura 4.7: non esiste lo strumento che insieme sia velocissimo e abbia una altissima risoluzione; la scelta dell’architettura è sempre un trade-off. Sulla mappa è segnato anche lo strumento chiave del laboratorio, ossia Analog Discovery 2: \(14\) bit a \(100\ \mathrm{MSa/s}\) mettono questo strumento in piena regione pipeline, che infatti è la tecnologia su cui è basato il suo convertitore AD9648 prodotto dalla Analog Devices.
4.2 Artefatti
4.2.1 Effetti statici
La non-idealità più ovvia di un sistema ADC consiste nel fatto che la discretizzazione potrebbe non essere regolare come si vorrebbe. Questo è un problema che realisticamente resiste a qualsiasi calibrazione e semplicemente incorpora un sistematico molto difficile da gestire, se non coperto da rumore stocastico. Genericamente tutto questo è classificato come non-linearità ma per completezza riportiamo alcune definizioni comuni.
Definizione 4.1: Non-linearitĂ differenziale e integrale
Chiamando \(T[k]\) il livello di transizione a cui la discretizzazione passa da \(k-1\) a \(k\), possiamo definire la larghezza del valore \(k\) come \(W[k] = T[k+1] - T[k]\). La DNL (Differential Non-Linearity) misura, valore per valore, di quanto la larghezza reale del gradino si discosta da quanto previsto per un LSB:
\[ \mathrm{DNL}[k] = \frac{W[k]}{\Delta x} - 1 = \frac{T[k+1] - T[k]}{\Delta x} - 1 \qquad (\mathrm{LSB}), \tag{4.3}\]
dove \(\Delta x\) è il gradino atteso. La INL (Integral Non-Linearity) misura lo scostamento della caratteristica dalla retta ideale, ed è la somma cumulata della DNL:
\[ \mathrm{INL}[k] = \frac{T[k] - T_{\text{ideale}}[k]}{\Delta x} = \sum_{j<k} \mathrm{DNL}[j] \qquad (\mathrm{LSB}). \tag{4.4}\]
I valori di discretizzazione vengono anche detti codici. Questi artefatti possono manifestarsi in vario modo, dalla non omogeneità delle larghezze di quantizzazione fino al caso di codici mancanti. Nessuno di questi artefatti può essere risolto misurando di più dato che si tratta di deviazioni sistematiche, peraltro anche di natura piuttosto complessa. Si noti che in un ADC questi effetti saranno tipicamente “sommersi” dalle fluttuazioni statistiche, ma possono emergere facilmente facendo molte medie fra diverse misure.
4.2.2 Effetti dinamici
Gli artefatti visti finora sono una proprietà della conversione: esistono anche se l’ingresso è fisso e per misurarli basta una tensione continua. Si noti che tipicamente gli ADC hanno una circuiteria di sample and hold, che campiona (tipicamente su un condensatore) il segnale per poi tenerlo fisso durante la conversione. Non è affatto detto che questo elimini qualsiasi problema connesso alla dinamica.
In effetti, esiste una seconda famiglia di errori che si vede solo quando il segnale varia, e che può peggiorare al crescere della frequenza d’ingresso: il parametro di controllo non è più il valore, è la velocità di variazione del valore. Non entriamo nei dettagli ma una sorgente di problemi è per esempio dovuta al fatto che qualsiasi circuito è in grado di variare i suoi voltaggi solo fino ad una certa slew rate, che determina una scala che può diventare importante nella conversione.
Una tipologia di errore dinamico che può diventare rilevante nello studio in frequenza è anche il cosiddetto jitter, per il quale il tempo di campionamento non è perfettamente regolare e mostra delle fluttuazioni temporali nel tempo di campionamento. In un segnale variabile nel tempo questo disturbo verrà visto come una fluttuazione nel valore misurato.
4.3 Analog Discovery 2
Concludiamo con una review hardware minimalista di Analog Discovery 2. Lo strumento include in primis due ingressi analogici differenziali Ch1 e Ch2 (ciascun canale misura la differenza fra due morsetti, non un potenziale rispetto a massa — utile per reiettare i disturbi di modo comune), due uscite analogiche W1 e W2 (i generatori di forma d’onda), un alimentatore duale \(\pm 5\ \mathrm V\) che serve tutti i circuiti attivi del corso e 16 linee di I/O digitale. Il componente principale (e più costoso) dello strumento è un AD9648, che contiene un ADC pipeline a doppio canale, 14 bit e 100 MSa/s, con uno stadio di ingresso che garantisce un range massimo di misura di \(\pm 25\ \mathrm V\).
Per il dettaglio del pinout si consulti Figura 4.8.
ImportanteTake-home
- Le fenomenologie connesse alla discretizzazione di un segnale continuo, l’emergere di errori sistematici, il meccanismo del dithering e dell’oversampling;
- Definizioni di base di un sistema DAC o ADC, i bit di risoluzione, l’intervallo di misura.
- Le tecniche principali di conversione analogico-digitale: caratteristiche, vantaggi e limiti.
- Le non-idealitĂ principali dei sistemi di conversione analogico-digitale, come la non-linearitĂ .
Firouzkouhi, Hossein, e Mohammadreza Ashraf. 2021. «A low-power 10-bit CCP-based pipelined ADC using a multi-level variable current source MDAC and an ultra-low-power double-tail dynamic latch». International Journal of Circuit Theory and Applications 49 (3): 830–52. https://doi.org/10.1002/cta.2938.
Kester, Walt. 2005. «Which ADC architecture is right for your application?» EDA Tech Forum 2 (4): 22–25.