Get Adobe Flash player

IL PIC 16F87XA E L'ADC

User Rating:  / 1
PoorBest 

Link Articolo Originale: http://www.grix.it/viewer.php?page=10488

 

Per una mia esigenza progettuale ho dovuto studiarmi l'ADC (ANALOG TO DIGITAL CONVERTER) e ho pensato di rendere partecipi tutti voi del mio lavoro, secondo lo spirito di GRIX.

Chi, come me, è alle prime armi nella programmazione di questi microcontrollori, spero  apprezzi questo semplice tutorial che cerca di introdurre il lettore all'uso dell'adc.


Descrizione

Il modulo adc dei pic 16f87xa dispone delle seguenti caratteristiche :

 - due registri ADCON0 e ADCON1 per la configurazione e il controllo.

- due registri ADRESH e ADRESl che contengono il risultato della conversione in quanto la risoluzione è di   10 bit.

Registro ADCON0

E' il registro che ci permette di accendere e spegnere il modulo, avviare l'operazione di conversione,

specificare l'ingresso dal quale prelevare il segnale analogico ecc.

Ma entriamo nello specifico:

-bit 7 e 6 (ADCS1 -ADCS2) servono insieme ad un terzo bit  ADCS3 presente nel registro ADCON1 e  servono a selezionare la frequenza di clock con la quale far funzionare il convertitore. La tabella sottostante chiarirà il concetto.

Fosc rappresenta la frequenza di Clock del pic.

-bit 5,4,3 (CHS2, CHS1, CHS0): con questi bit possiamo selezionare l'ingresso analogico dal quale prelevare il segnale.

N.B. I pin che si possono utilizzare per acquisire un segnale analogico sono segnati sul datasheet con la sigla ANx, dove la x indica il numero della porta analogica che non corrisponde alla numerazione della porta digitale. 

La tabella sottostante ci chiarirà come utilizzare i bit 5,4,3.(CHS2, CHS1,CHS0)



-bit 2 (GO/DONE): ponendo a 1 tale bit si avvia il convertitore. Finita la conversione il bit viene posto a 0  dal pic.

-bit 1 è inutilizzato.

-bit 0 (ADON): ponendo tale bit a 1  accendiamo il convertitore, a 0 lo spegniamo. Questo per limitare il cosumo della corrente.

Registro ADCON1

 

Come ho scritto sopra, il risultato della conversione è un valore a 10 bit quindi per poter memorizzare il valore bisogna utilizzare due registri a 8 bit: i due registri sono ADRESH e ADRESI .

Memorizzando 10 bit in due registri da 8 bit rimaranno inutilizzati 6 bit . Tali bit possono rimanere inutilizzati verso destra o verso sinistra.

Il grafico sottostante chiarirà il concetto sopra menzionato.

 

Il bit 7 (ADMF) serve a giustificare verso destra o verso sinistra il risultato della conversione.

Se poniamo il bit ADMF a 1 gli 8 bin meno significativi saranno memorizzati in ADRESL, i bit 9 e 10 della conversione saranno memorizzati in ADRESH nelle posizioni 0 e 1.

Gli altri 6 bit (bit 2,3,4,5,6,7) di ADRESH vengono posti a 0.

Se si pone il bit ADMF a 0 sarà esattamente il contrario. 

-bit 6 (ADCS2) insieme ai bit 7 e 6 del registro ADCON0 serve a selezionare la frequenza del clock come ho scritto sopra.

-bit 5,4 sono inutilizzati.

-bit 3,2,1,0 (PCFG3,PCFG2,PCFG1,PCFG0) servono a impostare quali ingressi si devono comportare come ingressi analogici o  a quali ingressi potremo applicare una tensione di riferimento.

La tabella chiarirà  quello che ho detto prima.

Come si può vedere dalla tabella, possiamo utilizzare delle tensioni di riferimento in assenze di queste il pic utilizzerà la tensione di alimentazione.

Dalla teoria alla pratica.

A questo punto, per fare chiarezza in quello che avevo studiato, ho inventato  una semplice applicazione che proporrò anche a voi.

Con un potenziometro si accendono in sequenza una serie di led.


Schema

Il pic utilizzato è il pic16f876a

Penso che lo schema non abbia bisogno di commenti, da notare comunque che ho collegato il potenziometro al pin 2 che in questo caso assume la funzione di ingresso analogico 0.

Flow chart  

 

Vista la semplicità dell'esempio, qualcuno potrebbe pensare che il flow chart sia inutile  Ho voluto inserirlo per una maggiore chiarezza e completezza e perchè quest'articolo è scritto per coloro che come me sono agli inizi nella conoscenza di questi microprocessori. 

Codice sorgente

 Il codice sorgente è scritto in c e come compilatore ho usato il mikroC PRO.

Nel codice sorgente utilizzo una funzione presente nella fornita libreria del compilatore.

Prototipo : unsigned ADC_Read(unsigned short channel); 

Questa funzione restituisce  un valore convertito in 10 bit.

Utilizza l'oscillatore interno RC.

Il parametro channel indica alla funzione su quale porta analogica si vuole andare a leggere il valore della tensione. 

 // Dichiarazione delle variabili
 
      unsigned int led;
 
// Configurazione ingresso analogico
 
      adcon0 = 11000101;    //Configuro l'adc per l'uso dell'oscillatore interno,seleziono il pin AN0
 
      adcon1 = 11000000;    //imposto tutti gli ingressi e prendo come tensione di riferimento quella di                                             //alimentazione.
 
// Configurazione I/O digitali
 
       trisa = 00000001;
       trisb = 0;
       trisc = 0;
 
   while(1){
 
               led =Adc_Read(0);
 
                   if (led<64)
                       {portc=0;}
 
                   else if (led<=128)
                             {portc=1;}
 
                   else if (led<=256)
                             {portc=3;}
 
                   else if (led<=384)
                             {portc=7;}
 
                   else if (led <=512)
                             {portc =15;}
 
                   else if (led <=640)
                             {portc =31;}
 
                   else if (led <=768)
                             {portc=63;}
 
                   else if(led <=896)
                            {portc =127;}
 
                   else
                            {portc =255;}
 
Conclusioni
 
Quest' esercizio didattico è stato montato su una breadboard di cui propongo le foto.
 
 

   

 DA QUI SI POSSONO SCARICARE I FILE SORGENTI .C E I FILE .EXE

Login Form

Elettronica Open Source