top of page
  • Adal

MPLAB X 11 Conversor Analógico-Digital (ADC) y MCP9700

Hooola!


Vivimos en un mundo donde todas las variables naturales sensables no son discretas, en palabras mas fáciles, son continuas o analógicas


Que es un ADC?

Para saber a cuanto equivale la resolución (escalón) de nuestro ADC, tenemos que dividir el Vref/la cantidad de bits, ejemplo para un ADC de 10bits

3.3/1024=3.22mV

5.0/1024=4.88mV

Que es la lógica SAR (Successive Approximation Register)?

En resumen, la lógica SAR lo que hace es que va comparando voltajes y va asignando 0 y 1 para que al final todos los bits sumen el voltaje de entrada

Ahora, dentro del micro PIC16F18855 en el modulo de ADC, lo que tendremos a dentro es lo siguiente:

Algo importante a tomar a consideración cuanto estas trabajando con velocidades altas es el tiempo de adquisición

Para la practica necesitaremos un sensor de temperatura analógico MCP9700, en su hoja de datos, nos dice que a 0°C, la salida es de 500mv y que tiene una resolución de 10mV por grado, es decir que a 1°C la salida debería de ser de 510mV y en 50°C la salida será de 1V, esto ultimo es muy importante, para tener una mejor resolución del sensor, dentro del micro tendremos que cambiar el Vref+ para que así nuestra resolución se mejor; mas abajo lo explico a detalle


Abrimos MPLAB X, creamos un proyecto y abrimos el MCC, y agregamos el modulo FVR, lo habilitamos y ponemos el FVR_buffer 1 Gain en 1x, lo cual nos debería de dar un voltaje de 1.024

Agregamos el Modulo ADCC y solamente modificamos la referencia positiva a FVR_buf1

Por ultimo agregamos el modulo de EUSART y redirigimos el STDIO a USART, sin olvidar cambiar en el pin manager Tx a PortC0 y Rx a PortC1 y agregar en el puerto ANx a RB0

Generamos y cerramos el MCC


Dentro del main.c escribiremos el siguiente código



Un pequeño resumen de que hicimos en el main, se declaran 3 variables, la primera es la variable de temperatura(temp) de tipo flotante, la segunda es el resultado de la conversión del ADC, por eso que se utiliza el tipo de conversión y por ultimo un buffer de 25 caracteres; y porque 25? debe de ser mas grande o igual a la cadena que debemos de almacenar

En la línea result=ADCC_GetSingleConversion(Sensor); el parametro pasado es Sensor, ya que en el pin module ese nombre le dimos

Para obtener la temperatura(temp), se le tienen que restar lo 0.5v del offset y dividirlo entre la resolución del sensor


Cual es la diferencia entre printf y sprintf?

A lo que yo he notado en efectos prácticos, es que con la función printf imprime un carácter a la vez de forma muy rápida, pero dado que estamos usando flotantes y formato para imprimir el texto, este puede ser un poco lento a la hora de imprimir en pantalla, mientras que con sprint, hace toda la cadena, y la guarda en una variable (buffer) para después con printf imprimirla toda de un jalón


Por ultimo, compilamos y subimos

Aquí un video del programa funcionando, el cactus es un hielo



16 visualizaciones0 comentarios

Entradas Recientes

Ver todo
bottom of page