
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.
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.
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.
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.
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:
- 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). - 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. - Attendere il tempo di acquisizione (TACQ): questo punto sarà approfondito in seguito.
- Avviare la conversione:
la conversione viene avviata mediante il bit GO/DONE di ADCON0. - Attesa del completamento della conversione:
questa può essere fatta con un polling sul bit GO/DONE o mediante le interruzioni. - 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
Leggi anche:
Come eseguire la calibrazione di un ADC

Articolo molto utile a chi vuole utilizzare il convertitore analogico digitale a bordo dei microcontrollori PIC. Ma non solo, direi utile anche per capire come viene gestito l’AD converter interno ai microcontrollori un po’ in generale. Poi basta leggere il relativo datasheet per gli aggiustamenti da fare relativamente alla casa di micro utilizzata.