Il convertitore AD (analogico-digitale) dei microcontrollori PIC

Convertitori AD dei Pic

Una breve introduzione alla conversione Analogico/Digitale ed una analisi del convertitore AD del microcontrollore PIC: le caratteristiche, le prestazioni, i registri coinvolti e le routines di gestione della conversione.

La conversione AD è quel processo che permette la digitalizzazione di un segnale analogico affinché questo possa essere trattato da un microcontrollore come una stringa di bit. L’informazione digitale ottenuta dal processo di  conversione, differisce comunque  dalla controparte analogica a causa dei processi di campionamento e quantizzazione a cui quest’ultima è sottoposta. Per questo motivo è importante condizionare il segnale analogico affinché, a seguito del processo di conversione, il contenuto informativo del segnale non vada perduto.

Quantizzazione

Per capire a fondo il problema della quantizzazione si consideri lo schema a blocchi di un sistema di conversione AD (figura 1) composto da un modulo Sample&Hold e dal convertitore vero e proprio. Il compito del modulo Sample&Hold è unicamente quello di campionare il segnale analogico e mantenerlo costante all’ingresso del blocco convertitore per tutta la durata della conversione. Per semplicità si supponga che l’ampiezza del segnale analogico sia compresa tra 0 e 4,095V, in questo modo si ha una corrispondenza diretta con i numeri binari compresi tra 0 e 4095 esprimibili su 12 bit. Nella figura 1 sono riportate le varie forme d’onda nei vari punti del sistema. Il risultato della conversione (grafico C di figura 1) produce un numero intero compreso tra 0 e 4095 in corrispondenza di ciascuna zona piatta del grafico B della stessa figura. Questo risultato è sicuramente affetto da errori in quanto se ad esempio il primo campione ha ampiezza 3,01405V, questo verrà convertito nell’intero 3015. Questa è l’operazione di quantizzazione: la trasformazione di una variabile dipendente (la tensione in questo caso) da continua a discreta. Il segnale risultante è dunque dato dal segnale di ingresso (campionato)  più un errore di quantizzazione che può essere al massimo di 1/2 LSB (ovvero la metà del peso del bit meno significativo) come confermato dal grafico C della figura 1. È interessante notare che l’effetto della quantizzazione può essere considerato (e trattato) alla stregua di un rumore random uniformemente distribuito tra ± 1/2 LSB e con deviazione standard di 0,29 LSB. Alla luce di questo modello è possibile affermare che se un segnale analogico viene digitalizzato su 8 bit (256 possibili valori), viene contemporaneamente aggiunto un rumore random rms di 0,29/256.

Figura 1. Schema a blocchi di un processo di digitalizzazione di un segnale analogico

Figura 1. Schema a blocchi di un processo di digitalizzazione di un segnale analogico

Dithering

Il modello appena esposto cade in difetto se l’errore di quantizzazione non può essere considerato random e ciò avviene quando il segnale analogico varia molto lentamente quindi si ha un elevato numero di campioni consecutivi dello stesso valore (si pensi ad esempio ad una temperatura  o alla variazione di  luminosità naturale di un ambiente). La tecnica Dithering permette di migliorare la digitalizzazione di questo tipo di segnali aggiungendo una certa quantità di rumore al segnale da campionare.  Si consideri ad  esempio il segnale di figura 2a: il segnale analogico rimane per diverso tempo entro il range 3001-3002 per cui vi saranno molti campioni aventi lo stesso valore. Se al segnale analogico  si aggiunge  un  rumore  random (Dithering)  con  una deviazione standard di  2/3LSB (come mostra la figura 2b) il risultato della digitalizzazione sarà quello di figura 2c. Ma in che modo questa tecnica migliora la digitalizzazione? Si consideri un segnale analogico costante di 3,0001V: questo produrrà una serie di campioni (si suppongano 10000 campioni) tutti di ugual valore pari a 3000. Aggiungendo il rumore Dithering e ripetendo il campionamento, si otterranno campioni di valore diverso, il 90% dei quali avrà valore 3000 ed il restante 10% avrà valore 3001. La media dei campioni ottenuti  sarà quindi  vicina al valore reale di 3000,1 (il vero valore che si dovrebbe ottenere idealmente dalla conversione). Ovviamente il rumore Dithering dovrà essere adeguatamente dimensionato in base alle caratteristiche del segnale per questo esistono diverse tecniche basate sulla generazione di numeri random con un calcolatore da inviare in un DAC per ottenere il rumore random voluto.

Figura 2. Tecnica Dithering

Figura 2. Tecnica Dithering

 

Il teorema del campionamento: quale frequenza?

Quale è la corretta frequenza di campionamento da utilizzare affinché sia possibile ricostruire il segnale originale a partire dai suoi campioni? È  bene precisare che qualsiasi segnale destinato alla digitalizzazione deve necessariamente avere una banda limitata e questo è il motivo per cui prima del campionamento viene sempre inserito un filtro passa basso che taglia tutte le componenti frequenziali al di sopra della frequenza di taglio. Lo spettro del segnale campionato ha la forma dello spettro del segnale base, ma ripetuta ad intervalli pari al valore della frequenza di campionamento (figura 3). Durante il processo di ricostruzione del segnale, un nuovo filtro passa basso avrà il compito di prelevare solo una singola porzione di spettro in modo da ottenere nuovamente lo spettro del segnale di partenza. A questo punto risulta chiaro che se la frequenza di campionamento non è almeno il doppio della banda B del segnale analogico, lo spettro del segnale campionato sarà affetto dal fenomeno dell’aliasing ovvero una sovrapposizione delle code dei vari spettri come mostra la figura  3.  È questa la sostanza del noto teorema del campionamento: per la corretta digitalizzazione di un segnale, questo dovrà essere innanzitutto limitato  in una banda B ben definita, quindi campionato con una frequenza fc  maggiore del doppio della banda B.

Figura 3. Il fenomeno dell’aliasing nel campionamento di un segnale

Figura 3. Il fenomeno dell’aliasing nel campionamento di un segnale

Il convertitore A/D del PIC

I registri coinvolti

Nel caso in cui un PIC sia equipaggiato con un convertitore AD, a questo faranno sicuramente capo più ingressi analogici selezionabili mediante un opportuno registro. L’ingresso analogico selezionato viene campionato ed inviato al convertitore che fornisce un risultato tipicamente su 10bit.  Per le operazioni riguardanti la conversione sono coinvolti  quattro  registri del micro: ADCON0 e ADCON1 per le operazioni e le inizializzazioni, ADRESH  e ADRESL  per la memorizzazione del risultato della conversione. Eccoli descritti nel dettaglio.

ADCON0

La struttura del registro ADCON0 è illustrata in figura 4. Il bit 0 (ADON) consente di abilitare o meno il convertitore AD: se tale bit viene messo ad ‘1’ il convertitore sarà Il bit 1 non è implementato, mentre il bit 2 (GO/DONE) fornisce una informazione sullo stato della conversione: se viene messo ad 1 si dà inizio alla conversione; alla fine del processo di conversione questo bit verrà riportato automaticamente a zero. I bit 3, 4 e 5 (CHS2, CHS1, CHS0) permettono di selezionare uno degli ingressi analogici disponibili in accordo con la tabella di figura 5. Infine i bit 6 e 7 permettono di selezionare la frequenza di lavoro del convertitore come frazione della frequenza Fosc dell’oscillatore RC interno o del quarzo esterno. In figura 5 è riportata la tabella di configurazione per questi due bit.

Figura 4. I registri ADCON0 e ADCON1

Figura 4. I registri ADCON0 e ADCON1

SELEZIONE CLOCK
  ADCS1  ACDS0 CLOCK
  0 0 Fosc/2
  0 1 Fosc/8
1 0 Fosc/32
  1 1 RC interno
   SELEZIONE INGRESSI ANALOGICI
 CHS2 CHS1 CHS0 INGR. SELEZIONATO
0 0 0 AN0
0 0 1 AN1
 0 1 0 AN2
 0 1 1 AN3
 1 0 0 AN4
 1  0 1 AN5
 1 1 0 AN6
 1 1 1 AN7
Figura 5.  Scelta dell’ingresso analogico e della frequenza operativa

ADCON1

Alcuni ingressi possono avere diverse funzioni ovvero essere ingressi digitali, analogici oppure ingressi per le tensioni di riferimento necessarie al convertitore. L’uso di tali ingressi nelle loro diverse funzioni, viene scelto in fase di inizializzazione mediante i primi  4 bit  meno significativi (PCFG0:3) del registro ADCON1 in accordo alla tabella di figura 6. I bit 4, 5 e 6 non sono implementati mentre il bit 7 (ADFM) consente di selezionare l’allineamento del risultato nei registri ADRESH e ADRESL. Questi sono infatti due registri a 8 bit che conterranno rispettivamente la parte alta e la parte bassa del risultato, ma poiché quest’ultimo sarà su 10 bit è necessario conoscere  se i 10 bit del risultato verranno allineati a destra o a sinistra. Impostando ad 1 il bit ADFM il risultato verrà allineato a destra ed i 6 bit più significativi verranno letti come 0. Viceversa con ADFM a 0 il risultato sarà allineato a sinistra quindi saranno i 6 bit meno significativi ad essere letti come 0.

Gli step del processo di conversione

Per poter utilizzare il convertitore AD del PIC nei propri progetti, è necessario seguire i seguenti passi:

  1. Configurare il modulo AD:
    Questa operazione comporta la configurazione degli ingressi (attraverso ADCON1), la scelta di quello che sarà il canale da convertire (attraverso ADCON0), il clock di conversione (ADCON0) e l’abilitazione del convertitore (ADON su ADCON0).
  2. Configurazione degli interrupts:
    per ottimizzare le risorse del PIC è consigliato utilizzare il convertitore AD mediante le interruzioni in modo da poter eseguire altre operazioni in attesa che il processo di conversione sia terminato. Per questo motivo sarà necessario azzerare il flag di notifica interruzione ADIF del registro INTCON, abilitare le interruzioni per il convertitore (mettendo ad 1 il bit ADIE di INTCON) quindi abilitare le interruzioni portando ad 1 il bit GIE di INTCON.
  3. Attendere il tempo di acquisizione (TACQ): questo punto sarà approfondito in seguito.
  4. Avviare la conversione:
    la  conversione  viene  avviata  mediante il bit GO/DONE di ADCON0.
  5. Attesa del completamento della conversione:
    questa può essere fatta con un polling sul  bit GO/DONE o mediante le interruzioni.
  6. Leggere il  risultato   nella   coppia   di   registri ADRESH:ADRESL ed eventualmente azzerare il flag ADIF delle interruzioni.
PCFG AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 VREF+ VREF-
 0000 Analog Analog Analog  Analog Analog Analog Analog Analog Vdd Vss
 0001 Analog Analog Analog Analog Vref+ Analog Analog Analog AN3 Vss
 0010 Digital Digital Digital Analog Analog Analog Analog Analog Vdd Vss
0011 Digital Digital Digital Analog Vref+ Analog Analog Analog AN3 Vss
 0100 Digital Digital Digital Digital Analog Digital Analog Analog Vdd Vss
 0101 Digital Digital Digital Digital Vref+ Digital Analog Analog AN3 Vss
 0110 Digital Digital Digital  Digital Digital Digital Digital Digital  -  -
 0111 Digital Digital Digital Digital Digital Digital Digital Digital - -
 1000  Analog Analog Analog Analog Vref+ Vref- Analog Analog AN3  AN2
 1001 Digital Digital Analog Analog Analog Analog Analog Analog Vdd Vss
 1010 Digital Digital Analog Analog Vref+ Analog Analog Analog AN3 Vss
1011 Digital Digital Analog Analog Vref+ Vref- Analog Analog AN3 AN2
1100 Digital Digital Digital Analog Vref+ Vref- Analog Analog AN3 AN2
1101 Digital Digital Digital Digital  Vref+ Vref- Analog Analog AN3 AN2
1110  Digital Digital Digital Digital Digital Digital Digital Analog Vdd Vss
1111 Digital Digital Digital Digital Vref+ Vref- Digital Analog AN3 AN2
Figura 6.  Configurazione degli ingressi

Tempo di campionamento del segnale

Il tempo di campionamento del segnale è il tempo che passa tra la lettura dell’ingresso analogico e la presenza del risultato nei registri ADRES. Tale tempo può  essere considerato composto  da due  parti:  il tempo di acquisizione (TACQ) ed il tempo di conversione (TAD). Il tempo di conversione è il tempo che il convertitore impiega per convertire il segnale acquisito nel risultato finale. Per capire il significato di TACQ occorre invece riferirsi alla figura 7 in cui è rappresentato lo stadio di campionamento relativo ad un ingresso del PIC. La struttura è quella tipica di un Sample&Hold in cui il segnale analogico viene utilizzato per caricare il condensatore CHOLD che manterrà la tensione costante per tutto il tempo di conversione. Il tempo di acquisizione è composto da tre parti: il tempo TAMP di predisposizione degli amplificatori interni (questo tempo è costante e pari a 2ms), il tempo TC di carica del condensatore CHOLD  ed un tempo TCOFF che tiene conto  della temperatura alla quale sta operando il componente (valore significativo se la temperatura supera i 25°C e dato da (T-25) ● 0,05 dove T è la temperatura in °C).
Poiché il condensatore si carica attraverso la resistenza interna della sorgente (Rs), la resistenza RIC (tipicamente 1Ko) e la resistenza R1 dello switch di campionamento (dipendente dalla tensione di alimentazione), TC è dato da –CHOLD(RIC+R1+Rs)ln(1/2047).

Uso del convertitore: una routine assembler

Come esempio pratico di uso del convertitore AD di un PIC (si consideri un PIC generico – le istruzioni sono le stesse), ecco una routine assembler che permette la configurazione e la gestione del convertitore AD. Nello specifico la routine riportata nel listato 1 abilita tutti gli ingressi analogici e seleziona le tensioni di alimentazione come tensioni di riferimento (Vdd e Vss) oltre ad abilitare le interruzioni. Si noti come nell’inizializzazione di ADCON0 non sia stata avviata la conversione (GO/DONE=0) ma solamente abilitato il convertitore. Questo è fondamentale per assicurare che la conversione inizi solo dopo il tempo di acquisizione. Se durante la conversione viene forzato a zero il bit GO di ADCON0, la conversione viene interrotta e nei registri risultato viene mantenuto l’ultimo valore valido calcolato (ovvero il risultato della conversione precedente).

Qualcosa di utile

Una volta effettuata la conversione AD, si presenta spesso la necessità di visualizzare il risultato su un display alfanumerico o inviarlo via seriale ad una periferica remota. In questi casi è dunque necessario convertire il risultato ottenuto in una sequenza di caratteri ASCII. Ad esempio un risultato binario pari a 00001101 verrà convertito nelle cifre ASCII '1' e '3'. Per fare questo nel listato 2 è riportata una routine che interpreta il contenuto di W come un intero in forma esadecimale e lo converte nelle rispettive cifre ASCII. Le due cifre risultanti verranno posizionate nei registri Hta_L ed Hta_H.

Un consiglio

Se si intende utilizzare il convertitore AD per monitorare il livello della tensione di alimentazione, sarà sicuramente un errore utilizzare la stessa tensione come riferimento. Questo perché qualora la tensione di alimentazione diminuisse, la tensione di riferimento farebbe lo stesso falsando così il  risultato  dell’operazione  di conversione. Per ovviare al problema occorrerà quindi ricavare la tensione di riferimento in modo che questa sia indipendente dall’alimentazione (usando ad esempio un diodo zener o un regolatore integrato) quindi inviare all’ingresso del convertitore una partizione della tensione di alimentazione stessa. In questo modo anche se l’alimentazione varia, la tensione di  riferimento rimane fissa consentendo il corretto svolgimento dell’operazione di conversione.

BSF     STATUS, RP0      ;Selezione del bank1
CLRF    ADCON1           ;abilita tutti gli ingressi analogici
                         ;imposta Vss e Vdd come tensioni di riferimento
                         ;imposta l’allineamento del risultato a sinistra
BSF     PIE1, ADIE       ;abilita le interruzioni per il convertitore AD
BCF     STATUS, RP0      ;selezione bank0
MOVLW   11000001
MOVWF   ADCON0           ;Clock RC interno
                         ;accensione del convertitore (ADON=1)
                         ;selezione del canale AN0
BCF     PIR1, ADIF       ;azzeramento del flag interrupt del convertitore
BSF     INTCON, PEIE     ;abilitazione delle interruzioni per le periferiche
BSF     INTCON, GEIE     ;abilitazione delle interruzioni
;Prima di avviare la conversione si deve attendere il tempo di acquisizione
BSF     ADCON0, GO       ;avvio della conversione
;quando la conversione è completa si riceverà una interruzione.

HexToAscii
movwf    HexTemp            ;salvataggio di W
andlw     0x0F              ;azzeramento dei 4 bit più significativi
sublw     0x09              ;elaborazione della cifra meno significativa
movf       HexTemp, w
andlw     0x0F
btfss      STATUS, C
addlw     7
addlw     0x30              ;ottenimento del codice ASCII
movwf     Hta_L             ;salvataggio del risultato
swapf     HexTemp, w        ;inizio elaborazione cifra più significativa
andlw     0x0F
sublw     0x09
swapf     HexTemp, w andlw   0x0F
btfss     STATUS, C
addlw       7
addlw     0x30
movwf     Hta_H              ;salvataggio del risultato
return

Figura 7. Struttura dello stadio di campionamento di un ingresso analogico

Figura 7. Struttura dello stadio di campionamento di un ingresso analogico

Leggi anche:

Come eseguire la calibrazione di un ADC

Scarica subito una copia gratis

Una risposta

  1. Avatar photo Emanuele 11 Novembre 2015

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend