Tutorials - PIC 

 

PIC12F510 e PIC16F506


PIC12F510 - 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.

Nel PIC12F510 è integrato un modulo ADC da 8 bit, simile a quello del PIC16F506; il dato analogico è convertito in un numero binario tra 0 e 255.

Le caratteristiche principali sono le seguenti:

  • tre 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 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:

  1. Il convertitore AD è spento per default al POR.
  2. 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
  3. La selezione a 1 di ANS1:0 sovrappassa una diversa selezione effettuata nel registro TRIS.
     
  4. 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:

  • 500ns<Tad<50us

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:

  1. AN0
  2. AN1
  3. AN2
  4. 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


 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 30/04/13.