Aquest és el nostre novè tutorial sobre l' aprenentatge de microcontroladors PIC mitjançant MPLAB i XC8. Fins ara, hem tractat molts tutorials bàsics com ara començar amb MPLABX, parpellejar LED amb PIC, temporitzadors en PIC, interfície LCD, interfície de 7 segments, etc. Si sou un principiant absolut, visiteu la llista completa de tutorials PIC aquí i començar a aprendre.
En aquest tutorial, aprendrem a utilitzar ADC amb el nostre microcontrolador PIC PICF877A. La majoria dels projectes de microcontroladors implicaran un convertidor ADC (analògic a digital), perquè és una de les maneres més utilitzades de llegir dades del món real. Gairebé tots els sensors com el sensor de temperatura, el de flux, el de pressió, els de corrent, els de voltatge, els giroscopis, els acceleròmetres, el sensor de distància i gairebé tots els sensors o transductors coneguts produeixen un voltatge analògic de 0V a 5V segons la lectura dels sensors. Un sensor de temperatura, per exemple, pot emetre 2,1 V quan la temperatura és de 25 ° C i pujar a 4,7 quan la temperatura és de 60 ° C. Per conèixer la temperatura del món real, l’MCU només ha de llegir la tensió de sortida d’aquest sensor de temperatura i relacionar-la amb la temperatura del món real. Per tant, ADC és una eina de treball important per a projectes MCU i permet aprendre com podem utilitzar-lo al nostre PIC16F877A.
Consulteu també els nostres articles anteriors sobre l’ús d’ADC en altres microcontroladors:
- Com utilitzar ADC a Arduino Uno?
- Tutorial ADC de Raspberry Pi
- Interfície ADC0808 amb microcontrolador 8051
ADC al microcontrolador PIC PIC16F877A:
Hi ha molts tipus d’ADC disponibles i cadascun té la seva pròpia velocitat i resolució. Els tipus més habituals d’ADC són flash, aproximació successiva i sigma-delta. El tipus d’ADC que s’utilitza a PIC16F877A s’anomena, en definitiva, ADC o SAR aproximació successiva. Així que aprenem una mica sobre SAR ADC abans de començar a utilitzar-lo.
ADC d'aproximació successiva: l'ADC SAR funciona amb l'ajut d'un comparador i algunes converses lògiques. Aquest tipus d’ADC utilitza un voltatge de referència (que és variable) i compara el voltatge d’entrada amb el voltatge de referència mitjançant un comparador i la diferència, que serà una sortida digital, es guarda des del bit més significatiu (MSB). La velocitat de la comparació depèn de la freqüència de rellotge (Fosc) en què funciona el PIC.
Ara que coneixem alguns aspectes bàsics sobre ADC, obrim el nostre full de dades i aprenem a utilitzar l'ADC a la nostra MCU PIC16F877A. El PIC que estem utilitzant té un ADC de 10 bits de 8 canals. Això significa que el valor de sortida del nostre ADC serà de 0-1024 (2 ^ 10) i hi ha 8 pins (canals) a la nostra MCU que poden llegir la tensió analògica. El valor 1024 s’obté per 2 ^ 10 ja que el nostre ADC és de 10 bits. Els vuit pins que poden llegir la tensió analògica s’esmenten al full de dades. Vegem la imatge següent.

Els canals analògics AN0 a AN7 estan destacats per a vosaltres. Només aquests pins poden llegir la tensió analògica. Per tant, abans de llegir una tensió d’entrada hem d’especificar al nostre codi quin canal s’ha d’utilitzar per llegir la tensió d’entrada. En aquest tutorial utilitzarem el canal 4 amb un potenciòmetre per llegir la tensió analògica d’aquest canal.
El mòdul A / D té quatre registres que s'han de configurar per llegir les dades dels pins d'entrada. Aquests registres són:
• Registre alt de resultats A / D (ADRESH)
• Registre baix de resultats A / D (ADRESL)
• Registre de control A / D 0 (ADCON0)
• Registre de control A / D 1 (ADCON1)
Programació per ADC:
El programa per utilitzar ADC amb microcontrolador PIC és molt senzill, només hem d’entendre aquests quatre registres i llegir la tensió analògica serà senzill. Com és habitual, inicialitzeu els bits de configuració i comencem amb el void main ().
Dins del void main () hem d’inicialitzar el nostre ADC mitjançant el registre ADCON1 i el registre ADCON0. El registre ADCON0 té els bits següents:

En aquest registre hem d’encendre el mòdul ADC fent ADON = 1 i activar el rellotge de conversió A / D mitjançant els bits ADCS1 i ADCS0, la resta no estarà configurada per ara. Al nostre programa es selecciona el rellotge de conversió A / D com a Fosc / 16. Podeu provar les vostres pròpies freqüències i veure com canvia el resultat. Els detalls complets estan disponibles a la pàgina 127 del full de dades. Per tant, ADCON0 s'inicialitzarà de la manera següent.
ADCON0 = 0b01000001;
Ara el registre ADCON1 té els següents bits:

En aquest registre hem de fer que el format de resultat A / D seleccioni el bit per ADFM = 1 i que ADCS2 = 1 torni a seleccionar el Fosc / 16. Els altres bits segueixen sent zero, ja que hem planejat utilitzar la tensió de referència interna. Els detalls complets estan disponibles a la pàgina 128 del full de dades. Per tant, ADCON1 establirem el següent.
ADCON1 = 0x11000000;
Ara, després d’inicialitzar el mòdul ADC dins de la nostra funció principal, entrem al bucle while i comencem a llegir els valors ADC. Per llegir un valor ADC, cal seguir els passos següents.
- Inicialitzeu el mòdul ADC
- Seleccioneu el canal analògic
- Inicieu ADC fent que Go / Done sigui una mica elevat
- Espereu que el bit Go / DONE baixi
- Obteniu el resultat ADC del registre ADRESH i ADRESL
1. Inicialitzeu el mòdul ADC: ja hem après a inicialitzar un ADC, de manera que només anomenem aquesta funció següent per inicialitzar l'ADC
La funció void ADC_Initialize () és la següent.
void ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON i Fosc / 16 està seleccionat ADCON1 = 0b11000000; // Es selecciona el voltatge de referència intern}
2. Seleccioneu el canal analògic: ara hem de seleccionar quin canal utilitzarem per llegir el valor ADC. Anem a fer una funció per això, així que serà fàcil per a nosaltres per canviar entre cada canal dins el temps de bucle.
unsigned int ADC_Read (canal de caràcters sense signar) {// **** Selecció del canal ** /// ADCON0 & = 0x11000101; // Esborrar els bits de selecció del canal ADCON0 - = canal << 3; // Configuració dels bits necessaris // ** Selecció de canal completa *** ///}
A continuació, el canal a seleccionar es rep dins del canal variable. A la línia
ADCON0 & = 0x1100101;
La selecció de canal anterior (si n’hi ha) s’esborra. Això es fa utilitzant l'operador bit & bit i "&". Els bits 3, 4 i 5 es veuen obligats a ser 0 mentre que els altres es queden en els seus valors anteriors.
A continuació, es selecciona el canal desitjat canviant el número de canal tres vegades a l'esquerra i configurant els bits mitjançant el bit o l'operador "-".
ADCON0 - = canal << 3; // Configuració dels bits necessaris
3. Inicieu ADC fent que Go / Done sigui alt: un cop seleccionat el canal, hem d'iniciar la conversió ADC simplement fent que el GO_nDONE sigui alt:
GO_nDONE = 1; // Inicialitza la conversió A / D
4. Espereu que el bit Go / DONE baixi: el bit GO / DONE es mantindrà alt fins que la conversió ADC s'hagi completat, per tant, hem d'esperar fins que aquest bit baixi de nou. Això es pot fer mitjançant l'ús d'un temps de bucle.
mentre que (GO_nDONE); // Espereu a que finalitzi la conversió A / D
5. Obteniu el resultat ADC del registre ADRESH i ADRESL: quan el bit Go / DONE torna a baixar, vol dir que la conversió ADC s'ha completat. El resultat de l’ADC serà un valor de 10 bits. Com que la nostra MCU és una MCU de 8 bits, el resultat es divideix en 8 bits superior i en 2 bits inferior. El resultat superior de 8 bits s’emmagatzema al registre ADRESH i el de 2 bits inferior s’emmagatzema al registre ADRESL. Per tant, hem de sumar-los als registres per obtenir el nostre valor ADC de 10 bits. La funció retorna aquest resultat com es mostra a continuació:
retorn ((ADRESH << 8) + ADRESL); // Retorna el resultat
Aquí es mostra la funció completa que s’utilitza per seleccionar el canal ADC, activar-lo i retornar el resultat.
unsigned int ADC_Read (canal de caràcters sense signar) {ADCON0 & = 0x11000101; // Esborrar els bits de selecció del canal ADCON0 - = canal << 3; // Configuració dels bits necessaris __delay_ms (2); // Temps d'adquisició per carregar el condensador GO_nDONE = 1; // Inicialitza la conversió A / D mentre (GO_nDONE); // Espereu que la conversió A / D completi la devolució ((ADRESH << 8) + ADRESL); // Retorna el resultat}
Ara tenim una funció que prendrà la selecció del canal com a entrada i ens retornarà el valor ADC. Per tant podem anomenar directament a aquesta funció dins del nostre temps de bucle, ja que estem llegint el voltatge analògic de canal 4 en aquest tutorial, la crida de funció serà el següent.
i = (ADC_Llegir (4)); // emmagatzemeu el resultat d’adc a “i”.
Per visualitzar la sortida del nostre ADC necessitarem algun tipus de mòduls de visualització com la pantalla LCD o el segment de 7. En aquest tutorial fem servir una pantalla de 7 segments per verificar la sortida. Si voleu saber com utilitzar 7 segments amb foto, seguiu el tutorial aquí.
A continuació es dóna el codi complet i el procés també s’explica al vídeo al final.
Configuració i proves de maquinari:
Com de costum, simuleu el codi mitjançant Proteus abans d’anar realment amb el nostre maquinari, els esquemes del projecte es mostren a continuació:

Les connexions del mòdul de visualització de 7 segments de 4 dígits amb microcontrolador PIC són les mateixes que el projecte anterior, acabem d’afegir un potenciòmetre al pin 7 que és el canal analògic 4. Al variar el pot, s’enviarà un voltatge variable a la MCU que llegirà el mòdul ADC i es mostrarà al mòdul de visualització de 7 segments. Consulteu el tutorial anterior per obtenir més informació sobre la visualització de 4 dígits de 7 segments i la seva interfície amb PIC MCU.
Aquí hem utilitzat la mateixa placa de microcontrolador PIC que hem creat al tutorial de parpelleig de LED. Després de garantir la connexió, pengeu el programa a PIC i hauríeu de veure una sortida com aquesta


Aquí hem llegit el valor ADC del pot i el hem convertit al voltatge real mapejant la sortida 0-1024 com a 0-5 volts (com es mostra al programa). El valor es mostra al segment de 7 i es verifica mitjançant el multímetre.
És a dir, ara estem preparats per utilitzar tots els sensors analògics disponibles al mercat, seguiu endavant i proveu-ho i, si teniu problemes com sempre, utilitzeu la secció de comentaris, estarem encantats d’ajudar-vos.
