IL PIC 16F87XA E L'ADC
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.
DA QUI SI POSSONO SCARICARE I FILE SORGENTI .C E I FILE .EXE