top of page

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

  • Adal
  • 10 mar 2022
  • 2 Min. de lectura

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?

ree
ree

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)?

ree
ree

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:

ree
ree
ree

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

ree

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

ree

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

ree

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

ree
ree

Generamos y cerramos el MCC


Dentro del main.c escribiremos el siguiente código

ree
ree


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



 
 
 

Comentarios


© 2050 por Adal. "Creando conexiones". Recuerda dar crédito al autor, evitemos el plagio.

bottom of page