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 del 12F510 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.
ADCON0
ADCON0 è il registro di gestione dell'
ADC. Questa è la sua struttura:
ADCON0
|
bit
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
nome
|
ANS1
|
ANS0
|
ADCS1
|
ADCS0
|
CHS1
|
CHS0
|
GO/DONE
|
ADON
|
funzione
|
R/W
|
R/W
|
R/W
|
R/W
|
R/W
|
R/W
|
R/W
|
R/W
|
default
|
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0
|
-
bit
7:6 ANS1:0 : selezione degli ingressi analogici
00 = nessun pin è ingresso analogico
01 = GP2 come AN2
10 = GP2 e GP0 come AN2 e AN0
11 = GP2/1/0 come AN2/1/0 (default)
-
bit 5:4 ADCS1:0 :
selezione del clock di conversione
00 = Fosc/32
01 = Fosc/16
10 = Fosc/8
11 = INTOSC/4 (default)
-
bit
3:2 CHS1:0 : selezione del canale da convertire
00 = AN0
01 = AN1
10 = AN2
11 = 0.6V Vref (default)
-
bit
1 GO/DONE : Status della conversione
1
= conversione
in corso / avvio conversione (default)
0 = conversione
completata
-
bit
0 ADON : ADC Enable
1 = abilitato
0 = disabilitato (default)
In particolare:
INTCON
|
bit
|
Funzione
|
Valore |
ANS1:0
|
7:6
|
Questi bit, in coppia, attribuiscono la funzione
analogica ai pin GP2/1/0.
Per default tutti gli ingressi analogici sono attivi.
La scelta fatta con questi bit
è
valida anche se ADON = 0
|
- 00 nesuno
- 01 AN2
- 01 AN2 e AN0
- 11 AN2/1/0 (default)
|
ADCS1:0
|
5:4
|
Questi bit, in coppia, selezionano il clock a cui avviene la
conversione.
I primi tre valori sono relativi all' uso di un oscillatore esterno.
Con l' oscillatore interno la selezione è quella di default.
|
- 00 Fosc/32
- 01 Fosc/16
- 01 Fosc/8
- 11 INTOS/4 (default)
|
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
- 01 AN2
- 11 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
sono a 1.
Quindi al POR l' ADC è spento, ma GP2/1/0 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 cancellareANS1
- La selezione a 1 di ANS1:0
sovrappassa una
diversa selezione effettuata nel registro TRIS.
- La selezione di C1OUT=1
sovrappassa la selezione di AN2.
|
E' possibile utilizzare contemporaneamente i pin analogici come ingressi per il modulo ADC e per il comparatore. In tal
caso si dovrà verificare che la sorgente di tensione esterna abbia una impedenza sufficiente bassa per il doppio carico.
Conversione AD.
Il convertitore AD di questi PIC Baseline è molto semplificato rispetto ai
moduli ADC dei Mid-range e dei PIC18.
La conversione
richiede sempre un tempo fisso pari a 13 Tad. Con il clock a 4MHz, dato che
Tad=Fosc/4, la conversione si completa in 13us, che diventano 6.5us con il
clock a 8 MHz.
Esiste comunque la possibilità di uilizzare una frazione del clock esterno (FOSC/32-16-8);
questa scelta è derivata dal fatto che il modulo ADC è in comune con
PIC16F506 che può operare con clock esterno fino a 20 MHz. Per 12F510 queste
scelte non sono significative in quanto anche con oscillatore esterno non è
prevista la possibilità di superare gli 8 MHz.
Viene data comunque le seguenti linea guida:
e il foglio dati fornisce una tabella che lega il clock con il periodo del
ciclo di istruzione Tad = 1/(Fosc/divisore):
La tabella indica, con le aree
grigie, situazioni che non consentono una conversione AD corretta. Le colonne
con clock a 16 e 20 MHz riguardano il PIC16F506, il cui foglio dati è in
comune con il 12F510.
Il foglio dati a riguardo all' hardaware dell' ADC
indica uno schema funzionale del tutto analogo a quello dei moduli di
conversione implementati sui PIC Midrange e superiori. dato importante è che l' impedenza della sorgente
di tensione da misurare non deve superare i 10 kohm, pena la necessità
di introdurre un tempo di attesa per la carica del condensatore interno di
sample.
Questo tempo diventa sensibile quanto maggiore è l' impedenza della sorgente.
Però pare logico che, anche se la maggior parte degli esempi di codice disponibili
non lo prevede, sia opportuno introdurre una breve attesa per l' acquisizione tra la
scelta del canale da leggere e l' avvio della conversione.
Alcune note sulla conversione AD le
trovate qui.
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.
|
PIC16F506 - ADC
La situazione è analoga a quanto detto finora. Una differenze consiste
nella maggiore frequenza di
clock a cui il chip può operare obbliga ad una verifica del tempo di
conversione ed alla corretta assegnazione del valore ai bit ADCS1:0
per la selezione del clock del convertitore