Sei sulla pagina 1di 5

23 gennaio 2014

Mencarelli Simone
V B Elettonica e Telecomunicazioni
_________________________________________________________________________________

Relazione di sistemi
Oggetto:

il convertitore analogico digitale del pic 16f887

Schema pic16F887

Introduzione e funzionamento dellADC:


Il Pic 16f887 possiede internamente un convertitore analogico digitale a 10 bit che sfrutta il
metodo di conversione ad approssimazioni successive (il segnale, che deve essere
compreso tra Vref- e Vref+, viene comparato con tensioni sempre meno approssimate per
10 volte) Luscita quindi un numero binario a 10 bit, che pu assumere quindi 2 10 valori
diversi con un quanto pari a (Vref+ - Vref- )/210.
Il convertitore analogico digitale di questo dispositivo collegato su 14 ingressi multiplexati
su uno stesso sample and hold (che non pu essere bypassato) utilizzato dal convertitore il
cui risultato viene memorizzato su i registri ADRESL e ADRESH e pu essere allineato a
destra o a sinistra tramite il registro di configurazione ADCON1.ADFM (bit7).
Le tensioni di fondoscala possono essere prese sia come interne che come esterne tramite
una configurazione via software . Infine il convertitore analogico digitale pu generare un
interrupt a gine conversione che pu anche essere utilizzato per il wake-up dalla modalit di
Sleep.
(tradotto e adattato dal datasheet della Microchip)

_________________________________________________________________________________
-1-

23 gennaio 2014
Mencarelli Simone
V B Elettonica e Telecomunicazioni
_________________________________________________________________________________

Configurazione dei registri interessati

Nella tabella in figura (dal datasheet) sono riportati tutti i registri interessati nellutilizzo del
pic in modalit polling o interrupt.
Sono infatti riportati anche i registri di configurazione delle porte e degli interrupt.
I registri direttamente interessati nella configurazione e la lettura dellADC sono, invece
ADCON0, ADCON1, ANSEL, ANSELH, ADRESH e ADRESL.
Qui di seguito vengono presi in considerazione i vari registri singolarmente:
ADCON0:
Il registro in questione serve ad abilitare lADC, a settare il canale di ingresso e a impostare
il divisore di clock per avere un TAD adeguato.Tutti i bit del registro ADCON0 sono
normalente (al reset di power-on) posti a 0. Partendo dal Bit 0 sono:

B0: E denominato ADON e ponendolo a 1 si attiva il convertitore analogico


digitale.

B1: E denominato GO/DONE quando settato a 1 si ha lo start conversion.


Cio lADC comincia il processo di conversione. Quando la conversione terminata il Bit
1 sar riportato a 0 del microcontrollore. La fine conversione pu anche lanciare un
interrupt.

B2, B3, B4, B5: Sono denominati rispettivamente CHS0, CHS1, CHS2 e
CHS3 servono per selezionare la porta che deve essere collegata allADC al momento
della conversione. se per esempio voglio utilizzare il convertitore sul pin RA0 i bit in
questione dovranno essere posti tutti a 0. Come gia detto il convertitore analogico
digitale multiplexato su 14 ingressi scrivendo un numero tra 0 e 13 in forma binaria sui
registri in questione si potr utilizzare la porta corrispondente indicata nello schema
(AN0, AN1, . AN13)

B6 e B7: Sono denominati rispettivamente ADCS0 e ADCS1 servono a


_________________________________________________________________________________
-2-

23 gennaio 2014
Mencarelli Simone
V B Elettonica e Telecomunicazioni
_________________________________________________________________________________
impostare il fattore di divisione del clock per determinare il TAD: il tempo che impiega il
convertitore per fare unapprossimazione. Dato che il convertitore a 10 bit dovr fare
10 approssimazioni (successive) pi un tempo per il sample-hold che pu variare a
seconda dellimpedenza della fonte del segnale analogico ed altri parametri. In ogni
caso il settaggio dei registri in questione per scegliere il TAD pi appropriato pu essere
fatto semplicemente seguendo le indicazioni della tabella in figura (i riquadri in grigio
sono da considerarsi non appropriati).
Tabella presa dal datasheet della Microchip

ADCON1:
Il regisro ADCON1 contiene 3 bit di configurazione dellADC:

B4 e B5: sono denominati VCFG0 e VCFG1. Servono per scegliere le


tensioni di fondoscala come pari a Vdd e Vss (alimentazione del pic) o come esterne. se
VCFG0=1 allora la Vref+ presa esterna dal pin RA3 (vedi schema) altrimenti se
VCFG0=0 la Vref+ uguale a Vdd. Analogamente se VCFG1=0 la Vref- uguale a Vss
(GND) cio la massa interna del pic. Altrimenti se VCFG1=1 la Vref- presa estena dal
pin RA2.

B7: E denominato ADFM e serve per decidere se il risultato della conversione


sar allineato a destra o a sinistra nei registri ADRESH e ADRESL che sono entrambi
da 8 bit quindi per ogni conversione saranno presenti 8 bit del risultato su un registro e 2
bit sullaltro. Se ADFM=1 allora i 2 bit pi significativi saranno registrati sui primi 2 bit di
ADRESH, mentre i restanti 8 saranno registrati in ADRESL. Viceversa se ADFM=0 i 2 bit
meno significativi della conversione saranno registrati sugli ultimi 2 bit di ADRESL e i
restanti 8 saranno registrati in ADRESH.
I bit di ADCON1 sono normalmente (al reset di power-on) posti a 0.
ANSEL e ANSELH
Sono i bit che servono a decidere se un dato input deve essere usato come ingresso
analogico o digitale.
Ogni bit rappresenta uno dei piedini indicati nello schema come AN 013 partendo dal bit
meno significativo di ANSEL che serve a configurare AN0 fino al bit 5 di ANSELH che
corrisponde al piedino AN13.
Le porte per funzionare devono essere settate come ingressi (1) nei registri TRIS.
ANSEL e ANSELH hanno normalmente (al reset di power-on) tutti i bit settati a 1.
_________________________________________________________________________________
-3-

23 gennaio 2014
Mencarelli Simone
V B Elettonica e Telecomunicazioni
_________________________________________________________________________________

Esempi di acquisizione
Qui di seguito verr mostrata la configurazione e lutilizzo dei registri sopra spiegati in
MicroC:
//CONFIGURAZIONE DEI REGISTRI
ANSEL=0x00;
ANSELH=0x00; //Tutte le porte sono impostate come digitali
ANSEL.B0 = 1; // solo AN0 impostata come analogica
TRISA.B0 = 1; // Porta AN0 settata come Input
ADCON0.B0=1;

// LADC attivato

ADCON0.B2=0;
ADCON0.B3=0;
ADCON0.B4=0;
ADCON0.B5=0;

/* Selziono lingresso AN0 tramite i registri CHS0


CHS1
CHS2
e CHS3 di ADCON0*/

ADCON0.B6=0;
ADCON0.B7=1;

/* Il clock a 8MHz quindi scelgo un fattore di


divisione di Fosc/32. Vedi tabella 9-1 */

ADCON1.B7=1;
ADCON1.B5=1;
ADCON1.B4=1;

//Il risultato allineato a destra tramite ADFM


//Vref- presa esterna. usato il registro VCFG1
//Vref+ presa esterna. usato il registro VCFG0

/*Per utilizzare lADC in interrupt si


registri*/
INTCON.GIE=1;
// abilito
INTCON.PEIE=1;
// abilito
PIE1.ADIE=1;
// abilito

devono configurare i seguenti


interruzioni generali
interruzione periferiche
interruzione ADC

/*in MicroC ansich scrivere B0,B1 etc si pu anche sscivere direttamente


il nome del registro per sapere quali sono i bit interessati di ogni
registro si pu far riferimento alla tabella 9-2*/
//ACQUISIZIONE DATI DALLADC
/* Qui di seguito uno spezzone di programma che riguarda la conversione e
la copia del risultato di conversione in una variabile int */
//MODALITA POLLING
volatile unsigned int conversione;//definisco la variabile int
ADCON0.B1=1; //Start conversion il bit GO/DONE posto a 1
while(ADCON0.B1=1)//finch GO/DONE non torna a 0
{
asm {
nop ;Non fa niente finch GO/DONE non torna a 1

_________________________________________________________________________________
-4-

23 gennaio 2014
Mencarelli Simone
V B Elettonica e Telecomunicazioni
_________________________________________________________________________________
}
}
conversione=(ADRESH<<8)+ADRESL;
/*Quando
il
while

finito
la
conversione viene inserita nella variabile conversione facendo la somma
tra ADRESL e ADRESH shiftato di 8 posizioni */
//MODALITA INTERRUPT
/*Allinterno della routine di Interrupt pu essere richiamata
subroutine quando la conversione finita, in questo modo: */
// presumendo che il convertitore ha gia iniziato la conversione
if(PIR1.ADIF==1)
// se convertitore finito
{
conversione=(ADRESH<<8)+ADRESL; // vedi sopra
PIR1.ADIF=0; //si resetta il registro per future interruzioni
}

una

_________________________________________________________________________________
-5-