- ADC en el microcontrolador PIC PIC16F877A:
- Programación para ADC:
- Configuración y prueba de hardware:
Este es nuestro noveno tutorial de aprendizaje de microcontroladores PIC usando MPLAB y XC8. Hasta ahora, hemos cubierto muchos tutoriales básicos como comenzar con MPLABX, LED parpadeando con PIC, temporizadores en PIC, LCD de interfaz, 7 segmentos de interfaz, etc. Si es un principiante absoluto, visite la lista completa de tutoriales de PIC aquí y empieza a aprender.
En este tutorial, aprenderemos cómo usar ADC con nuestro microcontrolador PIC PICF877A. La mayoría de los proyectos de microcontroladores incluirán un ADC (convertidor analógico a digital), porque es una de las formas más utilizadas para leer datos del mundo real. Casi todos los sensores como sensor de temperatura, sensor de flujo, sensor de presión, sensores de corriente, sensores de voltaje, giroscopios, acelerómetros, sensor de distancia y casi todos los sensores o transductores conocidos producen un voltaje analógico de 0 V a 5 V según la lectura de los sensores. Un sensor de temperatura, por ejemplo, puede dar 2,1 V cuando la temperatura es de 25 ° C y subir a 4,7 cuando la temperatura es de 60 ° C. Para conocer la temperatura del mundo real, la MCU solo tiene que leer el voltaje de salida de este sensor de temperatura y relacionarlo con la temperatura del mundo real. Por lo tanto, ADC es una herramienta de trabajo importante para proyectos de MCU y aprendamos cómo podemos usarlo en nuestro PIC16F877A.
Consulte también nuestros artículos anteriores sobre el uso de ADC en otros microcontroladores:
- ¿Cómo usar ADC en Arduino Uno?
- Tutorial de Raspberry Pi ADC
- Interfaz ADC0808 con microcontrolador 8051
ADC en el microcontrolador PIC PIC16F877A:
Hay muchos tipos de ADC disponibles y cada uno tiene su propia velocidad y resolución. Los tipos más comunes de ADC son flash, aproximación sucesiva y sigma-delta. El tipo de ADC utilizado en PIC16F877A se denomina ADC de aproximación sucesiva o SAR en breve. Así que aprendamos un poco sobre SAR ADC antes de comenzar a usarlo.
ADC de aproximación sucesiva: El ADC de SAR funciona con la ayuda de un comparador y algunas conversaciones lógicas. Este tipo de ADC usa un voltaje de referencia (que es variable) y compara el voltaje de entrada con el voltaje de referencia usando un comparador y la diferencia, que será una salida digital, se guarda del bit más significativo (MSB). La velocidad de la comparación depende de la frecuencia del reloj (Fosc) en la que está funcionando el PIC.
Ahora que conocemos algunos conceptos básicos sobre ADC, abramos nuestra hoja de datos y aprendamos a usar el ADC en nuestra MCU PIC16F877A. El PIC que estamos usando tiene ADC de 8 canales de 10 bits. Esto significa que el valor de salida de nuestro ADC será 0-1024 (2 ^ 10) y hay 8 pines (canales) en nuestro MCU que pueden leer voltaje analógico. El valor 1024 se obtiene por 2 ^ 10 ya que nuestro ADC es de 10 bits. Los ocho pines que pueden leer el voltaje analógico se mencionan en la hoja de datos. Veamos la imagen de abajo.
Los canales analógicos AN0 a AN7 están resaltados para usted. Solo estos pines podrán leer voltaje analógico. Entonces, antes de leer un voltaje de entrada, tenemos que especificar en nuestro código qué canal debe usarse para leer el voltaje de entrada. En este tutorial usaremos el canal 4 con un potenciómetro para leer el voltaje analógico en este canal.
El módulo A / D tiene cuatro registros que deben configurarse para leer datos de los pines de entrada. Estos registros son:
• Registro alto de resultado A / D (ADRESH)
• Registro bajo de resultado A / D (ADRESL)
• Registro de control A / D 0 (ADCON0)
• Registro de control A / D 1 (ADCON1)
Programación para ADC:
El programa para usar ADC con Microcontrolador PIC es muy simple, solo tenemos que entender estos cuatro registros y luego leer cualquier voltaje analógico será simple. Como de costumbre, inicialice los bits de configuración y comencemos con void main ().
Dentro de void main () tenemos que inicializar nuestro ADC usando el registro ADCON1 y el registro ADCON0. El registro ADCON0 tiene los siguientes bits:
En este registro tenemos que encender el módulo ADC haciendo ADON = 1 y encender el Reloj de Conversión A / D usando los bits ADCS1 y ADCS0, el resto no se configurará por ahora. En nuestro programa, el reloj de conversión A / D se selecciona como Fosc / 16. Puede probar sus propias frecuencias y ver cómo cambia el resultado. Los detalles completos están disponibles en la página 127 de la hoja de datos. Por lo tanto, ADCON0 se inicializará de la siguiente manera.
ADCON0 = 0b01000001;
Ahora el registro ADCON1 tiene los siguientes bits:
En este registro tenemos que hacer A / D Result Format Select bit alto por ADFM = 1 y hacer ADCS2 = 1 para seleccionar Fosc / 16 nuevamente. Los otros bits permanecen en cero, ya que hemos planeado usar el voltaje de referencia interno. Los detalles completos están disponibles en la hoja de datos de la página 128. Por lo tanto, ADCON1 configuraremos de la siguiente manera.
ADCON1 = 0x11000000;
Ahora, después de inicializar el módulo ADC dentro de nuestra función principal, entremos en el ciclo while y comencemos a leer los valores ADC. Para leer un valor de ADC se deben seguir los siguientes pasos.
- Inicializar el módulo ADC
- Seleccione el canal analógico
- Inicie ADC haciendo que Go / Done sea un poco alto
- Espere a que el bit Go / DONE baje
- Obtenga el resultado ADC del registro ADRESH y ADRESL
1. Inicialice el módulo ADC: ya hemos aprendido cómo inicializar un ADC, así que simplemente llamamos a esta función a continuación para inicializar el ADC
La función void ADC_Initialize () es la siguiente.
anular ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON y Fosc / 16 está seleccionado ADCON1 = 0b11000000; // Se selecciona la tensión de referencia interna}
2. Seleccionar el canal analógico: Ahora tenemos que seleccionar qué canal vamos a utilizar para leer el valor ADC. Vamos a hacer una función para esto, así que será fácil para nosotros para cambiar entre cada canal dentro del tiempo de bucle.
unsigned int ADC_Read (canal de caracteres sin firmar) {// **** Selección del canal ** /// ADCON0 & = 0x11000101; // Borrar los bits de selección de canal ADCON0 - = canal << 3; // Configuración de los bits necesarios // ** Selección de canal completa *** ///}
Luego, el canal a seleccionar se recibe dentro del canal variable. En la linea
ADCON0 & = 0x1100101;
Se borra la selección de canal anterior (si existe). Esto se hace usando el operador bit a bit y “&”. Los bits 3, 4 y 5 se obligan a ser 0 mientras que los demás se dejan en sus valores anteriores.
Luego, el canal deseado se selecciona desplazando a la izquierda el número de canal tres veces y configurando los bits usando el bit a bit o el operador “-”.
ADCON0 - = canal << 3; // Configuración de los bits necesarios
3. Inicie ADC haciendo que el bit Go / Done sea alto: Una vez que se selecciona el canal, tenemos que iniciar la conversión de ADC simplemente haciendo que el bit GO_nDONE sea alto:
GO_nDONE = 1; // Inicializa la conversión A / D
4. Espere a que el bit Go / DONE baje: El bit GO / DONE permanecerá alto hasta que se complete la conversión ADC, por lo tanto, tenemos que esperar hasta que este bit vuelva a bajar. Esto se puede hacer mediante el uso de un tiempo de bucle.
mientras (GO_nDONE); // Espere a que se complete la conversión A / D
5. Obtenga el resultado ADC de los registros ADRESH y ADRESL: Cuando el bit Go / DONE vuelve a bajar, significa que la conversión ADC está completa. El resultado del ADC será un valor de 10 bits. Dado que nuestra MCU es una MCU de 8 bits, el resultado se divide en 8 bits superiores y 2 bits inferiores. El resultado superior de 8 bits se almacena en el registro ADRESH y el inferior de 2 bits se almacena en el registro ADRESL. Por lo tanto, tenemos que sumarlos a los registros para obtener nuestro valor ADC de 10 bits. Este resultado es devuelto por la función como se muestra a continuación:
return ((ADRESH << 8) + ADRESL); // Devuelve el resultado
Aquí se muestra la función completa que se utiliza para seleccionar el canal ADC, activar el ADC y devolver el resultado.
unsigned int ADC_Read (canal de caracteres sin firmar) {ADCON0 & = 0x11000101; // Borrar los bits de selección de canal ADCON0 - = canal << 3; // Configurando los Bits requeridos __delay_ms (2); // Tiempo de adquisición para cargar el condensador de retención GO_nDONE = 1; // Inicializa la conversión A / D while (GO_nDONE); // Espere a que se complete la conversión A / D return ((ADRESH << 8) + ADRESL); // Devuelve el resultado}
Ahora tenemos una función que tomará la selección del canal como entrada y nos devolverá el valor ADC. Por lo tanto podemos llamar directamente a esta función dentro de nuestro tiempo de bucle, ya que estamos leyendo el voltaje analógico del canal 4 en este tutorial, la llamada de función será el siguiente.
i = (ADC_Read (4)); // almacena el resultado de adc en "i".
Para visualizar la salida de nuestro ADC necesitaremos algún tipo de módulos de visualización como el LCD o el segmento de 7. En este tutorial usamos una pantalla de 7 segmentos para verificar la salida. Si desea saber cómo usar 7 segmentos con imagen, siga el tutorial aquí.
El código completo se proporciona a continuación y el proceso también se explica en el video al final.
Configuración y prueba de hardware:
Como es habitual simular el código usando Proteus antes de irnos realmente con nuestro hardware, a continuación se muestran los esquemas del proyecto:
Las conexiones del módulo de visualización de siete segmentos de 4 dígitos con microcontrolador PIC son las mismas que en el proyecto anterior, acabamos de agregar un potenciómetro al pin 7 que es el canal analógico 4. Al variar el potenciómetro, se enviará un voltaje variable a la MCU que será leído por el módulo ADC y mostrado en el módulo de pantalla de 7 segmentos. Consulte el tutorial anterior para obtener más información sobre la pantalla de 7 segmentos de 4 dígitos y su interfaz con PIC MCU.
Aquí hemos utilizado la misma placa de microcontrolador PIC que hemos creado en el Tutorial de parpadeo de LED. Después de asegurar la conexión, cargue el programa en PIC y debería ver una salida como esta
Aquí hemos leído el valor de ADC del potenciómetro y lo convertimos al voltaje real mapeando la salida 0-1024 como 0-5 voltios (como se muestra en el programa). Luego, el valor se muestra en el segmento 7 y se verifica con el multímetro.
Eso es todo, ahora estamos listos para usar todos los Sensores Analógicos disponibles en el mercado, adelante, prueba esto y si tienes algún problema como de costumbre usa la sección de comentarios, estaremos encantados de ayudarte.