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
Comments