Tutorials - PIC 

 

PIC10F220/222


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
  • 1   ADC (default)
  • 0   GPIO
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:

  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.

 

 

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