ADC
Il convertitore analogico/digitale (ADC) ha la funzione di trasformare un segnale variabile tra 0 e la Vdd in un
dato binario equivalente.
La tensione massima applicabile ad un ingresso analogico non
può superare la massima consentita per il chip, quindi 5.5V.
Valori
maggiori danneggeranno irrimediabilmente il microcontroller.
|
Se dobbiamo misurare tensioni maggiori occorrerà inserire almeno un partitore.
Nei PIC10F220/222 è integrato un
modulo ADC da 8 bit: il dato analogico è convertito in un numero
binario tra 0 e 255.
Le caratteristiche principali sono le seguenti:
- due ingressi selezionabili
- sorgente del clock dall' oscillatore principale
- un solo registro ADRES raccoglie il risultato a 8 bit della
conversione
- generatore di tensione a 0.6V.
La tensione di riferimento della conversione analogico-digitale, dato il
basso numero di pin disponibili, non fa capo a tensioni esterne oltre alla Vdd.
Il chip è
alimentabile con tensioni tra 2 e 5.5 V, quindi questa tensione sarà il
riferimento della conversione e il valore massimo applicabile all' ingresso
analogico.
|
La sezione analogica comprende anche un generatore di tensione a
0.6V, la cui funzione sarà descritta più avanti.
La conversione AD non è possibile in sleep, dato che il modulo non ha una
sorgente propria di clock. Maggiori informazioni sul funzionamento del modulo
ADC e di sleep sono rilevabili dal foglio dati.
Il modulo AD può essere abilitato e disabilitato da programma agendo sul
registro ADCON0 che contiene i bit di
controllo di questa funzione.
Al POR il convertitore non è
abilitato, per minimizzare il consumo di energia.
Se è richiesta la sua funzione, occorre abilitarlo da programma agendo
su ADCON0. |
ADCON0
ADCON0 è il registro di gestione dell'
ADC.
struttura:
ADCON0
|
bit
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
nome
|
ANS1
|
ANS0
|
-
|
-
|
CHS1
|
CHS0
|
GO/DONE
|
ADON
|
funzione
|
R/W
|
R/W
|
-
|
-
|
R/W
|
R/W
|
R/W
|
R/W
|
default
|
1 |
1 |
0 |
0 |
1 |
1 |
0 |
0
|
-
bit 7
ANS1 : ADC analog input 0 pin selection
1 = GP1 come ingresso analogico AN1
0 = GP1 come I/O
-
bit
6 ANS0
: ADC analog input 1 pin
selection
1 = GP0 come ingresso
analogico AN1
0 = GP0 come I/O
-
bit
5:4
reserved
: non
utilizzati - read 0
-
bit 3:2 CHS1:0 :
ADC Channel Select
00 = canale 0
01 = canale 1
1x = riferimento interno 0.6V
-
bit
1 GO/DONE
: ADC Conversion
Status
1
= conversione
in corso / avvio conversione
0 = conversione
completata
-
bit
0 ADON : ADC Enable Bit
1 = abilitato
0 = disabilitato
In particolare:
INTCON |
bit |
Funzione |
Valore |
ANS1
ANS0 |
7
6 |
Questi bit, separatamente, attribuiscono la funzione
analogica ai pin GP1/GP0. Sono validi anche se
ADON = 0 |
|
CHS1:0 |
3:2 |
Questi bit selezionano il canale da convertire. Vanno a
11 dopo ogni genere di reset. In questa condizione l' ADC è collegato
alla tensione di riferimento interna. |
- 00 AN0
- 01 AN1
- 1x Vref interna (default)
|
GO/DONE |
1 |
E' il tipico bit di comando/flag.
Se portato da programma a 1 avvia la conversione. Dopo di questo,
permane a livello 1 fino a che la conversione è conclusa. |
- 1 conversone in corso
- 0 conversione non in
corso (default)
|
ADON |
0 |
Questo bit accende o spegne il convertitore per ridurre
il consumo. |
- 1 acceso
- 0 spento (default)
|
Sono da notare alcune caratteristiche:
- Il convertitore AD è spento per default al POR.
- Nonostante questo, occorre considerare che i i bit ANS1:0
per
default sopno a 1.
Quindi al POR l' ADC è spento, ma GP1 e GP0
sono comunque configurati come ingressi analogici; questa
"stranezza" è impostata sempre nell' ottica del minore
consumo.
Ne deriva che per usare i pin come GPIO occorre cancellare ANS1:0
- La selezione a 1 di ANS1:0
sovrappassa
una diversa selezione effettuata nel registro TRIS.
|
Conversione AD.
Il convertitore AD di questi PIC Baseline è molto semplificato rispetto ai moduli ADC dei Mid-range e dei PIC18.
Non esiste, qui, un registro di scelta dei tempi di conversione, che richiede
sempre un tempo fisso pari a 13 Tad. Con il clock a 4MHz, dato che Tad=Fosc/4, la
conversione si completa in 13 u, che diventano 6.5us con il clock a 8 MHz.
Il foglio dati a riguardo dell' ADC è molto parco di informazioni;
anzi, esiste
praticamente solo l' indicazione che l' impedenza della sorgente di tensione da
misurare non deve superare i 10 kohm. Si deve quindi supporre che il circuito
di ingresso sia analogo a quello implementato sugli altri PIC
maggiori. Quindi, all' applicazione della tensione da misurare occorrerebbe
valutare un tempo di carica per il condensatore interno di sample, che diventa
sensibile quanto maggiore è l' impedenza della sorgente. Di questo problema,
però, il foglio dati non fa cenno, nè ci sono parametri relativi ai tempi
necessari alla conversione.
Però pare logico che, anche se la maggior parte degli esempi di codice non lo
prevede, sia opportuno introdurre una breve attesa per l'
acquisizione tra la scelta
del canale da leggere e l' avvio della conversione.
Un esempio di codice :
readADC movlw b'10000101' ;
ingresso AN1, ADC on
movwf ADCON0
call
delay10us ;tempo di acquisizione
bsf
ADCON0, 1 ;avvia conversione
adl nop
btfsc ADCON0,
1 ;attesa fine conversione
goto
adl
movf
ADRES, W ;risultato in W |
Dato che il tempo di conversione è fisso, dovrebbe essere anche possibile
eliminare il loop di polling del bit
GO/DONE con un ritardo di
almeno 13 cicli di istruzione.
Si deve supporre anche che il massimo rate di conversioni al secondo sia
limitato anche dalla necessità di un tempo di set tra una conversione e la
successiva, cosa che, data la relativamente bassa frequenza del clock,
dovrebbe essere coperto dal tempo richiesto dalle istruzioni di lettura e
salvataggio del risultato.
La Vref
a 0.6V
Nell' area analogica del PIC12F510,
come in quella di PIC16F506
si trova anche una sorgente di tensione
di riferimento; si
tratta di un band gap generator a 0.6V.
Come possiamo osservare dall' analisi del registro ADCON0
, in effetti le possibili letture analogiche sono 4:
- AN0
- AN1
- AN2
- Vref
Ci si può chiedere a cosa serva la misura di Vref
(CHS1:0 = 11), se, per
definizione, è un valore di riferimento, quindi il più possibile costante.
Consideriamo che il risultato della lettura di Vref sarà
dato da 0,6 V / VDD * 255 ,
ovvero, con una Vdd= 5V:
0.6 / 5 * 255 = 30
Se la tensione di alimentazione è
3.3V:
0.6 / 3.3 * 255 = 46
Si può quindi notare che la conversione rende come risultato il rapporto
tra la Vref e la Vdd; e questo cambia con il variare della Vdd.
Una funzione di questa lettura, dunque, è la verifica della tensione di
alimentazione. Ad esempio, se la Vdd scende al di sotto di 3.3V, il valore
convertito cresce (a 2.5 V sarà uguale a 61). Quindi è possibile un
controllo indiretto sullo stato della Vdd.
Un' altra funzione è quella di verificare e correggere eventuali errori di
conversione dovuti a sensibili variazioni della Vdd; questo si può ottenere
campionando ciclicamente la Vref.
Il
valore della tensione di riferimento interno varia con la temperatura e le
tolleranze costruttive ed è sensibile al rumore elettrico o ripple sulla Vdd
e sui pin di I/O. La
sua precisione non è indicata sul foglio dati.
In ogni caso, dato che il riferimento della misura analogica è la Vdd,
occorrerà che questa sia quanto possibile stabile, libera da ripple e
disturbi, per ottenere delle letture analogiche ragionevolmente precise.
La Vref a 0.6V
non deve essere confusa con la tensione di riferimento della conversione
AD che è derivata dalla Vdd.
|
|